Skip to content
Permalink

Comparing changes

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

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 007e04e29420
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 1f292066804c
Choose a head ref
  • 3 commits
  • 32 files changed
  • 1 contributor

Commits on Jan 29, 2016

  1. Copy the full SHA
    104502d View commit details
  2. Copy the full SHA
    91ff94d View commit details
  3. [Truffle] Cleaned up the string_byte_substring primitive.

    In order to reduce the number of specializations, this change splits RubiniusPrimitiveNode
    into RubiniusPrimitiveArrayArgumentsNode and RubiniusPrimitiveNode, but like we have for
    core methods.
    nirvdrum committed Jan 29, 2016
    Copy the full SHA
    1f29206 View commit details
Showing with 355 additions and 249 deletions.
  1. +105 −0 truffle/src/main/java/org/jruby/truffle/nodes/cast/ArrayAttributeCastNode.java
  2. +4 −0 truffle/src/main/java/org/jruby/truffle/nodes/coerce/ToIntNode.java
  3. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/core/InterpolatedStringNode.java
  4. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/core/StringNodes.java
  5. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/ArrayPrimitiveNodes.java
  6. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/BignumPrimitiveNodes.java
  7. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/ChannelPrimitiveNodes.java
  8. +5 −5 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/DirPrimitiveNodes.java
  9. +5 −6 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/EncodingConverterPrimitiveNodes.java
  10. +1 −2 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/EncodingPrimitiveNodes.java
  11. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/ExceptionPrimitiveNodes.java
  12. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/FixnumPrimitiveNodes.java
  13. +3 −3 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/FloatPrimitiveNodes.java
  14. +3 −3 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/IOBufferPrimitiveNodes.java
  15. +16 −16 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/IOPrimitiveNodes.java
  16. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/NativeFunctionPrimitiveNodes.java
  17. +2 −2 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/ObjectPrimitiveNodes.java
  18. +15 −15 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/PointerPrimitiveNodes.java
  19. +5 −5 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/RandomizerPrimitiveNodes.java
  20. +7 −7 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/RegexpPrimitiveNodes.java
  21. +26 −0 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/RubiniusPrimitiveArrayArgumentsNode.java
  22. +2 −3 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/RubiniusPrimitiveNode.java
  23. +15 −2 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/RubiniusPrimitiveNodeConstructor.java
  24. +4 −6 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/StatPrimitiveNodes.java
  25. +79 −122 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/StringPrimitiveNodes.java
  26. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/SymbolPrimitiveNodes.java
  27. +3 −3 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/ThreadPrimitiveNodes.java
  28. +11 −11 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/TimePrimitiveNodes.java
  29. +1 −1 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/UndefinedPrimitiveNodes.java
  30. +22 −22 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/VMPrimitiveNodes.java
  31. +3 −3 truffle/src/main/java/org/jruby/truffle/nodes/rubinius/WeakRefPrimitiveNodes.java
  32. +7 −1 truffle/src/main/java/org/jruby/truffle/runtime/rope/Rope.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.nodes.cast;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.Fallback;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.coerce.ToIntNode;
import org.jruby.truffle.runtime.NotProvided;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;

/**
* Array indices and lengths must be in 32-bit ranges. This class handle various data types and lowers to a 32-bit int
* if possible or raises an exception if the value is out of the acceptable range.
*/
@ImportStatic(Integer.class)
@NodeChild(value = "value", type = RubyNode.class)
public abstract class ArrayAttributeCastNode extends RubyNode {

final String indexName;

public ArrayAttributeCastNode(RubyContext context, SourceSection sourceSection, String indexName) {
super(context, sourceSection);
this.indexName = indexName;
}

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

@Specialization(guards = "inBounds(value)")
public int doLongFixnum(long value) {
return (int) value;
}

@Specialization(guards = "!inBounds(value)")
public int doLongFixnumOutOfBounds(long value) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().argumentError(String.format("%s out of int range", indexName), this));
}

@Specialization(guards = "inBounds(value)")
public int doDouble(double value) {
return (int) value;
}

@Specialization(guards = "!inBounds(value)")
public int doDoubleOutOfBounds(double value) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().argumentError(String.format("%s out of int range", indexName), this));
}

@Specialization(guards = "isRubyBignum(value)")
public DynamicObject doBignum(DynamicObject value) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().argumentError(String.format("%s out of int range", indexName), this));
}


@Specialization(guards = "isRubyRange(range)")
public DynamicObject passThroughRange(DynamicObject range) {
return range;
}

@Specialization
public Object passThroughNotProvided(NotProvided value) {
return value;
}

@Specialization(guards = { "!isInteger(value)", "!isLong(value)", "!isDouble(value)", "!isRubyBignum(value)", "!isRubyRange(value)" })
public Object coerce(VirtualFrame frame, DynamicObject value, @Cached("create(getContext(), getSourceSection())") ToIntNode coerceToIntNode) {
return coerceToIntNode.executeIntOrLong(frame, value);
}

