@@ -533,7 +533,7 @@ public PTuple doObject(VirtualFrame frame, Object a, Object b,
533
533
public abstract static class EvalNode extends PythonBuiltinNode {
534
534
protected final String funcname = "eval" ;
535
535
private final BranchProfile hasFreeVarsBranch = BranchProfile .create ();
536
- @ Child protected CompileNode compileNode = CompileNode . create ( false ) ;
536
+ @ Child protected CompileNode compileNode ;
537
537
@ Child private GenericInvokeNode invokeNode = GenericInvokeNode .create ();
538
538
@ Child private HasInheritedAttributeNode hasGetItemNode ;
539
539
@@ -571,7 +571,7 @@ protected boolean isAnyNone(Object object) {
571
571
}
572
572
573
573
protected PCode createAndCheckCode (VirtualFrame frame , Object source ) {
574
- PCode code = compileNode .execute (frame , source , "<string>" , getMode (), 0 , false , -1 );
574
+ PCode code = getCompileNode () .execute (frame , source , "<string>" , getMode (), 0 , false , -1 );
575
575
assertNoFreeVars (code );
576
576
return code ;
577
577
}
@@ -680,6 +680,18 @@ PNone badGlobals(@SuppressWarnings("unused") Object source, Object globals, @Sup
680
680
PNone badLocals (@ SuppressWarnings ("unused" ) Object source , @ SuppressWarnings ("unused" ) PDict globals , Object locals ) {
681
681
throw raise (TypeError , ErrorMessages .LOCALS_MUST_BE_MAPPING , funcname , locals );
682
682
}
683
+
684
+ private CompileNode getCompileNode () {
685
+ if (compileNode == null ) {
686
+ CompilerDirectives .transferToInterpreterAndInvalidate ();
687
+ compileNode = insert (CompileNode .create (false , shouldStripLeadingWhitespace ()));
688
+ }
689
+ return compileNode ;
690
+ }
691
+
692
+ protected boolean shouldStripLeadingWhitespace () {
693
+ return true ;
694
+ }
683
695
}
684
696
685
697
@ Builtin (name = EXEC , minNumOfPositionalArgs = 1 , parameterNames = {"source" , "globals" , "locals" })
@@ -697,6 +709,11 @@ public final Object execute(VirtualFrame frame) {
697
709
executeInternal (frame );
698
710
return PNone .NONE ;
699
711
}
712
+
713
+ @ Override
714
+ protected boolean shouldStripLeadingWhitespace () {
715
+ return false ;
716
+ }
700
717
}
701
718
702
719
// compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
@@ -709,13 +726,16 @@ public abstract static class CompileNode extends PythonBuiltinNode {
709
726
* Truffle tooling
710
727
*/
711
728
private final boolean mayBeFromFile ;
729
+ private final boolean lstrip ;
712
730
713
- public CompileNode (boolean mayBeFromFile ) {
731
+ public CompileNode (boolean mayBeFromFile , boolean lstrip ) {
714
732
this .mayBeFromFile = mayBeFromFile ;
733
+ this .lstrip = lstrip ;
715
734
}
716
735
717
736
public CompileNode () {
718
737
this .mayBeFromFile = true ;
738
+ this .lstrip = false ;
719
739
}
720
740
721
741
public abstract PCode execute (VirtualFrame frame , Object source , String filename , String mode , Object kwFlags , Object kwDontInherit , Object kwOptimize );
@@ -761,6 +781,9 @@ PCode compile(String expression, String filename, String mode, Object kwFlags, O
761
781
} else {
762
782
throw raise (ValueError , ErrorMessages .COMPILE_MUST_BE );
763
783
}
784
+ if (lstrip ) {
785
+ code = code .replaceFirst ("^[ \t ]" , "" );
786
+ }
764
787
final String codeToCompile = code ;
765
788
Supplier <CallTarget > createCode = () -> {
766
789
Source source = PythonLanguage .newSource (context , codeToCompile , filename , mayBeFromFile );
@@ -788,7 +811,11 @@ private static String createString(byte[] bytes, Charset charset) {
788
811
}
789
812
790
813
public static CompileNode create (boolean mapFilenameToUri ) {
791
- return BuiltinFunctionsFactory .CompileNodeFactory .create (mapFilenameToUri , new ReadArgumentNode []{});
814
+ return BuiltinFunctionsFactory .CompileNodeFactory .create (mapFilenameToUri , false , new ReadArgumentNode []{});
815
+ }
816
+
817
+ public static CompileNode create (boolean mapFilenameToUri , boolean lstrip ) {
818
+ return BuiltinFunctionsFactory .CompileNodeFactory .create (mapFilenameToUri , lstrip , new ReadArgumentNode []{});
792
819
}
793
820
}
794
821
0 commit comments