Skip to content

Commit 6d24f62

Browse files
committed
[GR-14896] Fix native launcher in JVM mode.
PullRequest: truffleruby/764
2 parents 3177212 + e050908 commit 6d24f62

File tree

6 files changed

+30
-44
lines changed

6 files changed

+30
-44
lines changed

src/launcher/java/org/truffleruby/launcher/CommandLineOptions.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import org.truffleruby.shared.options.StringArrayOptionType;
3535

3636
import java.util.ArrayList;
37+
import java.util.Collections;
38+
import java.util.HashMap;
3739
import java.util.List;
3840
import java.util.Map;
3941

@@ -43,23 +45,34 @@ public class CommandLineOptions {
4345
boolean showVersion = false;
4446
boolean showCopyright = false;
4547
ShowHelp showHelp = ShowHelp.NONE;
48+
/** Read the RUBYOPT and TRUFFLERUBYOPT environment variables */
49+
boolean readRubyOptEnv = true;
4650
/** What should be done after context is created */
4751
ExecutionAction executionAction = ExecutionAction.NONE;
4852
/** What should be done when no action is set */
4953
DefaultExecutionAction defaultExecutionAction = DefaultExecutionAction.IRB;
5054
/** A thing to be executed: a file, inline script, etc. Used by executionAction when applicable. */
5155
String toExecute = "";
5256

53-
private Map<String, String> options;
57+
/** This should not be modified, as otherwise when exec()-ing to JVM from a native launcher,
58+
* these options would be passed on the command line, which fails if they are experimental.
59+
* This would also cause parsing the options twice with the current Launcher design. */
60+
private final Map<String, String> polyglotOptions;
61+
private final Map<String, String> options;
5462
private String[] arguments;
5563
private final List<String> unknownArguments;
5664

57-
public CommandLineOptions(Map<String, String> options) {
58-
this.options = options;
59-
this.arguments = new String[]{};
65+
public CommandLineOptions(Map<String, String> polyglotOptions) {
66+
this.polyglotOptions = Collections.unmodifiableMap(polyglotOptions);
67+
this.options = new HashMap<>();
68+
this.arguments = new String[0];
6069
this.unknownArguments = new ArrayList<>();
6170
}
6271

72+
boolean isSetInPolyglotOptions(String optionName) {
73+
return polyglotOptions.containsKey(optionName);
74+
}
75+
6376
public Map<String, String> getOptions() {
6477
return options;
6578
}

src/launcher/java/org/truffleruby/launcher/CommandLineParser.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -599,15 +599,13 @@ private CommandLineException notImplemented(String option) {
599599
FEATURES.get("gem"));
600600

601601
FEATURES.put("frozen-string-literal",
602-
(processor, enable) -> processor.config.setOption(
603-
OptionsCatalog.FROZEN_STRING_LITERALS,
604-
enable));
602+
(processor, enable) -> processor.config.setOption(OptionsCatalog.FROZEN_STRING_LITERALS, enable));
605603

606604
FEATURES.put("frozen_string_literal",
607605
FEATURES.get("frozen-string-literal"));
608606

609607
FEATURES.put("rubyopt",
610-
(processor, enable) -> processor.config.setOption(OptionsCatalog.READ_RUBYOPT, enable));
608+
(processor, enable) -> processor.config.readRubyOptEnv = enable);
611609
}
612610

