SharedStringList KRubyObject::GetPropertyNames() { SharedStringList names(new StringList()); VALUE vars = rb_obj_instance_variables(object); for (int i = 0; i < RARRAY_LEN(vars); i++) { VALUE prop_name = rb_ary_entry(vars, i); std::string name(StringValueCStr(prop_name)); if (name[0] == '@') name = name.substr(1); names->push_back(new std::string(name)); } VALUE methodsSymbol = rb_intern("methods"); if (!rb_obj_respond_to(object, methodsSymbol, Qfalse)) return names; VALUE methods = rb_funcall(object, rb_intern("methods"), 0); for (int i = 0; i < RARRAY_LEN(methods); i++) { VALUE rmethodName = rb_ary_entry(methods, i); const char *methodName = StringValueCStr(rmethodName); names->push_back(new std::string(methodName)); } return names; }
static void set_state_ivars(VALUE hash, VALUE state) { VALUE ivars = rb_obj_instance_variables(state); int i = 0; for (i = 0; i < RARRAY_LEN(ivars); i++) { VALUE key = rb_funcall(rb_ary_entry(ivars, i), i_to_s, 0); long key_len = RSTRING_LEN(key); VALUE value = rb_iv_get(state, StringValueCStr(key)); rb_hash_aset(hash, rb_str_intern(rb_str_substr(key, 1, key_len - 1)), value); } }