Skip to content

Commit

Permalink
Showing 2 changed files with 32 additions and 31 deletions.
29 changes: 14 additions & 15 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/StringNodes.java
Original file line number Diff line number Diff line change
@@ -191,7 +191,7 @@ public EqualNode(RubyContext context, SourceSection sourceSection) {

@Specialization(guards = "isRubyString(b)")
public boolean equal(DynamicObject a, DynamicObject b) {
return stringEqualNode.stringEqual(a, b);
return stringEqualNode.executeStringEqual(a, b);
}

@Specialization(guards = "!isRubyString(b)")
@@ -1185,15 +1185,14 @@ public DynamicObject forceEncoding(VirtualFrame frame, DynamicObject string, Obj
@CoreMethod(names = "getbyte", required = 1, lowerFixnumParameters = 0)
public abstract static class GetByteNode extends CoreMethodArrayArgumentsNode {

private final ConditionProfile negativeIndexProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile indexOutOfBoundsProfile = ConditionProfile.createBinaryProfile();

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

@Specialization
public Object getByte(DynamicObject string, int index) {
public Object getByte(DynamicObject string, int index,
@Cached("createBinaryProfile()") ConditionProfile negativeIndexProfile,
@Cached("createBinaryProfile()") ConditionProfile indexOutOfBoundsProfile) {
final ByteList bytes = StringOperations.getByteList(string);

if (negativeIndexProfile.profile(index < 0)) {
@@ -1562,15 +1561,14 @@ private int prevCharHead(Encoding enc, byte[]bytes, int p, int s, int end) {
@ImportStatic(StringGuards.class)
public abstract static class SwapcaseBangNode extends CoreMethodArrayArgumentsNode {

private final ConditionProfile singleByteOptimizableProfile = ConditionProfile.createBinaryProfile();

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

@TruffleBoundary
@Specialization
public DynamicObject swapcaseSingleByte(DynamicObject string) {
public DynamicObject swapcaseSingleByte(DynamicObject string,
@Cached("createBinaryProfile()") ConditionProfile singleByteOptimizableProfile) {
// Taken from org.jruby.RubyString#swapcase_bang19.

final ByteList value = StringOperations.getByteList(string);
@@ -1720,16 +1718,15 @@ public int size(DynamicObject string) {
@CoreMethod(names = "squeeze!", rest = true, raiseIfFrozenSelf = true)
public abstract static class SqueezeBangNode extends CoreMethodArrayArgumentsNode {

private final ConditionProfile singleByteOptimizableProfile = ConditionProfile.createBinaryProfile();

@Child private ToStrNode toStrNode;

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

@Specialization(guards = "zeroArgs(args)")
public Object squeezeBangZeroArgs(DynamicObject string, Object... args) {
public Object squeezeBangZeroArgs(DynamicObject string, Object[] args,
@Cached("createBinaryProfile()") ConditionProfile singleByteOptimizableProfile) {
// Taken from org.jruby.RubyString#squeeze_bang19.

if (StringOperations.getByteList(string).length() == 0) {
@@ -1755,7 +1752,8 @@ public Object squeezeBangZeroArgs(DynamicObject string, Object... args) {
}

@Specialization(guards = "!zeroArgs(args)")
public Object squeezeBang(VirtualFrame frame, DynamicObject string, Object... args) {
public Object squeezeBang(VirtualFrame frame, DynamicObject string, Object[] args,
@Cached("createBinaryProfile()") ConditionProfile singleByteOptimizableProfile) {
// Taken from org.jruby.RubyString#squeeze_bang19.

if (StringOperations.getByteList(string).length() == 0) {
@@ -1772,11 +1770,12 @@ public Object squeezeBang(VirtualFrame frame, DynamicObject string, Object... ar
for (int i = 0; i < args.length; i++) {
otherStrings[i] = toStrNode.executeToStr(frame, args[i]);
}
return performSqueezeBang(string, otherStrings);
return performSqueezeBang(string, otherStrings, singleByteOptimizableProfile);
}

@TruffleBoundary
private Object performSqueezeBang(DynamicObject string, DynamicObject[] otherStrings) {
private Object performSqueezeBang(DynamicObject string, DynamicObject[] otherStrings,
@Cached("createBinaryProfile()") ConditionProfile singleByteOptimizableProfile) {

DynamicObject otherStr = otherStrings[0];
Encoding enc = StringOperations.checkEncoding(getContext(), string, StringOperations.getCodeRangeable(otherStr), this);
@@ -1812,7 +1811,7 @@ private boolean squeezeCommonMultiByte(ByteList value, boolean squeeze[], String
return StringSupport.multiByteSqueeze(getContext().getRuntime(), value, squeeze, tables, enc, isArg);
}

public static boolean zeroArgs(Object... args) {
public static boolean zeroArgs(Object[] args) {
return args.length == 0;
}
}
Original file line number Diff line number Diff line change
@@ -55,6 +55,7 @@

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.ImportStatic;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -486,14 +487,15 @@ public int stringCompareSubstring(VirtualFrame frame, DynamicObject string, Dyna
@RubiniusPrimitive(name = "string_equal", needsSelf = true)
public static abstract class StringEqualPrimitiveNode extends RubiniusPrimitiveNode {

private final ConditionProfile incompatibleEncodingProfile = ConditionProfile.createBinaryProfile();

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

public abstract boolean executeStringEqual(DynamicObject string, DynamicObject other);

@Specialization(guards = "isRubyString(other)")
public boolean stringEqual(DynamicObject string, DynamicObject other) {
public boolean stringEqual(DynamicObject string, DynamicObject other,
@Cached("createBinaryProfile()") ConditionProfile incompatibleEncodingProfile) {
final ByteList a = StringOperations.getByteList(string);
final ByteList b = StringOperations.getByteList(other);

@@ -867,15 +869,13 @@ public Object stringCharacterIndex(DynamicObject string, DynamicObject pattern,
@ImportStatic(StringGuards.class)
public static abstract class StringByteIndexPrimitiveNode extends RubiniusPrimitiveNode {

private final ConditionProfile indexTooLargeProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile invalidByteProfile = ConditionProfile.createBinaryProfile();

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

@Specialization(guards = "isSingleByteOptimizable(string)")
public Object stringByteIndexSingleByte(DynamicObject string, int index, int start) {
public Object stringByteIndexSingleByte(DynamicObject string, int index, int start,
@Cached("createBinaryProfile()") ConditionProfile indexTooLargeProfile) {
final ByteList byteList = StringOperations.getByteList(string);

if (indexTooLargeProfile.profile(byteList.realSize() < index)) {
@@ -886,7 +886,9 @@ public Object stringByteIndexSingleByte(DynamicObject string, int index, int sta
}

@Specialization(guards = "!isSingleByteOptimizable(string)")
public Object stringByteIndex(DynamicObject string, int index, int start) {
public Object stringByteIndex(DynamicObject string, int index, int start,
@Cached("createBinaryProfile()") ConditionProfile indexTooLargeProfile,
@Cached("createBinaryProfile()") ConditionProfile invalidByteProfile) {
// Taken from Rubinius's String::byte_index.

final ByteList bytes = StringOperations.getByteList(string);
@@ -1212,13 +1214,6 @@ public static abstract class StringSubstringPrimitiveNode extends RubiniusPrimit

@Child private AllocateObjectNode allocateNode;
@Child private TaintResultNode taintResultNode;
private final ConditionProfile negativeLengthProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile emptyStringProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile tooLargeBeginProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile negativeBeginProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile stillNegativeBeginProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile tooLargeTotalProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile stillNegativeLengthProfile = ConditionProfile.createBinaryProfile();

public StringSubstringPrimitiveNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
@@ -1227,7 +1222,14 @@ public StringSubstringPrimitiveNode(RubyContext context, SourceSection sourceSec
public abstract Object execute(VirtualFrame frame, DynamicObject string, int beg, int len);

@Specialization(guards = "isSingleByteOptimizable(string)")
public Object stringSubstringSingleByteOptimizable(DynamicObject string, int beg, int len) {
public Object stringSubstringSingleByteOptimizable(DynamicObject string, int beg, int len,
@Cached("createBinaryProfile()") ConditionProfile negativeLengthProfile,
@Cached("createBinaryProfile()") ConditionProfile emptyStringProfile,
@Cached("createBinaryProfile()") ConditionProfile tooLargeBeginProfile,
@Cached("createBinaryProfile()") ConditionProfile negativeBeginProfile,
@Cached("createBinaryProfile()") ConditionProfile stillNegativeBeginProfile,
@Cached("createBinaryProfile()") ConditionProfile tooLargeTotalProfile,
@Cached("createBinaryProfile()") ConditionProfile stillNegativeLengthProfile) {
// Taken from org.jruby.RubyString#substr19.

if (negativeLengthProfile.profile(len < 0)) {

0 comments on commit a8135a2

Please sign in to comment.