Skip to content

Commit 24c03ba

Browse files
committed
reintroduce support for GRAAL_PYTHON_ARGS
1 parent bc81764 commit 24c03ba

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public static void main(String[] args) {
8888
@Override
8989
protected List<String> preprocessArguments(List<String> givenArgs, Map<String, String> polyglotOptions) {
9090
ArrayList<String> unrecognized = new ArrayList<>();
91-
ArrayList<String> inputArgs = new ArrayList<>();
91+
List<String> defaultEnvironmentArgs = getDefaultEnvironmentArgs();
92+
ArrayList<String> inputArgs = new ArrayList<>(defaultEnvironmentArgs);
9293
inputArgs.addAll(givenArgs);
9394
givenArguments = new ArrayList<>(inputArgs);
9495
List<String> arguments = new ArrayList<>(inputArgs);
@@ -576,6 +577,10 @@ protected void printHelp(OptionCategory maxCategory) {
576577
" as specifying the -R option: a random value is used to seed the hashes of\n" +
577578
" str, bytes and datetime objects. It can also be set to an integer\n" +
578579
" in the range [0,4294967295] to get hash values with a predictable seed.\n" +
580+
"GRAAL_PYTHON_ARGS: the value is added as arguments as if passed on the\n" +
581+
" commandline. There is one special case: any `$$' in the value is replaced\n" +
582+
" with the current process id. To pass a literal `$$', you must escape the\n" +
583+
" second `$' like so: `$\\$'\n" +
579584
(wantsExperimental ? "\nArguments specific to the Graal Python launcher:\n" +
580585
"--show-version : print the Python version number and continue.\n" +
581586
"-CC : run the C compiler used for generating GraalPython C extensions.\n" +
@@ -808,6 +813,72 @@ private static final class ExitException extends RuntimeException {
808813
}
809814
}
810815

816+
private static enum State {
817+
NORMAL,
818+
SINGLE_QUOTE,
819+
DOUBLE_QUOTE,
820+
ESCAPE_SINGLE_QUOTE,
821+
ESCAPE_DOUBLE_QUOTE,
822+
}
823+
824+
private static List<String> getDefaultEnvironmentArgs() {
825+
String pid;
826+
if (isAOT()) {
827+
pid = String.valueOf(ProcessProperties.getProcessID());
828+
} else {
829+
pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
830+
}
831+
String envArgsOpt = System.getenv("GRAAL_PYTHON_ARGS");
832+
ArrayList<String> envArgs = new ArrayList<>();
833+
State s = State.NORMAL;
834+
StringBuilder sb = new StringBuilder();
835+
if (envArgsOpt != null) {
836+
for (char x : envArgsOpt.toCharArray()) {
837+
if (s == State.NORMAL && Character.isWhitespace(x)) {
838+
addArgument(pid, envArgs, sb);
839+
} else {
840+
if (x == '"') {
841+
if (s == State.NORMAL) {
842+
s = State.DOUBLE_QUOTE;
843+
} else if (s == State.DOUBLE_QUOTE) {
844+
s = State.NORMAL;
845+
} else if (s == State.ESCAPE_DOUBLE_QUOTE) {
846+
s = State.DOUBLE_QUOTE;
847+
sb.append(x);
848+
}
849+
} else if (x == '\'') {
850+
if (s == State.NORMAL) {
851+
s = State.SINGLE_QUOTE;
852+
} else if (s == State.SINGLE_QUOTE) {
853+
s = State.NORMAL;
854+
} else if (s == State.ESCAPE_SINGLE_QUOTE) {
855+
s = State.SINGLE_QUOTE;
856+
sb.append(x);
857+
}
858+
} else if (x == '\\') {
859+
if (s == State.SINGLE_QUOTE) {
860+
s = State.ESCAPE_SINGLE_QUOTE;
861+
} else if (s == State.DOUBLE_QUOTE) {
862+
s = State.ESCAPE_DOUBLE_QUOTE;
863+
}
864+
} else {
865+
sb.append(x);
866+
}
867+
}
868+
}
869+
addArgument(pid, envArgs, sb);
870+
}
871+
return envArgs;
872+
}
873+
874+
private static void addArgument(String pid, ArrayList<String> envArgs, StringBuilder sb) {
875+
if (sb.length() > 0) {
876+
String arg = sb.toString().replace("$$", pid).replace("\\$", "$");
877+
envArgs.add(arg);
878+
sb.setLength(0);
879+
}
880+
}
881+
811882
private static boolean doEcho(@SuppressWarnings("unused") Context context) {
812883
return true;
813884
}

0 commit comments

Comments
 (0)