Skip to content

Commit ed43535

Browse files
committedAug 13, 2016
Added Mirror#instance_fields, #instance_variables.
1 parent 828bbe4 commit ed43535

File tree

6 files changed

+35
-27
lines changed

6 files changed

+35
-27
lines changed
 

Diff for: ‎core/basic_object.rb

-16
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,6 @@ def singleton_method_removed(name) end
5555
def singleton_method_undefined(name) end
5656
private :singleton_method_undefined
5757

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-
7458
##
7559
# :call-seq:
7660
# obj.instance_eval(string [, filename [, lineno]] ) => obj

Diff for: ‎core/kernel.rb

+2-7
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ def inspect
460460
# method is overridden, the new Ruby method is never called. So, we inline
461461
# the code for Kernel#to_s here because we simply dispatch to Ruby
462462
# methods.
463-
ivars = __instance_variables__
463+
ivars = Rubinius.invoke_primitive :object_instance_variables, self
464464

465465
if ivars.empty?
466466
return Rubinius::Type.infect "#{prefix}>", self
@@ -527,12 +527,7 @@ def instance_variable_set(sym, value)
527527
alias_method :__instance_variable_set__, :instance_variable_set
528528

529529
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
536531
end
537532

538533
def instance_variable_defined?(name)

Diff for: ‎core/marshal.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ def serialize_extended_object(obj)
945945
end
946946

947947
def serializable_instance_variables(obj, exclude_ivars)
948-
ivars = obj.__instance_variables__
948+
ivars = Rubinius.invoke_primitive :object_instance_variables, obj
949949
ivars -= exclude_ivars if exclude_ivars
950950
ivars
951951
end

Diff for: ‎core/mirror.rb

+8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ class Object < Mirror
2323
self.subject = ::Object
2424
end
2525

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+
2634
def inspect
2735
"#<#{self.class.name}:0x#{self.object_id.to_s(16)} object=#{@object.inspect}>"
2836
end

Diff for: ‎machine/builtin/object.cpp

+20-2
Original file line numberDiff line numberDiff line change
@@ -312,13 +312,31 @@ namespace rubinius {
312312
return table_ivar_defined(state, sym);
313313
}
314314

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+
315335
Array* Object::ivar_names(STATE) {
316336
return ivar_names(state, Array::create(state, 3));
317337
}
318338

319339
Array* Object::ivar_names(STATE, Array* ary) {
320-
// We don't check slots, because we don't advertise them
321-
// as normal ivars.
322340
class ivar_match : public ObjectMatcher {
323341
public:
324342
virtual bool match_p(STATE, Object* match) {

Diff for: ‎machine/builtin/object.hpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,11 @@ namespace rubinius {
202202
// Rubinius.primitive :object_ivar_defined
203203
Object* ivar_defined_prim(STATE, Symbol* sym);
204204

205+
// Rubinius.primitive :object_instance_fields
206+
Array* instance_fields(STATE);
207+
205208
/** Returns the structure containing this object's instance variables. */
206-
// Rubinius.primitive :object_ivar_names
209+
// Rubinius.primitive :object_instance_variables
207210
Array* ivar_names(STATE);
208211

209212
Array* ivar_names(STATE, Array* ary);

0 commit comments

Comments
 (0)
Please sign in to comment.