Skip to content

Commit 014eb9a

Browse files
committed
support GRAAL_PYTHON_OPTIONS environment variable for default arguments that should be picked up
1 parent bf1520d commit 014eb9a

File tree

1 file changed

+62
-3
lines changed

1 file changed

+62
-3
lines changed

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

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,11 @@ public static void main(String[] args) {
7474
private String sulongLibraryPath = null;
7575

7676
@Override
77-
protected List<String> preprocessArguments(List<String> arguments, Map<String, String> polyglotOptions) {
77+
protected List<String> preprocessArguments(List<String> givenArguments, Map<String, String> polyglotOptions) {
7878
ArrayList<String> unrecognized = new ArrayList<>();
79-
List<String> inputArgs = new ArrayList<>(arguments);
79+
ArrayList<String> inputArgs = new ArrayList<>(getDefaultEnvironmentArgs());
80+
inputArgs.addAll(givenArguments);
81+
List<String> arguments = new ArrayList<>(inputArgs);
8082
List<String> subprocessArgs = new ArrayList<>();
8183
programArgs = new ArrayList<>();
8284
for (int i = 0; i < arguments.size(); i++) {
@@ -201,6 +203,60 @@ protected List<String> preprocessArguments(List<String> arguments, Map<String, S
201203
return unrecognized;
202204
}
203205

206+
private static enum State {
207+
NORMAL,
208+
SINGLE_QUOTE,
209+
DOUBLE_QUOTE,
210+
ESCAPE_SINGLE_QUOTE,
211+
ESCAPE_DOUBLE_QUOTE,
212+
}
213+
214+
private static List<String> getDefaultEnvironmentArgs() {
215+
String envArgsOpt = System.getenv("GRAAL_PYTHON_OPTIONS");
216+
ArrayList<String> envArgs = new ArrayList<>();
217+
State s = State.NORMAL;
218+
StringBuilder sb = new StringBuilder();
219+
if (envArgsOpt != null) {
220+
for (char x : envArgsOpt.toCharArray()) {
221+
if (s == State.NORMAL && Character.isWhitespace(x)) {
222+
if (sb.length() > 0) {
223+
envArgs.add(sb.toString());
224+
sb.setLength(0);
225+
}
226+
} else {
227+
if (x == '"') {
228+
if (s == State.NORMAL) {
229+
s = State.DOUBLE_QUOTE;
230+
} else if (s == State.DOUBLE_QUOTE) {
231+
s = State.NORMAL;
232+
} else if (s == State.ESCAPE_DOUBLE_QUOTE) {
233+
s = State.DOUBLE_QUOTE;
234+
sb.append(x);
235+
}
236+
} else if (x == '\'') {
237+
if (s == State.NORMAL) {
238+
s = State.SINGLE_QUOTE;
239+
} else if (s == State.SINGLE_QUOTE) {
240+
s = State.NORMAL;
241+
} else if (s == State.ESCAPE_SINGLE_QUOTE) {
242+
s = State.SINGLE_QUOTE;
243+
sb.append(x);
244+
}
245+
} else if (x == '\\') {
246+
if (s == State.SINGLE_QUOTE) {
247+
s = State.ESCAPE_SINGLE_QUOTE;
248+
} else if (s == State.DOUBLE_QUOTE) {
249+
s = State.ESCAPE_DOUBLE_QUOTE;
250+
}
251+
} else {
252+
sb.append(x);
253+
}
254+
}
255+
}
256+
}
257+
return envArgs;
258+
}
259+
204260
private static void printShortHelp() {
205261
print("usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...\n" +
206262
"Try `python -h' for more information.");
@@ -423,7 +479,10 @@ protected void printHelp(OptionCategory maxCategory) {
423479
" str, bytes and datetime objects. It can also be set to an integer\n" +
424480
" in the range [0,4294967295] to get hash values with a predictable seed.\n" +
425481
"SULONG_LIBRARY_PATH: Specifies the library path for Sulong.\n" +
426-
" This is required when starting subprocesses of python.");
482+
" This is required when starting subprocesses of python." +
483+
"GRAAL_PYTHON_OPTIONS: This environment variable can include default options that\n" +
484+
" are always passed to the launcher. These are not shell expanded and given to\n" +
485+
" the launcher as-is.");
427486
if (maxCategory.compareTo(OptionCategory.DEBUG) >= 0) {
428487
print("\nGraalPython performance debugging options:\n" +
429488
"-debug-perf : Enable tracing of Truffle compilations and its warnings\n" +

0 commit comments

Comments
 (0)