Skip to content

Commit

Permalink
Showing 8 changed files with 89 additions and 16 deletions.
21 changes: 18 additions & 3 deletions truffle/src/main/java/org/jruby/truffle/nodes/RubyGuards.java
Original file line number Diff line number Diff line change
@@ -12,7 +12,10 @@
import com.oracle.truffle.api.interop.TruffleObject;
import org.jruby.truffle.nodes.core.BigDecimalNodes;
import org.jruby.truffle.nodes.core.MethodNodes;
import org.jruby.truffle.nodes.core.StringNodes;
import org.jruby.truffle.nodes.core.UnboundMethodNodes;
import org.jruby.truffle.nodes.core.array.ArrayNodes;
import org.jruby.truffle.nodes.core.hash.HashNodes;
import org.jruby.truffle.runtime.ThreadLocalObject;
import org.jruby.truffle.runtime.NotProvided;
import org.jruby.truffle.runtime.core.*;
@@ -48,7 +51,11 @@ public static boolean isIntegerFixnumRange(Object value) {
}

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

public static boolean isRubyArray(RubyBasicObject value) {
return value.getDynamicObject().getShape().getObjectType() == ArrayNodes.ARRAY_TYPE;
}

public static boolean isRubyBinding(Object value) {
@@ -60,7 +67,11 @@ public static boolean isRubyClass(Object value) {
}

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

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

public static boolean isRubyModule(Object value) {
@@ -76,7 +87,11 @@ public static boolean isRubyRegexp(Object value) {
}

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

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

public static boolean isRubyEncoding(Object value) {
Original file line number Diff line number Diff line change
@@ -29,6 +29,8 @@
import com.oracle.truffle.api.dsl.*;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.object.Shape;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.BranchProfile;
import com.oracle.truffle.api.utilities.ConditionProfile;
@@ -62,6 +64,7 @@
import org.jruby.truffle.runtime.NotProvided;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.*;
import org.jruby.truffle.runtime.object.BasicObjectType;
import org.jruby.truffle.runtime.rubinius.RubiniusByteArray;
import org.jruby.util.*;
import org.jruby.util.io.EncodingUtils;
@@ -73,6 +76,20 @@
@CoreClass(name = "String")
public abstract class StringNodes {

public static class StringType extends BasicObjectType {

}

public static final StringType STRING_TYPE = new StringType();

private static final DynamicObjectFactory STRING_FACTORY;

static {
final Shape.Allocator allocator = RubyBasicObject.LAYOUT.createAllocator();
final Shape shape = RubyBasicObject.LAYOUT.createShape(STRING_TYPE);
STRING_FACTORY = shape.createFactory();
}

public static void set(RubyString string, ByteList bytes) {
string.bytes = bytes;
}
@@ -149,7 +166,7 @@ public static RubyString createString(RubyClass stringClass, ByteBuffer bytes) {
}

public static RubyString createString(RubyClass stringClass, ByteList bytes) {
return new RubyString(stringClass, bytes);
return new RubyString(stringClass, bytes, STRING_FACTORY.newInstance());
}

@CoreMethod(names = "+", required = 1)
Original file line number Diff line number Diff line change
@@ -17,6 +17,8 @@
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.*;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.object.Shape;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.BranchProfile;
import org.jcodings.specific.USASCIIEncoding;
@@ -50,6 +52,7 @@
import org.jruby.truffle.runtime.methods.InternalMethod;
import org.jruby.truffle.runtime.methods.SharedMethodInfo;
import org.jruby.truffle.runtime.array.ArrayUtils;
import org.jruby.truffle.runtime.object.BasicObjectType;
import org.jruby.util.ByteList;
import org.jruby.util.Memo;
import org.jruby.util.cli.Options;
@@ -60,6 +63,20 @@
@CoreClass(name = "Array")
public abstract class ArrayNodes {

public static class ArrayType extends BasicObjectType {

}

public static final ArrayType ARRAY_TYPE = new ArrayType();

private static final DynamicObjectFactory ARRAY_FACTORY;

static {
final Shape.Allocator allocator = RubyBasicObject.LAYOUT.createAllocator();
final Shape shape = RubyBasicObject.LAYOUT.createShape(ARRAY_TYPE);
ARRAY_FACTORY = shape.createFactory();
}

public static final int ARRAYS_SMALL = Options.TRUFFLE_ARRAYS_SMALL.load();
public static final boolean RANDOMIZE_STORAGE_ARRAY = Options.TRUFFLE_RANDOMIZE_STORAGE_ARRAY.load();
private static final Random random = new Random(Options.TRUFFLE_RANDOMIZE_SEED.load());
@@ -306,23 +323,23 @@ public static RubyArray createEmptyArray(RubyClass arrayClass) {
}

public static RubyArray createArray(RubyClass arrayClass, int[] store, int size) {
return createGeneralArray(arrayClass, (Object) store, size);
return createGeneralArray(arrayClass, store, size);
}

public static RubyArray createArray(RubyClass arrayClass, long[] store, int size) {
return createGeneralArray(arrayClass, (Object) store, size);
return createGeneralArray(arrayClass, store, size);
}

public static RubyArray createArray(RubyClass arrayClass, double[] store, int size) {
return createGeneralArray(arrayClass, (Object) store, size);
return createGeneralArray(arrayClass, store, size);
}

public static RubyArray createArray(RubyClass arrayClass, Object[] store, int size) {
return createGeneralArray(arrayClass, (Object) store, size);
return createGeneralArray(arrayClass, store, size);
}

public static RubyArray createGeneralArray(RubyClass arrayClass, Object store, int size) {
return new RubyArray(arrayClass, store, size);
return new RubyArray(arrayClass, store, size, ARRAY_FACTORY.newInstance());
}

@CoreMethod(names = "+", required = 1)
Original file line number Diff line number Diff line change
@@ -10,12 +10,16 @@
package org.jruby.truffle.nodes.core.hash;

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.object.Shape;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.ConditionProfile;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.dispatch.CallDispatchHeadNode;
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyBasicObject;
import org.jruby.truffle.runtime.object.BasicObjectType;

public class HashNode extends RubyNode {

Original file line number Diff line number Diff line change
@@ -15,6 +15,8 @@
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.ExplodeLoop;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.object.Shape;
import com.oracle.truffle.api.source.SourceSection;
import com.oracle.truffle.api.utilities.BranchProfile;
import com.oracle.truffle.api.utilities.ConditionProfile;
@@ -33,12 +35,27 @@
import org.jruby.truffle.runtime.core.*;
import org.jruby.truffle.runtime.hash.*;
import org.jruby.truffle.runtime.methods.InternalMethod;
import org.jruby.truffle.runtime.object.BasicObjectType;

import java.util.Collection;

@CoreClass(name = "Hash")
public abstract class HashNodes {

public static class HashType extends BasicObjectType {

}

public static final HashType HASH_TYPE = new HashType();

private static final DynamicObjectFactory HASH_FACTORY;

static {
final Shape.Allocator allocator = RubyBasicObject.LAYOUT.createAllocator();
final Shape shape = RubyBasicObject.LAYOUT.createShape(HASH_TYPE);
HASH_FACTORY = shape.createFactory();
}

public static RubyProc getDefaultBlock(RubyHash hash) {
return hash.defaultBlock;
}
@@ -108,7 +125,7 @@ public static RubyHash createHash(RubyClass hashClass, Object[] store, int size)
}

public static RubyHash createHash(RubyClass hashClass, RubyProc defaultBlock, Object defaultValue, Object store, int size, Entry firstInSequence) {
return new RubyHash(hashClass, defaultBlock, defaultValue, store, size, firstInSequence);
return new RubyHash(hashClass, defaultBlock, defaultValue, store, size, firstInSequence, HASH_FACTORY.newInstance());
}

@CoreMethod(names = "[]", constructor = true, argumentsAsArray = true)
Original file line number Diff line number Diff line change
@@ -9,15 +9,16 @@
*/
package org.jruby.truffle.runtime.core;

import com.oracle.truffle.api.object.DynamicObject;
import org.jruby.truffle.nodes.core.array.ArrayNodes;

public final class RubyArray extends RubyBasicObject {

public Object store;
public int size;

public RubyArray(RubyClass arrayClass, Object store, int size) {
super(arrayClass);
public RubyArray(RubyClass arrayClass, Object store, int size, DynamicObject dynamicObject) {
super(arrayClass, dynamicObject);
ArrayNodes.setStore(this, store, size);
}

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

import com.oracle.truffle.api.object.DynamicObject;
import org.jruby.truffle.runtime.hash.Entry;
import org.jruby.truffle.runtime.hash.HashOperations;

@@ -22,8 +23,8 @@ public class RubyHash extends RubyBasicObject {
public Entry lastInSequence;
public boolean compareByIdentity;

public RubyHash(RubyClass rubyClass, RubyProc defaultBlock, Object defaultValue, Object store, int size, Entry firstInSequence) {
super(rubyClass);
public RubyHash(RubyClass rubyClass, RubyProc defaultBlock, Object defaultValue, Object store, int size, Entry firstInSequence, DynamicObject dynamicObject) {
super(rubyClass, dynamicObject);
this.defaultBlock = defaultBlock;
this.defaultValue = defaultValue;
this.store = store;
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
package org.jruby.truffle.runtime.core;

import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.object.DynamicObject;
import org.jcodings.Encoding;
import org.jruby.runtime.Helpers;
import org.jruby.util.ByteList;
@@ -21,8 +22,8 @@ public class RubyString extends RubyBasicObject implements CodeRangeable {
public ByteList bytes;
public int codeRange = StringSupport.CR_UNKNOWN;

public RubyString(RubyClass stringClass, ByteList bytes) {
super(stringClass);
public RubyString(RubyClass stringClass, ByteList bytes, DynamicObject dynamicObject) {
super(stringClass, dynamicObject);
this.bytes = bytes;
}

0 comments on commit 0f72afb

Please sign in to comment.