Skip to content

Commit

Permalink
Showing 190 changed files with 3,532 additions and 3,970 deletions.
9 changes: 0 additions & 9 deletions core/src/main/java/org/jruby/RubyInstanceConfig.java
Original file line number Diff line number Diff line change
@@ -1814,8 +1814,6 @@ public boolean shouldPrecompileAll() {
public static String IR_JIT_PASSES = Options.IR_JIT_PASSES.load();
public static String IR_INLINE_COMPILER_PASSES = Options.IR_INLINE_COMPILER_PASSES.load();

private TruffleHooksStub truffleHooks = null;

public static final boolean COROUTINE_FIBERS = Options.FIBER_COROUTINES.load();

/**
@@ -1848,13 +1846,6 @@ private static int initGlobalJavaVersion() {
return Opcodes.V1_5;
}
}
public void setTruffleHooks(TruffleHooksStub truffleHooks) {
this.truffleHooks = truffleHooks;
}

public TruffleHooksStub getTruffleHooks() {
return truffleHooks;
}

@Deprecated
public void setSafeLevel(int safeLevel) {
Original file line number Diff line number Diff line change
@@ -718,7 +718,7 @@ private void logScriptResolutionFailure(String path) {
public static void checkGraalVersion() {
if (Options.TRUFFLE_RUNTIME_VERSION_CHECK.load()) {
final String graalVersion = System.getProperty("graal.version", "unknown");
final String expectedGraalVersion = "0.6";
final String expectedGraalVersion = "0.7";

if (graalVersion.equals("unknown")) {
return;
2 changes: 2 additions & 0 deletions core/src/main/java/org/jruby/util/cli/Options.java
Original file line number Diff line number Diff line change
@@ -145,6 +145,8 @@ public class Options {
public static final Option<String> TRUFFLE_TRANSLATOR_PRINT_PARSE_TREE = string(TRUFFLE, "truffle.translator.print_parse_trees", "", "Comma delimited list of method names to print the JRuby parse tree of before translation.");
public static final Option<Boolean> TRUFFLE_PANIC_ON_JAVA_ASSERT = bool(TRUFFLE, "truffle.debug.panic_on_java_assert", false, "Panic as soon as a Java assertion failure is found.");
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_COVERAGE = bool(TRUFFLE, "truffle.coverage", false, "Enable coverage (will be enabled by default in the future - currently has some bugs");

public static final Option<Boolean> TRUFFLE_INLINER_ALWAYS_CLONE_YIELD = bool(TRUFFLE, "truffle.inliner.always_clone_yield", true, "Always clone yield call targets.");
public static final Option<Boolean> TRUFFLE_INLINER_ALWAYS_INLINE_YIELD = bool(TRUFFLE, "truffle.inliner.always_inline_yield", true, "Always inline yield call targets.");
19 changes: 19 additions & 0 deletions lib/ruby/truffle/truffle/coverage.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright (c) 2015 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

module Coverage

def self.start
Truffle::Primitive.coverage_start
end

def self.result
Truffle::Primitive.coverage_result
end

end
3 changes: 3 additions & 0 deletions spec/truffle/tags/core/string/strip_tags.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fails:String#strip returns a new string with leading and trailing whitespace removed
fails:String#strip returns a copy of self with trailing NULL bytes and whitespace
fails:String#strip taints the result when self is tainted
1 change: 0 additions & 1 deletion test/pom.rb
Original file line number Diff line number Diff line change
@@ -309,7 +309,6 @@ def truffle_spec_config(spec_type, generate_report)
'<exec dir="${jruby.home}" executable="${jruby.home}/bin/jruby" failonerror="true">' +
'<arg value="-J-server" />' +
'<arg value="-X+T" />' +
'<arg value="-Xtruffle.debug.enable_assert_constant=true" />' +
'<arg value="test/truffle/pe/pe.rb" />' +
'</exec>' +
'</target>' ) ] )
1 change: 0 additions & 1 deletion test/pom.xml
Original file line number Diff line number Diff line change
@@ -1009,7 +1009,6 @@
<exec failonerror="true" dir="${jruby.home}" executable="${jruby.home}/bin/jruby">
<arg value="-J-server" />
<arg value="-X+T" />
<arg value="-Xtruffle.debug.enable_assert_constant=true" />
<arg value="test/truffle/pe/pe.rb" />
</exec>
</target>
7 changes: 7 additions & 0 deletions test/truffle/cext/foo/ext/foo/add.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include <ruby.h>

#include "add.h"

VALUE add(VALUE self, VALUE a, VALUE b) {
return INT2NUM(NUM2INT(a) + NUM2INT(b));
}
1 change: 1 addition & 0 deletions test/truffle/cext/foo/ext/foo/add.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
VALUE add(VALUE self, VALUE a, VALUE b);
3 changes: 3 additions & 0 deletions test/truffle/cext/foo/ext/foo/extconf.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
require 'mkmf'
$CFLAGS << ' -Wall'
create_makefile('foo/foo')
8 changes: 8 additions & 0 deletions test/truffle/cext/foo/ext/foo/foo.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#include <ruby.h>

#include "add.h"

void Init_foo() {
VALUE Foo = rb_define_module("Foo");
rb_define_method(Foo, "add", add, 2);
}
7 changes: 7 additions & 0 deletions test/truffle/cext/inline.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
p Truffle::CExt.supported?

Truffle::CExt.inline %{
#include <stdio.h>
}, %{
printf("Hello, World!\\n");
}
12 changes: 12 additions & 0 deletions test/truffle/cext/inline_capi.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
p Truffle::CExt.supported?

Truffle::CExt.inline %{
VALUE add(VALUE self, VALUE a, VALUE b) {
return INT2NUM(NUM2INT(a) + NUM2INT(b));
}
}, %{
VALUE Test = rb_define_module("Test");
rb_define_method(Test, "add", add, 2);
}

p Test.add(14, 2)
7 changes: 7 additions & 0 deletions test/truffle/cext/inline_flags.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
p Truffle::CExt.supported?

Truffle::CExt.inline %{
#include <stdio.h>
}, %{
printf("FOO was defined to be %d\\n", FOO);
}, %w(-DFOO=14)
5 changes: 5 additions & 0 deletions test/truffle/cext/require.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
p Truffle::CExt.supported?

require 'foo/foo'

p Foo.add 14, 2
33 changes: 0 additions & 33 deletions test/truffle/pe/core/kernel/set_trace_func_pe.rb

This file was deleted.

4 changes: 2 additions & 2 deletions truffle/.factorypath
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<factorypath>
<factorypathentry kind="VARJAR" id="M2_REPO/com/oracle/truffle/0.6/truffle-0.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/oracle/truffle-dsl-processor/0.6/truffle-dsl-processor-0.6.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/oracle/truffle/0.7-SNAPSHOT/truffle-0.7-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
<factorypathentry kind="VARJAR" id="M2_REPO/com/oracle/truffle-dsl-processor/0.7-SNAPSHOT/truffle-dsl-processor-0.7-SNAPSHOT.jar" enabled="true" runInBatchMode="false"/>
</factorypath>
25 changes: 23 additions & 2 deletions truffle/pom.rb
Original file line number Diff line number Diff line change
@@ -9,11 +9,17 @@
'tesla.dump.readonly' => true,

'jruby.basedir' => '${basedir}/..' )

repository( 'http://lafo.ssw.uni-linz.ac.at/nexus/content/repositories/releases/',
:id => 'truffle' ) do
releases 'true'
snapshots 'false'
end

jar 'org.jruby:jruby-core', '${project.version}', :scope => 'provided'

jar 'com.oracle:truffle:0.6'
jar 'com.oracle:truffle-dsl-processor:0.6', :scope => 'provided'
jar 'com.oracle:truffle:0.7'
jar 'com.oracle:truffle-dsl-processor:0.7', :scope => 'provided'

plugin( :compiler,
'encoding' => 'utf-8',
@@ -49,4 +55,19 @@
includes '**/*rb'
end
end

[ :dist, :'jruby-jars', :all, :release ].each do |name|
profile name do
plugin :shade do
execute_goals( 'shade',
:id => 'pack jruby-truffle-complete.jar',
:phase => 'verify',
:artifactSet => { :includes => [
'com.oracle:truffle',
'com.oracle:truffle-interop' ] },
:shadedArtifactAttached => 'true',
:shadedClassifierName => 'complete' )
end
end
end
end
134 changes: 132 additions & 2 deletions truffle/pom.xml
Original file line number Diff line number Diff line change
@@ -24,15 +24,27 @@
<dependency>
<groupId>com.oracle</groupId>
<artifactId>truffle</artifactId>
<version>0.6</version>
<version>0.7</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>truffle-dsl-processor</artifactId>
<version>0.6</version>
<version>0.7</version>
<scope>provided</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>truffle</id>
<url>http://lafo.ssw.uni-linz.ac.at/nexus/content/repositories/releases/</url>
</repository>
</repositories>
<build>
<defaultGoal>package</defaultGoal>
<resources>
@@ -96,4 +108,122 @@
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dist</id>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>pack jruby-truffle-complete.jar</id>
<phase>verify</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>com.oracle:truffle</include>
<include>com.oracle:truffle-interop</include>
</includes>
</artifactSet>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>complete</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jruby-jars</id>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>pack jruby-truffle-complete.jar</id>
<phase>verify</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>com.oracle:truffle</include>
<include>com.oracle:truffle-interop</include>
</includes>
</artifactSet>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>complete</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>all</id>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>pack jruby-truffle-complete.jar</id>
<phase>verify</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>com.oracle:truffle</include>
<include>com.oracle:truffle-interop</include>
</includes>
</artifactSet>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>complete</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>pack jruby-truffle-complete.jar</id>
<phase>verify</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>com.oracle:truffle</include>
<include>com.oracle:truffle-interop</include>
</includes>
</artifactSet>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>complete</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
19 changes: 8 additions & 11 deletions truffle/src/main/java/org/jruby/truffle/TruffleBridgeImpl.java
Original file line number Diff line number Diff line change
@@ -44,6 +44,8 @@

public class TruffleBridgeImpl implements TruffleBridge {

private static final boolean PRINT_RUNTIME = Options.TRUFFLE_PRINT_RUNTIME.load();

private final org.jruby.Ruby runtime;
private final RubyContext truffleContext;

@@ -59,7 +61,7 @@ public TruffleBridgeImpl(org.jruby.Ruby runtime) {

@Override
public void init() {
if (Options.TRUFFLE_PRINT_RUNTIME.load()) {
if (PRINT_RUNTIME) {
runtime.getInstanceConfig().getError().println("jruby: using " + Truffle.getRuntime().getName());
}

@@ -96,6 +98,7 @@ public void init() {
CoreMethodNodeManager.addCoreMethodNodes(rubyObjectClass, TrufflePrimitiveNodesFactory.getFactories());
CoreMethodNodeManager.addCoreMethodNodes(rubyObjectClass, EncodingNodesFactory.getFactories());
CoreMethodNodeManager.addCoreMethodNodes(rubyObjectClass, EncodingConverterNodesFactory.getFactories());
CoreMethodNodeManager.addCoreMethodNodes(rubyObjectClass, TruffleInteropNodesFactory.getFactories());
CoreMethodNodeManager.addCoreMethodNodes(rubyObjectClass, MethodNodesFactory.getFactories());
CoreMethodNodeManager.addCoreMethodNodes(rubyObjectClass, UnboundMethodNodesFactory.getFactories());
CoreMethodNodeManager.addCoreMethodNodes(rubyObjectClass, ByteArrayNodesFactory.getFactories());
@@ -139,6 +142,9 @@ public void init() {
// Libraries copied unmodified from MRI
loadPath.slowPush(truffleContext.makeString(new File(home, "lib/ruby/truffle/mri").toString()));

// Our own implementations
loadPath.slowPush(truffleContext.makeString(new File(home, "lib/ruby/truffle/truffle").toString()));

// Libraries from RubySL
for (String lib : Arrays.asList("rubysl-strscan", "rubysl-stringio",
"rubysl-complex", "rubysl-date", "rubysl-pathname",
@@ -164,12 +170,6 @@ public void init() {
}
}
}

// Hook

if (truffleContext.getHooks() != null) {
truffleContext.getHooks().afterInit(truffleContext);
}
}

@Override
@@ -189,10 +189,7 @@ public Object execute(final TranslatorDriver.ParserContext parserContext, final
// Assume UTF-8 for the moment
source = Source.fromBytes(runtime.getInstanceConfig().inlineScript(), "-e", new BytesDecoder.UTF8BytesDecoder());
} else {
final byte[] bytes = FileUtils.readAllBytesInterruptedly(truffleContext, inputFile);

// Assume UTF-8 for the moment
source = Source.fromBytes(bytes, inputFile, new BytesDecoder.UTF8BytesDecoder());
source = truffleContext.getSourceManager().forFile(inputFile);
}

truffleContext.getFeatureManager().setMainScriptSource(source);
19 changes: 0 additions & 19 deletions truffle/src/main/java/org/jruby/truffle/TruffleHooks.java

This file was deleted.

87 changes: 47 additions & 40 deletions truffle/src/main/java/org/jruby/truffle/nodes/RubyNode.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.CompilerAsserts;
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.dsl.TypeSystemReference;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.instrument.Probe;
import com.oracle.truffle.api.instrument.ProbeNode;
import com.oracle.truffle.api.instrument.TruffleEventReceiver;
import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.UnexpectedResultException;
import com.oracle.truffle.api.source.SourceSection;
@@ -42,22 +43,50 @@
* @see YieldDispatchNode
*/
@TypeSystemReference(RubyTypes.class)
public abstract class RubyNode extends Node implements ProbeNode.Instrumentable {
@GenerateNodeFactory
public abstract class RubyNode extends Node {

private final RubyContext context;

// This field is a hack, used to transmit the information
// supplied by the JRuby parser in the form of a special
// node in the parse tree. The right thing to do is to
// add a special information node when the AST is constructed,
// which can then be removed.
private boolean atNewline = false;

public RubyNode(RubyContext context, SourceSection sourceSection) {
super(sourceSection);
assert context != null;
this.context = context;
}

public RubyNode(RubyNode prev) {
this(prev.context, prev.getSourceSection());
@Override
public boolean isInstrumentable() {
return true;
}

@Override
public ProbeNode.WrapperNode createWrapperNode() {
return new RubyWrapperNode(this);
}

public abstract Object execute(VirtualFrame frame);

/**
* Records that this node was wrapped by the JRuby parser with a "newline" node.
*/
public void setAtNewline() {
atNewline = true;
}

/**
* Was this ndoe wrapped by a JRuby parser "newline" node?
*/
public boolean isAtNewline() {
return atNewline;
}

/**
* Ruby's parallel semantic path.
*
@@ -182,6 +211,10 @@ public UndefinedPlaceholder executeUndefinedPlaceholder(VirtualFrame frame) thro
return RubyTypesGen.RUBYTYPES.expectUndefinedPlaceholder(execute(frame));
}

public TruffleObject executeTruffleObject(VirtualFrame frame) throws UnexpectedResultException {
return RubyTypesGen.RUBYTYPES.expectTruffleObject(execute(frame));
}

public RubyEncodingConverter executeRubyEncodingConverter(VirtualFrame frame) throws UnexpectedResultException {
return RubyTypesGen.RUBYTYPES.expectRubyEncodingConverter(execute(frame));
}
@@ -222,44 +255,18 @@ public RubyNode getNonWrapperNode() {
return this;
}

public Probe probe() {
final Node parent = getParent();

if (parent == null) {
throw new IllegalStateException("Cannot call probe() on a node without a parent.");
}

if (parent instanceof RubyWrapperNode) {
return ((RubyWrapperNode) parent).getProbe();
}

// Create a new wrapper/probe with this node as its child.
final RubyWrapperNode wrapper = new RubyWrapperNode(this);

// Connect it to a Probe
final Probe probe = ProbeNode.insertProbe(wrapper);

// Replace this node in the AST with the wrapper
this.replace(wrapper);

return probe;
public boolean isRational(RubyBasicObject o) {
// TODO(CS, 10-Jan-15) should this be a full is_a? test? We'd need a node for that.
return o.getLogicalClass() == getContext().getCoreLibrary().getRationalClass();
}

public void probeLite(TruffleEventReceiver eventReceiver) {
final Node parent = getParent();

if (parent == null) {
throw new IllegalStateException("Cannot call probeLite() on a node without a parent");
}

if (parent instanceof RubyWrapperNode) {
throw new IllegalStateException("Cannot call probeLite() on a node that already has a wrapper.");
}

final RubyWrapperNode wrapper = new RubyWrapperNode(this);
ProbeNode.insertProbeLite(wrapper, eventReceiver);
public boolean isForeignObject(Object object) {
return (object instanceof TruffleObject) && !(isRubyBasicObject(object));
}

this.replace(wrapper);
public boolean isComplex(RubyBasicObject o) {
// TODO(BF, 4-4-15) COPIED from isRational - should this be a full is_a? test? We'd need a node for that.
return o.getLogicalClass() == getContext().getCoreLibrary().getComplexClass();
}

public boolean isNaN(double value) {
@@ -443,7 +450,7 @@ public boolean isThreadLocal(Object value) {
}

@SuppressWarnings("static-method")
public boolean isObjectArray(Object value) {
public boolean isJavaObjectArray(Object value) {
return value instanceof Object[];
}

11 changes: 11 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/nodes/RubyRootNode.java
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.oracle.truffle.api.ExecutionContext;
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.instrument.Probe;
import com.oracle.truffle.api.nodes.NodeUtil;
import com.oracle.truffle.api.nodes.RootNode;
import com.oracle.truffle.api.source.SourceSection;
@@ -30,6 +31,8 @@ public class RubyRootNode extends RootNode {
@Child private RubyNode body;
private final RubyNode uninitializedBody;

private boolean instrumentationApplied = false;

public RubyRootNode(RubyContext context, SourceSection sourceSection, FrameDescriptor frameDescriptor, SharedMethodInfo sharedMethodInfo, RubyNode body) {
super(sourceSection, frameDescriptor);
assert body != null;
@@ -71,4 +74,12 @@ public RubyNode getBody() {
public ExecutionContext getExecutionContext() {
return context;
}

@Override
public void applyInstrumentation() {
if (!instrumentationApplied) {
Probe.applyASTProbers(body);
instrumentationApplied = true;
}
}
}
9 changes: 9 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/nodes/RubyTypes.java
Original file line number Diff line number Diff line change
@@ -10,6 +10,8 @@
package org.jruby.truffle.nodes;

import com.oracle.truffle.api.dsl.TypeSystem;
import com.oracle.truffle.api.dsl.internal.DSLOptions;
import com.oracle.truffle.api.interop.TruffleObject;
import org.jruby.truffle.nodes.dispatch.DispatchAction;
import org.jruby.truffle.runtime.LexicalScope;
import org.jruby.truffle.runtime.UndefinedPlaceholder;
@@ -20,6 +22,12 @@
* The list of types and type conversions that the AST interpreter knows about and can specialise
* using. Used by the DSL.
*/
@DSLOptions(
useNewLayout = true,
monomorphicTypeBoxingOptimization = DSLOptions.TypeBoxingOptimization.NONE,
polymorphicTypeBoxingElimination = DSLOptions.TypeBoxingOptimization.NONE,
implicitTypeBoxingOptimization = DSLOptions.TypeBoxingOptimization.NONE,
voidBoxingOptimization = DSLOptions.TypeBoxingOptimization.NONE)
@TypeSystem({ //
UndefinedPlaceholder.class, //
boolean.class, //
@@ -57,6 +65,7 @@
RubyUnboundMethod.class, //
RubiniusByteArray.class, //
RubyBasicObject.class, //
TruffleObject.class, //
ThreadLocal.class, //
Object[].class})

Original file line number Diff line number Diff line change
@@ -31,11 +31,6 @@ public ArrayReadDenormalizedNode(RubyContext context, SourceSection sourceSectio
super(context, sourceSection);
}

public ArrayReadDenormalizedNode(ArrayReadDenormalizedNode prev) {
super(prev);
readNode = prev.readNode;
}

public abstract Object executeRead(VirtualFrame frame, RubyArray array, int index);

@Specialization
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.array;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -26,23 +26,19 @@
@NodeChild(value="array", type=RubyNode.class),
@NodeChild(value="index", type=RubyNode.class)
})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArrayReadNormalizedNode extends RubyNode {

public ArrayReadNormalizedNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ArrayReadNormalizedNode(ArrayReadNormalizedNode prev) {
super(prev);
}

public abstract Object executeRead(VirtualFrame frame, RubyArray array, int index);

// Anything from a null array is nil

@Specialization(
guards="isNullArray"
guards="isNullArray(array)"
)
public RubyNilClass readNull(RubyArray array, int index) {
return nil();
@@ -51,28 +47,28 @@ public RubyNilClass readNull(RubyArray array, int index) {
// Read within the bounds of an array with actual storage

@Specialization(
guards={"isInBounds", "isIntArray"}
guards={"isInBounds(array, index)", "isIntArray(array)"}
)
public int readIntInBounds(RubyArray array, int index) {
return ((int[]) array.getStore())[index];
}

@Specialization(
guards={"isInBounds", "isLongArray"}
guards={"isInBounds(array, index)", "isLongArray(array)"}
)
public long readLongInBounds(RubyArray array, int index) {
return ((long[]) array.getStore())[index];
}

@Specialization(
guards={"isInBounds", "isDoubleArray"}
guards={"isInBounds(array, index)", "isDoubleArray(array)"}
)
public double readDoubleInBounds(RubyArray array, int index) {
return ((double[]) array.getStore())[index];
}

@Specialization(
guards={"isInBounds", "isObjectArray"}
guards={"isInBounds(array, index)", "isObjectArray(array)"}
)
public Object readObjectInBounds(RubyArray array, int index) {
return ((Object[]) array.getStore())[index];
@@ -81,7 +77,7 @@ public Object readObjectInBounds(RubyArray array, int index) {
// Reading out of bounds is nil of any array is nil - cannot contain isNullArray

@Specialization(
guards="!isInBounds"
guards="!isInBounds(array, index)"
)
public RubyNilClass readOutOfBounds(RubyArray array, int index) {
return nil();
Original file line number Diff line number Diff line change
@@ -32,11 +32,6 @@ public ArrayReadSliceDenormalizedNode(RubyContext context, SourceSection sourceS
super(context, sourceSection);
}

public ArrayReadSliceDenormalizedNode(ArrayReadSliceDenormalizedNode prev) {
super(prev);
readNode = prev.readNode;
}

public abstract Object executeReadSlice(VirtualFrame frame, RubyArray array, int index, int length);

@Specialization
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.array;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -28,30 +28,26 @@
@NodeChild(value="index", type=RubyNode.class),
@NodeChild(value="length", type=RubyNode.class)
})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArrayReadSliceNormalizedNode extends RubyNode {

public ArrayReadSliceNormalizedNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ArrayReadSliceNormalizedNode(ArrayReadSliceNormalizedNode prev) {
super(prev);
}

public abstract Object executeReadSlice(VirtualFrame frame, RubyArray array, int index, int length);

// Index out of bounds or negative length always gives you nil

@Specialization(
guards={"!indexInBounds"}
guards={"!indexInBounds(array, index)"}
)
public RubyNilClass readIndexOutOfBounds(RubyArray array, int index, int length) {
return nil();
}

@Specialization(
guards={"!lengthPositive"}
guards={"!lengthPositive(length)"}
)
public RubyNilClass readNegativeLength(RubyArray array, int index, int length) {
return nil();
@@ -60,7 +56,7 @@ public RubyNilClass readNegativeLength(RubyArray array, int index, int length) {
// If these guards pass for a null array you can only get an empty array

@Specialization(
guards={"indexInBounds", "lengthPositive", "isNullArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "isNullArray(array)"}
)
public RubyArray readNull(RubyArray array, int index, int length) {
return new RubyArray(array.getLogicalClass(), null, 0);
@@ -69,31 +65,31 @@ public RubyArray readNull(RubyArray array, int index, int length) {
// Reading within bounds on an array with actual storage

@Specialization(
guards={"indexInBounds", "lengthPositive", "endInBounds", "isIntArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "endInBounds(array, index, length)", "isIntArray(array)"}
)
public RubyArray readIntInBounds(RubyArray array, int index, int length) {
return new RubyArray(array.getLogicalClass(),
Arrays.copyOfRange((int[]) array.getStore(), index, index + length), length);
}

@Specialization(
guards={"indexInBounds", "lengthPositive", "endInBounds", "isLongArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "endInBounds(array, index, length)", "isLongArray(array)"}
)
public RubyArray readLongInBounds(RubyArray array, int index, int length) {
return new RubyArray(array.getLogicalClass(),
Arrays.copyOfRange((long[]) array.getStore(), index, index + length), length);
}

@Specialization(
guards={"indexInBounds", "lengthPositive", "endInBounds", "isDoubleArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "endInBounds(array, index, length)", "isDoubleArray(array)"}
)
public RubyArray readDoubleInBounds(RubyArray array, int index, int length) {
return new RubyArray(array.getLogicalClass(),
Arrays.copyOfRange((double[]) array.getStore(), index, index + length), length);
}

@Specialization(
guards={"indexInBounds", "lengthPositive", "endInBounds", "isObjectArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "endInBounds(array, index, length)", "isObjectArray(array)"}
)
public RubyArray readObjectInBounds(RubyArray array, int index, int length) {
return new RubyArray(array.getLogicalClass(),
@@ -103,7 +99,7 @@ public RubyArray readObjectInBounds(RubyArray array, int index, int length) {
// Reading beyond upper bounds on an array with actual storage needs clamping

@Specialization(
guards={"indexInBounds", "lengthPositive", "!endInBounds", "isIntArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "!endInBounds(array, index, length)", "isIntArray(array)"}
)
public RubyArray readIntOutOfBounds(RubyArray array, int index, int length) {
final int clampedLength = Math.min(array.getSize(), index + length) - index;
@@ -113,7 +109,7 @@ public RubyArray readIntOutOfBounds(RubyArray array, int index, int length) {
}

@Specialization(
guards={"indexInBounds", "lengthPositive", "!endInBounds", "isLongArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "!endInBounds(array, index, length)", "isLongArray(array)"}
)
public RubyArray readLongOutOfBounds(RubyArray array, int index, int length) {
final int clampedLength = Math.min(array.getSize(), index + length) - index;
@@ -123,7 +119,7 @@ public RubyArray readLongOutOfBounds(RubyArray array, int index, int length) {
}

@Specialization(
guards={"indexInBounds", "lengthPositive", "!endInBounds", "isDoubleArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "!endInBounds(array, index, length)", "isDoubleArray(array)"}
)
public RubyArray readDoubleOutOfBounds(RubyArray array, int index, int length) {
final int clampedLength = Math.min(array.getSize(), index + length) - index;
@@ -133,7 +129,7 @@ public RubyArray readDoubleOutOfBounds(RubyArray array, int index, int length) {
}

@Specialization(
guards={"indexInBounds", "lengthPositive", "!endInBounds", "isObjectArray"}
guards={"indexInBounds(array, index)", "lengthPositive(length)", "!endInBounds(array, index, length)", "isObjectArray(array)"}
)
public RubyArray readObjectOutOfBounds(RubyArray array, int index, int length) {
final int clampedLength = Math.min(array.getSize(), index + length) - index;
@@ -144,11 +140,11 @@ public RubyArray readObjectOutOfBounds(RubyArray array, int index, int length) {

// Guards

protected static boolean indexInBounds(RubyArray array, int index, int length) {
protected static boolean indexInBounds(RubyArray array, int index) {
return index >= 0 && index <= array.getSize();
}

protected static boolean lengthPositive(RubyArray array, int index, int length) {
protected static boolean lengthPositive(int length) {
return length >= 0;
}

Original file line number Diff line number Diff line change
@@ -32,11 +32,6 @@ public ArrayWriteDenormalizedNode(RubyContext context, SourceSection sourceSecti
super(context, sourceSection);
}

public ArrayWriteDenormalizedNode(ArrayWriteDenormalizedNode prev) {
super(prev);
writeNode = prev.writeNode;
}

public abstract Object executeWrite(VirtualFrame frame, RubyArray array, int index, Object value);

@Specialization
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.array;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -28,7 +28,7 @@
@NodeChild(value="index", type=RubyNode.class),
@NodeChild(value="value", type=RubyNode.class)
})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArrayWriteNormalizedNode extends RubyNode {

@Child private EnsureCapacityArrayNode ensureCapacityNode;
@@ -42,50 +42,44 @@ public ArrayWriteNormalizedNode(RubyContext context, SourceSection sourceSection
generalizeNode = GeneralizeArrayNodeFactory.create(context, sourceSection, null, null);
}

public ArrayWriteNormalizedNode(ArrayWriteNormalizedNode prev) {
super(prev);
ensureCapacityNode = prev.ensureCapacityNode;
generalizeNode = prev.generalizeNode;
}

public abstract Object executeWrite(VirtualFrame frame, RubyArray array, int index, Object value);

// Writing at index 0 into a null array creates a new array of the most specific type

@Specialization(
guards={"isNullArray", "isIndex0"}
guards={"isNullArray(array)", "isIndex0(array, index)"}
)
public boolean writeNull0(RubyArray array, int index, boolean value) {
array.setStore(new Object[]{value}, 1);
return value;
}

@Specialization(
guards={"isNullArray", "isIndex0"}
guards={"isNullArray(array)", "isIndex0(array, index)"}
)
public int writeNull0(RubyArray array, int index, int value) {
array.setStore(new int[]{value}, 1);
return value;
}

@Specialization(
guards={"isNullArray", "isIndex0"}
guards={"isNullArray(array)", "isIndex0(array, index)"}
)
public long writeNull0(RubyArray array, int index, long value) {
array.setStore(new long[]{value}, 1);
return value;
}

@Specialization(
guards={"isNullArray", "isIndex0"}
guards={"isNullArray(array)", "isIndex0(array, index)"}
)
public double writeNull0(RubyArray array, int index, double value) {
array.setStore(new double[]{value}, 1);
return value;
}

@Specialization(
guards={"isNullArray", "isIndex0"}
guards={"isNullArray(array)", "isIndex0(array, index)"}
)
public RubyBasicObject writeNull0(RubyArray array, int index, RubyBasicObject value) {
array.setStore(new Object[]{value}, 1);
@@ -95,7 +89,7 @@ public RubyBasicObject writeNull0(RubyArray array, int index, RubyBasicObject va
// Writing beyond index 0 in a null array creates an Object[] as we need to fill the rest with nil

@Specialization(
guards={"isNullArray", "!isIndex0"}
guards={"isNullArray(array)", "!isIndex0(array, index)"}
)
public Object writeNullBeyond(RubyArray array, int index, Object value) {
final Object[] store = new Object[index + 1];
@@ -112,7 +106,7 @@ public Object writeNullBeyond(RubyArray array, int index, Object value) {
// Writing within an existing array with a compatible type

@Specialization(
guards={"isObjectArray", "isInBounds"}
guards={"isObjectArray(array)", "isInBounds(array, index)"}
)
public boolean writeWithin(RubyArray array, int index, boolean value) {
final Object[] store = (Object[]) array.getStore();
@@ -121,7 +115,7 @@ public boolean writeWithin(RubyArray array, int index, boolean value) {
}

@Specialization(
guards={"isIntArray", "isInBounds"}
guards={"isIntArray(array)", "isInBounds(array, index)"}
)
public int writeWithin(RubyArray array, int index, int value) {
final int[] store = (int[]) array.getStore();
@@ -130,15 +124,15 @@ public int writeWithin(RubyArray array, int index, int value) {
}

@Specialization(
guards={"isLongArray", "isInBounds"}
guards={"isLongArray(array)", "isInBounds(array, index)"}
)
public int writeWithinIntIntoLong(RubyArray array, int index, int value) {
writeWithin(array, index, (long) value);
return value;
}

@Specialization(
guards={"isLongArray", "isInBounds"}
guards={"isLongArray(array)", "isInBounds(array, index)"}
)
public long writeWithin(RubyArray array, int index, long value) {
final long[] store = (long[]) array.getStore();
@@ -147,7 +141,7 @@ public long writeWithin(RubyArray array, int index, long value) {
}

@Specialization(
guards={"isDoubleArray", "isInBounds"}
guards={"isDoubleArray(array)", "isInBounds(array, index)"}
)
public double writeWithin(RubyArray array, int index, double value) {
final double[] store = (double[]) array.getStore();
@@ -156,7 +150,7 @@ public double writeWithin(RubyArray array, int index, double value) {
}

@Specialization(
guards={"isObjectArray", "isInBounds"}
guards={"isObjectArray(array)", "isInBounds(array, index)"}
)
public Object writeWithin(RubyArray array, int index, Object value) {
final Object[] store = (Object[]) array.getStore();
@@ -167,7 +161,7 @@ public Object writeWithin(RubyArray array, int index, Object value) {
// Writing within an existing array with an incompatible type - need to generalise

@Specialization(
guards={"isIntArray", "isInBounds"}
guards={"isIntArray(array)", "isInBounds(array, index)"}
)
public long writeWithinInt(RubyArray array, int index, long value) {
final int[] intStore = (int[]) array.getStore();
@@ -183,7 +177,7 @@ public long writeWithinInt(RubyArray array, int index, long value) {
}

@Specialization(
guards={"isIntArray", "isInBounds", "!isInteger(value)", "!isLong(value)"}
guards={"isIntArray(array)", "isInBounds(array, index)", "!isInteger(value)", "!isLong(value)"}
)
public Object writeWithinInt(RubyArray array, int index, Object value) {
final Object[] objectStore = ArrayUtils.box((int[]) array.getStore());
@@ -193,7 +187,7 @@ public Object writeWithinInt(RubyArray array, int index, Object value) {
}

@Specialization(
guards={"isLongArray", "isInBounds", "!isInteger(value)", "!isLong(value)"}
guards={"isLongArray(array)", "isInBounds(array, index)", "!isInteger(value)", "!isLong(value)"}
)
public Object writeWithinLong(RubyArray array, int index, Object value) {
final Object[] objectStore = ArrayUtils.box((long[]) array.getStore());
@@ -203,7 +197,7 @@ public Object writeWithinLong(RubyArray array, int index, Object value) {
}

@Specialization(
guards={"isDoubleArray", "isInBounds", "!isDouble(value)"}
guards={"isDoubleArray(array)", "isInBounds(array, index)", "!isDouble(value)"}
)
public Object writeWithinDouble(RubyArray array, int index, Object value) {
final Object[] objectStore = ArrayUtils.box((double[]) array.getStore());
@@ -215,7 +209,7 @@ public Object writeWithinDouble(RubyArray array, int index, Object value) {
// Extending an array of compatible type by just one

@Specialization(
guards={"isObjectArray", "isExtendingByOne"}
guards={"isObjectArray(array)", "isExtendingByOne(array, index)"}
)
public boolean writeExtendByOne(VirtualFrame frame, RubyArray array, int index, boolean value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
@@ -225,7 +219,7 @@ public boolean writeExtendByOne(VirtualFrame frame, RubyArray array, int index,
}

@Specialization(
guards={"isIntArray", "isExtendingByOne"}
guards={"isIntArray(array)", "isExtendingByOne(array, index)"}
)
public int writeExtendByOne(VirtualFrame frame, RubyArray array, int index, int value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
@@ -235,7 +229,7 @@ public int writeExtendByOne(VirtualFrame frame, RubyArray array, int index, int
}

@Specialization(
guards={"isLongArray", "isExtendingByOne"}
guards={"isLongArray(array)", "isExtendingByOne(array, index)"}
)
public int writeExtendByOneIntIntoLong(VirtualFrame frame, RubyArray array, int index, int value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
@@ -245,7 +239,7 @@ public int writeExtendByOneIntIntoLong(VirtualFrame frame, RubyArray array, int
}

@Specialization(
guards={"isLongArray", "isExtendingByOne"}
guards={"isLongArray(array)", "isExtendingByOne(array, index)"}
)
public long writeExtendByOne(VirtualFrame frame, RubyArray array, int index, long value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
@@ -255,7 +249,7 @@ public long writeExtendByOne(VirtualFrame frame, RubyArray array, int index, lon
}

@Specialization(
guards={"isDoubleArray", "isExtendingByOne"}
guards={"isDoubleArray(array)", "isExtendingByOne(array, index)"}
)
public double writeExtendByOne(VirtualFrame frame, RubyArray array, int index, double value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
@@ -265,7 +259,7 @@ public double writeExtendByOne(VirtualFrame frame, RubyArray array, int index, d
}

@Specialization(
guards={"isObjectArray", "isExtendingByOne"}
guards={"isObjectArray(array)", "isExtendingByOne(array, index)"}
)
public RubyBasicObject writeExtendByOne(VirtualFrame frame, RubyArray array, int index, RubyBasicObject value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
@@ -275,7 +269,7 @@ public RubyBasicObject writeExtendByOne(VirtualFrame frame, RubyArray array, int
}

@Specialization(
guards={"isObjectArray", "isExtendingByOne"}
guards={"isObjectArray(array)", "isExtendingByOne(array, index)"}
)
public int writeObjectExtendByOne(VirtualFrame frame, RubyArray array, int index, int value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
@@ -287,7 +281,7 @@ public int writeObjectExtendByOne(VirtualFrame frame, RubyArray array, int index
// Writing beyond the end of an array - may need to generalise to Object[] or otherwise extend

@Specialization(
guards={"!isObjectArray", "!isInBounds", "!isExtendingByOne"}
guards={"!isObjectArray(array)", "!isInBounds(array, index)", "!isExtendingByOne(array, index)"}
)
public Object writeBeyondPrimitive(VirtualFrame frame, RubyArray array, int index, Object value) {
generalizeNode.executeGeneralize(frame, array, index + 1);
@@ -303,7 +297,7 @@ public Object writeBeyondPrimitive(VirtualFrame frame, RubyArray array, int inde
}

@Specialization(
guards={"isObjectArray", "!isInBounds", "!isExtendingByOne"}
guards={"isObjectArray(array)", "!isInBounds(array, index)", "!isExtendingByOne(array, index)"}
)
public Object writeBeyondObject(VirtualFrame frame, RubyArray array, int index, Object value) {
ensureCapacityNode.executeEnsureCapacity(frame, array, index + 1);
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.array;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -28,7 +28,7 @@
@NodeChild(value="array", type=RubyNode.class),
@NodeChild(value="requiredCapacity", type=RubyNode.class)
})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class EnsureCapacityArrayNode extends RubyNode {

private final ConditionProfile allocateProfile = ConditionProfile.createCountingProfile();
@@ -37,14 +37,10 @@ public EnsureCapacityArrayNode(RubyContext context, SourceSection sourceSection)
super(context, sourceSection);
}

public EnsureCapacityArrayNode(EnsureCapacityArrayNode prev) {
super(prev);
}

public abstract Object executeEnsureCapacity(VirtualFrame frame, RubyArray array, int requiredCapacity);

@Specialization(
guards={"isIntArray"}
guards={"isIntArray(array)"}
)
public boolean ensureCapacityInt(RubyArray array, int requiredCapacity) {
final int[] store = (int[]) array.getStore();
@@ -58,7 +54,7 @@ public boolean ensureCapacityInt(RubyArray array, int requiredCapacity) {
}

@Specialization(
guards={"isLongArray"}
guards={"isLongArray(array)"}
)
public boolean ensureCapacityLong(RubyArray array, int requiredCapacity) {
final long[] store = (long[]) array.getStore();
@@ -72,7 +68,7 @@ public boolean ensureCapacityLong(RubyArray array, int requiredCapacity) {
}

@Specialization(
guards={"isDoubleArray"}
guards={"isDoubleArray(array)"}
)
public boolean ensureCapacityDouble(RubyArray array, int requiredCapacity) {
final double[] store = (double[]) array.getStore();
@@ -86,7 +82,7 @@ public boolean ensureCapacityDouble(RubyArray array, int requiredCapacity) {
}

@Specialization(
guards={"isObjectArray"}
guards={"isObjectArray(array)"}
)
public boolean ensureCapacityObject(RubyArray array, int requiredCapacity) {
final Object[] store = (Object[]) array.getStore();
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.array;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -28,31 +28,27 @@
@NodeChild(value="array", type=RubyNode.class),
@NodeChild(value="requiredCapacity", type=RubyNode.class)
})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class GeneralizeArrayNode extends RubyNode {

public GeneralizeArrayNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public GeneralizeArrayNode(GeneralizeArrayNode prev) {
super(prev);
}

public abstract Object executeGeneralize(VirtualFrame frame, RubyArray array, int requiredCapacity);

// TODO CS 9-Feb-15 should use ArrayUtils.capacity?

@Specialization(
guards={"isNullArray"}
guards={"isNullArray(array)"}
)
public RubyArray generalizeNull(RubyArray array, int requiredCapacity) {
array.setStore(new Object[requiredCapacity], array.getSize());
return array;
}

@Specialization(
guards={"isIntArray"}
guards={"isIntArray(array)"}
)
public RubyArray generalizeInt(RubyArray array, int requiredCapacity) {
final int[] intStore = (int[]) array.getStore();
@@ -61,7 +57,7 @@ public RubyArray generalizeInt(RubyArray array, int requiredCapacity) {
}

@Specialization(
guards={"isLongArray"}
guards={"isLongArray(array)"}
)
public RubyArray generalizeLong(RubyArray array, int requiredCapacity) {
final long[] intStore = (long[]) array.getStore();
@@ -70,7 +66,7 @@ public RubyArray generalizeLong(RubyArray array, int requiredCapacity) {
}

@Specialization(
guards={"isDoubleArray"}
guards={"isDoubleArray(array)"}
)
public RubyArray generalizeDouble(RubyArray array, int requiredCapacity) {
final double[] intStore = (double[]) array.getStore();
Original file line number Diff line number Diff line change
@@ -22,28 +22,24 @@
* {@code int}, such as Java array indexing, but we would like to also handle {@code long} if they also fit within an
* {@code int}.
*/
@NodeChild(value="child", type=RubyNode.class)
@NodeChild(value="value", type=RubyNode.class)
public abstract class NewFixnumLowerNode extends RubyNode {

public NewFixnumLowerNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public NewFixnumLowerNode(NewFixnumLowerNode prev) {
super(prev);
}

@Specialization
public int lower(int value) {
return value;
}

@Specialization(guards="canLower")
@Specialization(guards="canLower(value)")
public int lower(long value) {
return (int) value;
}

@Specialization(guards="!canLower")
@Specialization(guards="!canLower(value)")
public long lowerFails(long value) {
return value;
}
Original file line number Diff line number Diff line change
@@ -44,12 +44,6 @@ public ArrayCastNode(RubyContext context, SourceSection sourceSection, SplatCast
this.nilBehavior = nilBehavior;
}

public ArrayCastNode(ArrayCastNode prev) {
super(prev);
toArrayNode = prev.toArrayNode;
nilBehavior = prev.nilBehavior;
}

protected abstract RubyNode getChild();

@Specialization
@@ -101,7 +95,7 @@ public Object cast(RubyNilClass nil) {
}
}

@Specialization(guards = {"!isRubyNilClass", "!isRubyArray"})
@Specialization(guards = {"!isRubyNilClass(object)", "!isRubyArray(object)"})
public Object cast(VirtualFrame frame, RubyBasicObject object) {
notDesignedForCompilation();

Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@
/**
* Casts a value into a boolean.
*/
@NodeChild(value = "child", type = RubyNode.class)
@NodeChild(value = "value", type = RubyNode.class)
public abstract class BooleanCastNode extends RubyNode {

public BooleanCastNode(RubyContext context, SourceSection sourceSection) {
@@ -61,7 +61,7 @@ public boolean doFloat(double value) {
return true;
}

@Specialization(guards = "!isRubyNilClass")
@Specialization(guards = "!isRubyNilClass(object)")
public boolean doBasicObject(RubyBasicObject object) {
return true;
}
Original file line number Diff line number Diff line change
@@ -33,6 +33,7 @@
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.RubyBignum;
import org.jruby.truffle.runtime.core.RubyNilClass;
import org.jruby.truffle.runtime.core.RubyString;

/**
* This is a port of MRI's rb_cmpint, as taken from RubyComparable and broken out into specialized nodes.
@@ -52,13 +53,7 @@ public CmpIntNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public CmpIntNode(CmpIntNode prev) {
super(prev);
gtNode = prev.gtNode;
ltNode = prev.ltNode;
}

public abstract int executeCmpInt(VirtualFrame frame, Object value, Object receiver, Object other);
public abstract int executeCmpInt(VirtualFrame frame, Object cmpResult, RubyString a, Object b);

@Specialization
public int cmpInt(int value, Object receiver, Object other) {
@@ -127,5 +122,4 @@ public int cmpObject(VirtualFrame frame, Object value, Object receiver, Object o

return 0;
}

}
Original file line number Diff line number Diff line change
@@ -35,11 +35,6 @@ public HashCastNode(RubyContext context, SourceSection sourceSection) {
toHashNode = DispatchHeadNodeFactory.createMethodCall(context, MissingBehavior.RETURN_MISSING);
}

public HashCastNode(HashCastNode prev) {
super(prev);
toHashNode = prev.toHashNode;
}

protected abstract RubyNode getChild();

@Specialization
@@ -77,7 +72,7 @@ public RubyNilClass cast(RubyNilClass nil) {
return nil;
}

@Specialization(guards = {"!isRubyNilClass", "!isRubyHash"})
@Specialization(guards = {"!isRubyNilClass(object)", "!isRubyHash(object)"})
public Object cast(VirtualFrame frame, RubyBasicObject object) {
notDesignedForCompilation();

Original file line number Diff line number Diff line change
@@ -29,7 +29,7 @@
/**
* Casts a value into a Ruby Float (double).
*/
@NodeChild(value = "child", type = RubyNode.class)
@NodeChild(value = "value", type = RubyNode.class)
public abstract class NumericToFloatNode extends RubyNode {

@Child private KernelNodes.IsANode isANode;
@@ -43,12 +43,6 @@ public NumericToFloatNode(RubyContext context, SourceSection sourceSection, Stri
this.method = method;
}

public NumericToFloatNode(NumericToFloatNode prev) {
super(prev.getContext(), prev.getSourceSection());
isANode = prev.isANode;
method = prev.method;
}

public abstract double executeFloat(VirtualFrame frame, RubyBasicObject value);

private Object callToFloat(VirtualFrame frame, RubyBasicObject value) {
@@ -59,7 +53,7 @@ private Object callToFloat(VirtualFrame frame, RubyBasicObject value) {
return toFloatCallNode.call(frame, value, method, null);
}

@Specialization(guards = "isNumeric")
@Specialization(guards = "isNumeric(frame, value)")
protected double castNumeric(VirtualFrame frame, RubyBasicObject value) {
final Object result = callToFloat(frame, value);

Original file line number Diff line number Diff line change
@@ -35,11 +35,6 @@ public ProcCastNode(RubyContext context, SourceSection sourceSection) {
toProc = DispatchHeadNodeFactory.createMethodCall(context);
}

public ProcCastNode(ProcCastNode prev) {
super(prev);
toProc = prev.toProc;
}

@Specialization
public RubyNilClass doNil(RubyNilClass nil) {
return nil;
Original file line number Diff line number Diff line change
@@ -30,10 +30,6 @@ public ProcOrNullNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ProcOrNullNode(ProcOrNullNode prev) {
super(prev);
}

@Specialization
public Object doNil(RubyNilClass nil) {
return null;
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
*/
package org.jruby.truffle.nodes.cast;

import com.oracle.truffle.api.frame.VirtualFrame;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyArray;
@@ -25,23 +26,19 @@ public SingleValueCastNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public SingleValueCastNode(SingleValueCastNode prev) {
super(prev);
}

public abstract Object executeSingleValue(Object[] args);
public abstract Object executeSingleValue(VirtualFrame frame, Object[] args);

@Specialization(guards = "noArguments")
@Specialization(guards = "noArguments(args)")
protected RubyNilClass castNil(Object[] args) {
return nil();
}

@Specialization(guards = "singleArgument")
@Specialization(guards = "singleArgument(args)")
protected Object castSingle(Object[] args) {
return args[0];
}

@Specialization(guards = { "!noArguments", "!singleArgument" })
@Specialization(guards = { "!noArguments(args)", "!singleArgument(args)" })
protected RubyArray castMany(Object[] args) {
notDesignedForCompilation();

Original file line number Diff line number Diff line change
@@ -54,16 +54,6 @@ public SplatCastNode(RubyContext context, SourceSection sourceSection, NilBehavi
this.useToAry = useToAry;
}

public SplatCastNode(SplatCastNode prev) {
super(prev);
dup = prev.dup;
nilBehavior = prev.nilBehavior;
respondToToA = prev.respondToToA;
respondToCast = prev.respondToCast;
toA = prev.toA;
useToAry = prev.useToAry;
}

protected abstract RubyNode getChild();

@Specialization
@@ -89,7 +79,7 @@ public RubyArray splat(VirtualFrame frame, RubyArray array) {
return dup.executeDup(frame, array);
}

@Specialization(guards = {"!isRubyNilClass", "!isRubyArray"})
@Specialization(guards = {"!isRubyNilClass(object)", "!isRubyArray(object)"})
public RubyArray splat(VirtualFrame frame, Object object) {
notDesignedForCompilation();

Original file line number Diff line number Diff line change
@@ -28,10 +28,6 @@ public StringToSymbolNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public StringToSymbolNode(StringToSymbolNode prev) {
super(prev);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubySymbol doString(RubyString string) {
10 changes: 2 additions & 8 deletions truffle/src/main/java/org/jruby/truffle/nodes/cast/ToSNode.java
Original file line number Diff line number Diff line change
@@ -44,12 +44,6 @@ protected RubyString kernelToS(VirtualFrame frame, Object object) {
return kernelToSNode.executeToS(frame, object);
}


public ToSNode(ToSNode prev) {
super(prev);
callToSNode = prev.callToSNode;
}

@Override
public abstract RubyString executeRubyString(VirtualFrame frame);

@@ -58,12 +52,12 @@ public RubyString toS(RubyString string) {
return string;
}

@Specialization(guards = "!isRubyString", rewriteOn = UnexpectedResultException.class)
@Specialization(guards = "!isRubyString(object)", rewriteOn = UnexpectedResultException.class)
public RubyString toS(VirtualFrame frame, Object object) throws UnexpectedResultException {
return RubyTypesGen.RUBYTYPES.expectRubyString(callToSNode.call(frame, object, "to_s", null));
}

@Specialization(guards = "!isRubyString")
@Specialization(guards = "!isRubyString(object)")
public RubyString toSFallback(VirtualFrame frame, Object object) {
final Object value = callToSNode.call(frame, object, "to_s", null);

Original file line number Diff line number Diff line change
@@ -34,12 +34,7 @@ public SymbolOrToStrNode(RubyContext context, SourceSection sourceSection) {
toStr = DispatchHeadNodeFactory.createMethodCall(context);
}

public SymbolOrToStrNode(SymbolOrToStrNode prev) {
super(prev);
toStr = prev.toStr;
}

public abstract String executeToJavaString(VirtualFrame frame, Object object);
public abstract String executeToJavaString(VirtualFrame frame, Object name);

@Specialization
public String coerceRubySymbol(RubySymbol symbol) {
@@ -51,7 +46,7 @@ public String coerceRubyString(RubyString string) {
return string.toString();
}

@Specialization(guards = { "!isRubySymbol", "!isRubyString" })
@Specialization(guards = { "!isRubySymbol(object)", "!isRubyString(object)" })
public String coerceObject(VirtualFrame frame, Object object) {
notDesignedForCompilation();

@@ -75,5 +70,4 @@ public String coerceObject(VirtualFrame frame, Object object) {
throw new RaiseException(getContext().getCoreLibrary().typeErrorBadCoercion(object, "String", "to_str", coerced, this));
}
}

}
Original file line number Diff line number Diff line change
@@ -31,16 +31,12 @@ public ToAryNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToAryNode(ToAryNode prev) {
super(prev);
}

@Specialization
public RubyArray coerceRubyArray(RubyArray rubyArray) {
return rubyArray;
}

@Specialization(guards = "!isRubyArray")
@Specialization(guards = "!isRubyArray(object)")
public RubyArray coerceObject(VirtualFrame frame, Object object) {
notDesignedForCompilation();

Original file line number Diff line number Diff line change
@@ -36,10 +36,6 @@ public ToIntNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToIntNode(ToIntNode prev) {
super(prev);
}

public abstract int executeInt(VirtualFrame frame, Object object);

@Specialization
@@ -71,7 +67,7 @@ public Object coerceBoolean(VirtualFrame frame, boolean value) {
return coerceObject(frame, value);
}

@Specialization(guards = "!isRubyBignum")
@Specialization(guards = "!isRubyBignum(object)")
public Object coerceBasicObject(VirtualFrame frame, RubyBasicObject object) {
return coerceObject(frame, object);
}
Original file line number Diff line number Diff line change
@@ -32,19 +32,14 @@ public ToStrNode(RubyContext context, SourceSection sourceSection) {
toStrNode = DispatchHeadNodeFactory.createMethodCall(context);
}

public ToStrNode(ToStrNode prev) {
super(prev);
toStrNode = prev.toStrNode;
}

public abstract RubyString executeRubyString(VirtualFrame frame, Object object);

@Specialization
public RubyString coerceRubyString(RubyString string) {
return string;
}

@Specialization(guards = "!isRubyString")
@Specialization(guards = "!isRubyString(object)")
public RubyString coerceObject(VirtualFrame frame, Object object) {
notDesignedForCompilation();

13 changes: 11 additions & 2 deletions truffle/src/main/java/org/jruby/truffle/nodes/control/IfNode.java
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.BranchProfile;
import com.oracle.truffle.api.utilities.ConditionProfile;

import org.jruby.truffle.nodes.RubyNode;
@@ -27,7 +28,11 @@ public class IfNode extends RubyNode {
@Child private BooleanCastNode condition;
@Child private RubyNode thenBody;
@Child private RubyNode elseBody;
private final ConditionProfile conditionProfile = ConditionProfile.createCountingProfile();

private final BranchProfile thenBranch = BranchProfile.create();
private final BranchProfile elseBranch = BranchProfile.create();

// private final ConditionProfile conditionProfile = ConditionProfile.createCountingProfile();

public IfNode(RubyContext context, SourceSection sourceSection, RubyNode condition, RubyNode thenBody, RubyNode elseBody) {
super(context, sourceSection);
@@ -43,9 +48,13 @@ public IfNode(RubyContext context, SourceSection sourceSection, RubyNode conditi

@Override
public Object execute(VirtualFrame frame) {
if (conditionProfile.profile(condition.executeBoolean(frame))) {
// TODO CS 20-Feb-15 - we'd like to use this but it causes problems where we do things like x = if ...
// if (conditionProfile.profile(condition.executeBoolean(frame))) {
if (condition.executeBoolean(frame)) {
thenBranch.enter();
return thenBody.execute(frame);
} else {
elseBranch.enter();
return elseBody.execute(frame);
}
}
Original file line number Diff line number Diff line change
@@ -26,10 +26,6 @@ public ToJavaStringNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToJavaStringNode(ToJavaStringNode prev) {
super(prev);
}

public abstract String executeJavaString(VirtualFrame frame, Object object);

// TODO(CS): cache the conversion to a Java String? Or should the user do that themselves?
Original file line number Diff line number Diff line change
@@ -25,10 +25,6 @@ public ToSymbolNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToSymbolNode(ToSymbolNode prev) {
super(prev);
}

public abstract RubySymbol executeRubySymbol(VirtualFrame frame, Object object);

// TODO(CS): cache the conversion to a symbol? Or should the user do that themselves?
Original file line number Diff line number Diff line change
@@ -475,6 +475,10 @@ public Object append(Object store, int index, RubyArray array) {

@Override
public Object append(Object store, int index, Object value) {
if (index >= ((Object[]) store).length) {
new Exception().printStackTrace();
}

((Object[]) store)[index] = value;
return store;
}
Original file line number Diff line number Diff line change
@@ -9,19 +9,15 @@
*/
package org.jruby.truffle.nodes.core;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.runtime.RubyContext;

@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArrayCoreMethodNode extends CoreMethodNode {

public ArrayCoreMethodNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ArrayCoreMethodNode(ArrayCoreMethodNode prev) {
super(prev);
}

}
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.core;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -23,7 +23,7 @@
import java.util.Arrays;

@NodeChildren({@NodeChild(value = "array", type = RubyNode.class)})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArrayDropTailNode extends RubyNode {

final int index;
@@ -33,19 +33,14 @@ public ArrayDropTailNode(RubyContext context, SourceSection sourceSection, int i
this.index = index;
}

public ArrayDropTailNode(ArrayDropTailNode prev) {
super(prev);
index = prev.index;
}

@Specialization(guards = "isNull")
@Specialization(guards = "isNull(array)")
public RubyArray getHeadNull(RubyArray array) {
notDesignedForCompilation();

return new RubyArray(getContext().getCoreLibrary().getArrayClass());
}

@Specialization(guards = "isIntegerFixnum")
@Specialization(guards = "isIntegerFixnum(array)")
public RubyArray getHeadIntegerFixnum(RubyArray array) {
notDesignedForCompilation();

@@ -56,7 +51,7 @@ public RubyArray getHeadIntegerFixnum(RubyArray array) {
}
}

@Specialization(guards = "isLongFixnum")
@Specialization(guards = "isLongFixnum(array)")
public RubyArray geHeadLongFixnum(RubyArray array) {
notDesignedForCompilation();

@@ -68,7 +63,7 @@ public RubyArray geHeadLongFixnum(RubyArray array) {
}
}

@Specialization(guards = "isFloat")
@Specialization(guards = "isFloat(array)")
public RubyArray getHeadFloat(RubyArray array) {
notDesignedForCompilation();

@@ -80,7 +75,7 @@ public RubyArray getHeadFloat(RubyArray array) {
}
}

@Specialization(guards = "isObject")
@Specialization(guards = "isObject(array)")
public RubyArray getHeadObject(RubyArray array) {
notDesignedForCompilation();

Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.core;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -25,40 +25,36 @@
* Dup an array, without using any method lookup. This isn't a call - it's an operation on a core class.
*/
@NodeChildren({@NodeChild(value = "array", type = RubyNode.class)})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArrayDupNode extends RubyNode {

public ArrayDupNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ArrayDupNode(ArrayDupNode prev) {
super(prev);
}

public abstract RubyArray executeDup(VirtualFrame frame, RubyArray array);

@Specialization(guards = "isNull")
@Specialization(guards = "isNull(from)")
public RubyArray dupNull(RubyArray from) {
return new RubyArray(getContext().getCoreLibrary().getArrayClass(), null, 0);
}

@Specialization(guards = "isIntegerFixnum")
@Specialization(guards = "isIntegerFixnum(from)")
public RubyArray dupIntegerFixnum(RubyArray from) {
return new RubyArray(getContext().getCoreLibrary().getArrayClass(), Arrays.copyOf((int[]) from.getStore(), from.getSize()), from.getSize());
}

@Specialization(guards = "isLongFixnum")
@Specialization(guards = "isLongFixnum(from)")
public RubyArray dupLongFixnum(RubyArray from) {
return new RubyArray(getContext().getCoreLibrary().getArrayClass(), Arrays.copyOf((long[]) from.getStore(), from.getSize()), from.getSize());
}

@Specialization(guards = "isFloat")
@Specialization(guards = "isFloat(from)")
public RubyArray dupFloat(RubyArray from) {
return new RubyArray(getContext().getCoreLibrary().getArrayClass(), Arrays.copyOf((double[]) from.getStore(), from.getSize()), from.getSize());
}

@Specialization(guards = "isObject")
@Specialization(guards = "isObject(from)")
public RubyArray dupObject(RubyArray from) {
return new RubyArray(getContext().getCoreLibrary().getArrayClass(), Arrays.copyOf((Object[]) from.getStore(), from.getSize()), from.getSize());
}
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.core;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -23,7 +23,7 @@
import java.util.Arrays;

@NodeChildren({@NodeChild(value = "array", type = RubyNode.class)})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArrayGetTailNode extends RubyNode {

final int index;
@@ -33,19 +33,14 @@ public ArrayGetTailNode(RubyContext context, SourceSection sourceSection, int in
this.index = index;
}

public ArrayGetTailNode(ArrayGetTailNode prev) {
super(prev);
index = prev.index;
}

@Specialization(guards = "isNull")
@Specialization(guards = "isNull(array)")
public RubyArray getTailNull(RubyArray array) {
notDesignedForCompilation();

return new RubyArray(getContext().getCoreLibrary().getArrayClass());
}

@Specialization(guards = "isIntegerFixnum")
@Specialization(guards = "isIntegerFixnum(array)")
public RubyArray getTailIntegerFixnum(RubyArray array) {
notDesignedForCompilation();

@@ -56,7 +51,7 @@ public RubyArray getTailIntegerFixnum(RubyArray array) {
}
}

@Specialization(guards = "isLongFixnum")
@Specialization(guards = "isLongFixnum(array)")
public RubyArray getTailLongFixnum(RubyArray array) {
notDesignedForCompilation();

@@ -67,7 +62,7 @@ public RubyArray getTailLongFixnum(RubyArray array) {
}
}

@Specialization(guards = "isFloat")
@Specialization(guards = "isFloat(array)")
public RubyArray getTailFloat(RubyArray array) {
notDesignedForCompilation();

@@ -78,7 +73,7 @@ public RubyArray getTailFloat(RubyArray array) {
}
}

@Specialization(guards = "isObject")
@Specialization(guards = "isObject(array)")
public RubyArray getTailObject(RubyArray array) {
notDesignedForCompilation();

641 changes: 229 additions & 412 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/ArrayNodes.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@
*/
package org.jruby.truffle.nodes.core;

import com.oracle.truffle.api.dsl.ImportGuards;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.NodeChildren;
import com.oracle.truffle.api.dsl.Specialization;
@@ -23,7 +23,7 @@
import java.util.Arrays;

@NodeChildren({@NodeChild(value = "array", type = RubyNode.class)})
@ImportGuards(ArrayGuards.class)
@ImportStatic(ArrayGuards.class)
public abstract class ArraySliceNode extends RubyNode {

final int from; // positive
@@ -37,20 +37,14 @@ public ArraySliceNode(RubyContext context, SourceSection sourceSection, int from
this.to = to;
}

public ArraySliceNode(ArraySliceNode prev) {
super(prev);
from = prev.from;
to = prev.to;
}

@Specialization(guards = "isNull")
@Specialization(guards = "isNull(array)")
public RubyArray sliceNull(RubyArray array) {
notDesignedForCompilation();

return new RubyArray(getContext().getCoreLibrary().getArrayClass());
}

@Specialization(guards = "isIntegerFixnum")
@Specialization(guards = "isIntegerFixnum(array)")
public RubyArray sliceIntegerFixnum(RubyArray array) {
notDesignedForCompilation();
final int to = array.getSize() + this.to;
@@ -62,7 +56,7 @@ public RubyArray sliceIntegerFixnum(RubyArray array) {
}
}

@Specialization(guards = "isLongFixnum")
@Specialization(guards = "isLongFixnum(array)")
public RubyArray sliceLongFixnum(RubyArray array) {
notDesignedForCompilation();
final int to = array.getSize() + this.to;
@@ -74,7 +68,7 @@ public RubyArray sliceLongFixnum(RubyArray array) {
}
}

@Specialization(guards = "isFloat")
@Specialization(guards = "isFloat(array)")
public RubyArray sliceFloat(RubyArray array) {
notDesignedForCompilation();
final int to = array.getSize() + this.to;
@@ -86,7 +80,7 @@ public RubyArray sliceFloat(RubyArray array) {
}
}

@Specialization(guards = "isObject")
@Specialization(guards = "isObject(array)")
public RubyArray sliceObject(RubyArray array) {
notDesignedForCompilation();
final int to = array.getSize() + this.to;
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2015 Oracle and/or its affiliates. All rights reserved. This
* Copyb (c) 2013, 2015 Oracle and/or its affiliates. All bs 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:
*
@@ -44,10 +44,6 @@ public NotNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public NotNode(NotNode prev) {
super(prev);
}

@CreateCast("operand") public RubyNode createCast(RubyNode operand) {
return BooleanCastNodeFactory.create(getContext(), getSourceSection(), operand);
}
@@ -67,10 +63,6 @@ public EqualNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public EqualNode(EqualNode prev) {
super(prev);
}

@Specialization public boolean equal(boolean a, boolean b) { return a == b; }
@Specialization public boolean equal(int a, int b) { return a == b; }
@Specialization public boolean equal(long a, long b) { return a == b; }
@@ -80,17 +72,17 @@ public EqualNode(EqualNode prev) {
return a == b;
}

@Specialization(guards = {"isNotRubyBasicObject(left)", "isNotRubyBasicObject(right)", "notSameClass"})
@Specialization(guards = {"isNotRubyBasicObject(a)", "isNotRubyBasicObject(b)", "notSameClass(a, b)"})
public boolean equal(Object a, Object b) {
return false;
}

@Specialization(guards = "isNotRubyBasicObject(left)")
@Specialization(guards = "isNotRubyBasicObject(a)")
public boolean equal(Object a, RubyBasicObject b) {
return false;
}

@Specialization(guards = "isNotRubyBasicObject(right)")
@Specialization(guards = "isNotRubyBasicObject(b)")
public boolean equal(RubyBasicObject a, Object b) {
return false;
}
@@ -115,11 +107,6 @@ public NotEqualNode(RubyContext context, SourceSection sourceSection) {
equalNode = DispatchHeadNodeFactory.createMethodCall(context, false, false, null);
}

public NotEqualNode(NotEqualNode prev) {
super(prev);
equalNode = prev.equalNode;
}

@Specialization
public boolean equal(VirtualFrame frame, Object a, Object b) {
return !equalNode.callBoolean(frame, a, "==", null, b);
@@ -134,10 +121,6 @@ public ReferenceEqualNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ReferenceEqualNode(ReferenceEqualNode prev) {
super(prev);
}

public abstract boolean executeReferenceEqual(VirtualFrame frame, Object a, Object b);

@Specialization public boolean equal(boolean a, boolean b) { return a == b; }
@@ -149,17 +132,17 @@ public ReferenceEqualNode(ReferenceEqualNode prev) {
return a == b;
}

@Specialization(guards = {"isNotRubyBasicObject(left)", "isNotRubyBasicObject(right)", "notSameClass"})
@Specialization(guards = {"isNotRubyBasicObject(a)", "isNotRubyBasicObject(b)", "notSameClass(a, b)"})
public boolean equal(Object a, Object b) {
return false;
}

@Specialization(guards = "isNotRubyBasicObject(left)")
@Specialization(guards = "isNotRubyBasicObject(a)")
public boolean equal(Object a, RubyBasicObject b) {
return false;
}

@Specialization(guards = "isNotRubyBasicObject(right)")
@Specialization(guards = "isNotRubyBasicObject(b)")
public boolean equal(RubyBasicObject a, Object b) {
return false;
}
@@ -181,10 +164,6 @@ public InitializeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InitializeNode(InitializeNode prev) {
super(prev);
}

@Specialization
public RubyNilClass initialize() {
return nil();
@@ -202,11 +181,6 @@ public InstanceEvalNode(RubyContext context, SourceSection sourceSection) {
yield = new YieldDispatchHeadNode(context);
}

public InstanceEvalNode(InstanceEvalNode prev) {
super(prev);
yield = prev.yield;
}

@Specialization
public Object instanceEval(VirtualFrame frame, Object receiver, RubyString string, UndefinedPlaceholder block) {
notDesignedForCompilation();
@@ -230,10 +204,6 @@ public InstanceExecNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InstanceExecNode(InstanceExecNode prev) {
super(prev);
}

@Specialization
public Object instanceExec(VirtualFrame frame, Object receiver, Object[] arguments, RubyProc block) {
notDesignedForCompilation();
@@ -257,10 +227,6 @@ public MethodMissingNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public MethodMissingNode(MethodMissingNode prev) {
super(prev);
}

@Specialization
public Object methodMissing(Object self, Object[] args, UndefinedPlaceholder block) {
notDesignedForCompilation();
@@ -312,18 +278,13 @@ public abstract static class SendNode extends CoreMethodNode {
public SendNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);

dispatchNode = DispatchHeadNodeFactory.createMethodCall(context, true, Options.TRUFFLE_DISPATCH_METAPROGRAMMING_ALWAYS_INDIRECT.load(), MissingBehavior.CALL_METHOD_MISSING);
dispatchNode = DispatchHeadNodeFactory.createMethodCall(context, true, DispatchNode.DISPATCH_METAPROGRAMMING_ALWAYS_INDIRECT, MissingBehavior.CALL_METHOD_MISSING);

if (Options.TRUFFLE_DISPATCH_METAPROGRAMMING_ALWAYS_UNCACHED.load()) {
if (DispatchNode.DISPATCH_METAPROGRAMMING_ALWAYS_UNCACHED) {
dispatchNode.forceUncached();
}
}

public SendNode(SendNode prev) {
super(prev);
dispatchNode = prev.dispatchNode;
}

@Specialization
public Object send(VirtualFrame frame, Object self, Object[] args, UndefinedPlaceholder block) {
return send(frame, self, args, (RubyProc) null);
118 changes: 3 additions & 115 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/BignumNodes.java
Original file line number Diff line number Diff line change
@@ -45,11 +45,6 @@ public BignumCoreMethodNode(RubyContext context, SourceSection sourceSection) {
fixnumOrBignum = new FixnumOrBignumNode(context, sourceSection);
}

public BignumCoreMethodNode(BignumCoreMethodNode prev) {
super(prev);
fixnumOrBignum = prev.fixnumOrBignum;
}

public Object fixnumOrBignum(BigInteger value) {
return fixnumOrBignum.fixnumOrBignum(value);
}
@@ -63,10 +58,6 @@ public NegNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public NegNode(NegNode prev) {
super(prev);
}

@Specialization
public Object neg(RubyBignum value) {
return fixnumOrBignum(value.bigIntegerValue().negate());
@@ -81,10 +72,6 @@ public AddNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public AddNode(AddNode prev) {
super(prev);
}

@Specialization
public Object add(RubyBignum a, int b) {
return fixnumOrBignum(a.bigIntegerValue().add(BigInteger.valueOf(b)));
@@ -114,10 +101,6 @@ public SubNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public SubNode(SubNode prev) {
super(prev);
}

@Specialization
public Object sub(RubyBignum a, int b) {
return fixnumOrBignum(a.bigIntegerValue().subtract(BigInteger.valueOf(b)));
@@ -147,10 +130,6 @@ public MulNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public MulNode(MulNode prev) {
super(prev);
}

@TruffleBoundary
@Specialization
public Object mul(RubyBignum a, int b) {
@@ -183,10 +162,6 @@ public DivNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public DivNode(DivNode prev) {
super(prev);
}

@Specialization
public Object div(RubyBignum a, int b) {
return fixnumOrBignum(a.bigIntegerValue().divide(BigInteger.valueOf(b)));
@@ -216,10 +191,6 @@ public ModNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ModNode(ModNode prev) {
super(prev);
}

@Specialization
public Object mod(RubyBignum a, int b) {
if (b == 0) {
@@ -257,7 +228,7 @@ public Object mod(RubyBignum a, RubyBignum b) {
return fixnumOrBignum(a.bigIntegerValue().mod(b.bigIntegerValue()));
}

@Specialization(guards = {"!isInteger(arguments[1])", "!isLong(arguments[1])", "!isRubyBignum(arguments[1])"})
@Specialization(guards = {"!isInteger(b)", "!isLong(b)", "!isRubyBignum(b)"})
public Object mod(VirtualFrame frame, RubyBignum a, Object b) {
return ruby(frame, "redo_coerced :%, other", "other", b);
}
@@ -271,10 +242,6 @@ public LessNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public LessNode(LessNode prev) {
super(prev);
}

@Specialization
public boolean less(RubyBignum a, int b) {
return a.bigIntegerValue().compareTo(BigInteger.valueOf(b)) < 0;
@@ -295,7 +262,7 @@ public boolean less(RubyBignum a, RubyBignum b) {
return a.bigIntegerValue().compareTo(b.bigIntegerValue()) < 0;
}

@Specialization(guards = "!isRubyBignum(arguments[1])")
@Specialization(guards = "!isRubyBignum(b)")
public Object lessCoerced(VirtualFrame frame, RubyBignum a, RubyBasicObject b) {
return ruby(frame, "redo_coerced :<, b", "b", b);
}
@@ -309,10 +276,6 @@ public LessEqualNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public LessEqualNode(LessEqualNode prev) {
super(prev);
}

@Specialization
public boolean lessEqual(RubyBignum a, int b) {
return a.bigIntegerValue().compareTo(BigInteger.valueOf(b)) <= 0;
@@ -344,12 +307,6 @@ public EqualNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public EqualNode(EqualNode prev) {
super(prev);
booleanCastNode = prev.booleanCastNode;
reverseCallNode = prev.reverseCallNode;
}

@Specialization
public boolean equal(RubyBignum a, int b) {
return a.bigIntegerValue().equals(BigInteger.valueOf(b));
@@ -370,7 +327,7 @@ public boolean equal(RubyBignum a, RubyBignum b) {
return a.bigIntegerValue().equals(b.bigIntegerValue());
}

@Specialization(guards = "!isRubyBignum(arguments[1])")
@Specialization(guards = "!isRubyBignum(b)")
public Object equal(VirtualFrame frame, RubyBignum a, RubyBasicObject b) {
if (booleanCastNode == null) {
CompilerDirectives.transferToInterpreter();
@@ -397,10 +354,6 @@ public CompareNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public CompareNode(CompareNode prev) {
super(prev);
}

@Specialization
public int compare(RubyBignum a, int b) {
return a.bigIntegerValue().compareTo(BigInteger.valueOf(b));
@@ -433,10 +386,6 @@ public GreaterEqualNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public GreaterEqualNode(GreaterEqualNode prev) {
super(prev);
}

@Specialization
public boolean greaterEqual(RubyBignum a, int b) {
return a.bigIntegerValue().compareTo(BigInteger.valueOf(b)) >= 0;
@@ -465,10 +414,6 @@ public GreaterNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public GreaterNode(GreaterNode prev) {
super(prev);
}

@Specialization
public boolean greater(RubyBignum a, int b) {
return a.bigIntegerValue().compareTo(BigInteger.valueOf(b)) > 0;
@@ -497,10 +442,6 @@ public BitAndNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public BitAndNode(BitAndNode prev) {
super(prev);
}

@Specialization
public Object bitAnd(RubyBignum a, int b) {
return fixnumOrBignum(a.bigIntegerValue().and(BigInteger.valueOf(b)));
@@ -524,10 +465,6 @@ public BitOrNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public BitOrNode(BitOrNode prev) {
super(prev);
}

@Specialization
public Object bitOr(RubyBignum a, int b) {
return fixnumOrBignum(a.bigIntegerValue().or(BigInteger.valueOf(b)));
@@ -551,10 +488,6 @@ public BitXOrNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public BitXOrNode(BitXOrNode prev) {
super(prev);
}

@Specialization
public Object bitXOr(RubyBignum a, int b) {
return fixnumOrBignum(a.bigIntegerValue().xor(BigInteger.valueOf(b)));
@@ -580,10 +513,6 @@ public LeftShiftNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public LeftShiftNode(LeftShiftNode prev) {
super(prev);
}

@Specialization
public Object leftShift(RubyBignum a, int b) {
if (b >= 0) {
@@ -605,10 +534,6 @@ public RightShiftNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public RightShiftNode(RightShiftNode prev) {
super(prev);
}

@Specialization
public Object leftShift(RubyBignum a, int b) {
if (b >= 0) {
@@ -628,10 +553,6 @@ public AbsNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public AbsNode(AbsNode prev) {
super(prev);
}

@Specialization
public Object abs(RubyBignum value) {
return fixnumOrBignum(value.bigIntegerValue().abs());
@@ -646,10 +567,6 @@ public BitLengthNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public BitLengthNode(BitLengthNode prev) {
super(prev);
}

@Specialization
public int bitLength(RubyBignum value) {
return value.bigIntegerValue().bitLength();
@@ -664,10 +581,6 @@ public CoerceNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public CoerceNode(CoerceNode prev) {
super(prev);
}

@Specialization
public RubyArray coerce(RubyBignum a, int b) {
notDesignedForCompilation();
@@ -708,11 +621,6 @@ public DivModNode(RubyContext context, SourceSection sourceSection) {
divModNode = new GeneralDivModNode(context, sourceSection);
}

public DivModNode(DivModNode prev) {
super(prev);
divModNode = prev.divModNode;
}

@Specialization
public RubyArray divMod(RubyBignum a, int b) {
return divModNode.execute(a, b);
@@ -737,10 +645,6 @@ public EvenNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public EvenNode(EvenNode prev) {
super(prev);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public boolean even(RubyBignum value) {
@@ -756,10 +660,6 @@ public HashNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public HashNode(HashNode prev) {
super(prev);
}

@Specialization
public int hash(RubyBignum self) {
return self.bigIntegerValue().hashCode();
@@ -774,10 +674,6 @@ public SizeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public SizeNode(SizeNode prev) {
super(prev);
}

@Specialization
public int size(RubyBignum value) {
return (value.bigIntegerValue().bitLength() + 7) / 8;
@@ -792,10 +688,6 @@ public ToFNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToFNode(ToFNode prev) {
super(prev);
}

@Specialization
public double toF(RubyBignum value) {
return value.bigIntegerValue().doubleValue();
@@ -810,10 +702,6 @@ public ToSNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToSNode(ToSNode prev) {
super(prev);
}

@TruffleBoundary
@Specialization
public RubyString toS(RubyBignum value, UndefinedPlaceholder undefined) {
Original file line number Diff line number Diff line change
@@ -24,10 +24,6 @@ public BinaryCoreMethodNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public BinaryCoreMethodNode(BinaryCoreMethodNode prev) {
super(prev);
}

public abstract RubyNode getLeft();

public abstract RubyNode getRight();
Original file line number Diff line number Diff line change
@@ -31,10 +31,6 @@ public InitializeCopyNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InitializeCopyNode(InitializeCopyNode prev) {
super(prev);
}

@Specialization
public Object initializeCopy(RubyBinding self, RubyBinding from) {
notDesignedForCompilation();
@@ -66,10 +62,6 @@ public LocalVariableGetNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public LocalVariableGetNode(LocalVariableGetNode prev) {
super(prev);
}

@Specialization
public Object localVariableGet(RubyBinding binding, RubySymbol symbol) {
notDesignedForCompilation();
@@ -94,10 +86,6 @@ public LocalVariableSetNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public LocalVariableSetNode(LocalVariableSetNode prev) {
super(prev);
}

@Specialization
public Object localVariableSetNode(RubyBinding binding, RubySymbol symbol, Object value) {
notDesignedForCompilation();
@@ -133,10 +121,6 @@ public LocalVariablesNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public LocalVariablesNode(LocalVariablesNode prev) {
super(prev);
}

@Specialization
public RubyArray localVariables(RubyBinding binding) {
notDesignedForCompilation();
24 changes: 0 additions & 24 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/ClassNodes.java
Original file line number Diff line number Diff line change
@@ -36,10 +36,6 @@ public AllocateNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public AllocateNode(AllocateNode prev) {
super(prev);
}

public abstract RubyBasicObject executeAllocate(VirtualFrame frame, RubyClass rubyClass);

@Specialization
@@ -65,14 +61,6 @@ public NewNode(RubyContext context, SourceSection sourceSection) {
initialize = DispatchHeadNodeFactory.createMethodCallOnSelf(context);
}

public NewNode(NewNode prev) {
super(prev);
allocateNode = prev.allocateNode;
initialize = prev.initialize;
}

public abstract RubyBasicObject executeNew(VirtualFrame frame, RubyClass rubyClass, Object[] args, Object block);

@Specialization
public Object newInstance(VirtualFrame frame, RubyClass rubyClass, Object[] args, UndefinedPlaceholder block) {
return doNewInstance(frame, rubyClass, args, null);
@@ -99,10 +87,6 @@ public InitializeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InitializeNode(InitializeNode prev) {
super(prev);
}

void moduleInitialize(VirtualFrame frame, RubyClass rubyClass, RubyProc block) {
if (moduleInitializeNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -143,10 +127,6 @@ public InheritedNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InheritedNode(InheritedNode prev) {
super(prev);
}

@Specialization
public RubyNilClass inherited(Object subclass) {
return nil();
@@ -161,10 +141,6 @@ public SuperClassNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public SuperClassNode(SuperClassNode prev) {
super(prev);
}

@Specialization
public Object getSuperClass(RubyClass rubyClass) {
RubyClass superclass = rubyClass.getSuperClass();
Original file line number Diff line number Diff line change
@@ -21,8 +21,4 @@ public CoreMethodNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public CoreMethodNode(CoreMethodNode prev) {
super(prev);
}

}
Original file line number Diff line number Diff line change
@@ -205,7 +205,8 @@ private static RubyRootNode makeGenericMethod(RubyContext context, MethodDetails
}
}

verifyNoAmbiguousDefaultArguments(methodDetails);
// TODO CS 12 Feb 15 - doesn't work any more I'm afraid as the guards use parameter names now
//verifyNoAmbiguousDefaultArguments(methodDetails);

final CheckArityNode checkArity = new CheckArityNode(context, sourceSection, arity);
RubyNode sequence = SequenceNode.sequence(context, sourceSection, checkArity, methodNode);
Original file line number Diff line number Diff line change
@@ -42,10 +42,6 @@ public InitializeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InitializeNode(InitializeNode prev) {
super(prev);
}

@TruffleBoundary
@Specialization
public RubyNilClass initialize(RubyEncodingConverter self, Object source, Object destination, Object options) {
@@ -131,15 +127,6 @@ public TranscodingMapNode(RubyContext context, SourceSection sourceSection) {
newTranscodingNode = DispatchHeadNodeFactory.createMethodCall(context);
}

public TranscodingMapNode(TranscodingMapNode prev) {
super(prev);
upcaseNode = prev.upcaseNode;
toSymNode = prev.toSymNode;
newLookupTableNode = prev.newLookupTableNode;
lookupTableWriteNode = prev.lookupTableWriteNode;
newTranscodingNode = prev.newTranscodingNode;
}

@Specialization
public Object transcodingMap(VirtualFrame frame) {
final Object ret = newLookupTableNode.call(frame, getContext().getCoreLibrary().getLookupTableClass(), "new", null);
Original file line number Diff line number Diff line change
@@ -44,10 +44,6 @@ public AsciiCompatibleNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public AsciiCompatibleNode(AsciiCompatibleNode prev) {
super(prev);
}

@Specialization
public Object isCompatible(RubyEncoding encoding) {
notDesignedForCompilation();
@@ -62,10 +58,6 @@ public CompatibleQueryNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public CompatibleQueryNode(CompatibleQueryNode prev) {
super(prev);
}

@TruffleBoundary
@Specialization
public Object isCompatible(RubyString first, RubyString second) {
@@ -198,11 +190,6 @@ public SetDefaultExternalNode(RubyContext context, SourceSection sourceSection)
super(context, sourceSection);
}

public SetDefaultExternalNode(SetDefaultExternalNode prev) {
super(prev);
toStrNode = prev.toStrNode;
}

@Specialization
public RubyEncoding defaultExternal(RubyEncoding encoding) {
notDesignedForCompilation();
@@ -227,7 +214,7 @@ public RubyEncoding defaultExternal(RubyNilClass nil) {
throw new RaiseException(getContext().getCoreLibrary().argumentError("default external can not be nil", this));
}

@Specialization(guards = { "!isRubyEncoding", "!isRubyString", "!isRubyNilClass" })
@Specialization(guards = { "!isRubyEncoding(encoding)", "!isRubyString(encoding)", "!isRubyNilClass(encoding)" })
public RubyEncoding defaultExternal(VirtualFrame frame, Object encoding) {
if (toStrNode == null) {
CompilerDirectives.transferToInterpreter();
@@ -249,10 +236,6 @@ public SetDefaultInternalNode(RubyContext context, SourceSection sourceSection)
super(context, sourceSection);
}

public SetDefaultInternalNode(SetDefaultInternalNode prev) {
super(prev);
}

@Specialization
public RubyEncoding defaultInternal(RubyEncoding encoding) {
notDesignedForCompilation();
@@ -271,7 +254,7 @@ public RubyNilClass defaultInternal(RubyNilClass encoding) {
return encoding;
}

@Specialization(guards = { "!isRubyEncoding", "!isRubyNilClass" })
@Specialization(guards = { "!isRubyEncoding(encoding)", "!isRubyNilClass(encoding)" })
public RubyString defaultInternal(VirtualFrame frame, Object encoding) {
notDesignedForCompilation();

@@ -295,10 +278,6 @@ public ListNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ListNode(ListNode prev) {
super(prev);
}

@Specialization
public RubyArray list() {
notDesignedForCompilation();
@@ -317,10 +296,6 @@ public LocaleCharacterMapNode(RubyContext context, SourceSection sourceSection)
super(context, sourceSection);
}

public LocaleCharacterMapNode(LocaleCharacterMapNode prev) {
super(prev);
}

@Specialization
public RubyString localeCharacterMap() {
notDesignedForCompilation();
@@ -336,10 +311,6 @@ public DummyNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public DummyNode(DummyNode prev) {
super(prev);
}

@Specialization
public boolean isDummy(RubyEncoding encoding) {
notDesignedForCompilation();
@@ -367,15 +338,6 @@ public EncodingMapNode(RubyContext context, SourceSection sourceSection) {
newTupleNode = DispatchHeadNodeFactory.createMethodCall(context);
}

public EncodingMapNode(EncodingMapNode prev) {
super(prev);
upcaseNode = prev.upcaseNode;
toSymNode = prev.toSymNode;
newLookupTableNode = prev.newLookupTableNode;
lookupTableWriteNode = prev.lookupTableWriteNode;
newTupleNode = prev.newTupleNode;
}

@Specialization
public Object encodingMap(VirtualFrame frame) {
Object ret = newLookupTableNode.call(frame, getContext().getCoreLibrary().getLookupTableClass(), "new", null);
@@ -447,10 +409,6 @@ public ToSNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToSNode(ToSNode prev) {
super(prev);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubyString toS(RubyEncoding encoding) {
Original file line number Diff line number Diff line change
@@ -31,10 +31,6 @@ public InitializeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InitializeNode(InitializeNode prev) {
super(prev);
}

@Specialization
public RubyNilClass initialize(RubyException exception, UndefinedPlaceholder message) {
notDesignedForCompilation();
@@ -60,10 +56,6 @@ public BacktraceNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public BacktraceNode(BacktraceNode prev) {
super(prev);
}

@Specialization
public Object backtrace(RubyException exception) {
if (exception.getBacktrace() == null) {
@@ -83,10 +75,6 @@ public CaptureBacktraceNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public CaptureBacktraceNode(CaptureBacktraceNode prev) {
super(prev);
}

@Specialization
public RubyNilClass captureBacktrace(RubyException exception, UndefinedPlaceholder offset) {
return captureBacktrace(exception, 1);
@@ -108,10 +96,6 @@ public MessageNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public MessageNode(MessageNode prev) {
super(prev);
}

@Specialization
public RubyString message(RubyException exception) {
return exception.getMessage();
@@ -126,10 +110,6 @@ public ToSNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public ToSNode(ToSNode prev) {
super(prev);
}

@Specialization
public RubyString toS(RubyException exception) {
if (exception.getMessage().length() == 0) {
Original file line number Diff line number Diff line change
@@ -27,10 +27,6 @@ public AndNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public AndNode(AndNode prev) {
super(prev);
}

@Specialization
public boolean and(Object other) {
return false;
@@ -44,10 +40,6 @@ public OrXorNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public OrXorNode(OrXorNode prev) {
super(prev);
}

@CreateCast("operand") public RubyNode createCast(RubyNode operand) {
return BooleanCastNodeFactory.create(getContext(), getSourceSection(), operand);
}
37 changes: 10 additions & 27 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/FiberNodes.java
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.SourceSection;

import org.jruby.truffle.nodes.methods.UnsupportedOperationBehavior;
@@ -36,22 +37,18 @@ public FiberTransferNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public FiberTransferNode(FiberTransferNode prev) {
super(prev);
}

protected Object singleValue(Object[] args) {
protected Object singleValue(VirtualFrame frame, Object[] args) {
if (singleValueCastNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
singleValueCastNode = insert(SingleValueCastNodeFactory.create(getContext(), getSourceSection(), null));
}
return singleValueCastNode.executeSingleValue(args);
return singleValueCastNode.executeSingleValue(frame, args);
}

public abstract Object executeTransferControlTo(RubyFiber fiber, boolean isYield, Object[] args);
public abstract Object executeTransferControlTo(VirtualFrame frame, RubyFiber fiber, boolean isYield, Object[] args);

@Specialization
protected Object transfer(RubyFiber fiber, boolean isYield, Object[] args) {
protected Object transfer(VirtualFrame frame, RubyFiber fiber, boolean isYield, Object[] args) {
notDesignedForCompilation();

if (!fiber.isAlive()) {
@@ -66,7 +63,7 @@ protected Object transfer(RubyFiber fiber, boolean isYield, Object[] args) {

final RubyFiber sendingFiber = currentThread.getFiberManager().getCurrentFiber();

return singleValue(sendingFiber.transferControlTo(fiber, isYield, args));
return singleValue(frame, sendingFiber.transferControlTo(fiber, isYield, args));
}

}
@@ -78,10 +75,6 @@ public InitializeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

public InitializeNode(InitializeNode prev) {
super(prev);
}

@Specialization
public RubyNilClass initialize(RubyFiber fiber, RubyProc block) {
notDesignedForCompilation();
@@ -102,14 +95,9 @@ public ResumeNode(RubyContext context, SourceSection sourceSection) {
fiberTransferNode = FiberTransferNodeFactory.create(context, sourceSection, new RubyNode[] { null, null, null });
}

public ResumeNode(ResumeNode prev) {
super(prev);
fiberTransferNode = prev.fiberTransferNode;
}

@Specialization
public Object resume(RubyFiber fiberBeingResumed, Object[] args) {
return fiberTransferNode.executeTransferControlTo(fiberBeingResumed, false, args);
public Object resume(VirtualFrame frame, RubyFiber fiberBeingResumed, Object[] args) {
return fiberTransferNode.executeTransferControlTo(frame, fiberBeingResumed, false, args);
}

}
@@ -124,13 +112,8 @@ public YieldNode(RubyContext context, SourceSection sourceSection) {
fiberTransferNode = FiberTransferNodeFactory.create(context, sourceSection, new RubyNode[] { null, null, null });
}

public YieldNode(YieldNode prev) {
super(prev);
fiberTransferNode = prev.fiberTransferNode;
}

@Specialization
public Object yield(Object[] args) {
public Object yield(VirtualFrame frame, Object[] args) {
RubyThread currentThread = getContext().getThreadManager().getCurrentThread();
final RubyFiber yieldingFiber = currentThread.getFiberManager().getCurrentFiber();
final RubyFiber fiberYieldedTo = yieldingFiber.getLastResumedByFiber();
@@ -139,7 +122,7 @@ public Object yield(Object[] args) {
throw new RaiseException(getContext().getCoreLibrary().yieldFromRootFiberError(this));
}

return fiberTransferNode.executeTransferControlTo(fiberYieldedTo, true, args);
return fiberTransferNode.executeTransferControlTo(frame, fiberYieldedTo, true, args);
}

}
Loading

2 comments on commit ad4ba4b

@chrisseaton
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eregon @nirvdrum @bjfish

This merge updates us to the 0.7 version of the Truffle API. There are some significant changes, especially in the guard syntax and node copy constructors so you may want to browse and learn about them. There are some new features we aren't really using yet but will start to experiment with.

You may want to via the raw diff at https://github.com/jruby/jruby/commit/ad4ba4b4f8c5b54af2409314e8c8e6d582dfce40.diff rather than the GitHub UI, as it's so large.

I'm going to start a few days of big refactorings, now that we are merged and we no longer have branches with large diffs between them.

@nirvdrum
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hooray. I should be able to finally move my JRuby src dir back to my encrypted home directory.

Please sign in to comment.