summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazuki Tsujimoto <kazuki@callcc.net>2019-11-19 08:53:01 -0600
committerKazuki Tsujimoto <kazuki@callcc.net>2019-11-19 08:53:01 -0600
commit2439948bcc0ec9daf91cf79301195e59bad49aff (patch)
tree9603e001e41d33d231479ac6e1d63068ef56a033
parent822d7ae31659e4ab60c4d1aa6d088577d6bc74b0 (diff)
Avoid needless object allocation
-rw-r--r--struct.c5
-rw-r--r--test/ruby/test_pattern_matching.rb2
-rw-r--r--test/ruby/test_struct.rb2
3 files changed, 7 insertions, 2 deletions
diff --git a/struct.c b/struct.c
index bf1ff6f386..d1aa7c278f 100644
--- a/struct.c
+++ b/struct.c
@@ -957,12 +957,15 @@ rb_struct_deconstruct_keys(VALUE s, VALUE keys)
rb_obj_class(keys));
}
+ if (RSTRUCT_LEN(s) < RARRAY_LEN(keys)) {
+ return rb_hash_new_with_size(0);
+ }
h = rb_hash_new_with_size(RARRAY_LEN(keys));
for (i=0; i<RARRAY_LEN(keys); i++) {
VALUE key = RARRAY_AREF(keys, i);
int i = rb_struct_pos(s, &key);
if (i < 0) {
- return rb_hash_new_with_size(0);
+ return h;
}
rb_hash_aset(h, key, RSTRUCT_GET(s, i));
}
diff --git a/test/ruby/test_pattern_matching.rb b/test/ruby/test_pattern_matching.rb
index 69524cb7a7..889f8dd519 100644
--- a/test/ruby/test_pattern_matching.rb
+++ b/test/ruby/test_pattern_matching.rb
@@ -1250,6 +1250,8 @@ END
case s[a: 0, b: 1]
in a:, c:
flunk
+ in a:, b:, c:
+ flunk
in b:
b == 1
end
diff --git a/test/ruby/test_struct.rb b/test/ruby/test_struct.rb
index 2c725f112f..2f5ef80c9b 100644
--- a/test/ruby/test_struct.rb
+++ b/test/ruby/test_struct.rb
@@ -437,7 +437,7 @@ module TestStruct
assert_equal({a: 1, b: 2}, o.deconstruct_keys(nil))
assert_equal({a: 1, b: 2}, o.deconstruct_keys([:b, :a]))
assert_equal({a: 1}, o.deconstruct_keys([:a]))
- assert_equal({}, o.deconstruct_keys([:a, :c]))
+ assert_not_send([o.deconstruct_keys([:a, :c]), :key?, :c])
assert_raise(TypeError) {
o.deconstruct_keys(0)
}