Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: d686a67983c9
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: ce1be31b291e
Choose a head ref
Loading
Showing 306 changed files with 7,788 additions and 6,255 deletions.
4 changes: 2 additions & 2 deletions spec/truffle/specs/truffle/runtime/java_class_of_spec.rb
Original file line number Diff line number Diff line change
@@ -34,8 +34,8 @@
Truffle::Runtime.java_class_of(3.14).should == 'Double'
end

it "returns 'RubyString' for a String" do
Truffle::Runtime.java_class_of('test').should == 'RubyString'
it "returns 'DynamicObject*' for a String" do
Truffle::Runtime.java_class_of('test').start_with?('DynamicObject').should be_true
end

end
1 change: 1 addition & 0 deletions spec/truffle/tags/core/module/prepend_tags.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fails:Module#prepend keeps the module in the chain when dupping the class
15 changes: 10 additions & 5 deletions truffle/pom.rb
Original file line number Diff line number Diff line change
@@ -30,17 +30,22 @@
'source' => [ '${base.java.version}', '1.7' ],
'target' => [ '${base.javac.version}', '1.7' ],
'useIncrementalCompilation' => 'false' ) do
execute_goals( 'compile',
:id => 'anno',
:phase => 'process-resources',
'includes' => [ 'org/jruby/truffle/om/dsl/processor/OMProcessor.java' ],
'compilerArgs' => [ '-J-ea' ] )
execute_goals( 'compile',
:id => 'default-compile',
:phase => 'compile',
'annotationProcessors' => [
'com.oracle.truffle.dsl.processor.TruffleProcessor',
'com.oracle.truffle.dsl.processor.LanguageRegistrationProcessor'
],
'annotationProcessors' => [ 'org.jruby.truffle.om.dsl.processor.OMProcessor',
'com.oracle.truffle.dsl.processor.TruffleProcessor',
'com.oracle.truffle.dsl.processor.LanguageRegistrationProcessor' ],
'generatedSourcesDirectory' => 'target/generated-sources',
'compilerArgs' => [ '-XDignore.symbol.file=true',
'-J-Duser.language=en',
'-J-Dfile.encoding=UTF-8' ] )
'-J-Dfile.encoding=UTF-8',
'-J-ea' ] )
end

plugin :shade do
17 changes: 17 additions & 0 deletions truffle/pom.xml
Original file line number Diff line number Diff line change
@@ -71,6 +71,21 @@ DO NOT MODIFIY - GENERATED CODE
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>anno</id>
<phase>process-resources</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<includes>
<include>org/jruby/truffle/om/dsl/processor/OMProcessor.java</include>
</includes>
<compilerArgs>
<compilerArg>-J-ea</compilerArg>
</compilerArgs>
</configuration>
</execution>
<execution>
<id>default-compile</id>
<phase>compile</phase>
@@ -79,6 +94,7 @@ DO NOT MODIFIY - GENERATED CODE
</goals>
<configuration>
<annotationProcessors>
<annotationProcessor>org.jruby.truffle.om.dsl.processor.OMProcessor</annotationProcessor>
<annotationProcessor>com.oracle.truffle.dsl.processor.TruffleProcessor</annotationProcessor>
<annotationProcessor>com.oracle.truffle.dsl.processor.LanguageRegistrationProcessor</annotationProcessor>
</annotationProcessors>
@@ -87,6 +103,7 @@ DO NOT MODIFIY - GENERATED CODE
<compilerArg>-XDignore.symbol.file=true</compilerArg>
<compilerArg>-J-Duser.language=en</compilerArg>
<compilerArg>-J-Dfile.encoding=UTF-8</compilerArg>
<compilerArg>-J-ea</compilerArg>
</compilerArgs>
</configuration>
</execution>
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.RootNode;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.source.SourceSection;
import org.jcodings.specific.UTF8Encoding;
@@ -18,7 +19,6 @@
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.RubyLanguage;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.translator.NodeWrapper;
import org.jruby.truffle.translator.TranslatorDriver;

