66
66
import org .truffleruby .language .WarningNode ;
67
67
import org .truffleruby .language .arguments .MissingArgumentBehavior ;
68
68
import org .truffleruby .language .arguments .ProfileArgumentNodeGen ;
69
+ import org .truffleruby .language .arguments .ReadCallerFrameNode ;
69
70
import org .truffleruby .language .arguments .ReadPreArgumentNode ;
70
71
import org .truffleruby .language .arguments .ReadSelfNode ;
71
72
import org .truffleruby .language .arguments .RubyArguments ;
@@ -386,24 +387,24 @@ public GenerateAccessorNode(boolean isGetter) {
386
387
this .isGetter = isGetter ;
387
388
}
388
389
389
- public abstract DynamicObject executeGenerateAccessor (DynamicObject module , Object name );
390
+ public abstract DynamicObject executeGenerateAccessor (VirtualFrame frame , DynamicObject module , Object name );
390
391
391
392
@ Specialization
392
- protected DynamicObject generateAccessor (DynamicObject module , Object nameObject ,
393
- @ Cached NameToJavaStringNode nameToJavaStringNode ) {
393
+ protected DynamicObject generateAccessor (VirtualFrame frame , DynamicObject module , Object nameObject ,
394
+ @ Cached NameToJavaStringNode nameToJavaStringNode ,
395
+ @ Cached ReadCallerFrameNode readCallerFrame ) {
394
396
final String name = nameToJavaStringNode .executeToJavaString (nameObject );
395
- createAccessor (module , name );
397
+ createAccessor (module , name , readCallerFrame . execute ( frame ) );
396
398
return nil ();
397
399
}
398
400
399
401
@ TruffleBoundary
400
- private void createAccessor (DynamicObject module , String name ) {
402
+ private void createAccessor (DynamicObject module , String name , MaterializedFrame callerFrame ) {
401
403
final SourceSection sourceSection = getContext ()
402
404
.getCallStack ()
403
405
.getCallerNodeIgnoringSend ()
404
406
.getEncapsulatingSourceSection ();
405
407
final SourceIndexLength sourceIndexLength = new SourceIndexLength (sourceSection );
406
- final Frame callerFrame = getContext ().getCallStack ().getCallerFrameIgnoringSend (FrameAccess .READ_ONLY );
407
408
final Visibility visibility = DeclarationContext .findVisibility (callerFrame );
408
409
final Arity arity = isGetter ? Arity .NO_ARGUMENTS : Arity .ONE_REQUIRED ;
409
410
final String ivar = "@" + name ;
@@ -464,7 +465,7 @@ public abstract static class AttrNode extends CoreMethodArrayArgumentsNode {
464
465
@ Child private WarningNode warnNode ;
465
466
466
467
@ Specialization
467
- protected DynamicObject attr (DynamicObject module , Object [] names ) {
468
+ protected DynamicObject attr (VirtualFrame frame , DynamicObject module , Object [] names ) {
468
469
final boolean setter ;
469
470
if (names .length == 2 && names [1 ] instanceof Boolean ) {
470
471
warnObsoletedBooleanArgument ();
@@ -475,9 +476,9 @@ protected DynamicObject attr(DynamicObject module, Object[] names) {
475
476
}
476
477
477
478
for (Object name : names ) {
478
- generateGetterNode .executeGenerateAccessor (module , name );
479
+ generateGetterNode .executeGenerateAccessor (frame , module , name );
479
480
if (setter ) {
480
- generateSetterNode .executeGenerateAccessor (module , name );
481
+ generateSetterNode .executeGenerateAccessor (frame , module , name );
481
482
}
482
483
}
483
484
return nil ();
@@ -501,10 +502,10 @@ public abstract static class AttrAccessorNode extends CoreMethodArrayArgumentsNo
501
502
@ Child private GenerateAccessorNode generateSetterNode = GenerateAccessorNodeGen .create (false );
502
503
503
504
@ Specialization
504
- protected DynamicObject attrAccessor (DynamicObject module , Object [] names ) {
505
+ protected DynamicObject attrAccessor (VirtualFrame frame , DynamicObject module , Object [] names ) {
505
506
for (Object name : names ) {
506
- generateGetterNode .executeGenerateAccessor (module , name );
507
- generateSetterNode .executeGenerateAccessor (module , name );
507
+ generateGetterNode .executeGenerateAccessor (frame , module , name );
508
+ generateSetterNode .executeGenerateAccessor (frame , module , name );
508
509
}
509
510
return nil ();
510
511
}
@@ -517,9 +518,9 @@ public abstract static class AttrReaderNode extends CoreMethodArrayArgumentsNode
517
518
@ Child private GenerateAccessorNode generateGetterNode = GenerateAccessorNodeGen .create (true );
518
519
519
520
@ Specialization
520
- protected DynamicObject attrReader (DynamicObject module , Object [] names ) {
521
+ protected DynamicObject attrReader (VirtualFrame frame , DynamicObject module , Object [] names ) {
521
522
for (Object name : names ) {
522
- generateGetterNode .executeGenerateAccessor (module , name );
523
+ generateGetterNode .executeGenerateAccessor (frame , module , name );
523
524
}
524
525
return nil ();
525
526
}
@@ -532,9 +533,9 @@ public abstract static class AttrWriterNode extends CoreMethodArrayArgumentsNode
532
533
@ Child private GenerateAccessorNode generateSetterNode = GenerateAccessorNodeGen .create (false );
533
534
534
535
@ Specialization
535
- protected DynamicObject attrWriter (DynamicObject module , Object [] names ) {
536
+ protected DynamicObject attrWriter (VirtualFrame frame , DynamicObject module , Object [] names ) {
536
537
for (Object name : names ) {
537
- generateSetterNode .executeGenerateAccessor (module , name );
538
+ generateSetterNode .executeGenerateAccessor (frame , module , name );
538
539
}
539
540
return nil ();
540
541
}
@@ -612,6 +613,7 @@ public abstract static class ClassEvalNode extends CoreMethodArrayArgumentsNode
612
613
613
614
@ Child private CreateEvalSourceNode createEvalSourceNode = new CreateEvalSourceNode ();
614
615
@ Child private ToStrNode toStrNode ;
616
+ @ Child private ReadCallerFrameNode readCallerFrameNode = ReadCallerFrameNode .create ();
615
617
616
618
protected DynamicObject toStr (VirtualFrame frame , Object object ) {
617
619
if (toStrNode == null ) {
@@ -622,24 +624,25 @@ protected DynamicObject toStr(VirtualFrame frame, Object object) {
622
624
}
623
625
624
626
@ Specialization (guards = "isRubyString(code)" )
625
- protected Object classEval (DynamicObject module , DynamicObject code , NotProvided file , NotProvided line ,
627
+ protected Object classEval (VirtualFrame frame , DynamicObject module , DynamicObject code , NotProvided file , NotProvided line ,
626
628
NotProvided block ,
627
629
@ Cached IndirectCallNode callNode ) {
628
- return classEvalSource (module , code , "(eval)" , callNode );
630
+ return classEvalSource (frame , module , code , "(eval)" , callNode );
629
631
}
630
632
631
633
@ Specialization (guards = { "isRubyString(code)" , "isRubyString(file)" })
632
- protected Object classEval (DynamicObject module , DynamicObject code , DynamicObject file , NotProvided line ,
634
+ protected Object classEval (VirtualFrame frame , DynamicObject module , DynamicObject code , DynamicObject file , NotProvided line ,
633
635
NotProvided block ,
634
636
@ Cached IndirectCallNode callNode ) {
635
- return classEvalSource (module , code , StringOperations .getString (file ), callNode );
637
+ return classEvalSource (frame , module , code , StringOperations .getString (file ), callNode );
636
638
}
637
639
638
640
@ Specialization (guards = { "isRubyString(code)" , "isRubyString(file)" })
639
- protected Object classEval (DynamicObject module , DynamicObject code , DynamicObject file , int line ,
641
+ protected Object classEval (VirtualFrame frame , DynamicObject module , DynamicObject code , DynamicObject file , int line ,
640
642
NotProvided block ,
641
643
@ Cached IndirectCallNode callNode ) {
642
644
final CodeLoader .DeferredCall deferredCall = classEvalSource (
645
+ frame ,
643
646
module ,
644
647
code ,
645
648
StringOperations .getString (file ),
@@ -651,35 +654,37 @@ protected Object classEval(DynamicObject module, DynamicObject code, DynamicObje
651
654
protected Object classEval (VirtualFrame frame , DynamicObject module , Object code , NotProvided file ,
652
655
NotProvided line , NotProvided block ,
653
656
@ Cached IndirectCallNode callNode ) {
654
- return classEvalSource (module , toStr (frame , code ), "(eval)" , callNode );
657
+ return classEvalSource (frame , module , toStr (frame , code ), "(eval)" , callNode );
655
658
}
656
659
657
660
@ Specialization (guards = { "isRubyString(code)" , "wasProvided(file)" })
658
661
protected Object classEval (VirtualFrame frame , DynamicObject module , DynamicObject code , Object file ,
659
662
NotProvided line , NotProvided block ,
660
663
@ Cached IndirectCallNode callNode ) {
661
- return classEvalSource (module , code , StringOperations .getString (toStr (frame , file )), callNode );
664
+ return classEvalSource (frame , module , code , StringOperations .getString (toStr (frame , file )), callNode );
662
665
}
663
666
664
- private Object classEvalSource (DynamicObject module , DynamicObject code , String file ,
667
+ private Object classEvalSource (VirtualFrame frame , DynamicObject module , DynamicObject code , String file ,
665
668
@ Cached IndirectCallNode callNode ) {
666
- final CodeLoader .DeferredCall deferredCall = classEvalSource (module , code , file , 1 );
669
+ final CodeLoader .DeferredCall deferredCall = classEvalSource (frame , module , code , file , 1 );
667
670
return deferredCall .call (callNode );
668
671
}
669
672
670
- @ TruffleBoundary
671
- private CodeLoader .DeferredCall classEvalSource (DynamicObject module , DynamicObject rubySource , String file ,
673
+ private CodeLoader .DeferredCall classEvalSource (VirtualFrame frame , DynamicObject module , DynamicObject rubySource , String file ,
672
674
int line ) {
673
675
assert RubyGuards .isRubyString (rubySource );
674
676
677
+ final MaterializedFrame callerFrame = readCallerFrameNode .execute (frame );
678
+
679
+ return classEvalSourceInternal (module , rubySource , file , line , callerFrame );
680
+ }
681
+
682
+ @ TruffleBoundary
683
+ private CodeLoader .DeferredCall classEvalSourceInternal (DynamicObject module , DynamicObject rubySource , String file , int line ,
684
+ final MaterializedFrame callerFrame ) {
675
685
final RubySource source = createEvalSourceNode
676
686
.createEvalSource (StringOperations .rope (rubySource ), "class/module_eval" , file , line );
677
687
678
- final MaterializedFrame callerFrame = getContext ()
679
- .getCallStack ()
680
- .getCallerFrameIgnoringSend (FrameAccess .MATERIALIZE )
681
- .materialize ();
682
-
683
688
final RubyRootNode rootNode = getContext ().getCodeLoader ().parse (
684
689
source ,
685
690
ParserContext .MODULE ,
@@ -1071,6 +1076,7 @@ private void warnAlreadyInitializedConstant(DynamicObject module, String name,
1071
1076
public abstract static class DefineMethodNode extends CoreMethodNode {
1072
1077
1073
1078
@ Child private AddMethodNode addMethodNode = AddMethodNode .create (false );
1079
+ @ Child private ReadCallerFrameNode readCallerFrame = ReadCallerFrameNode .create ();
1074
1080
1075
1081
@ CreateCast ("name" )
1076
1082
protected RubyNode coerceToString (RubyNode name ) {
@@ -1083,18 +1089,16 @@ protected DynamicObject defineMethod(DynamicObject module, String name, NotProvi
1083
1089
throw new RaiseException (getContext (), coreExceptions ().argumentError ("needs either proc or block" , this ));
1084
1090
}
1085
1091
1086
- @ TruffleBoundary
1087
1092
@ Specialization
1088
- protected DynamicObject defineMethodBlock (DynamicObject module , String name , NotProvided proc ,
1093
+ protected DynamicObject defineMethodBlock (VirtualFrame frame , DynamicObject module , String name , NotProvided proc ,
1089
1094
DynamicObject block ) {
1090
- return defineMethodProc (module , name , block , NotProvided .INSTANCE );
1095
+ return defineMethodProc (frame , module , name , block , NotProvided .INSTANCE );
1091
1096
}
1092
1097
1093
- @ TruffleBoundary
1094
1098
@ Specialization (guards = "isRubyProc(proc)" )
1095
- protected DynamicObject defineMethodProc (DynamicObject module , String name , DynamicObject proc ,
1099
+ protected DynamicObject defineMethodProc (VirtualFrame frame , DynamicObject module , String name , DynamicObject proc ,
1096
1100
NotProvided block ) {
1097
- return defineMethod (module , name , proc );
1101
+ return defineMethod (module , name , proc , readCallerFrame . execute ( frame ) );
1098
1102
}
1099
1103
1100
1104
@ TruffleBoundary
@@ -1121,10 +1125,16 @@ protected DynamicObject defineMethodMethod(DynamicObject module, String name, Dy
1121
1125
return getSymbol (name );
1122
1126
}
1123
1127
1124
- @ TruffleBoundary
1125
1128
@ Specialization (guards = "isRubyUnboundMethod(method)" )
1126
- protected DynamicObject defineMethod (DynamicObject module , String name , DynamicObject method ,
1129
+ protected DynamicObject defineMethod (VirtualFrame frame , DynamicObject module , String name , DynamicObject method ,
1127
1130
NotProvided block ) {
1131
+ final MaterializedFrame callerFrame = readCallerFrame .execute (frame );
1132
+ return defineMethodInternal (module , name , method , callerFrame );
1133
+ }
1134
+
1135
+ @ TruffleBoundary
1136
+ private DynamicObject defineMethodInternal (DynamicObject module , String name , DynamicObject method ,
1137
+ final MaterializedFrame callerFrame ) {
1128
1138
final InternalMethod internalMethod = Layouts .UNBOUND_METHOD .getMethod (method );
1129
1139
if (!ModuleOperations .canBindMethodTo (internalMethod , module )) {
1130
1140
final DynamicObject declaringModule = internalMethod .getDeclaringModule ();
@@ -1142,11 +1152,11 @@ protected DynamicObject defineMethod(DynamicObject module, String name, DynamicO
1142
1152
}
1143
1153
}
1144
1154
1145
- return addMethod (module , name , internalMethod );
1155
+ return addMethod (module , name , internalMethod , callerFrame );
1146
1156
}
1147
1157
1148
1158
@ TruffleBoundary
1149
- private DynamicObject defineMethod (DynamicObject module , String name , DynamicObject proc ) {
1159
+ private DynamicObject defineMethod (DynamicObject module , String name , DynamicObject proc , MaterializedFrame callerFrame ) {
1150
1160
final RootCallTarget callTarget = Layouts .PROC .getCallTargetForLambdas (proc );
1151
1161
final RubyRootNode rootNode = (RubyRootNode ) callTarget .getRootNode ();
1152
1162
final SharedMethodInfo info = Layouts .PROC .getSharedMethodInfo (proc ).forDefineMethod (module , name );
@@ -1173,7 +1183,7 @@ private DynamicObject defineMethod(DynamicObject module, String name, DynamicObj
1173
1183
Visibility .PUBLIC ,
1174
1184
proc ,
1175
1185
newCallTarget );
1176
- return addMethod (module , name , method );
1186
+ return addMethod (module , name , method , callerFrame );
1177
1187
}
1178
1188
1179
1189
private static class CallMethodWithProcBody extends RubyNode {
@@ -1195,11 +1205,10 @@ public Object execute(VirtualFrame frame) {
1195
1205
}
1196
1206
1197
1207
@ TruffleBoundary
1198
- private DynamicObject addMethod (DynamicObject module , String name , InternalMethod method ) {
1208
+ private DynamicObject addMethod (DynamicObject module , String name , InternalMethod method , MaterializedFrame callerFrame ) {
1199
1209
method = method .withName (name );
1200
1210
1201
- final Frame frame = getContext ().getCallStack ().getCallerFrameIgnoringSend (FrameAccess .READ_ONLY );
1202
- final Visibility visibility = GetCurrentVisibilityNode .getVisibilityFromNameAndFrame (name , frame );
1211
+ final Visibility visibility = GetCurrentVisibilityNode .getVisibilityFromNameAndFrame (name , callerFrame );
1203
1212
addMethodNode .executeAddMethod (module , method , visibility );
1204
1213
return getSymbol (method .getName ());
1205
1214
}
0 commit comments