@Fallback
public int doBasicObject(Object object) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().
typeErrorIsNotA(object.toString(), "Fixnum (fitting in int)", this));
}

protected static boolean inBounds(long value) {
return (value >= Integer.MIN_VALUE) && (value <= Integer.MAX_VALUE);
}

protected static boolean inBounds(double value) {
return (value >= Integer.MIN_VALUE) && (value <= Integer.MAX_VALUE);
}
}
Original file line number Diff line number Diff line change
@@ -39,6 +39,10 @@ public abstract class ToIntNode extends RubyNode {
private final ConditionProfile wasLong = ConditionProfile.createBinaryProfile();
private final ConditionProfile wasLongInRange = ConditionProfile.createBinaryProfile();

public static ToIntNode create(RubyContext context, SourceSection sourceSection) {
return ToIntNodeGen.create(context, sourceSection, null);
}

public ToIntNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}
Original file line number Diff line number Diff line change
@@ -84,7 +84,7 @@ private Object concat(VirtualFrame frame, Object[] strings) {
if (builder == null) {
builder = (DynamicObject) dupNode.call(frame, string, "dup", null);
} else {
builder = appendNode.executeStringAppend(frame, builder, (DynamicObject) string);
builder = appendNode.executeStringAppend(builder, (DynamicObject) string);
}
}

Original file line number Diff line number Diff line change
@@ -439,13 +439,13 @@ public DynamicObject concatStringSingleByte(DynamicObject string, DynamicObject
}

