Skip to content

Commit

Permalink
Showing 2 changed files with 17 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -25,6 +25,11 @@ public static boolean isSingleByteOptimizable(DynamicObject string) {
return Layouts.STRING.getCodeRange(string) == StringSupport.CR_7BIT || StringOperations.getByteList(string).getEncoding().maxLength() == 1;
}

public static boolean is7Bit(DynamicObject string) {
assert RubyGuards.isRubyString(string);
return Layouts.STRING.getCodeRange(string) == StringSupport.CR_7BIT;
}

public static boolean isAsciiCompatible(DynamicObject string) {
assert RubyGuards.isRubyString(string);
return StringOperations.getByteList(string).getEncoding().isAsciiCompatible();
Original file line number Diff line number Diff line change
@@ -302,6 +302,7 @@ public Object compare(VirtualFrame frame, DynamicObject a, Object b) {
@NodeChild(type = RubyNode.class, value = "string"),
@NodeChild(type = RubyNode.class, value = "other")
})
@ImportStatic(StringGuards.class)
public abstract static class ConcatNode extends CoreMethodNode {

public ConcatNode(RubyContext context, SourceSection sourceSection) {
@@ -342,8 +343,18 @@ public DynamicObject concatBignum(DynamicObject string, DynamicObject other) {
return concatNumeric(string, Layouts.BIGNUM.getValue(other).intValue());
}

@Specialization(guards = { "isRubyString(other)", "is7Bit(string)", "is7Bit(other)" })
public DynamicObject concatStringSingleByte(DynamicObject string, DynamicObject other) {
final ByteList stringByteList = StringOperations.getByteList(string);
final ByteList otherByteList = StringOperations.getByteList(other);

stringByteList.append(otherByteList);

return string;
}

@TruffleBoundary
@Specialization(guards = "isRubyString(other)")
@Specialization(guards = { "isRubyString(other)", "!is7Bit(string) || !is7Bit(other)" })
public DynamicObject concatString(DynamicObject string, DynamicObject other) {
final int codeRange = Layouts.STRING.getCodeRange(other);
final int[] ptr_cr_ret = { codeRange };

0 comments on commit f2242d0

Please sign in to comment.