5. About me
And C.
segfault(87698) malloc: *** error for object
0x7fff5dbad6c0:
pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
Вівторок, 19 березня 13 р.
27. Well-known APIs
VALUE hash = rb_hash_new();
VALUE key = rb_string_new2(“key”);
VALUE value = INT2FIX(42);
rb_hash_aset(hash, key, value);
rb_p(hash);
Вівторок, 19 березня 13 р.
40. This will SEGFAULT
int main() {
ruby_init();
ruby_init_loadpath();
ruby_script("c.rb");
VALUE ruby_string = rb_str_new2("Hi,I’m
Ruby!");
rb_p(ruby_string);
rb_gc();
rb_p(ruby_string); /* Right here */
ruby_finalize();
return 0;
}
Вівторок, 19 березня 13 р.
41. Registering vars
#include <ruby.h>
static VALUE ruby_objects;
void lo(VALUE ruby_object) {
rb_hash_aset(ruby_objects,
rb_obj_id(ruby_object),
ruby_object);
}
void uo(VALUE ruby_object) {
rb_hash_delete(ruby_objects,
rb_obj_id(ruby_object));
}
Вівторок, 19 березня 13 р.
42. Registering vars
int main() {
ruby_init();
...
ruby_objects = rb_hash_new();
rb_global_variable(&ruby_objects);
}
Вівторок, 19 березня 13 р.
43. Registering vars
int main() {
ruby_init();
...
ruby_objects = rb_hash_new();
rb_global_variable(&ruby_objects);
VALUE ruby_string = rb_str_new2("Hi
from Ruby!");
}
Вівторок, 19 березня 13 р.
44. Registering vars
int main() {
ruby_init();
...
ruby_objects = rb_hash_new();
rb_global_variable(&ruby_objects);
VALUE ruby_string = rb_str_new2("Hi from
Ruby!");
lo(ruby_string);
rb_p(ruby_string);
rb_gc();
}
Вівторок, 19 березня 13 р.
45. Registering vars
int main() {
ruby_init();
...
ruby_objects = rb_hash_new();
rb_global_variable(&ruby_objects);
VALUE ruby_string = rb_str_new2("Hi from Ruby!");
lo(ruby_string);
rb_p(ruby_string);
rb_gc();
rb_p(ruby_string); /* No SEGFAULT this time */
uo(ruby_string);
...
}
Вівторок, 19 березня 13 р.
46. GC tips
call rb_gc() to collect
can also be invoked by Ruby itself
Вівторок, 19 березня 13 р.
47. GC tips
always register variables
rb_gc_register_address() is slow,
so use some data structure
Вівторок, 19 березня 13 р.
48. GC tips
run rb_gc() often to detect problems early
automatic GC can be disabled (dangerous!)
Вівторок, 19 березня 13 р.
54. Exceptions
int state = 0;
rb_protect(
RUBY_METHOD_FUNC(rb_require),
(VALUE) “./code.rb”,
&state);
/* We couldn't execute rb_require */
if (state) {
rb_p(rb_gv_get("$!"));
exit(1);
}
Вівторок, 19 березня 13 р.