@Specialization(guards = { "isRubyString(other)", "!is7Bit(string) || !is7Bit(other)" })
public Object concatString(VirtualFrame frame, DynamicObject string, DynamicObject other) {
public Object concatString(DynamicObject string, DynamicObject other) {
if (stringAppendNode == null) {
CompilerDirectives.transferToInterpreter();
stringAppendNode = insert(StringPrimitiveNodesFactory.StringAppendPrimitiveNodeFactory.create(getContext(), getSourceSection(), new RubyNode[] {}));
}

return stringAppendNode.executeStringAppend(frame, string, other);
return stringAppendNode.executeStringAppend(string, other);
}

@Specialization(guards = "!isRubyString(other)")
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@
public abstract class ArrayPrimitiveNodes {

@RubiniusPrimitive(name = "tuple_copy_from")
public static abstract class TupleCopyFromPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class TupleCopyFromPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public TupleCopyFromPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@
public abstract class BignumPrimitiveNodes {

@RubiniusPrimitive(name = "bignum_compare")
public abstract static class BignumCompareNode extends RubiniusPrimitiveNode {
public abstract static class BignumCompareNode extends RubiniusPrimitiveArrayArgumentsNode {

public BignumCompareNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -63,7 +63,7 @@ public Object compareFallback(DynamicObject a, DynamicObject b) {
}

@RubiniusPrimitive(name = "bignum_pow")
public static abstract class BignumPowPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class BignumPowPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

private final ConditionProfile negativeProfile = ConditionProfile.createBinaryProfile();

Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@
public abstract class ChannelPrimitiveNodes {

@RubiniusPrimitive(name = "channel_new")
public static abstract class ChannelNewPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class ChannelNewPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public ChannelNewPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Original file line number Diff line number Diff line change
@@ -53,7 +53,7 @@
public abstract class DirPrimitiveNodes {

@RubiniusPrimitive(name = "dir_allocate")
public static abstract class DirAllocatePrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class DirAllocatePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public DirAllocatePrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -67,7 +67,7 @@ public DynamicObject allocate(DynamicObject dirClass) {
}

@RubiniusPrimitive(name = "dir_open")
public static abstract class DirOpenPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class DirOpenPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public DirOpenPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -106,7 +106,7 @@ public DynamicObject openEncoding(DynamicObject dir, DynamicObject path, Dynamic
}

@RubiniusPrimitive(name = "dir_read")
public static abstract class DirReadPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class DirReadPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public DirReadPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -138,7 +138,7 @@ public Object read(DynamicObject dir) {


@RubiniusPrimitive(name = "dir_control")
public static abstract class DirControlPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class DirControlPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public DirControlPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -164,7 +164,7 @@ public Object control(DynamicObject dir, int kind, int position) {
}

@RubiniusPrimitive(name = "dir_close")
public static abstract class DirClosePrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class DirClosePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public DirClosePrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.utilities.ConditionProfile;
import com.oracle.truffle.api.source.SourceSection;
import org.jcodings.Ptr;
import org.jcodings.transcode.EConv;
@@ -43,7 +42,7 @@
public abstract class EncodingConverterPrimitiveNodes {

@RubiniusPrimitive(name = "encoding_converter_allocate")
public static abstract class EncodingConverterAllocateNode extends RubiniusPrimitiveNode {
public static abstract class EncodingConverterAllocateNode extends RubiniusPrimitiveArrayArgumentsNode {

public EncodingConverterAllocateNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -57,7 +56,7 @@ public Object encodingConverterAllocate(DynamicObject encodingConverterClass, No
}

@RubiniusPrimitive(name = "encoding_converter_primitive_convert")
public static abstract class PrimitiveConvertNode extends RubiniusPrimitiveNode {
public static abstract class PrimitiveConvertNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private RopeNodes.MakeSubstringNode makeSubstringNode;

@@ -173,7 +172,7 @@ private Object primitiveConvertHelper(DynamicObject encodingConverter, DynamicOb
}

@RubiniusPrimitive(name = "encoding_converter_putback")
public static abstract class EncodingConverterPutbackNode extends RubiniusPrimitiveNode {
public static abstract class EncodingConverterPutbackNode extends RubiniusPrimitiveArrayArgumentsNode {

public EncodingConverterPutbackNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -218,7 +217,7 @@ private DynamicObject putback(DynamicObject encodingConverter, int n) {
}

@RubiniusPrimitive(name = "encoding_converter_last_error")
public static abstract class EncodingConverterLastErrorNode extends RubiniusPrimitiveNode {
public static abstract class EncodingConverterLastErrorNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private CallDispatchHeadNode newLookupTableNode;
@Child private CallDispatchHeadNode lookupTableWriteNode;
@@ -273,7 +272,7 @@ private DynamicObject eConvResultToSymbol(EConvResult result) {
}

@RubiniusPrimitive(name = "encoding_converter_primitive_errinfo")
public static abstract class EncodingConverterErrinfoNode extends RubiniusPrimitiveNode {
public static abstract class EncodingConverterErrinfoNode extends RubiniusPrimitiveArrayArgumentsNode {

public EncodingConverterErrinfoNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Original file line number Diff line number Diff line change
@@ -14,7 +14,6 @@
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.core.EncodingNodes;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.StringOperations;
import org.jruby.truffle.runtime.layouts.Layouts;

/**
@@ -23,7 +22,7 @@
public abstract class EncodingPrimitiveNodes {

@RubiniusPrimitive(name = "encoding_get_object_encoding", needsSelf = false)
public static abstract class EncodingGetObjectEncodingNode extends RubiniusPrimitiveNode {
public static abstract class EncodingGetObjectEncodingNode extends RubiniusPrimitiveArrayArgumentsNode {

public EncodingGetObjectEncodingNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@
public abstract class ExceptionPrimitiveNodes {

@RubiniusPrimitive(name = "exception_errno_error", needsSelf = false)
public static abstract class ExceptionErrnoErrorPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class ExceptionErrnoErrorPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public ExceptionErrnoErrorPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Original file line number Diff line number Diff line change
@@ -26,7 +26,7 @@
public abstract class FixnumPrimitiveNodes {

@RubiniusPrimitive(name = "fixnum_coerce")
public static abstract class FixnumCoercePrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class FixnumCoercePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public FixnumCoercePrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@
public abstract class FloatPrimitiveNodes {

@RubiniusPrimitive(name = "float_dtoa")
public static abstract class FloatDToAPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class FloatDToAPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public FloatDToAPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -79,7 +79,7 @@ public DynamicObject dToA(double value) {
}

@RubiniusPrimitive(name = "float_signbit_p")
public static abstract class FloatSignBitNode extends RubiniusPrimitiveNode {
public static abstract class FloatSignBitNode extends RubiniusPrimitiveArrayArgumentsNode {

public FloatSignBitNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -94,7 +94,7 @@ public boolean floatSignBit(double value) {
}

@RubiniusPrimitive(name = "float_round")
public static abstract class FloatRoundPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class FloatRoundPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private FixnumOrBignumNode fixnumOrBignum;

Original file line number Diff line number Diff line change
@@ -60,7 +60,7 @@ public abstract class IOBufferPrimitiveNodes {
private static final int STACK_BUF_SZ = 8192;

@RubiniusPrimitive(name = "iobuffer_allocate")
public static abstract class IOBufferAllocatePrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class IOBufferAllocatePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateNode;

@@ -81,7 +81,7 @@ public DynamicObject allocate(DynamicObject classToAllocate) {
}

@RubiniusPrimitive(name = "iobuffer_unshift", lowerFixnumParameters = 1)
public static abstract class IOBufferUnshiftPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class IOBufferUnshiftPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOBufferUnshiftPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -113,7 +113,7 @@ public int unshift(VirtualFrame frame, DynamicObject ioBuffer, DynamicObject str
}

@RubiniusPrimitive(name = "iobuffer_fill")
public static abstract class IOBufferFillPrimitiveNode extends RubiniusPrimitiveNode {
public static abstract class IOBufferFillPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOBufferFillPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
Loading