@@ -88,7 +88,8 @@ public static void main(String[] args) {
88
88
@ Override
89
89
protected List <String > preprocessArguments (List <String > givenArgs , Map <String , String > polyglotOptions ) {
90
90
ArrayList <String > unrecognized = new ArrayList <>();
91
- ArrayList <String > inputArgs = new ArrayList <>();
91
+ List <String > defaultEnvironmentArgs = getDefaultEnvironmentArgs ();
92
+ ArrayList <String > inputArgs = new ArrayList <>(defaultEnvironmentArgs );
92
93
inputArgs .addAll (givenArgs );
93
94
givenArguments = new ArrayList <>(inputArgs );
94
95
List <String > arguments = new ArrayList <>(inputArgs );
@@ -576,6 +577,10 @@ protected void printHelp(OptionCategory maxCategory) {
576
577
" as specifying the -R option: a random value is used to seed the hashes of\n " +
577
578
" str, bytes and datetime objects. It can also be set to an integer\n " +
578
579
" 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 " +
579
584
(wantsExperimental ? "\n Arguments specific to the Graal Python launcher:\n " +
580
585
"--show-version : print the Python version number and continue.\n " +
581
586
"-CC : run the C compiler used for generating GraalPython C extensions.\n " +
@@ -808,6 +813,72 @@ private static final class ExitException extends RuntimeException {
808
813
}
809
814
}
810
815
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
+
811
882
private static boolean doEcho (@ SuppressWarnings ("unused" ) Context context ) {
812
883
return true ;
813
884
}
0 commit comments