613611
private static Logger createLogger() {

src/launcher/java/org/truffleruby/launcher/RubyLauncher.java

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ protected List<String> preprocessArguments(List<String> args, Map<String, String
6868
final CommandLineParser argumentCommandLineParser = new CommandLineParser(args, config, true, false);
6969
argumentCommandLineParser.processArguments();
7070

71-
if ((boolean) config.getOption(OptionsCatalog.READ_RUBYOPT)) {
71+
if (config.readRubyOptEnv) {
7272
// Process RUBYOPT
7373
final List<String> rubyoptArgs = getArgsFromEnvVariable("RUBYOPT");
7474
new CommandLineParser(rubyoptArgs, config, false, true).processArguments();
@@ -89,7 +89,7 @@ protected List<String> preprocessArguments(List<String> args, Map<String, String
8989
* therefore this is not done on JVM.
9090
*/
9191
final int index = argumentCommandLineParser.getLastInterpreterArgumentIndex();
92-
args.add(index, "--read_rubyopt=false");
92+
args.add(index, "--disable=rubyopt");
9393
args.addAll(index + 1, rubyoptArgs);
9494
args.addAll(index + 1 + rubyoptArgs.size(), trufflerubyoptArgs);
9595
}
@@ -101,13 +101,6 @@ protected List<String> preprocessArguments(List<String> args, Map<String, String
101101
config.appendOptionValue(OptionsCatalog.LOAD_PATHS, path);
102102
}
103103

104-
if (isAOT()) {
105-
final String launcher = setRubyLauncher();
106-
if (launcher != null) {
107-
polyglotOptions.put(OptionsCatalog.LAUNCHER.getName(), launcher);
108-
}
109-
}
110-
111104
} catch (CommandLineException commandLineException) {
112105
System.err.println(TruffleRuby.SIMPLE_NAME + ": " + commandLineException.getMessage());
113106
if (commandLineException.isUsageError()) {
@@ -248,10 +241,17 @@ private static void debugPreInitialization() {
248241
}
249242

250243
private Context createContext(Context.Builder builder, CommandLineOptions config) {
251-
if (!config.getOptions().containsKey(OptionsCatalog.EMBEDDED.getName())) {
252-
builder.option(OptionsCatalog.EMBEDDED.getName(), Boolean.FALSE.toString());
244+
if (isAOT() && !config.isSetInPolyglotOptions(OptionsCatalog.LAUNCHER.getName())) {
245+
final String launcher = ProcessProperties.getExecutableName();
246+
builder.option(OptionsCatalog.LAUNCHER.getName(), launcher);
247+
}
248+
249+
if (!config.isSetInPolyglotOptions(OptionsCatalog.EMBEDDED.getName())) {
250+
builder.option(OptionsCatalog.EMBEDDED.getName(), "false");
253251
}
254252

253+
builder.options(config.getOptions());
254+
255255
builder.arguments(TruffleRuby.LANGUAGE_ID, config.getArguments());
256256

257257
return builder.build();
@@ -276,15 +276,6 @@ private static List<String> getPathListFromEnvVariable(String name) {
276276
return Collections.emptyList();
277277
}
278278

279-
private String setRubyLauncher() {
280-
if (String.class.cast(config.getOption(OptionsCatalog.LAUNCHER)).isEmpty()) {
281-
final String launcher = ProcessProperties.getExecutableName();
282-
config.setOption(OptionsCatalog.LAUNCHER, launcher);
283-
return launcher;
284-
}
285-
return null;
286-
}
287-
288279
private static void printPreRunInformation(CommandLineOptions config) {
289280
if (config.showVersion) {
290281
System.out.println(TruffleRuby.getVersionString(getImplementationNameFromEngine(), isAOT()));

src/main/java/org/truffleruby/options/Options.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ public class Options {
8080
public final boolean ARGV_GLOBALS;
8181
public final boolean IGNORE_LINES_BEFORE_RUBY_SHEBANG;
8282
public final boolean SYNTAX_CHECK;
83-
public final boolean READ_RUBYOPT;
8483
public final String[] ARGV_GLOBAL_VALUES;
8584
public final String[] ARGV_GLOBAL_FLAGS;
8685
public final boolean BUILDING_CORE_CEXTS;
@@ -207,7 +206,6 @@ public Options(Env env, OptionValues options) {
207206
ARGV_GLOBALS = options.get(OptionsCatalog.ARGV_GLOBALS_KEY);
208207
IGNORE_LINES_BEFORE_RUBY_SHEBANG = options.get(OptionsCatalog.IGNORE_LINES_BEFORE_RUBY_SHEBANG_KEY);
209208
SYNTAX_CHECK = options.get(OptionsCatalog.SYNTAX_CHECK_KEY);
210-
READ_RUBYOPT = options.get(OptionsCatalog.READ_RUBYOPT_KEY);
211209
ARGV_GLOBAL_VALUES = options.get(OptionsCatalog.ARGV_GLOBAL_VALUES_KEY);
212210
ARGV_GLOBAL_FLAGS = options.get(OptionsCatalog.ARGV_GLOBAL_FLAGS_KEY);
213211
BUILDING_CORE_CEXTS = options.get(OptionsCatalog.BUILDING_CORE_CEXTS_KEY);
@@ -393,8 +391,6 @@ public Object fromDescriptor(OptionDescriptor descriptor) {
393391
return IGNORE_LINES_BEFORE_RUBY_SHEBANG;
394392
case "ruby.syntax_check":
395393
return SYNTAX_CHECK;
396-
case "ruby.read_rubyopt":
397-
return READ_RUBYOPT;
398394
case "ruby.argv_global_values":
399395
return ARGV_GLOBAL_VALUES;
400396
case "ruby.argv_global_flags":

src/options.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ INTERNAL: # Options for debugging the TruffleRuby implementation
8585
SYNTAX_CHECK: [[syntax_check, -c], boolean, false, Do not execute just check syntax]
8686

8787
# Used internally for the launcher to communicate with the RubyContext
88-
READ_RUBYOPT: [read_rubyopt, boolean, true, Read RUBYOPT and TRUFFLERUBYOPT environment variables]
8988
ARGV_GLOBAL_VALUES: [argv_global_values, string-array, [], Parsed options from script argv with a value]
9089
ARGV_GLOBAL_FLAGS: [argv_global_flags, string-array, [], Parsed options from script argv acting as flags (no value)]
9190
BUILDING_CORE_CEXTS: [building.core.cexts, boolean, false, 'Used while building TruffleRuby to build core C extensions']

src/shared/java/org/truffleruby/shared/options/OptionsCatalog.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ public class OptionsCatalog {
7878
public static final OptionKey<Boolean> ARGV_GLOBALS_KEY = new OptionKey<>(false);
7979
public static final OptionKey<Boolean> IGNORE_LINES_BEFORE_RUBY_SHEBANG_KEY = new OptionKey<>(false);
8080
public static final OptionKey<Boolean> SYNTAX_CHECK_KEY = new OptionKey<>(false);
81-
public static final OptionKey<Boolean> READ_RUBYOPT_KEY = new OptionKey<>(true);
8281
public static final OptionKey<String[]> ARGV_GLOBAL_VALUES_KEY = new OptionKey<>(new String[]{}, StringArrayOptionType.INSTANCE);
8382
public static final OptionKey<String[]> ARGV_GLOBAL_FLAGS_KEY = new OptionKey<>(new String[]{}, StringArrayOptionType.INSTANCE);
8483
public static final OptionKey<Boolean> BUILDING_CORE_CEXTS_KEY = new OptionKey<>(false);
@@ -546,13 +545,6 @@ public class OptionsCatalog {
546545
.stability(OptionStability.EXPERIMENTAL)
547546
.build();
548547

549-
public static final OptionDescriptor READ_RUBYOPT = OptionDescriptor
550-
.newBuilder(READ_RUBYOPT_KEY, "ruby.read_rubyopt")
551-
.help("Read RUBYOPT and TRUFFLERUBYOPT environment variables")
552-
.category(OptionCategory.INTERNAL)
553-
.stability(OptionStability.EXPERIMENTAL)
554-
.build();
555-
556548
public static final OptionDescriptor ARGV_GLOBAL_VALUES = OptionDescriptor
557549
.newBuilder(ARGV_GLOBAL_VALUES_KEY, "ruby.argv_global_values")
558550
.help("Parsed options from script argv with a value")
@@ -1138,8 +1130,6 @@ public static OptionDescriptor fromName(String name) {
11381130
return IGNORE_LINES_BEFORE_RUBY_SHEBANG;
11391131
case "ruby.syntax_check":
11401132
return SYNTAX_CHECK;
1141-
case "ruby.read_rubyopt":
1142-
return READ_RUBYOPT;
11431133
case "ruby.argv_global_values":
11441134
return ARGV_GLOBAL_VALUES;
11451135
case "ruby.argv_global_flags":
@@ -1377,7 +1367,6 @@ public static OptionDescriptor[] allDescriptors() {
13771367
POLYGLOT_STDIO,
13781368
PREINITIALIZATION,
13791369
PRIMITIVE_CALLERS_ALWAYS_CLONE,
1380-
READ_RUBYOPT,
13811370
REGEXP_INSTRUMENT_CREATION,
13821371
REGEXP_INSTRUMENT_MATCH,
13831372
REQUIRED_LIBRARIES,

0 commit comments

Comments
 (0)