Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 61 additions & 2 deletions benchmark/vm_ivar_set_on_instance.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,44 @@
prelude: |
class TheClass
def initialize
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
end

def set_value_loop
# 100k
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
i += 1
end
end
end

class Generic < Time
def initialize
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
end

def set_value_loop
# 1M
# 100k
i = 0
while i < 1000000
while i < 100_000
# 10 times to de-emphasize loop overhead
@levar = i
@levar = i
Expand All @@ -28,8 +56,39 @@ prelude: |
end

obj = TheClass.new
gen_obj = Generic.new

class SomeClass
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3

def self.set_value_loop
# 100k
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
i += 1
end
end
end

benchmark:
vm_ivar_set_on_instance: |
obj.set_value_loop
vm_ivar_set_on_generic: |
gen_obj.set_value_loop
vm_ivar_set_on_class: |
SomeClass.set_value_loop
loop_count: 100
16 changes: 1 addition & 15 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -4699,21 +4699,7 @@ AC_CONFIG_FILES(Makefile:template/Makefile.in, [

echo; echo '$(srcdir)/$(CONFIGURE):RUBY_M4_INCLUDED \
$(empty)'
} > $tmpmk && AS_IF([! grep '^ruby:' $tmpmk > /dev/null], [
AS_IF([test "${gnumake}" = yes], [
tmpgmk=confgmk$$.tmp
{
echo "include $tmpmk"
echo "-include uncommon.mk"
} > $tmpgmk
], [
tmpgmk=$tmpmk
]) &&
test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" &&
echo 'ruby: $(PROGRAM);' >> $tmpmk
rm -f uncommon.mk # remove stale uncommon.mk, it should be updated by GNUmakefile
test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk"
]) && mv -f $tmpmk Makefile],
} > $tmpmk && mv -f $tmpmk Makefile],
[EXEEXT='$EXEEXT' MAKE='${MAKE-make}' gnumake='$gnumake' GIT='$GIT' YJIT_SUPPORT='$YJIT_SUPPORT'])

AC_ARG_WITH([ruby-pc],
Expand Down
4 changes: 4 additions & 0 deletions defs/gmake.mk
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,10 @@ endif

config.status: $(wildcard config.cache)

ifneq (ruby,$(PROGRAM))
ruby: $(PROGRAM);
endif

STUBPROGRAM = rubystub$(EXEEXT)
IGNOREDPATTERNS = %~ .% %.orig %.rej \#%\#
SCRIPTBINDIR := $(if $(EXEEXT),,exec/)
Expand Down
4 changes: 2 additions & 2 deletions internal/variable.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ void rb_obj_init_too_complex(VALUE obj, st_table *table);
void rb_evict_ivars_to_hash(VALUE obj);
VALUE rb_obj_field_get(VALUE obj, shape_id_t target_shape_id);
void rb_ivar_set_internal(VALUE obj, ID id, VALUE val);
void rb_obj_field_set(VALUE obj, shape_id_t target_shape_id, ID field_name, VALUE val);
attr_index_t rb_ivar_set_index(VALUE obj, ID id, VALUE val);
attr_index_t rb_obj_field_set(VALUE obj, shape_id_t target_shape_id, ID field_name, VALUE val);

RUBY_SYMBOL_EXPORT_BEGIN
/* variable.c (export) */
Expand All @@ -67,6 +68,5 @@ VALUE rb_gvar_set(ID, VALUE);
VALUE rb_gvar_defined(ID);
void rb_const_warn_if_deprecated(const rb_const_entry_t *, VALUE, ID);
void rb_ensure_iv_list_size(VALUE obj, uint32_t current_len, uint32_t newsize);
attr_index_t rb_obj_ivar_set(VALUE obj, ID id, VALUE val);

#endif /* INTERNAL_VARIABLE_H */
55 changes: 55 additions & 0 deletions test/ruby/test_variable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,61 @@ def test_special_constant_ivars
end
end

class RemoveIvar
class << self
attr_reader :ivar

def add_ivar
@ivar = 1
end
end

attr_reader :ivar

def add_ivar
@ivar = 1
end
end

def add_and_remove_ivar(obj)
assert_nil obj.ivar
assert_equal 1, obj.add_ivar
assert_equal 1, obj.instance_variable_get(:@ivar)
assert_equal 1, obj.ivar

obj.remove_instance_variable(:@ivar)
assert_nil obj.ivar

assert_raise NameError do
obj.remove_instance_variable(:@ivar)
end
end

def test_remove_instance_variables_object
obj = RemoveIvar.new
add_and_remove_ivar(obj)
add_and_remove_ivar(obj)
end

def test_remove_instance_variables_class
add_and_remove_ivar(RemoveIvar)
add_and_remove_ivar(RemoveIvar)
end

class RemoveIvarGeneric < Array
attr_reader :ivar

def add_ivar
@ivar = 1
end
end

def test_remove_instance_variables_generic
obj = RemoveIvarGeneric.new
add_and_remove_ivar(obj)
add_and_remove_ivar(obj)
end

class ExIvar < Hash
def initialize
@a = 1
Expand Down
Loading