@@ -27,7 +27,7 @@ public class LazyRubyRootNode extends RootNode {
private final Source source;

@CompilationFinal private RubyContext cachedContext;
@CompilationFinal private RubyBasicObject mainObject;
@CompilationFinal private DynamicObject mainObject;

@Child private Node findContextNode;
@Child private DirectCallNode callNode;
175 changes: 114 additions & 61 deletions truffle/src/main/java/org/jruby/truffle/nodes/RubyGuards.java
Original file line number Diff line number Diff line change
@@ -10,14 +10,15 @@
package org.jruby.truffle.nodes;

import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.object.DynamicObject;
import org.jruby.truffle.nodes.core.*;
import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.nodes.core.hash.HashNodes;
import org.jruby.truffle.nodes.ext.BigDecimalNodes;
import org.jruby.truffle.nodes.rubinius.ByteArrayNodes;
import org.jruby.truffle.nodes.rubinius.PointerNodes;
import org.jruby.truffle.runtime.NotProvided;
import org.jruby.truffle.runtime.ThreadLocalObject;
import org.jruby.truffle.runtime.core.*;

public abstract class RubyGuards {

@@ -41,152 +42,204 @@ public static boolean isDouble(Object value) {

// Ruby types

public static boolean isRubyBasicObject(Object object) {
return BasicObjectNodes.BASIC_OBJECT_LAYOUT.isBasicObject(object);
}

public static boolean isRubyBignum(Object value) {
return (value instanceof RubyBasicObject) && isRubyBignum((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubyBignum((DynamicObject) value);
}

public static boolean isRubyBignum(DynamicObject value) {
return BignumNodes.BIGNUM_LAYOUT.isBignum(value);
}

public static boolean isRubyBigDecimal(DynamicObject value) {
return BigDecimalNodes.BIG_DECIMAL_LAYOUT.isBigDecimal(value);
}

public static boolean isIntegerFixnumRange(Object object) {
return (object instanceof DynamicObject) && isIntegerFixnumRange((DynamicObject) object);
}

public static boolean isRubyBignum(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == BignumNodes.BIGNUM_TYPE;
public static boolean isIntegerFixnumRange(DynamicObject object) {
return RangeNodes.INTEGER_FIXNUM_RANGE_LAYOUT.isIntegerFixnumRange(object);
}

public static boolean isRubyBigDecimal(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == BigDecimalNodes.BIG_DECIMAL_TYPE;
public static boolean isLongFixnumRange(Object object) {
return (object instanceof DynamicObject) && isLongFixnumRange((DynamicObject) object);
}

public static boolean isIntegerFixnumRange(Object value) {
return value instanceof RubyIntegerFixnumRange;
public static boolean isLongFixnumRange(DynamicObject object) {
return RangeNodes.LONG_FIXNUM_RANGE_LAYOUT.isLongFixnumRange(object);
}

public static boolean isLongFixnumRange(Object value) {
return value instanceof RubyLongFixnumRange;
public static boolean isObjectRange(Object object) {
return (object instanceof DynamicObject) && isObjectRange((DynamicObject) object);
}

public static boolean isObjectRange(Object value) {
return value instanceof RubyObjectRange;
public static boolean isObjectRange(DynamicObject object) {
return RangeNodes.OBJECT_RANGE_LAYOUT.isObjectRange(object);
}

public static boolean isRubyRange(Object value) {
return isIntegerFixnumRange(value) || isLongFixnumRange(value) || isObjectRange(value);
}

public static boolean isRubyArray(Object value) {
return (value instanceof RubyBasicObject) && isRubyArray((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubyArray((DynamicObject) value);
}

public static boolean isRubyArray(RubyBasicObject value) {
//return value.getDynamicObject().getShape().getObjectType() == ArrayNodes.ARRAY_TYPE;
return value instanceof RubyArray;
public static boolean isRubyArray(DynamicObject value) {
return ArrayNodes.ARRAY_LAYOUT.isArray(value);
}

public static boolean isRubyBinding(Object value) {
return value instanceof RubyBinding;
public static boolean isRubyBinding(DynamicObject object) {
return BindingNodes.BINDING_LAYOUT.isBinding(object);
}

public static boolean isRubyClass(Object value) {
return value instanceof RubyClass;
return (value instanceof DynamicObject) && isRubyClass((DynamicObject) value);
}

public static boolean isRubyClass(DynamicObject value) {
return ClassNodes.CLASS_LAYOUT.isClass(value);
}

public static boolean isRubyHash(Object value) {
return (value instanceof RubyBasicObject) && isRubyHash((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubyHash((DynamicObject) value);
}

public static boolean isRubyHash(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == HashNodes.HASH_TYPE;
public static boolean isRubyHash(DynamicObject value) {
return HashNodes.HASH_LAYOUT.isHash(value);
}

public static boolean isRubyModule(Object value) {
return value instanceof RubyModule;
return (value instanceof DynamicObject) && isRubyModule((DynamicObject) value);
}

public static boolean isRubyModule(DynamicObject value) {
return ModuleNodes.MODULE_LAYOUT.isModule(value);
}

public static boolean isRubyRegexp(Object value) {
return value instanceof RubyRegexp;
return (value instanceof DynamicObject) && isRubyRegexp((DynamicObject) value);
}

public static boolean isRubyRegexp(DynamicObject value) {
return RegexpNodes.REGEXP_LAYOUT.isRegexp(value);
}

public static boolean isRubyString(Object value) {
return (value instanceof RubyBasicObject) && isRubyString((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubyString((DynamicObject) value);
}

public static boolean isRubyString(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == StringNodes.STRING_TYPE;
public static boolean isRubyString(DynamicObject value) {
return StringNodes.STRING_LAYOUT.isString(value);
}

public static boolean isRubyEncoding(Object value) {
return value instanceof RubyEncoding;
public static boolean isRubyEncoding(Object object) {
return (object instanceof DynamicObject) && isRubyEncoding((DynamicObject) object);
}

public static boolean isRubyEncoding(DynamicObject object) {
return EncodingNodes.ENCODING_LAYOUT.isEncoding(object);
}

public static boolean isRubySymbol(Object value) {
return (value instanceof RubyBasicObject) && isRubySymbol((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubySymbol((DynamicObject) value);
}

public static boolean isRubySymbol(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == SymbolNodes.SYMBOL_TYPE;
public static boolean isRubySymbol(DynamicObject value) {
return SymbolNodes.SYMBOL_LAYOUT.isSymbol(value);
}

public static boolean isRubyMethod(Object value) {
return (value instanceof RubyBasicObject) && isRubyMethod((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubyMethod((DynamicObject) value);
}

public static boolean isRubyMethod(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == MethodNodes.METHOD_TYPE;
public static boolean isRubyMethod(DynamicObject value) {
return MethodNodes.METHOD_LAYOUT.isMethod(value);
}

public static boolean isRubyUnboundMethod(Object value) {
return (value instanceof RubyBasicObject) && isRubyUnboundMethod((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubyUnboundMethod((DynamicObject) value);
}

public static boolean isRubyUnboundMethod(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == UnboundMethodNodes.UNBOUND_METHOD_TYPE;
public static boolean isRubyUnboundMethod(DynamicObject value) {
return UnboundMethodNodes.UNBOUND_METHOD_LAYOUT.isUnboundMethod(value);
}

public static boolean isRubyMutex(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == MutexNodes.MUTEX_TYPE;
public static boolean isRubyMutex(DynamicObject value) {
return MutexNodes.MUTEX_LAYOUT.isMutex(value);
}

public static boolean isRubyBasicObject(Object value) {
return value instanceof RubyBasicObject;
public static boolean isDynamicObject(Object value) {
return value instanceof DynamicObject;
}

public static boolean isRubyPointer(Object value) {
return (value instanceof RubyBasicObject) && isRubyPointer((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubyPointer((DynamicObject) value);
}

public static boolean isRubyPointer(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == PointerNodes.POINTER_TYPE;
public static boolean isRubyPointer(DynamicObject value) {
return PointerNodes.POINTER_LAYOUT.isPointer(value);
}

public static boolean isRubiniusByteArray(Object value) {
return (value instanceof RubyBasicObject) && isRubiniusByteArray((RubyBasicObject) value);
return (value instanceof DynamicObject) && isRubiniusByteArray((DynamicObject) value);
}

public static boolean isRubiniusByteArray(DynamicObject value) {
return ByteArrayNodes.BYTE_ARRAY_LAYOUT.isByteArray(value);
}

public static boolean isRubiniusByteArray(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == ByteArrayNodes.BYTE_ARRAY_TYPE;
public static boolean isRubyProc(Object object) {
return (object instanceof DynamicObject) && isRubyProc((DynamicObject) object);
}

public static boolean isRubyProc(Object value) {
return value instanceof RubyProc;
public static boolean isRubyProc(DynamicObject object) {
return ProcNodes.PROC_LAYOUT.isProc(object);
}
public static boolean isRubyEncodingConverter(RubyBasicObject encodingConverter) {
return encodingConverter instanceof RubyEncodingConverter;

public static boolean isRubyEncodingConverter(DynamicObject encodingConverter) {
return EncodingConverterNodes.ENCODING_CONVERTER_LAYOUT.isEncodingConverter(encodingConverter);
}

public static boolean isRubyTime(DynamicObject object) {
return TimeNodes.TIME_LAYOUT.isTime(object);
}

public static boolean isRubyTime(RubyBasicObject time) {
return time instanceof RubyTime;
public static boolean isRubyException(Object value) {
return (value instanceof DynamicObject) && isRubyException((DynamicObject) value);
}

public static boolean isRubyException(Object object) {
return object instanceof RubyException;
public static boolean isRubyException(DynamicObject object) {
return ExceptionNodes.EXCEPTION_LAYOUT.isException(object);
}

public static boolean isRubyFiber(Object fiber) {
return fiber instanceof RubyFiber;
public static boolean isRubyFiber(Object object) {
return (object instanceof DynamicObject) && isRubyFiber((DynamicObject) object);
}

public static boolean isRubyFiber(DynamicObject object) {
return FiberNodes.FIBER_LAYOUT.isFiber(object);
}

public static boolean isRubyThread(Object object) {
return object instanceof RubyThread;
return (object instanceof DynamicObject) && isRubyThread((DynamicObject) object);
}

public static boolean isRubyThread(DynamicObject object) {
return ThreadNodes.THREAD_LAYOUT.isThread(object);
}

public static boolean isRubyMatchData(Object object) {
return object instanceof RubyMatchData;
return (object instanceof DynamicObject) && isRubyMatchData((DynamicObject) object);
}

public static boolean isRubyMatchData(DynamicObject object) {
return MatchDataNodes.MATCH_DATA_LAYOUT.isMatchData(object);
}

// Internal types
@@ -196,7 +249,7 @@ public static boolean isThreadLocal(Object value) {
}

public static boolean isForeignObject(Object object) {
return (object instanceof TruffleObject) && !(object instanceof RubyBasicObject);
return (object instanceof TruffleObject) && !(object instanceof DynamicObject);
}

// Sentinels
Loading