File tree Expand file tree Collapse file tree 1 file changed +23
-6
lines changed
src/main/ruby/truffleruby/core Expand file tree Collapse file tree 1 file changed +23
-6
lines changed Original file line number Diff line number Diff line change @@ -539,25 +539,42 @@ def transform_values!
539
539
self
540
540
end
541
541
542
- def transform_keys
543
- return to_enum ( :transform_keys ) { size } unless block_given?
542
+ def transform_keys ( mapping = nil )
543
+ has_block = block_given?
544
+ return to_enum ( :transform_keys ) { size } unless mapping || has_block
545
+
546
+ mapping = Truffle ::Type . coerce_to ( mapping , Hash , :to_hash ) if mapping
544
547
545
548
h = { }
546
549
each_pair do |key , value |
547
- h [ yield ( key ) ] = value
550
+ if mapping
551
+ k = Primitive . hash_get_or_undefined ( mapping , key )
552
+ k = has_block ? yield ( key ) : key if Primitive . undefined? ( k )
553
+ h [ k ] = value
554
+ else
555
+ h [ yield ( key ) ] = value
556
+ end
548
557
end
549
558
h
550
559
end
551
560
552
- def transform_keys!
553
- return to_enum ( :transform_keys! ) { size } unless block_given?
561
+ def transform_keys! ( mapping = nil )
562
+ has_block = block_given?
563
+ return to_enum ( :transform_keys! ) { size } unless mapping || has_block
554
564
555
565
Primitive . check_frozen self
566
+ mapping = Truffle ::Type . coerce_to ( mapping , Hash , :to_hash ) if mapping
556
567
557
568
h = { }
558
569
begin
559
570
each_pair do |key , value |
560
- h [ yield ( key ) ] = value
571
+ if mapping
572
+ k = Primitive . hash_get_or_undefined ( mapping , key )
573
+ k = has_block ? yield ( key ) : key if Primitive . undefined? ( k )
574
+ h [ k ] = value
575
+ else
576
+ h [ yield ( key ) ] = value
577
+ end
561
578
end
562
579
ensure
563
580
replace h
You can’t perform that action at this time.
0 commit comments