Skip to content

Commit 4b41b43

Browse files
committed
Make eval strip leading whitespace
1 parent 35a7359 commit 4b41b43

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ public PTuple doObject(VirtualFrame frame, Object a, Object b,
533533
public abstract static class EvalNode extends PythonBuiltinNode {
534534
protected final String funcname = "eval";
535535
private final BranchProfile hasFreeVarsBranch = BranchProfile.create();
536-
@Child protected CompileNode compileNode = CompileNode.create(false);
536+
@Child protected CompileNode compileNode;
537537
@Child private GenericInvokeNode invokeNode = GenericInvokeNode.create();
538538
@Child private HasInheritedAttributeNode hasGetItemNode;
539539

@@ -571,7 +571,7 @@ protected boolean isAnyNone(Object object) {
571571
}
572572

573573
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);
575575
assertNoFreeVars(code);
576576
return code;
577577
}
@@ -680,6 +680,18 @@ PNone badGlobals(@SuppressWarnings("unused") Object source, Object globals, @Sup
680680
PNone badLocals(@SuppressWarnings("unused") Object source, @SuppressWarnings("unused") PDict globals, Object locals) {
681681
throw raise(TypeError, ErrorMessages.LOCALS_MUST_BE_MAPPING, funcname, locals);
682682
}
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+
}
683695
}
684696

685697
@Builtin(name = EXEC, minNumOfPositionalArgs = 1, parameterNames = {"source", "globals", "locals"})
@@ -697,6 +709,11 @@ public final Object execute(VirtualFrame frame) {
697709
executeInternal(frame);
698710
return PNone.NONE;
699711
}
712+
713+
@Override
714+
protected boolean shouldStripLeadingWhitespace() {
715+
return false;
716+
}
700717
}
701718

702719
// compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
@@ -709,13 +726,16 @@ public abstract static class CompileNode extends PythonBuiltinNode {
709726
* Truffle tooling
710727
*/
711728
private final boolean mayBeFromFile;
729+
private final boolean lstrip;
712730

713-
public CompileNode(boolean mayBeFromFile) {
731+
public CompileNode(boolean mayBeFromFile, boolean lstrip) {
714732
this.mayBeFromFile = mayBeFromFile;
733+
this.lstrip = lstrip;
715734
}
716735

717736
public CompileNode() {
718737
this.mayBeFromFile = true;
738+
this.lstrip = false;
719739
}
720740

721741
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
761781
} else {
762782
throw raise(ValueError, ErrorMessages.COMPILE_MUST_BE);
763783
}
784+
if (lstrip) {
785+
code = code.replaceFirst("^[ \t]", "");
786+
}
764787
final String codeToCompile = code;
765788
Supplier<CallTarget> createCode = () -> {
766789
Source source = PythonLanguage.newSource(context, codeToCompile, filename, mayBeFromFile);
@@ -788,7 +811,11 @@ private static String createString(byte[] bytes, Charset charset) {
788811
}
789812

790813
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[]{});
792819
}
793820
}
794821

0 commit comments

Comments
 (0)