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: 26fb9e4d625b
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 4029e68c913f
Choose a head ref
  • 2 commits
  • 4 files changed
  • 1 contributor

Commits on Oct 15, 2015

  1. Copy the full SHA
    3a827ac View commit details
  2. Copy the full SHA
    4029e68 View commit details
1 change: 1 addition & 0 deletions core/src/main/java/org/jruby/util/cli/Options.java
Original file line number Diff line number Diff line change
@@ -241,6 +241,7 @@ public class Options {
public static final Option<Integer> TRUFFLE_ALLOCATE_CLASS_CACHE = integer(TRUFFLE, "truffle.allocate_class.cache", TRUFFLE_DEFAULT_CACHE.load(), "Allocation size class cache size");
public static final Option<Integer> TRUFFLE_PACK_CACHE = integer(TRUFFLE, "truffle.pack.cache", TRUFFLE_DEFAULT_CACHE.load(), "Array#pack cache size");
public static final Option<Integer> TRUFFLE_EVAL_CACHE = integer(TRUFFLE, "truffle.eval.cache", TRUFFLE_DEFAULT_CACHE.load(), "eval lookup cache size");
public static final Option<Integer> ENCODING_COMPATIBILE_QUERY_CACHE = integer(TRUFFLE, "truffle.encoding_comptabile_query.cache", TRUFFLE_DEFAULT_CACHE.load(), "Encoding.compatible? cache size");

public static final Option<Boolean> TRUFFLE_CORE_ALWAYS_CLONE = bool(TRUFFLE, "truffle.core.always_clone", true, "Always clone built-in core methods.");
public static final Option<Boolean> TRUFFLE_YIELD_ALWAYS_CLONE = bool(TRUFFLE, "truffle.yield.always_clone", true, "Always clone yields.");
Original file line number Diff line number Diff line change
@@ -11,11 +11,13 @@

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.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.SourceSection;

import com.oracle.truffle.api.utilities.ConditionProfile;
import org.jcodings.Encoding;
import org.jcodings.EncodingDB;
import org.jcodings.specific.ASCIIEncoding;
@@ -111,10 +113,25 @@ public CompatibleQueryNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@TruffleBoundary
@Specialization(guards = {"isRubyString(first)", "isRubyString(second)"})
public Object isCompatibleStringString(DynamicObject first, DynamicObject second) {
final Encoding compatibleEncoding = org.jruby.RubyEncoding.areCompatible(StringOperations.getCodeRangeable(first), StringOperations.getCodeRangeable(second));
@Specialization(guards = {
"isRubyString(first)",
"isRubyString(second)",
"firstEncoding == secondEncoding",
"extractEncoding(first) == firstEncoding",
"extractEncoding(second) == secondEncoding"
}, limit = "getCacheLimit()")
public DynamicObject isCompatibleStringStringCached(DynamicObject first, DynamicObject second,
@Cached("extractEncoding(first)") Encoding firstEncoding,
@Cached("extractEncoding(second)") Encoding secondEncoding,
@Cached("isCompatibleStringStringUncached(first, second)") DynamicObject rubyEncoding) {
return rubyEncoding;
}

@Specialization(guards = {
"isRubyString(first)", "isRubyString(second)"
}, contains = "isCompatibleStringStringCached")
public DynamicObject isCompatibleStringStringUncached(DynamicObject first, DynamicObject second) {
final Encoding compatibleEncoding = areCompatible(first, second);

if (compatibleEncoding != null) {
return getEncoding(compatibleEncoding);
@@ -233,6 +250,35 @@ public Object isCompatibleStringEncoding(DynamicObject first, DynamicObject seco
}
}

private Encoding areCompatible(DynamicObject first, DynamicObject second) {
assert RubyGuards.isRubyString(first);
assert RubyGuards.isRubyString(second);

final ByteList firstByteList = StringOperations.getByteList(first);
final ByteList secondByteList = StringOperations.getByteList(second);

final Encoding firstEncoding = firstByteList.getEncoding();
final Encoding secondEncoding = secondByteList.getEncoding();

if (firstEncoding == secondEncoding) {
return firstEncoding;
}

return org.jruby.RubyEncoding.areCompatible(StringOperations.getCodeRangeable(first), StringOperations.getCodeRangeable(second));
}

protected Encoding extractEncoding(DynamicObject string) {
if (RubyGuards.isRubyString(string)) {
return StringOperations.getByteList(string).getEncoding();
}

return null;
}

protected int getCacheLimit() {
return getContext().getOptions().ENCODING_COMPATIBILE_QUERY_CACHE;
}

}

@RubiniusOnly
Original file line number Diff line number Diff line change
@@ -1240,21 +1240,15 @@ public StringSubstringPrimitiveNode(RubyContext context, SourceSection sourceSec

public abstract Object execute(VirtualFrame frame, DynamicObject string, int beg, int len);

@Specialization(guards = "isSingleByteOptimizable(string)")
@Specialization(guards = { "isSingleByteOptimizable(string)", "len >= 0" })
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) {
@Cached("createBinaryProfile()") ConditionProfile negativeLengthProfile) {
// Taken from org.jruby.RubyString#substr19.

if (negativeLengthProfile.profile(len < 0)) {
return nil();
}

final int length = StringOperations.getByteList(string).getRealSize();
if (emptyStringProfile.profile(length == 0)) {
len = 0;
@@ -1276,7 +1270,7 @@ public Object stringSubstringSingleByteOptimizable(DynamicObject string, int beg
len = length - beg;
}

if (stillNegativeLengthProfile.profile(len <= 0)) {
if (negativeLengthProfile.profile(len <= 0)) {
len = 0;
beg = 0;
}
@@ -1285,14 +1279,10 @@ public Object stringSubstringSingleByteOptimizable(DynamicObject string, int beg
}

@TruffleBoundary
@Specialization(guards = "!isSingleByteOptimizable(string)")
@Specialization(guards = { "!isSingleByteOptimizable(string)", "len >= 0" })
public Object stringSubstring(DynamicObject string, int beg, int len) {
// Taken from org.jruby.RubyString#substr19 & org.jruby.RubyString#multibyteSubstr19.

if (len < 0) {
return nil();
}

final int length = StringOperations.getByteList(string).getRealSize();
if (length == 0) {
len = 0;
@@ -1357,6 +1347,11 @@ public Object stringSubstring(DynamicObject string, int beg, int len) {
return makeSubstring(string, p - s, len);
}

@Specialization(guards = "len < 0")
public Object stringSubstringNegativeLength(DynamicObject string, int beg, int len) {
return nil();
}

private DynamicObject makeSubstring(DynamicObject string, int beg, int len) {
assert RubyGuards.isRubyString(string);

Original file line number Diff line number Diff line change
@@ -41,6 +41,7 @@ public class Options {
public final int ALLOCATE_CLASS_CACHE = org.jruby.util.cli.Options.TRUFFLE_ALLOCATE_CLASS_CACHE.load();
public final int PACK_CACHE = org.jruby.util.cli.Options.TRUFFLE_PACK_CACHE.load();
public final int EVAL_CACHE = org.jruby.util.cli.Options.TRUFFLE_EVAL_CACHE.load();
public final int ENCODING_COMPATIBILE_QUERY_CACHE = org.jruby.util.cli.Options.ENCODING_COMPATIBILE_QUERY_CACHE.load();

// Cloning and inlining