Skip to content

Commit

Permalink
Showing 26 changed files with 513 additions and 328 deletions.
7 changes: 4 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -24,9 +24,10 @@
build
build.properties
build_graph.png
mx*/*pyc
mx*/env
mxbuild
/mx.jruby/*pyc
/mx.jruby/env
/mxbuild
/mx.imports
core/src/main/java/org/jruby/runtime/Constants.java
dependency-reduced-pom.xml
dev_null
176 changes: 88 additions & 88 deletions lib/ruby/truffle/cext/ruby.h
Original file line number Diff line number Diff line change
@@ -88,66 +88,66 @@ void rb_free_tmp_buffer(volatile VALUE *buffer_pointer);
// Types

enum ruby_value_type {
RUBY_T_NONE = 0x00,

RUBY_T_OBJECT = 0x01,
RUBY_T_CLASS = 0x02,
RUBY_T_MODULE = 0x03,
RUBY_T_FLOAT = 0x04,
RUBY_T_STRING = 0x05,
RUBY_T_REGEXP = 0x06,
RUBY_T_ARRAY = 0x07,
RUBY_T_HASH = 0x08,
RUBY_T_STRUCT = 0x09,
RUBY_T_BIGNUM = 0x0a,
RUBY_T_FILE = 0x0b,
RUBY_T_DATA = 0x0c,
RUBY_T_MATCH = 0x0d,
RUBY_T_COMPLEX = 0x0e,
RUBY_T_RATIONAL = 0x0f,

RUBY_T_NIL = 0x11,
RUBY_T_TRUE = 0x12,
RUBY_T_FALSE = 0x13,
RUBY_T_SYMBOL = 0x14,
RUBY_T_FIXNUM = 0x15,
RUBY_T_UNDEF = 0x16,

RUBY_T_IMEMO = 0x1a,
RUBY_T_NODE = 0x1b,
RUBY_T_ICLASS = 0x1c,
RUBY_T_ZOMBIE = 0x1d,

RUBY_T_MASK = 0x1f
RUBY_T_NONE = 0x00,

RUBY_T_OBJECT = 0x01,
RUBY_T_CLASS = 0x02,
RUBY_T_MODULE = 0x03,
RUBY_T_FLOAT = 0x04,
RUBY_T_STRING = 0x05,
RUBY_T_REGEXP = 0x06,
RUBY_T_ARRAY = 0x07,
RUBY_T_HASH = 0x08,
RUBY_T_STRUCT = 0x09,
RUBY_T_BIGNUM = 0x0a,
RUBY_T_FILE = 0x0b,
RUBY_T_DATA = 0x0c,
RUBY_T_MATCH = 0x0d,
RUBY_T_COMPLEX = 0x0e,
RUBY_T_RATIONAL = 0x0f,

RUBY_T_NIL = 0x11,
RUBY_T_TRUE = 0x12,
RUBY_T_FALSE = 0x13,
RUBY_T_SYMBOL = 0x14,
RUBY_T_FIXNUM = 0x15,
RUBY_T_UNDEF = 0x16,

RUBY_T_IMEMO = 0x1a,
RUBY_T_NODE = 0x1b,
RUBY_T_ICLASS = 0x1c,
RUBY_T_ZOMBIE = 0x1d,

RUBY_T_MASK = 0x1f
};

#define T_NONE RUBY_T_NONE
#define T_NIL RUBY_T_NIL
#define T_OBJECT RUBY_T_OBJECT
#define T_CLASS RUBY_T_CLASS
#define T_ICLASS RUBY_T_ICLASS
#define T_MODULE RUBY_T_MODULE
#define T_FLOAT RUBY_T_FLOAT
#define T_STRING RUBY_T_STRING
#define T_REGEXP RUBY_T_REGEXP
#define T_ARRAY RUBY_T_ARRAY
#define T_HASH RUBY_T_HASH
#define T_STRUCT RUBY_T_STRUCT
#define T_BIGNUM RUBY_T_BIGNUM
#define T_FILE RUBY_T_FILE
#define T_FIXNUM RUBY_T_FIXNUM
#define T_TRUE RUBY_T_TRUE
#define T_FALSE RUBY_T_FALSE
#define T_DATA RUBY_T_DATA
#define T_MATCH RUBY_T_MATCH
#define T_SYMBOL RUBY_T_SYMBOL
#define T_NONE RUBY_T_NONE
#define T_NIL RUBY_T_NIL
#define T_OBJECT RUBY_T_OBJECT
#define T_CLASS RUBY_T_CLASS
#define T_ICLASS RUBY_T_ICLASS
#define T_MODULE RUBY_T_MODULE
#define T_FLOAT RUBY_T_FLOAT
#define T_STRING RUBY_T_STRING
#define T_REGEXP RUBY_T_REGEXP
#define T_ARRAY RUBY_T_ARRAY
#define T_HASH RUBY_T_HASH
#define T_STRUCT RUBY_T_STRUCT
#define T_BIGNUM RUBY_T_BIGNUM
#define T_FILE RUBY_T_FILE
#define T_FIXNUM RUBY_T_FIXNUM
#define T_TRUE RUBY_T_TRUE
#define T_FALSE RUBY_T_FALSE
#define T_DATA RUBY_T_DATA
#define T_MATCH RUBY_T_MATCH
#define T_SYMBOL RUBY_T_SYMBOL
#define T_RATIONAL RUBY_T_RATIONAL
#define T_COMPLEX RUBY_T_COMPLEX
#define T_IMEMO RUBY_T_IMEMO
#define T_UNDEF RUBY_T_UNDEF
#define T_NODE RUBY_T_NODE
#define T_ZOMBIE RUBY_T_ZOMBIE
#define T_MASK RUBY_T_MASK
#define T_IMEMO RUBY_T_IMEMO
#define T_UNDEF RUBY_T_UNDEF
#define T_NODE RUBY_T_NODE
#define T_ZOMBIE RUBY_T_ZOMBIE
#define T_MASK RUBY_T_MASK

int rb_type(VALUE value);
#define TYPE(value) rb_type((VALUE) (value))
@@ -171,10 +171,10 @@ VALUE rb_jt_get_Qfalse(void);
VALUE rb_jt_get_Qtrue(void);
VALUE rb_jt_get_Qnil(void);

#define Qundef rb_jt_get_Qundef()
#define Qfalse rb_jt_get_Qfalse()
#define Qtrue rb_jt_get_Qtrue()
#define Qnil rb_jt_get_Qnil()
#define Qundef rb_jt_get_Qundef()
#define Qfalse rb_jt_get_Qfalse()
#define Qtrue rb_jt_get_Qtrue()
#define Qnil rb_jt_get_Qnil()

VALUE rb_jt_get_cObject(void);
VALUE rb_jt_get_cArray(void);
@@ -187,16 +187,16 @@ VALUE rb_jt_get_mWaitReadable(void);
VALUE rb_jt_get_mWaitWritable(void);
VALUE rb_jt_get_mComparable(void);

#define rb_cObject rb_jt_get_cObject()
#define rb_cArray rb_jt_get_cArray()
#define rb_cHash rb_jt_get_cHash()
#define rb_mKernel rb_jt_get_mKernel()
#define rb_cProc rb_jt_get_cProc()
#define rb_cTime rb_jt_get_cTime()
#define rb_mEnumerable rb_jt_get_mEnumerable()
#define rb_mWaitReadable rb_jt_get_mWaitReadable()
#define rb_mWaitWritable rb_jt_get_mWaitWritable()
#define rb_mComparable rb_jt_get_mComparable()
#define rb_cObject rb_jt_get_cObject()
#define rb_cArray rb_jt_get_cArray()
#define rb_cHash rb_jt_get_cHash()
#define rb_mKernel rb_jt_get_mKernel()
#define rb_cProc rb_jt_get_cProc()
#define rb_cTime rb_jt_get_cTime()
#define rb_mEnumerable rb_jt_get_mEnumerable()
#define rb_mWaitReadable rb_jt_get_mWaitReadable()
#define rb_mWaitWritable rb_jt_get_mWaitWritable()
#define rb_mComparable rb_jt_get_mComparable()

VALUE rb_jt_get_eException(void);
VALUE rb_jt_get_eRuntimeError(void);
@@ -207,14 +207,14 @@ VALUE rb_jt_get_eArgError(void);
VALUE rb_jt_get_eRangeError(void);
VALUE rb_jt_get_eNotImpError(void);

#define rb_eException rb_jt_get_eException()
#define rb_eRuntimeError rb_jt_get_eRuntimeError()
#define rb_eStandardError rb_jt_get_eStandardError()
#define rb_eNoMemError rb_jt_get_eNoMemError()
#define rb_eTypeError rb_jt_get_eTypeError()
#define rb_eArgError rb_jt_get_eArgError()
#define rb_eRangeError rb_jt_get_eRangeError()
#define rb_eNotImpError rb_jt_get_eNotImpError()
#define rb_eException rb_jt_get_eException()
#define rb_eRuntimeError rb_jt_get_eRuntimeError()
#define rb_eStandardError rb_jt_get_eStandardError()
#define rb_eNoMemError rb_jt_get_eNoMemError()
#define rb_eTypeError rb_jt_get_eTypeError()
#define rb_eArgError rb_jt_get_eArgError()
#define rb_eRangeError rb_jt_get_eRangeError()
#define rb_eNotImpError rb_jt_get_eNotImpError()

// Conversions

@@ -327,16 +327,16 @@ double RFLOAT_VALUE(VALUE value);

// String

#define PRI_VALUE_PREFIX "l"
#define PRI_LONG_PREFIX "l"
#define PRI_64_PREFIX PRI_LONG_PREFIX
#define RUBY_PRI_VALUE_MARK "\v"
#define PRIdVALUE PRI_VALUE_PREFIX"d"
#define PRIoVALUE PRI_VALUE_PREFIX"o"
#define PRIuVALUE PRI_VALUE_PREFIX"u"
#define PRIxVALUE PRI_VALUE_PREFIX"x"
#define PRIXVALUE PRI_VALUE_PREFIX"X"
#define PRIsVALUE PRI_VALUE_PREFIX"i" RUBY_PRI_VALUE_MARK
#define PRI_VALUE_PREFIX "l"
#define PRI_LONG_PREFIX "l"
#define PRI_64_PREFIX PRI_LONG_PREFIX
#define RUBY_PRI_VALUE_MARK "\v"
#define PRIdVALUE PRI_VALUE_PREFIX"d"
#define PRIoVALUE PRI_VALUE_PREFIX"o"
#define PRIuVALUE PRI_VALUE_PREFIX"u"
#define PRIxVALUE PRI_VALUE_PREFIX"x"
#define PRIXVALUE PRI_VALUE_PREFIX"X"
#define PRIsVALUE PRI_VALUE_PREFIX"i" RUBY_PRI_VALUE_MARK

char *RSTRING_PTR(VALUE string);
int rb_str_len(VALUE string);
Original file line number Diff line number Diff line change
@@ -80,6 +80,7 @@ TestGenerationPrefix::WithMountedEngine:
ActionController::LiveStreamTest:
- test_exception_callback_when_committed
- test_async_stream # fails on travis
- test_abort_with_full_buffer # fails intermittently on CI
ApplicationIntegrationTest:
- test_missing_route_helper_after_controller_access
- test_missing_route_helper_before_controller_access
3 changes: 2 additions & 1 deletion lib/ruby/truffle/jruby+truffle/lib/truffle/config.rb
Original file line number Diff line number Diff line change
@@ -134,7 +134,8 @@ def gem(gem_name, *requirements)
end
# activate
require "minitest/reporters"
Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
reporter_class = ENV["CI"] ? Minitest::Reporters::SpecReporter : Minitest::Reporters::ProgressReporter
Minitest::Reporters.use! reporter_class.new
RUBY
}.reduce({}) do |h, (k, v)|
file_name = format '%s.rb', k
17 changes: 10 additions & 7 deletions lib/ruby/truffle/truffle/openssl.rb
Original file line number Diff line number Diff line change
@@ -6,11 +6,14 @@
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

# If loaded directly simulate as it was not found, it can added only
# explicitly by loading openssl-stubs which makes it look like
# openssl was loaded.

load_error = LoadError.new("cannot load such file -- openssl")
load_error.instance_variable_set :@path, 'openssl'
raise load_error
if ENV['JRUBY_TRUFFLE_NATIVE_OPENSSL']
require_relative '../openssl/openssl'
else
# If loaded directly simulate as it was not found, it can added only
# explicitly by loading openssl-stubs which makes it look like
# openssl was loaded.

load_error = LoadError.new("cannot load such file -- openssl")
load_error.instance_variable_set :@path, 'openssl'
raise load_error
end
381 changes: 210 additions & 171 deletions mx.jruby/mx_jruby.py

Large diffs are not rendered by default.

152 changes: 100 additions & 52 deletions mx.jruby/suite.py
Original file line number Diff line number Diff line change
@@ -6,8 +6,23 @@
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

def mavenLib(mavenDep, sha1):
groupId, artifactId, version = mavenDep.split(':')
args = (groupId.replace('.', '/'), artifactId, version, artifactId, version)
url = "https://search.maven.org/remotecontent?filepath=%s/%s/%s/%s-%s.jar" % args
return {
"urls": [ url ],
"sha1": sha1,
"maven": {
"groupId": groupId,
"artifactId": artifactId,
"version": version,
},
"license": "EPL", # fake
}

suite = {
"mxversion": "5.31.4",
"mxversion": "5.36.1",
"name": "jrubytruffle",
"defaultLicense": "EPL",

@@ -17,104 +32,137 @@
"name": "truffle",
"version": "0f666d1a0c4eabc0d44d1a2ad75cebd3ea6dbadb",
"urls": [
{"url": "https://github.com/graalvm/truffle.git",
"kind": "git"},
{"url": "https://github.com/graalvm/truffle.git", "kind": "git"},
{"url": "https://curio.ssw.jku.at/nexus/content/repositories/snapshots", "kind": "binary"},
]
},
],
},
"libraries": {
"RUBY_COMPLETE": {
"path": "maven/jruby-complete/target/jruby-complete-graal-vm.jar",
"sha1": "NOCHECK",
"optional":"true",
"license": "EPL"
},
"RUBY_TRUFFLE": {
"path": "lib/jruby-truffle.jar",
"sha1": "NOCHECK",
"optional":"true",
"license": "EPL"

"licenses": {
"EPL": {
"name": "EPL",
"url": "https://opensource.org/licenses/EPL-1.0",
},
},

"libraries": {

# ------------- Libraries -------------

"ANTLR4_MAIN": mavenLib(
"org.antlr:antlr4:4.5.1-1",
"a8867c83a73791cf30e30de4cf5d0c9a5f0dfdab"),

"ANTLR4_RUNTIME": mavenLib(
"org.antlr:antlr4-runtime:4.5.1-1",
"66144204f9d6d7d3f3f775622c2dd7e9bd511d97"),

"SNAKEYAML": mavenLib(
"org.yaml:snakeyaml:1.14",
"c2df91929ed06a25001939929bff5120e0ea3fd4"),
},

"projects": {

# ------------- Projects -------------

"jruby-ruby": {
"subDir": "lib/ruby",
"class": "MavenProject",
"build": "true",
"prefix": "lib/ruby/",
"jruby-core": {
"class": "JRubyCoreMavenProject",
"sourceDirs": [ "core/src/main/java" ],
"watch": [ "core/src" ],
"jar": "lib/jruby.jar",
},

"jruby-antlr": {
"class": "AntlrProject",
"sourceDir": "truffle/src/main/antlr4",
"outputDir": "truffle/target/generated-sources/antlr4",
"grammars": [ "org/jruby/truffle/core/format/pack/Pack.g4" ],
"dependencies": [ "ANTLR4_RUNTIME" ],
},

"jruby-truffle": {
"dir": "truffle",
"sourceDirs": [
"src/main/java",
"target/generated-sources/antlr4",
],
"dependencies": [
"jruby-core",
"jruby-antlr",
"truffle:TRUFFLE_API",
"truffle:TRUFFLE_DEBUG",
"ANTLR4_RUNTIME",
"SNAKEYAML",
],
"annotationProcessors": ["truffle:TRUFFLE_DSL_PROCESSOR"],
"javaCompliance": "1.8",
"workingSets": "JRubyTruffle",
},

"jruby-truffle-ruby": {
"class": "ArchiveProject",
"outputDir": "truffle/src/main/ruby",
"prefix": "jruby-truffle",
},

# Depends on jruby-core extracting jni libs in lib/jni
"jruby-lib-jni": {
"subDir": "lib/jni",
"class": "MavenProject",
"prefix": "lib/jni/",
"dependencies": [
"truffle:TRUFFLE_API",
"truffle:TRUFFLE_DEBUG",
],
"class": "ArchiveProject",
"outputDir": "lib/jni",
"prefix": "lib/jni",
"dependencies": [ "jruby-core" ],
},

# Depends on jruby-core installing gems in lib/ruby
"jruby-lib-ruby": {
"class": "ArchiveProject",
"outputDir": "lib/ruby",
"prefix": "lib/ruby",
"dependencies": [ "jruby-core" ],
},

"jruby-licences": {
"subDir": "licenses",
"class": "LicensesProject",
"build": "true",
"prefix": "licenses",
"dependencies": [
"truffle:TRUFFLE_API",
"truffle:TRUFFLE_DEBUG",
],
},
},
"licenses": {
"EPL": {
"name": "EPL",
"url": "https://opensource.org/licenses/EPL-1.0",
"outputDir": "",
"prefix": "",
},
},

"distributions": {

# ------------- Distributions -------------

"RUBY": {
"mainClass": "org.jruby.Main",
"dependencies": [
"RUBY_COMPLETE",
"RUBY_TRUFFLE"
"jruby-core",
"jruby-truffle",
"jruby-truffle-ruby",
],
"exclude": [
"truffle:JLINE",
],
"distDependencies": [
"RUBY-ZIP",
"truffle:TRUFFLE_API",
"truffle:TRUFFLE_DEBUG",
],
"description": "JRuby+Truffle",
"license": "EPL"
},

# Set of extra files to extract to run Ruby
"RUBY-ZIP": {
"native": True, # Not Java
"relpath": True,
"dependencies": [
"jruby-ruby",
"jruby-lib-jni",
"jruby-lib-ruby",
"jruby-licences",
],
"exclude": [
"truffle:JLINE",
],
"distDependencies": [
"truffle:TRUFFLE_API",
"truffle:TRUFFLE_DEBUG",
],
"description": "JRuby+Truffle Native Libs",
"license": "EPL"
},

},
}
8 changes: 8 additions & 0 deletions spec/ruby/core/kernel/select_spec.rb
Original file line number Diff line number Diff line change
@@ -9,4 +9,12 @@

describe "Kernel.select" do
it "needs to be reviewed for spec completeness"

it 'does not block when timeout is 0' do
IO.pipe do |read, write|
IO.select([read], [], [], 0).should == nil
write.write 'data'
IO.select([read], [], [], 0).should == [[read], [], []]
end
end
end
2 changes: 1 addition & 1 deletion truffle/src/main/c/cext/ruby.c
Original file line number Diff line number Diff line change
@@ -284,7 +284,7 @@ VALUE rb_jt_obj_taint(VALUE object) {
}

bool rb_jt_obj_taintable_p(VALUE object) {
return truffle_invoke_b(RUBY_CEXT, "RB_OBJ_TAINTED", object);
return truffle_invoke_b(RUBY_CEXT, "RB_OBJ_TAINTABLE", object);
}

bool rb_jt_obj_tainted_p(VALUE object) {
1 change: 1 addition & 0 deletions truffle/src/main/java/org/jruby/truffle/RubyContext.java
Original file line number Diff line number Diff line change
@@ -287,6 +287,7 @@ public LexicalScope getRootLexicalScope() {
return rootLexicalScope;
}

@Override
public CompilerOptions getCompilerOptions() {
return compilerOptions;
}
Original file line number Diff line number Diff line change
@@ -237,6 +237,7 @@ public Object appendValue(Object store, int index, Object value) {
}
}

@Override
public Object finish(Object store, int length) {
return store;
}
@@ -309,6 +310,7 @@ public Object appendValue(Object store, int index, Object value) {
return appendValueFallback(store, index, value, expectedLength);
}

@Override
public Object finish(Object store, int length) {
return store;
}
@@ -384,6 +386,7 @@ public Object appendValue(Object store, int index, Object value) {
}
}

@Override
public Object finish(Object store, int length) {
return store;
}
@@ -497,6 +500,7 @@ public Object appendValue(Object store, int index, Object value) {
return store;
}

@Override
public Object finish(Object store, int length) {
return store;
}
Original file line number Diff line number Diff line change
@@ -33,6 +33,7 @@ public boolean isDefaultValue(Object value) {

public abstract ArrayMirror newMirror(DynamicObject array);

@Override
public abstract String toString();

public ArrayStrategy generalize(ArrayStrategy other) {
@@ -114,26 +115,32 @@ private static class IntArrayStrategy extends ArrayStrategy {

static final ArrayStrategy INSTANCE = new IntArrayStrategy();

@Override
public Class<?> type() {
return Integer.class;
}

@Override
public boolean canStore(Class<?> type) {
return type == Integer.class;
}

@Override
public boolean accepts(Object value) {
return value instanceof Integer;
}

@Override
public boolean specializesFor(Object value) {
return value instanceof Integer;
}

@Override
public boolean isDefaultValue(Object value) {
return (int) value == 0;
}

@Override
public boolean matches(DynamicObject array) {
return ArrayGuards.isIntArray(array);
}
@@ -150,14 +157,17 @@ public ArrayStrategy generalize(ArrayStrategy other) {
}
}

@Override
public ArrayMirror newArray(int size) {
return new IntegerArrayMirror(new int[size]);
}

@Override
public ArrayMirror newMirror(DynamicObject array) {
return new IntegerArrayMirror((int[]) Layouts.ARRAY.getStore(array));
}

@Override
public String toString() {
return "int[]";
}
@@ -168,38 +178,47 @@ private static class LongArrayStrategy extends ArrayStrategy {

static final ArrayStrategy INSTANCE = new LongArrayStrategy();

@Override
public Class<?> type() {
return Long.class;
}

@Override
public boolean canStore(Class<?> type) {
return type == Long.class || type == Integer.class;
}

@Override
public boolean accepts(Object value) {
return value instanceof Long;
}

@Override
public boolean specializesFor(Object value) {
return value instanceof Long;
}

@Override
public boolean isDefaultValue(Object value) {
return (long) value == 0L;
}

@Override
public boolean matches(DynamicObject array) {
return ArrayGuards.isLongArray(array);
}

@Override
public ArrayMirror newArray(int size) {
return new LongArrayMirror(new long[size]);
}

@Override
public ArrayMirror newMirror(DynamicObject array) {
return new LongArrayMirror((long[]) Layouts.ARRAY.getStore(array));
}

@Override
public String toString() {
return "long[]";
}
@@ -210,38 +229,47 @@ private static class DoubleArrayStrategy extends ArrayStrategy {

static final ArrayStrategy INSTANCE = new DoubleArrayStrategy();

@Override
public Class<?> type() {
return Double.class;
}

@Override
public boolean canStore(Class<?> type) {
return type == Double.class;
}

@Override
public boolean accepts(Object value) {
return value instanceof Double;
}

@Override
public boolean specializesFor(Object value) {
return value instanceof Double;
}

@Override
public boolean isDefaultValue(Object value) {
return (double) value == 0.0;
}

@Override
public boolean matches(DynamicObject array) {
return ArrayGuards.isDoubleArray(array);
}

@Override
public ArrayMirror newArray(int size) {
return new DoubleArrayMirror(new double[size]);
}

@Override
public ArrayMirror newMirror(DynamicObject array) {
return new DoubleArrayMirror((double[]) Layouts.ARRAY.getStore(array));
}

@Override
public String toString() {
return "double[]";
}
@@ -252,38 +280,47 @@ private static class ObjectArrayStrategy extends ArrayStrategy {

static final ArrayStrategy INSTANCE = new ObjectArrayStrategy();

@Override
public Class<?> type() {
return Object.class;
}

@Override
public boolean canStore(Class<?> type) {
return true;
}

@Override
public boolean accepts(Object value) {
return true;
}

@Override
public boolean specializesFor(Object value) {
return !(value instanceof Integer) && !(value instanceof Long) && !(value instanceof Double);
}

@Override
public boolean isDefaultValue(Object value) {
return value == null;
}

@Override
public boolean matches(DynamicObject array) {
return ArrayGuards.isObjectArray(array);
}

@Override
public ArrayMirror newArray(int size) {
return new ObjectArrayMirror(new Object[size]);
}

@Override
public ArrayMirror newMirror(DynamicObject array) {
return new ObjectArrayMirror((Object[]) Layouts.ARRAY.getStore(array));
}

@Override
public String toString() {
return "Object[]";
}
@@ -297,18 +334,22 @@ private static class LongIntArrayStrategy extends LongArrayStrategy {

static final ArrayStrategy INSTANCE = new LongIntArrayStrategy();

@Override
public boolean accepts(Object value) {
return value instanceof Integer;
}

@Override
public boolean matches(DynamicObject array) {
return ArrayGuards.isLongArray(array);
}

@Override
public ArrayMirror newMirror(DynamicObject array) {
return new LongIntArrayMirror((long[]) Layouts.ARRAY.getStore(array));
}

@Override
public String toString() {
return "(long[], int)";
}
@@ -320,22 +361,27 @@ private static class IntToObjectGeneralizationArrayStrategy extends ArrayStrateg

static final ArrayStrategy INSTANCE = new IntToObjectGeneralizationArrayStrategy();

@Override
public boolean accepts(Object value) {
return !(value instanceof Long);
}

@Override
public boolean matches(DynamicObject array) {
return ArrayGuards.isObjectArray(array);
}

@Override
public ArrayMirror newArray(int size) {
return new ObjectArrayMirror(new Object[size]);
}

@Override
public ArrayMirror newMirror(DynamicObject array) {
return new ObjectArrayMirror((Object[]) Layouts.ARRAY.getStore(array));
}

@Override
public String toString() {
return "Object[] (not accepting long)";
}
@@ -348,10 +394,12 @@ private static class FallbackArrayStrategy extends ArrayStrategy {

static final ArrayStrategy INSTANCE = new FallbackArrayStrategy();

@Override
public boolean accepts(Object value) {
return false;
}

@Override
public boolean matches(DynamicObject array) {
return false;
}
@@ -361,14 +409,17 @@ public ArrayStrategy generalize(ArrayStrategy other) {
return other;
}

@Override
public ArrayMirror newArray(int size) {
throw unsupported();
}

@Override
public ArrayMirror newMirror(DynamicObject array) {
throw unsupported();
}

@Override
public String toString() {
return "null";
}
Original file line number Diff line number Diff line change
@@ -491,8 +491,9 @@ public void newLexicalVersion() {
}

public void newVersion(Set<DynamicObject> alreadyInvalidated, boolean considerLexicalDependents) {
if (alreadyInvalidated.contains(rubyModuleObject))
if (alreadyInvalidated.contains(rubyModuleObject)) {
return;
}

unmodifiedAssumption.invalidate();
alreadyInvalidated.add(rubyModuleObject);
@@ -516,8 +517,9 @@ public void addDependent(DynamicObject dependent) {

public void addLexicalDependent(DynamicObject lexicalChild) {
assert RubyGuards.isRubyModule(lexicalChild);
if (lexicalChild != rubyModuleObject)
if (lexicalChild != rubyModuleObject) {
lexicalDependents.add(lexicalChild);
}
}

public Assumption getUnmodifiedAssumption() {
Original file line number Diff line number Diff line change
@@ -623,6 +623,7 @@ private StringSubstringPrimitiveNode getSubstringNode() {
return substringNode;
}

@Override
protected boolean isRubiniusUndefined(Object object) {
return object == coreLibrary().getRubiniusUndefined();
}
@@ -3217,7 +3218,7 @@ public DynamicObject stringFromCodepointSimple(int code, DynamicObject encoding,
}

@TruffleBoundary(throwsControlFlowException = true)
@Specialization(guards = {"isRubyEncoding(rubyEncoding)", "!isSimple(code, rubyEncoding)"})
@Specialization(guards = { "isRubyEncoding(rubyEncoding)", "!isSimple(code, rubyEncoding)", "isCodepoint(code)" })
public DynamicObject stringFromCodepoint(long code, DynamicObject rubyEncoding) {
final Encoding encoding = EncodingOperations.getEncoding(rubyEncoding);
final int length;
@@ -3247,6 +3248,11 @@ public DynamicObject stringFromCodepoint(long code, DynamicObject rubyEncoding)
return createString(RopeOperations.create(bytes, encoding, CodeRange.CR_VALID));
}

protected boolean isCodepoint(long code) {
// Fits in an unsigned int
return code >= 0 && code < (1L << 32);
}

protected boolean isSimple(long code, DynamicObject encoding) {
final Encoding enc = EncodingOperations.getEncoding(encoding);

Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@
public class JavaException extends RuntimeException {

public JavaException(Throwable cause) {
super(cause);
super(cause.getMessage(), cause);
}

@Override
Original file line number Diff line number Diff line change
@@ -96,6 +96,7 @@ protected DispatchHeadNode getHeadNode() {
return NodeUtil.findParent(this, DispatchHeadNode.class);
}

@Override
public final Object execute(VirtualFrame frame) {
throw new IllegalStateException("do not call execute on dispatch nodes");
}
Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@ public RespondToNode(RubyContext context, SourceSection sourceSection, RubyNode
this.dispatch = new DoesRespondDispatchHeadNode(context, true);
}

@Override
public boolean executeBoolean(VirtualFrame frame) {
// TODO(cseaton): check this is actually a static "find if there is such method" and not a dynamic call to respond_to?
return dispatch.doesRespondTo(frame, methodName, child.execute(frame));
Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@ public CheckMatchVariableTypeNode(RubyContext context, SourceSection sourceSecti
this.child = child;
}

@Override
public Object execute(VirtualFrame frame) {
final Object childValue = child.execute(frame);

Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@ public CheckOutputSeparatorVariableTypeNode(RubyContext context, SourceSection s
this.child = child;
}

@Override
public Object execute(VirtualFrame frame) {
final Object childValue = child.execute(frame);

Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@ public CheckProgramNameVariableTypeNode(RubyContext context, SourceSection sourc
this.child = child;
}

@Override
public Object execute(VirtualFrame frame) {
final Object childValue = child.execute(frame);

Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@ public CheckRecordSeparatorVariableTypeNode(RubyContext context, SourceSection s
this.child = child;
}

@Override
public Object execute(VirtualFrame frame) {
final Object childValue = child.execute(frame);

Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@ public CheckStdoutVariableTypeNode(RubyContext context, SourceSection sourceSect
this.child = child;
}

@Override
public Object execute(VirtualFrame frame) {
final Object childValue = child.execute(frame);

Original file line number Diff line number Diff line change
@@ -24,6 +24,7 @@ public UpdateVerbosityNode(RubyContext context, SourceSection sourceSection, Rub
this.child = child;
}

@Override
public Object execute(VirtualFrame frame) {
final Object childValue = child.execute(frame);
setVerbose(childValue);
Original file line number Diff line number Diff line change
@@ -24,6 +24,7 @@ public ThreadLocalObjectNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@Override
public abstract DynamicObject executeDynamicObject(VirtualFrame frame);

@Specialization(
Original file line number Diff line number Diff line change
@@ -88,6 +88,7 @@ public Object addSpecial(VirtualFrame frame, DynamicObject a, DynamicObject b) {
@NodeChild(value = "precision", type = RubyNode.class)
public abstract static class AddNode extends AbstractAddNode {

@Override
@Specialization(guards = {
"isNormal(a)",
"isNormalRubyBigDecimal(b)"
@@ -96,6 +97,7 @@ protected Object add(VirtualFrame frame, DynamicObject a, DynamicObject b, int p
return super.add(frame, a, b, precision);
}

@Override
@Specialization(guards = {
"isRubyBigDecimal(b)",
"!isNormal(a) || !isNormal(b)"
@@ -129,6 +131,7 @@ public Object subSpecial(VirtualFrame frame, DynamicObject a, DynamicObject b) {
@NodeChild(value = "precision", type = RubyNode.class)
public abstract static class SubNode extends AbstractSubNode {

@Override
@Specialization(guards = {
"isNormal(a)",
"isNormalRubyBigDecimal(b)"
@@ -137,6 +140,7 @@ public Object subNormal(VirtualFrame frame, DynamicObject a, DynamicObject b, in
return super.subNormal(frame, a, b, precision);
}

@Override
@Specialization(guards = {
"isRubyBigDecimal(b)",
"!isNormal(a) || !isNormal(b)"
@@ -235,6 +239,7 @@ public Object multSpecial(VirtualFrame frame, DynamicObject a, DynamicObject b)
@NodeChild(value = "precision", type = RubyNode.class)
public abstract static class MultNode extends AbstractMultNode {

@Override
@Specialization(guards = {
"isNormal(a)",
"isNormalRubyBigDecimal(b)"
@@ -243,6 +248,7 @@ public Object mult(VirtualFrame frame, DynamicObject a, DynamicObject b, int pre
return super.mult(frame, a, b, precision);
}

@Override
@Specialization(guards = {
"isNormal(a)",
"isSpecialRubyBigDecimal(b)"
@@ -251,6 +257,7 @@ public Object multNormalSpecial(VirtualFrame frame, DynamicObject a, DynamicObje
return super.multNormalSpecial(frame, a, b, precision);
}

@Override
@Specialization(guards = {
"!isNormal(a)",
"isNormalRubyBigDecimal(b)"
@@ -259,6 +266,7 @@ public Object multSpecialNormal(VirtualFrame frame, DynamicObject a, DynamicObje
return super.multSpecialNormal(frame, a, b, precision);
}

@Override
@Specialization(guards = {
"!isNormal(a)",
"isSpecialRubyBigDecimal(b)"
@@ -369,6 +377,7 @@ public Object divNormalSpecial(
}
}

@Override
@Specialization(guards = {
"isNormal(a)",
"isSpecialRubyBigDecimal(b)"
@@ -402,6 +411,7 @@ public Object divSpecialNormal(
}
}

@Override
@Specialization(guards = {
"!isNormal(a)",
"isNormalRubyBigDecimal(b)"
@@ -432,6 +442,7 @@ public Object divSpecialSpecial(
}
}

@Override
@Specialization(guards = {
"!isNormal(a)",
"isSpecialRubyBigDecimal(b)"
2 changes: 1 addition & 1 deletion truffle/src/main/ruby/core/truffle/cext.rb
Original file line number Diff line number Diff line change
@@ -242,7 +242,7 @@ def RTEST(value)
!nil.equal?(value) && !false.equal?(value)
end

def RB_OBJ_TAINTED(object)
def RB_OBJ_TAINTABLE(object)
case object
when TrueClass, FalseClass, Fixnum, Float, NilClass, Symbol
true

0 comments on commit 6af2b33

Please sign in to comment.