Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Truffle] New system for options.
Browse files Browse the repository at this point in the history
chrisseaton committed Nov 25, 2016
1 parent b19ae98 commit ed6e12e
Showing 17 changed files with 388 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -778,7 +778,7 @@ private String grabOptionalValue() {

private static void checkProperties() {
for (String propertyName : System.getProperties().stringPropertyNames()) {
if (propertyName.startsWith("jruby.")) {
if (propertyName.startsWith("jruby.") && !propertyName.startsWith("jruby.truffle.")) {
if (!isPropertySupported(propertyName)) {
System.err.println("jruby: warning: unknown property " + propertyName);
}
2 changes: 1 addition & 1 deletion core/src/main/java/org/jruby/util/cli/Options.java
Original file line number Diff line number Diff line change
@@ -296,7 +296,7 @@ public class Options {

public static final Option<Integer> TRUFFLE_INSTRUMENTATION_SERVER_PORT = integer(TRUFFLE, "truffle.instrumentation_server_port", 0, "Port number to run an HTTP server on that provides instrumentation services");
public static final Option<Boolean> TRUFFLE_EXCEPTIONS_STORE_JAVA = bool(TRUFFLE, "truffle.exceptions.store_java", false, "Store the Java exception with the Ruby backtrace");
public static final Option<Boolean> TRUFFLE_EXCEPTIONS_PRINT_JAVA = bool(TRUFFLE, "truffle.exceptions.print_java", false, "Print Java exceptions at the point of translating them to Ruby exceptions.");
//public static final Option<Boolean> TRUFFLE_EXCEPTIONS_PRINT_JAVA = bool(TRUFFLE, "truffle.exceptions.print_java", false, "Print Java exceptions at the point of translating them to Ruby exceptions.");
public static final Option<Boolean> TRUFFLE_EXCEPTIONS_PRINT_UNCAUGHT_JAVA = bool(TRUFFLE, "truffle.exceptions.print_uncaught_java", false, "Print uncaught Java exceptions at the point of translating them to Ruby exceptions.");
public static final Option<Boolean> TRUFFLE_BACKTRACES_HIDE_CORE_FILES = bool(TRUFFLE, "truffle.backtraces.hide_core_files", true, "Hide core source files in backtraces, like MRI does.");
public static final Option<Boolean> TRUFFLE_BACKTRACES_INTERLEAVE_JAVA = bool(TRUFFLE, "truffle.backtraces.interleave_java", false, "Interleave Java stacktraces into the Ruby backtrace.");
4 changes: 2 additions & 2 deletions truffle/src/main/java/org/jruby/truffle/Options.java
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@
import static org.jruby.util.cli.Options.TRUFFLE_ENCODING_COMPATIBLE_QUERY_CACHE;
import static org.jruby.util.cli.Options.TRUFFLE_ENCODING_LOADED_CLASSES_CACHE;
import static org.jruby.util.cli.Options.TRUFFLE_EVAL_CACHE;
import static org.jruby.util.cli.Options.TRUFFLE_EXCEPTIONS_PRINT_JAVA;
//import static org.jruby.util.cli.Options.TRUFFLE_EXCEPTIONS_PRINT_JAVA;
import static org.jruby.util.cli.Options.TRUFFLE_EXCEPTIONS_PRINT_UNCAUGHT_JAVA;
import static org.jruby.util.cli.Options.TRUFFLE_EXCEPTIONS_STORE_JAVA;
import static org.jruby.util.cli.Options.TRUFFLE_HASH_PACKED_ARRAY_MAX;
@@ -159,7 +159,7 @@ public class Options {

public final int INSTRUMENTATION_SERVER_PORT = TRUFFLE_INSTRUMENTATION_SERVER_PORT.load();
public final boolean EXCEPTIONS_STORE_JAVA = TRUFFLE_EXCEPTIONS_STORE_JAVA.load();
public final boolean EXCEPTIONS_PRINT_JAVA = TRUFFLE_EXCEPTIONS_PRINT_JAVA.load();
//public final boolean EXCEPTIONS_PRINT_JAVA = TRUFFLE_EXCEPTIONS_PRINT_JAVA.load();
public final boolean EXCEPTIONS_PRINT_UNCAUGHT_JAVA = TRUFFLE_EXCEPTIONS_PRINT_UNCAUGHT_JAVA.load();
public final boolean BACKTRACES_HIDE_CORE_FILES = TRUFFLE_BACKTRACES_HIDE_CORE_FILES.load();
public final boolean BACKTRACES_INTERLEAVE_JAVA = TRUFFLE_BACKTRACES_INTERLEAVE_JAVA.load();
14 changes: 14 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/RubyContext.java
Original file line number Diff line number Diff line change
@@ -46,6 +46,8 @@
import org.jruby.truffle.language.methods.DeclarationContext;
import org.jruby.truffle.language.methods.InternalMethod;
import org.jruby.truffle.language.objects.shared.SharedObjects;
import org.jruby.truffle.options.NewOptions;
import org.jruby.truffle.options.OptionsBuilder;
import org.jruby.truffle.platform.NativePlatform;
import org.jruby.truffle.platform.NativePlatformFactory;
import org.jruby.truffle.stdlib.CoverageManager;
@@ -66,6 +68,8 @@ public class RubyContext extends ExecutionContext {

private final TruffleLanguage.Env env;

private final NewOptions newOptions;

private final RubyInstanceConfig instanceConfig;
private final String jrubyHome;
private String originalInputFile;
@@ -110,6 +114,12 @@ public class RubyContext extends ExecutionContext {
public RubyContext(RubyInstanceConfig instanceConfig, TruffleLanguage.Env env) {
this.instanceConfig = instanceConfig;
this.env = env;

final OptionsBuilder optionsBuilder = new OptionsBuilder();
optionsBuilder.set(env.getConfig());
optionsBuilder.set(System.getProperties());
newOptions = optionsBuilder.build();

this.jrubyHome = setupJRubyHome();
this.currentDirectory = System.getProperty("user.dir");

@@ -458,4 +468,8 @@ public InputStream getSyntaxCheckInputStream() {
public void setSyntaxCheckInputStream(InputStream syntaxCheckInputStream) {
this.syntaxCheckInputStream = syntaxCheckInputStream;
}

public NewOptions getNewOptions() {
return newOptions;
}
}
4 changes: 3 additions & 1 deletion truffle/src/main/java/org/jruby/truffle/RubyEngine.java
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.vm.PolyglotEngine;
import org.jruby.RubyInstanceConfig;
import org.jruby.truffle.options.OptionsCatalogue;
import org.jruby.truffle.platform.graal.Graal;
import org.jruby.util.cli.Options;

@@ -35,6 +36,7 @@ public RubyEngine(RubyInstanceConfig instanceConfig) {

engine = PolyglotEngine.newBuilder()
.config(RubyLanguage.MIME_TYPE, INSTANCE_CONFIG_KEY, instanceConfig)
.config(RubyLanguage.MIME_TYPE, OptionsCatalogue.ARGUMENTS.getName(), instanceConfig.getArgv())
.build();
Main.printTruffleTimeMetric("before-load-context");
context = engine.eval(loadSource("Truffle::Boot.context", "context")).as(RubyContext.class);
@@ -70,7 +72,7 @@ public int doCheckSyntax(InputStream in, String filename) {
boolean status = checkSyntax(in, filename);

// check other scripts specified on argv
for (String arg : context.getInstanceConfig().getArgv()) {
for (String arg : context.getNewOptions().ARGUMENTS) {
status = status && checkFileSyntax(arg);
}

Original file line number Diff line number Diff line change
@@ -133,7 +133,7 @@ public abstract static class OriginalArgvNode extends CoreMethodNode {
@TruffleBoundary
@Specialization
public DynamicObject originalArgv() {
final String[] argv = getContext().getInstanceConfig().getArgv();
final String[] argv = getContext().getNewOptions().ARGUMENTS;
final Object[] array = new Object[argv.length];

for (int n = 0; n < array.length; n++) {
Original file line number Diff line number Diff line change
@@ -100,7 +100,7 @@ public List<String> formatBacktrace(RubyContext context, DynamicObject exception
try {
lines.add(formatLine(activations, n, exception));
} catch (Exception e) {
if (context.getOptions().EXCEPTIONS_PRINT_JAVA) {
if (context.getNewOptions().EXCEPTIONS_PRINT_JAVA) {
e.printStackTrace();
}

Original file line number Diff line number Diff line change
@@ -74,7 +74,7 @@ public Object execute(VirtualFrame frame) {

@TruffleBoundary
private DynamicObject translate(ArithmeticException exception) {
if (getContext().getOptions().EXCEPTIONS_PRINT_JAVA) {
if (getContext().getNewOptions().EXCEPTIONS_PRINT_JAVA) {
exception.printStackTrace();
}

@@ -83,7 +83,7 @@ private DynamicObject translate(ArithmeticException exception) {

@TruffleBoundary
private DynamicObject translate(StackOverflowError error) {
if (getContext().getOptions().EXCEPTIONS_PRINT_JAVA) {
if (getContext().getNewOptions().EXCEPTIONS_PRINT_JAVA) {
error.printStackTrace();
}

@@ -92,7 +92,7 @@ private DynamicObject translate(StackOverflowError error) {

@TruffleBoundary
private DynamicObject translate(IllegalArgumentException exception) {
if (getContext().getOptions().EXCEPTIONS_PRINT_JAVA) {
if (getContext().getNewOptions().EXCEPTIONS_PRINT_JAVA) {
exception.printStackTrace();
}

@@ -107,7 +107,7 @@ private DynamicObject translate(IllegalArgumentException exception) {

@TruffleBoundary
private DynamicObject translate(UnsupportedSpecializationException exception) {
if (getContext().getOptions().EXCEPTIONS_PRINT_JAVA) {
if (getContext().getNewOptions().EXCEPTIONS_PRINT_JAVA) {
exception.printStackTrace();
}

@@ -175,7 +175,7 @@ private DynamicObject translate(UnsupportedSpecializationException exception) {

@TruffleBoundary
public DynamicObject translate(Throwable throwable) {
if (getContext().getOptions().EXCEPTIONS_PRINT_JAVA
if (getContext().getNewOptions().EXCEPTIONS_PRINT_JAVA
|| getContext().getOptions().EXCEPTIONS_PRINT_UNCAUGHT_JAVA) {
throwable.printStackTrace();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

public class BooleanOptionDescription extends OptionDescription {

private final boolean defaultValue;

public BooleanOptionDescription(String name, String description, boolean defaultValue) {
super(name, description);
this.defaultValue = defaultValue;
}

@Override
public Object getDefaultValue() {
return defaultValue;
}

@Override
public Object checkValue(Object value) {
if (value instanceof Boolean) {
return value;
} else if (value instanceof String) {
switch ((String) value) {
case "true":
return true;
case "false":
return false;
default:
throw new OptionTypeException();
}
} else {
throw new OptionTypeException();
}
}

}
25 changes: 25 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/options/NewOptions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

// This file would be automatically generated from the list of options in the text file.

public class NewOptions {

public final String[] ARGUMENTS;

public final boolean EXCEPTIONS_PRINT_JAVA;

NewOptions(OptionsBuilder builder) {
ARGUMENTS = builder.getOrDefault(OptionsCatalogue.ARGUMENTS);
EXCEPTIONS_PRINT_JAVA = builder.getOrDefault(OptionsCatalogue.EXCEPTIONS_PRINT_JAVA);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

public abstract class OptionDescription {

private final String name;
private final String description;

public OptionDescription(String name, String description) {
this.name = name;
this.description = description;
}

public String getName() {
return name;
}

public String getDescription() {
return description;
}

public abstract Object getDefaultValue();

public abstract Object checkValue(Object value);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

public class OptionTypeException extends UnsupportedOperationException {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class OptionsBuilder {

private final String LEGACY_PREFIX = "jruby.truffle.";

private final Map<OptionDescription, Object> options = new HashMap<>();

public void set(Properties properties) {
for (Map.Entry<Object, Object> property : properties.entrySet()) {
final String name = (String) property.getKey();

if (name.startsWith(LEGACY_PREFIX)) {
set(name.substring(LEGACY_PREFIX.length()), property.getValue());
}
}
}

public void set(Map<String, Object> properties) {
for (Map.Entry<String, Object> property : properties.entrySet()) {
set(property.getKey(), property.getValue());
}
}

private void set(String name, Object value) {
final OptionDescription description = OptionsCatalogue.fromName(name);

if (description == null) {
//throw new UnsupportedOperationException(name);

// Don't throw for now - not all the options are transalted across
return;
}

options.put(description, description.checkValue(value));
}

public NewOptions build() {
return new NewOptions(this);
}

<T> T getOrDefault(OptionDescription description) {
Object value = options.get(description);

if (value == null) {
value = description.getDefaultValue();
}

return (T) value;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

// This file would be automatically generated from the list of options in the text file.

public class OptionsCatalogue {

public static final OptionDescription ARGUMENTS = new StringArrayOptionDescription("arguments", "Foo bar baz", new String[0]);

public static final OptionDescription EXCEPTIONS_PRINT_JAVA = new BooleanOptionDescription("exceptions.print_java", "Foo baz bar", false);

public static OptionDescription fromName(String name) {
switch (name) {
case "arguments":
return ARGUMENTS;
case "exceptions.print_java":
return EXCEPTIONS_PRINT_JAVA;
default:
return null;
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

import java.util.ArrayList;
import java.util.List;

public class StringArrayOptionDescription extends OptionDescription {

private final String[] defaultValue;

public StringArrayOptionDescription(String name, String description, String[] defaultValue) {
super(name, description);
this.defaultValue = defaultValue;
}

@Override
public Object getDefaultValue() {
return defaultValue.clone();
}

@Override
public Object checkValue(Object value) {
if (value instanceof String[]) {
return value;
} else if (value instanceof String) {
return parseStringArray((String) value);
} else {
throw new OptionTypeException();
}
}

// Allows input such as [foo, "bar", 'baz']. Doesn't support escape sequences.

private String[] parseStringArray(String string) {
final List<String> values = new ArrayList<>();

final int start = 0;
final int startOfString = 1;
final int endOfString = 2;
final int endOfArray = 3;

int n = 0;
int state = start;
boolean array = false;

while (n < string.length()) {
while (n < string.length() && Character.isWhitespace(string.charAt(n))) {
n++;
}

if (n == string.length() && array && state != start && state != endOfArray) {
throw new OptionTypeException();
}

switch (state) {
case start:
if (string.charAt(n) == '[') {
n++;
array = true;
state = startOfString;
} else {
array = false;
state = startOfString;
}
break;

case startOfString:
final int startN;
final int endN;
if (string.charAt(n) == '"' || string.charAt(n) == '\'') {
final char quote = string.charAt(n);

n++;
startN = n;

while (n < string.length() && string.charAt(n) != quote) {
n++;
}

endN = n;

if (string.charAt(n) == quote){
n++;
} else {
throw new OptionTypeException();
}

state = endOfString;
} else {
startN = n;

while (n < string.length() && string.charAt(n) != ',') {
n++;
}

endN = n;

state = endOfString;
}
values.add(string.substring(startN, endN));
break;

case endOfString:
if (string.charAt(n) == ',') {
n++;
state = startOfString;
} else if (array && string.charAt(n) == ']') {
n++;
state = endOfArray;
} else {
throw new OptionTypeException();
}
break;

case endOfArray:
break;
}
}

return values.toArray(new String[values.size()]);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.options;

public class UnknownOptionException extends UnsupportedOperationException {

}
2 changes: 2 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/options/options.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ARGUMENTS arguments String[] [] "Foo bar baz"
EXCEPTIONS_PRINT_JAVA exceptions.print_java boolean false "Foo baz bar"

0 comments on commit ed6e12e

Please sign in to comment.