File tree 6 files changed +35
-27
lines changed
6 files changed +35
-27
lines changed Original file line number Diff line number Diff line change @@ -55,22 +55,6 @@ def singleton_method_removed(name) end
55
55
def singleton_method_undefined ( name ) end
56
56
private :singleton_method_undefined
57
57
58
- def __all_instance_variables__
59
- Rubinius . primitive :object_ivar_names
60
-
61
- raise PrimitiveFailure , "BasicObject#__instance_variables__ failed"
62
- end
63
- private :__all_instance_variables__
64
-
65
- def __instance_variables__
66
- ary = [ ]
67
- __all_instance_variables__ . each do |sym |
68
- ary << sym if sym . is_ivar?
69
- end
70
-
71
- ary
72
- end
73
-
74
58
##
75
59
# :call-seq:
76
60
# obj.instance_eval(string [, filename [, lineno]] ) => obj
Original file line number Diff line number Diff line change @@ -460,7 +460,7 @@ def inspect
460
460
# method is overridden, the new Ruby method is never called. So, we inline
461
461
# the code for Kernel#to_s here because we simply dispatch to Ruby
462
462
# methods.
463
- ivars = __instance_variables__
463
+ ivars = Rubinius . invoke_primitive :object_instance_variables , self
464
464
465
465
if ivars . empty?
466
466
return Rubinius ::Type . infect "#{ prefix } >" , self
@@ -527,12 +527,7 @@ def instance_variable_set(sym, value)
527
527
alias_method :__instance_variable_set__ , :instance_variable_set
528
528
529
529
def instance_variables
530
- ary = [ ]
531
- __all_instance_variables__ . each do |sym |
532
- ary << sym if sym . is_ivar?
533
- end
534
-
535
- ary
530
+ Rubinius . invoke_primitive :object_instance_variables , self
536
531
end
537
532
538
533
def instance_variable_defined? ( name )
Original file line number Diff line number Diff line change @@ -945,7 +945,7 @@ def serialize_extended_object(obj)
945
945
end
946
946
947
947
def serializable_instance_variables ( obj , exclude_ivars )
948
- ivars = obj . __instance_variables__
948
+ ivars = Rubinius . invoke_primitive :object_instance_variables , obj
949
949
ivars -= exclude_ivars if exclude_ivars
950
950
ivars
951
951
end
Original file line number Diff line number Diff line change @@ -23,6 +23,14 @@ class Object < Mirror
23
23
self . subject = ::Object
24
24
end
25
25
26
+ def instance_fields
27
+ Rubinius . invoke_primitive :object_instance_fields , @object
28
+ end
29
+
30
+ def instance_variables
31
+ Rubinius . invoke_primitive :object_instance_variables , @object
32
+ end
33
+
26
34
def inspect
27
35
"#<#{ self . class . name } :0x#{ self . object_id . to_s ( 16 ) } object=#{ @object . inspect } >"
28
36
end
Original file line number Diff line number Diff line change @@ -312,13 +312,31 @@ namespace rubinius {
312
312
return table_ivar_defined (state, sym);
313
313
}
314
314
315
+ Array* Object::instance_fields (STATE) {
316
+ if (!reference_p ()) return Array::create (state, 0 );
317
+
318
+ TypeInfo* ti = state->memory ()->type_info [type_id ()];
319
+
320
+ Array* fields = Array::create (state, ti->slots .size ());
321
+ int index = 0 ;
322
+
323
+ for (TypeInfo::Slots::iterator i = ti->slots .begin ();
324
+ i != ti->slots .end ();
325
+ ++i) {
326
+ Symbol* sym = Symbol::from_index (i->first );
327
+ if (sym->is_ivar_p (state)->true_p ()) {
328
+ fields->set (state, index ++, sym);
329
+ }
330
+ }
331
+
332
+ return fields;
333
+ }
334
+
315
335
Array* Object::ivar_names (STATE) {
316
336
return ivar_names (state, Array::create (state, 3 ));
317
337
}
318
338
319
339
Array* Object::ivar_names (STATE, Array* ary) {
320
- // We don't check slots, because we don't advertise them
321
- // as normal ivars.
322
340
class ivar_match : public ObjectMatcher {
323
341
public:
324
342
virtual bool match_p (STATE, Object* match) {
Original file line number Diff line number Diff line change @@ -202,8 +202,11 @@ namespace rubinius {
202
202
// Rubinius.primitive :object_ivar_defined
203
203
Object* ivar_defined_prim (STATE, Symbol* sym);
204
204
205
+ // Rubinius.primitive :object_instance_fields
206
+ Array* instance_fields (STATE);
207
+
205
208
/* * Returns the structure containing this object's instance variables. */
206
- // Rubinius.primitive :object_ivar_names
209
+ // Rubinius.primitive :object_instance_variables
207
210
Array* ivar_names (STATE);
208
211
209
212
Array* ivar_names (STATE, Array* ary);
You can’t perform that action at this time.
0 commit comments