50
50
import org .truffleruby .core .array .library .SharedArrayStorage ;
51
51
import org .truffleruby .core .cast .BooleanCastNode ;
52
52
import org .truffleruby .core .cast .CmpIntNode ;
53
+ import org .truffleruby .core .cast .NameToJavaStringNode ;
53
54
import org .truffleruby .core .cast .ToAryNode ;
54
55
import org .truffleruby .core .cast .ToIntNode ;
55
56
import org .truffleruby .core .cast .ToLongNode ;
71
72
import org .truffleruby .core .string .RubyString ;
72
73
import org .truffleruby .core .string .StringHelperNodes ;
73
74
import org .truffleruby .core .support .TypeNodes .CheckFrozenNode ;
74
- import org .truffleruby .core .symbol .RubySymbol ;
75
75
import org .truffleruby .extra .ffi .Pointer ;
76
76
import org .truffleruby .interop .ToJavaStringNode ;
77
77
import org .truffleruby .language .Nil ;
@@ -1352,34 +1352,39 @@ public void accept(Node node, CallBlockNode yieldNode, RubyArray array, Object s
1352
1352
1353
1353
// Uses Symbol and no block
1354
1354
1355
- @ Specialization (guards = { "isEmptyArray(array)" })
1356
- Object injectSymbolEmptyArrayNoInitial (
1357
- RubyArray array , RubySymbol initialOrSymbol , NotProvided symbol , Nil block ) {
1355
+ @ Specialization (guards = { "isEmptyArray(array)" , "wasProvided(initialOrSymbol)" })
1356
+ Object injectSymbolEmptyArrayNoInitial (RubyArray array , Object initialOrSymbol , NotProvided symbol , Nil block ,
1357
+ @ Cached @ Shared NameToJavaStringNode nameToJavaStringNode ) {
1358
+ nameToJavaStringNode .execute (this , initialOrSymbol ); // ensure a method name is either a Symbol or could be converted to String
1358
1359
return nil ;
1359
1360
}
1360
1361
1361
1362
@ Specialization (
1362
1363
guards = {
1363
1364
"isEmptyArray(array)" ,
1364
- "wasProvided(initialOrSymbol)" })
1365
- Object injectSymbolEmptyArray (RubyArray array , Object initialOrSymbol , RubySymbol symbol , Nil block ) {
1365
+ "wasProvided(initialOrSymbol)" ,
1366
+ "wasProvided(symbol)" })
1367
+ Object injectSymbolEmptyArray (RubyArray array , Object initialOrSymbol , Object symbol , Nil block ,
1368
+ @ Cached @ Shared NameToJavaStringNode nameToJavaStringNode ) {
1369
+ nameToJavaStringNode .execute (this , symbol ); // ensure a method name is either a Symbol or could be converted to String
1366
1370
return initialOrSymbol ;
1367
1371
}
1368
1372
1369
1373
@ Specialization (
1370
- guards = { "!isEmptyArray(array)" },
1374
+ guards = { "!isEmptyArray(array)" , "wasProvided(initialOrSymbol)" },
1371
1375
limit = "storageStrategyLimit()" )
1372
1376
Object injectSymbolNoInitial (
1373
- VirtualFrame frame , RubyArray array , RubySymbol initialOrSymbol , NotProvided symbol , Nil block ,
1377
+ VirtualFrame frame , RubyArray array , Object initialOrSymbol , NotProvided symbol , Nil block ,
1374
1378
@ Bind ("array.getStore()" ) Object store ,
1375
1379
@ CachedLibrary ("store" ) ArrayStoreLibrary stores ,
1376
1380
@ Cached @ Shared IntValueProfile arraySizeProfile ,
1377
1381
@ Cached @ Exclusive LoopConditionProfile loopProfile ,
1378
- @ Cached @ Shared ToJavaStringNode toJavaString ) {
1382
+ @ Cached @ Shared NameToJavaStringNode nameToJavaStringNode ) {
1383
+ String methodName = nameToJavaStringNode .execute (this , initialOrSymbol ); // ensure a method name is either a Symbol or could be converted to String
1379
1384
return injectSymbolHelper (
1380
1385
frame ,
1381
1386
array ,
1382
- toJavaString . execute ( this , initialOrSymbol ) ,
1387
+ methodName ,
1383
1388
stores ,
1384
1389
store ,
1385
1390
stores .read (store , 0 ),
@@ -1391,19 +1396,21 @@ Object injectSymbolNoInitial(
1391
1396
@ Specialization (
1392
1397
guards = {
1393
1398
"!isEmptyArray(array)" ,
1394
- "wasProvided(initialOrSymbol)" },
1399
+ "wasProvided(initialOrSymbol)" ,
1400
+ "wasProvided(symbol)" },
1395
1401
limit = "storageStrategyLimit()" )
1396
1402
Object injectSymbolWithInitial (
1397
- VirtualFrame frame , RubyArray array , Object initialOrSymbol , RubySymbol symbol , Nil block ,
1403
+ VirtualFrame frame , RubyArray array , Object initialOrSymbol , Object symbol , Nil block ,
1398
1404
@ Bind ("array.getStore()" ) Object store ,
1399
1405
@ CachedLibrary ("store" ) ArrayStoreLibrary stores ,
1400
1406
@ Cached @ Shared IntValueProfile arraySizeProfile ,
1401
1407
@ Cached @ Exclusive LoopConditionProfile loopProfile ,
1402
- @ Cached @ Shared ToJavaStringNode toJavaString ) {
1408
+ @ Cached @ Shared NameToJavaStringNode nameToJavaStringNode ) {
1409
+ String methodName = nameToJavaStringNode .execute (this , symbol ); // ensure a method name is either a Symbol or could be converted to String
1403
1410
return injectSymbolHelper (
1404
1411
frame ,
1405
1412
array ,
1406
- toJavaString . execute ( this , symbol ) ,
1413
+ methodName ,
1407
1414
stores ,
1408
1415
store ,
1409
1416
initialOrSymbol ,
0 commit comments