@@ -74,9 +74,11 @@ public static void main(String[] args) {
74
74
private String sulongLibraryPath = null ;
75
75
76
76
@ 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 ) {
78
78
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 );
80
82
List <String > subprocessArgs = new ArrayList <>();
81
83
programArgs = new ArrayList <>();
82
84
for (int i = 0 ; i < arguments .size (); i ++) {
@@ -201,6 +203,60 @@ protected List<String> preprocessArguments(List<String> arguments, Map<String, S
201
203
return unrecognized ;
202
204
}
203
205
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
+
204
260
private static void printShortHelp () {
205
261
print ("usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...\n " +
206
262
"Try `python -h' for more information." );
@@ -423,7 +479,10 @@ protected void printHelp(OptionCategory maxCategory) {
423
479
" str, bytes and datetime objects. It can also be set to an integer\n " +
424
480
" in the range [0,4294967295] to get hash values with a predictable seed.\n " +
425
481
"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." );
427
486
if (maxCategory .compareTo (OptionCategory .DEBUG ) >= 0 ) {
428
487
print ("\n GraalPython performance debugging options:\n " +
429
488
"-debug-perf : Enable tracing of Truffle compilations and its warnings\n " +
0 commit comments