Bug #12246 ยป doc_extension_lang.patch
doc/extension.rdoc | ||
---|---|---|
types, so data will need to be converted between the languages.
|
||
Data in Ruby are represented by the C type `VALUE'. Each VALUE data
|
||
has its data-type.
|
||
has its data type.
|
||
To retrieve C data from a VALUE, you need to:
|
||
... | ... | |
Converting to the wrong data type may cause serious problems.
|
||
== Data-Types
|
||
== Data Types
|
||
The Ruby interpreter has the following data types:
|
||
... | ... | |
break;
|
||
}
|
||
There is the data-type check function
|
||
There is the data type check function
|
||
void Check_Type(VALUE value, int type)
|
||
... | ... | |
Note that Qfalse is false in C also (i.e. 0), but not Qnil.
|
||
The T_FIXNUM data is a 31bit or 63bit length fixed integer.
|
||
This size is depend on the size of long: if long is 32bit then
|
||
This size depends on the size of long: if long is 32bit then
|
||
T_FIXNUM is 31bit, if long is 64bit then T_FIXNUM is 63bit.
|
||
T_FIXNUM can be converted to a C integer by using the
|
||
FIX2INT() macro or FIX2LONG(). Though you have to check that the
|
||
... | ... | |
never raises exceptions, but FIX2INT() raises RangeError if the
|
||
result is bigger or smaller than the size of int.
|
||
There are also NUM2INT() and NUM2LONG() which converts any Ruby
|
||
numbers into C integers. These macros includes a type check,
|
||
numbers into C integers. These macros include a type check,
|
||
so an exception will be raised if the conversion failed. NUM2DBL()
|
||
can be used to retrieve the double float value in the same way.
|
||
You can use the macros
|
||
StringValue() and StringValuePtr() to get a char* from a VALUE.
|
||
StringValue(var) replaces var's value with the result of "var.to_str()".
|
||
StringValuePtr(var) does same replacement and returns char*
|
||
StringValuePtr(var) does the same replacement and returns the char*
|
||
representation of var. These macros will skip the replacement if var
|
||
is a String. Notice that the macros take only the lvalue as their
|
||
argument, to change the value of var in place.
|
||
You can also use the macro named StringValueCStr(). This is just
|
||
like StringValuePtr(), but always add NUL character at the end of
|
||
the result. If the result contains NUL character, this macro causes
|
||
like StringValuePtr(), but always adds a NUL character at the end of
|
||
the result. If the result contains a NUL character, this macro causes
|
||
the ArgumentError exception.
|
||
StringValuePtr() doesn't guarantee the existence of a NUL at the end
|
||
of the result, and the result may contain NUL.
|
||
... | ... | |
structure can be cast to retrieve the pointer to the struct. The
|
||
casting macro will be of the form RXXXX for each data type; for
|
||
instance, RARRAY(obj). See "ruby.h". However, we do not recommend
|
||
to access RXXXX data directly because these data structure is complex.
|
||
Use corresponding rb_xxx() functions to access internal struct.
|
||
to access RXXXX data directly because these data structures are complex.
|
||
Use corresponding rb_xxx() functions to access the internal struct.
|
||
For example, to access an entry of array, use rb_ary_entry(ary, offset)
|
||
and rb_ary_store(ary, offset, obj).
|
||
... | ... | |
FIXNUM ::
|
||
left shift 1 bit, and turn on LSB.
|
||
left shift 1 bit, and turn on its least significant bit (LSB).
|
||
Other pointer values ::
|
||
cast to VALUE.
|
||
You can determine whether a VALUE is pointer or not by checking its LSB.
|
||
You can determine whether a VALUE is a pointer or not by checking its LSB.
|
||
Notice Ruby does not allow arbitrary pointer values to be a VALUE. They
|
||
Notice: Ruby does not allow arbitrary pointer values to be a VALUE. They
|
||
should be pointers to the structures which Ruby knows about. The known
|
||
structures are defined in <ruby.h>.
|
||
To convert C numbers to Ruby values, use these macros.
|
||
To convert C numbers to Ruby values, use these macros:
|
||
INT2FIX() :: for integers within 31bits.
|
||
INT2NUM() :: for arbitrary sized integer.
|
||
INT2NUM() :: for arbitrary sized integers.
|
||
INT2NUM() converts an integer into a Bignum if it is out of the FIXNUM
|
||
range, but is a bit slower.
|
||
... | ... | |
rb_str_resize(VALUE str, long len) ::
|
||
Resizes Ruby string to len bytes. If str is not modifiable, this
|
||
Resizes a Ruby string to len bytes. If str is not modifiable, this
|
||
function raises an exception. The length of str must be set in
|
||
advance. If len is less than the old length the content beyond
|
||
len bytes is discarded, else if len is greater than the old length
|
||
... | ... | |
rb_str_set_len(VALUE str, long len) ::
|
||
Sets the length of Ruby string. If str is not modifiable, this
|
||
Sets the length of a Ruby string. If str is not modifiable, this
|
||
function raises an exception. This function preserves the content
|
||
upto len bytes, regardless RSTRING_LEN(str). len must not exceed
|
||
up to len bytes, regardless RSTRING_LEN(str). len must not exceed
|
||
the capacity of str.
|
||
=== Array Functions
|
||
... | ... | |
void rb_define_protected_method(VALUE klass, const char *name,
|
||
VALUE (*func)(), int argc)
|
||
At last, rb_define_module_function defines a module functions,
|
||
At last, rb_define_module_function defines a module function,
|
||
which are private AND singleton methods of the module.
|
||
For example, sqrt is the module function defined in Math module.
|
||
For example, sqrt is a module function defined in the Math module.
|
||
It can be called in the following way:
|
||
Math.sqrt(4)
|
||
... | ... | |
VALUE rb_eval_string_protect(const char *str, int *state)
|
||
It returns nil when an error occur. Moreover, *state is zero if str was
|
||
It returns nil when an error occurred. Moreover, *state is zero if str was
|
||
successfully evaluated, or nonzero otherwise.
|
||
=== ID or Symbol
|
||
... | ... | |
= Information Sharing Between Ruby and C
|
||
=== Ruby Constants That C Can Be Accessed From C
|
||
=== Ruby Constants That Can Be Accessed From C
|
||
As stated in section 1.3,
|
||
the following Ruby constants can be referred from C.
|
||
... | ... | |
See the example below for details.
|
||
= Example - Creating dbm Extension
|
||
= Example - Creating the dbm Extension
|
||
OK, here's the example of making an extension library. This is the
|
||
extension to access DBMs. The full source is included in the ext/
|
||
... | ... | |
char * -> String
|
||
== Defining Class and Module
|
||
== Defining Classes and Modules
|
||
VALUE rb_define_class(const char *name, VALUE super) ::
|
||