Skip to content

Commit

Permalink
Propagate coderange out of StringLiteral through all consumers.
Browse files Browse the repository at this point in the history
  • Loading branch information
headius committed Apr 17, 2015
1 parent 210148c commit d2ea85f
Show file tree
Hide file tree
Showing 10 changed files with 37 additions and 31 deletions.
4 changes: 4 additions & 0 deletions core/src/main/java/org/jruby/RubyString.java
Expand Up @@ -478,6 +478,10 @@ public static RubyString newString(Ruby runtime, ByteList bytes) {
return new RubyString(runtime, runtime.getString(), bytes);
}

public static RubyString newString(Ruby runtime, ByteList bytes, int coderange) {
return new RubyString(runtime, runtime.getString(), bytes, coderange);
}

public static RubyString newString(Ruby runtime, ByteList bytes, Encoding encoding) {
return new RubyString(runtime, runtime.getString(), bytes, encoding);
}
Expand Down
Expand Up @@ -65,7 +65,7 @@ public Object interpret(ThreadContext context, StaticScope currScope, DynamicSco
for (Operand p : operands) {
if ((p instanceof StringLiteral) && (isSameEncodingAndCodeRange(str, (StringLiteral)p))) {
str.getByteList().append(((StringLiteral)p).bytelist);
str.setCodeRange(str.scanForCodeRange());
str.setCodeRange(((StringLiteral)p).getCodeRange());
} else {
IRubyObject pval = (IRubyObject)p.retrieve(context, self, currScope, currDynScope, temp);
str.append19(pval);
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/org/jruby/ir/operands/FrozenString.java
Expand Up @@ -33,12 +33,12 @@ public FrozenString(String s) {

@Override
public Object retrieve(ThreadContext context, IRubyObject self, StaticScope currScope, DynamicScope currDynScope, Object[] temp) {
return context.runtime.freezeAndDedupString(RubyString.newString(context.runtime, bytelist));
return context.runtime.freezeAndDedupString(RubyString.newString(context.runtime, bytelist, coderange));
}

@Override
public boolean equals(Object other) {
return other instanceof FrozenString && bytelist.equals(((FrozenString) other).bytelist);
return other instanceof FrozenString && bytelist.equals(((FrozenString) other).bytelist) && coderange == ((FrozenString) other).coderange;
}

@Override
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/org/jruby/ir/operands/StringLiteral.java
Expand Up @@ -88,7 +88,7 @@ public int hashCode() {

@Override
public boolean equals(Object other) {
return other instanceof StringLiteral && bytelist.equals(((StringLiteral) other).bytelist);
return other instanceof StringLiteral && bytelist.equals(((StringLiteral) other).bytelist) && coderange == ((StringLiteral) other).coderange;
}

@Override
Expand All @@ -104,7 +104,7 @@ public Operand cloneForInlining(CloneInfo ii) {
@Override
public Object retrieve(ThreadContext context, IRubyObject self, StaticScope currScope, DynamicScope currDynScope, Object[] temp) {
// SSS FIXME: AST interpreter passes in a coderange argument.
return RubyString.newStringShared(context.runtime, bytelist);
return RubyString.newStringShared(context.runtime, bytelist, coderange);
}

@Override
Expand Down
6 changes: 3 additions & 3 deletions core/src/main/java/org/jruby/ir/runtime/IRRuntimeHelpers.java
Expand Up @@ -981,9 +981,9 @@ public static final Type[] typesFromSignature(Signature signature) {
return types;
}

// Used by JIT
public static RubyString newFrozenStringFromRaw(Ruby runtime, String str, String encoding) {
return runtime.freezeAndDedupString(new RubyString(runtime, runtime.getString(), newByteListFromRaw(runtime, str, encoding)));
@JIT
public static RubyString newFrozenStringFromRaw(Ruby runtime, String str, String encoding, int cr) {
return runtime.freezeAndDedupString(RubyString.newString(runtime, newByteListFromRaw(runtime, str, encoding), cr));
}

@JIT
Expand Down
14 changes: 7 additions & 7 deletions core/src/main/java/org/jruby/ir/targets/Bootstrap.java
Expand Up @@ -42,7 +42,7 @@ public class Bootstrap {
private static final Logger LOG = LoggerFactory.getLogger("Bootstrap");
static final Lookup LOOKUP = MethodHandles.lookup();

public static CallSite string(Lookup lookup, String name, MethodType type, String value, String encodingName) {
public static CallSite string(Lookup lookup, String name, MethodType type, String value, String encodingName, int cr) {
Encoding encoding;
EncodingDB.Entry entry = EncodingDB.getEncodings().get(encodingName.getBytes());
if (entry == null) entry = EncodingDB.getAliases().get(encodingName.getBytes());
Expand All @@ -52,7 +52,7 @@ public static CallSite string(Lookup lookup, String name, MethodType type, Strin
MutableCallSite site = new MutableCallSite(type);
Binder binder = Binder
.from(RubyString.class, ThreadContext.class)
.insert(0, arrayOf(MutableCallSite.class, ByteList.class), site, byteList);
.insert(0, arrayOf(MutableCallSite.class, ByteList.class), site, byteList, cr);
if (name.equals("frozen")) {
site.setTarget(binder.invokeStaticQuiet(lookup, Bootstrap.class, "frozenString"));
} else {
Expand Down Expand Up @@ -131,7 +131,7 @@ public static CallSite searchConst(Lookup lookup, String name, MethodType type,
}

public static Handle string() {
return new Handle(Opcodes.H_INVOKESTATIC, p(Bootstrap.class), "string", sig(CallSite.class, Lookup.class, String.class, MethodType.class, String.class, String.class));
return new Handle(Opcodes.H_INVOKESTATIC, p(Bootstrap.class), "string", sig(CallSite.class, Lookup.class, String.class, MethodType.class, String.class, String.class, int.class));
}

public static Handle bytelist() {
Expand Down Expand Up @@ -162,19 +162,19 @@ public static Handle searchConst() {
return new Handle(Opcodes.H_INVOKESTATIC, p(Bootstrap.class), "searchConst", sig(CallSite.class, Lookup.class, String.class, MethodType.class, int.class));
}

public static RubyString string(MutableCallSite site, ByteList value, ThreadContext context) throws Throwable {
public static RubyString string(MutableCallSite site, ByteList value, int cr, ThreadContext context) throws Throwable {
MethodHandle handle = SmartBinder
.from(STRING_SIGNATURE)
.invoke(NEW_STRING_SHARED_HANDLE.apply("byteList", value))
.handle();

site.setTarget(handle);

return RubyString.newStringShared(context.runtime, value);
return RubyString.newStringShared(context.runtime, value, cr);
}

public static RubyString frozenString(MutableCallSite site, ByteList value, ThreadContext context) throws Throwable {
RubyString frozen = context.runtime.freezeAndDedupString(RubyString.newStringShared(context.runtime, value));
public static RubyString frozenString(MutableCallSite site, ByteList value, int cr, ThreadContext context) throws Throwable {
RubyString frozen = context.runtime.freezeAndDedupString(RubyString.newStringShared(context.runtime, value, cr));
MethodHandle handle = Binder.from(RubyString.class, ThreadContext.class)
.dropAll()
.constant(frozen);
Expand Down
Expand Up @@ -237,14 +237,14 @@ public void pushBlockBody(Handle handle, org.jruby.runtime.Signature signature,
*
* @param bl ByteList for the String to push
*/
public abstract void pushString(ByteList bl);
public abstract void pushString(ByteList bl, int cr);

/**
* Stack required: none
*
* @param bl ByteList for the String to push
*/
public abstract void pushFrozenString(ByteList bl);
public abstract void pushFrozenString(ByteList bl, int cr);

/**
* Stack required: none
Expand Down
13 changes: 7 additions & 6 deletions core/src/main/java/org/jruby/ir/targets/IRBytecodeAdapter6.java
Expand Up @@ -85,10 +85,11 @@ public void run() {
});
}

public void pushString(ByteList bl) {
public void pushString(ByteList bl, int cr) {
loadRuntime();
pushByteList(bl);
adapter.invokestatic(p(RubyString.class), "newStringShared", sig(RubyString.class, Ruby.class, ByteList.class));
adapter.ldc(cr);
adapter.invokestatic(p(RubyString.class), "newStringShared", sig(RubyString.class, Ruby.class, ByteList.class, int.class));
}

private String newFieldName(String baseName) {
Expand All @@ -100,14 +101,14 @@ private String newFieldName(String baseName) {
*
* @param bl ByteList for the String to push
*/
public void pushFrozenString(final ByteList bl) {
public void pushFrozenString(final ByteList bl, final int cr) {
cacheValuePermanently("fstring", RubyString.class, keyFor("fstring", bl), new Runnable() {
@Override
public void run() {
loadRuntime();
adapter.ldc(bl.toString());
adapter.ldc(bl.getEncoding().toString());
invokeIRHelper("newFrozenStringFromRaw", sig(RubyString.class, Ruby.class, String.class, String.class));
pushByteList(bl);
adapter.ldc(cr);
invokeIRHelper("newFrozenStringFromRaw", sig(RubyString.class, Ruby.class, String.class, String.class, int.class));
}
});
}
Expand Down
Expand Up @@ -54,14 +54,14 @@ public void pushFloat(double d) {
adapter.invokedynamic("flote", sig(JVM.OBJECT, ThreadContext.class), FloatObjectSite.BOOTSTRAP, d);
}

public void pushString(ByteList bl) {
public void pushString(ByteList bl, int cr) {
loadContext();
adapter.invokedynamic("string", sig(RubyString.class, ThreadContext.class), Bootstrap.string(), new String(bl.bytes(), RubyEncoding.ISO), bl.getEncoding().toString());
adapter.invokedynamic("string", sig(RubyString.class, ThreadContext.class), Bootstrap.string(), new String(bl.bytes(), RubyEncoding.ISO), bl.getEncoding().toString(), cr);
}

public void pushFrozenString(ByteList bl) {
public void pushFrozenString(ByteList bl, int cr) {
loadContext();
adapter.invokedynamic("frozen", sig(RubyString.class, ThreadContext.class), Bootstrap.string(), new String(bl.bytes(), RubyEncoding.ISO), bl.getEncoding().toString());
adapter.invokedynamic("frozen", sig(RubyString.class, ThreadContext.class), Bootstrap.string(), new String(bl.bytes(), RubyEncoding.ISO), bl.getEncoding().toString(), cr);
}

public void pushByteList(ByteList bl) {
Expand Down
9 changes: 5 additions & 4 deletions core/src/main/java/org/jruby/ir/targets/JVMVisitor.java
Expand Up @@ -33,6 +33,7 @@
import org.jruby.util.JavaNameMangler;
import org.jruby.util.KeyValuePair;
import org.jruby.util.RegexpOptions;
import org.jruby.util.StringSupport;
import org.jruby.util.cli.Options;
import org.jruby.util.log.Logger;
import org.jruby.util.log.LoggerFactory;
Expand Down Expand Up @@ -625,7 +626,7 @@ public void BacktickInstr(BacktickInstr instr) {
jvmMethod().loadSelf();

ByteList csByteList = new ByteList();
jvmMethod().pushString(csByteList);
jvmMethod().pushString(csByteList, StringSupport.CR_BROKEN);

for (Operand p : instr.getOperands()) {
// visit piece and ensure it's a string
Expand Down Expand Up @@ -712,7 +713,7 @@ public void BuildCompoundArrayInstr(BuildCompoundArrayInstr instr) {
public void BuildCompoundStringInstr(BuildCompoundStringInstr compoundstring) {
ByteList csByteList = new ByteList();
csByteList.setEncoding(compoundstring.getEncoding());
jvmMethod().pushString(csByteList);
jvmMethod().pushString(csByteList, StringSupport.CR_UNKNOWN);
for (Operand p : compoundstring.getPieces()) {
// if ((p instanceof StringLiteral) && (compoundstring.isSameEncodingAndCodeRange((StringLiteral)p))) {
// jvmMethod().pushByteList(((StringLiteral)p).bytelist);
Expand Down Expand Up @@ -2013,7 +2014,7 @@ public void Fixnum(Fixnum fixnum) {

@Override
public void FrozenString(FrozenString frozen) {
jvmMethod().pushFrozenString(frozen.getByteList());
jvmMethod().pushFrozenString(frozen.getByteList(), frozen.getCodeRange());
}

@Override
Expand Down Expand Up @@ -2142,7 +2143,7 @@ public void StandardError(StandardError standarderror) {

@Override
public void StringLiteral(StringLiteral stringliteral) {
jvmMethod().pushString(stringliteral.getByteList());
jvmMethod().pushString(stringliteral.getByteList(), stringliteral.getCodeRange());
}

@Override
Expand Down

0 comments on commit d2ea85f

Please sign in to comment.