Skip to content

Commit

Permalink
Showing 6 changed files with 35 additions and 27 deletions.
16 changes: 0 additions & 16 deletions core/basic_object.rb
Original file line number Diff line number Diff line change
@@ -55,22 +55,6 @@ def singleton_method_removed(name) end
def singleton_method_undefined(name) end
private :singleton_method_undefined

def __all_instance_variables__
Rubinius.primitive :object_ivar_names

raise PrimitiveFailure, "BasicObject#__instance_variables__ failed"
end
private :__all_instance_variables__

def __instance_variables__
ary = []
__all_instance_variables__.each do |sym|
ary << sym if sym.is_ivar?
end

ary
end

##
# :call-seq:
# obj.instance_eval(string [, filename [, lineno]] ) => obj
9 changes: 2 additions & 7 deletions core/kernel.rb
Original file line number Diff line number Diff line change
@@ -460,7 +460,7 @@ def inspect
# method is overridden, the new Ruby method is never called. So, we inline
# the code for Kernel#to_s here because we simply dispatch to Ruby
# methods.
ivars = __instance_variables__
ivars = Rubinius.invoke_primitive :object_instance_variables, self

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

def instance_variables
ary = []
__all_instance_variables__.each do |sym|
ary << sym if sym.is_ivar?
end

ary
Rubinius.invoke_primitive :object_instance_variables, self
end

def instance_variable_defined?(name)
2 changes: 1 addition & 1 deletion core/marshal.rb
Original file line number Diff line number Diff line change
@@ -945,7 +945,7 @@ def serialize_extended_object(obj)
end

def serializable_instance_variables(obj, exclude_ivars)
ivars = obj.__instance_variables__
ivars = Rubinius.invoke_primitive :object_instance_variables, obj
ivars -= exclude_ivars if exclude_ivars
ivars
end
8 changes: 8 additions & 0 deletions core/mirror.rb
Original file line number Diff line number Diff line change
@@ -23,6 +23,14 @@ class Object < Mirror
self.subject = ::Object
end

def instance_fields
Rubinius.invoke_primitive :object_instance_fields, @object
end

def instance_variables
Rubinius.invoke_primitive :object_instance_variables, @object
end

def inspect
"#<#{self.class.name}:0x#{self.object_id.to_s(16)} object=#{@object.inspect}>"
end
22 changes: 20 additions & 2 deletions machine/builtin/object.cpp
Original file line number Diff line number Diff line change
@@ -312,13 +312,31 @@ namespace rubinius {
return table_ivar_defined(state, sym);
}

Array* Object::instance_fields(STATE) {
if(!reference_p()) return Array::create(state, 0);

TypeInfo* ti = state->memory()->type_info[type_id()];

Array* fields = Array::create(state, ti->slots.size());
int index = 0;

for(TypeInfo::Slots::iterator i = ti->slots.begin();
i != ti->slots.end();
++i) {
Symbol* sym = Symbol::from_index(i->first);
if(sym->is_ivar_p(state)->true_p()) {
fields->set(state, index++, sym);
}
}

return fields;
}

Array* Object::ivar_names(STATE) {
return ivar_names(state, Array::create(state, 3));
}

Array* Object::ivar_names(STATE, Array* ary) {
// We don't check slots, because we don't advertise them
// as normal ivars.
class ivar_match : public ObjectMatcher {
public:
virtual bool match_p(STATE, Object* match) {
5 changes: 4 additions & 1 deletion machine/builtin/object.hpp
Original file line number Diff line number Diff line change
@@ -202,8 +202,11 @@ namespace rubinius {
// Rubinius.primitive :object_ivar_defined
Object* ivar_defined_prim(STATE, Symbol* sym);

// Rubinius.primitive :object_instance_fields
Array* instance_fields(STATE);

/** Returns the structure containing this object's instance variables. */
// Rubinius.primitive :object_ivar_names
// Rubinius.primitive :object_instance_variables
Array* ivar_names(STATE);

Array* ivar_names(STATE, Array* ary);

0 comments on commit ed43535

Please sign in to comment.