Skip to content

Commit

Permalink
Showing 10 changed files with 107 additions and 72 deletions.
74 changes: 37 additions & 37 deletions truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java

Large diffs are not rendered by default.

19 changes: 13 additions & 6 deletions truffle/src/main/java/org/jruby/truffle/core/StringNodes.java
Original file line number Diff line number Diff line change
@@ -2491,22 +2491,29 @@ public Object upcase(VirtualFrame frame, DynamicObject string) {
@ImportStatic(StringGuards.class)
public abstract static class UpcaseBangNode extends CoreMethodArrayArgumentsNode {

@Child private RopeNodes.MakeLeafRopeNode makeLeafRopeNode;

public UpcaseBangNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
makeLeafRopeNode = RopeNodesFactory.MakeLeafRopeNodeGen.create(context, sourceSection, null, null, null);
}

@Specialization(guards = "isSingleByteOptimizable(string)")
public DynamicObject upcaseSingleByte(DynamicObject string) {
public DynamicObject upcaseSingleByte(DynamicObject string,
@Cached("createBinaryProfile()") ConditionProfile isEmptyProfile,
@Cached("createBinaryProfile()") ConditionProfile modifiedProfile) {
final Rope rope = rope(string);
final ByteList bytes = rope.toByteListCopy();

if (rope.isEmpty()) {
if (isEmptyProfile.profile(rope.isEmpty())) {
return nil();
}

final boolean modified = singleByteUpcase(bytes.unsafeBytes(), bytes.begin(), bytes.realSize());
if (modified) {
StringOperations.setRope(string, StringOperations.ropeFromByteList(bytes, rope.getCodeRange()));
final byte[] bytes = rope.getBytesCopy();
final boolean modified = singleByteUpcase(bytes, 0, bytes.length);

if (modifiedProfile.profile(modified)) {
final Rope newRope = makeLeafRopeNode.executeMake(bytes, rope.getEncoding(), rope.getCodeRange());
StringOperations.setRope(string, newRope);

return string;
} else {
Original file line number Diff line number Diff line change
@@ -30,7 +30,6 @@
import com.oracle.truffle.api.object.DynamicObject;
import org.jcodings.Encoding;
import org.jruby.RubyEncoding;
import org.jruby.RubyString;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.language.control.RaiseException;
@@ -184,11 +183,6 @@ public static Encoding checkEncoding(RubyContext context, DynamicObject string,
return encoding;
}

@TruffleBoundary
public static ByteList encodeByteList(CharSequence value, Encoding encoding) {
return RubyString.encodeBytelist(value, encoding);
}

@TruffleBoundary
public static Rope encodeRope(CharSequence value, Encoding encoding, CodeRange codeRange) {
// Taken from org.jruby.RubyString#encodeByteList.
@@ -214,6 +208,11 @@ public static Rope encodeRope(CharSequence value, Encoding encoding) {
return encodeRope(value, encoding, CodeRange.CR_UNKNOWN);
}

@TruffleBoundary
public static Rope createRope(String s, Encoding encoding) {
return RopeOperations.create(ByteList.encode(s, "ISO-8859-1"), encoding, CodeRange.CR_UNKNOWN);
}

public static ByteList getByteList(DynamicObject object) {
throw new RuntimeException("Replace with read-only call or rope update for String.");
}
31 changes: 29 additions & 2 deletions truffle/src/main/java/org/jruby/truffle/core/SymbolTable.java
Original file line number Diff line number Diff line change
@@ -14,7 +14,6 @@
import org.jcodings.specific.USASCIIEncoding;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.rope.CodeRange;
import org.jruby.truffle.runtime.rope.Rope;
import org.jruby.truffle.runtime.rope.RopeOperations;
import org.jruby.util.ByteList;
@@ -32,14 +31,42 @@ public class SymbolTable {

private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final WeakHashMap<Rope, WeakReference<DynamicObject>> symbolsTable = new WeakHashMap<>();
private final WeakHashMap<String, WeakReference<DynamicObject>> symbolsTableByString = new WeakHashMap<>();

public SymbolTable(RubyContext context) {
this.context = context;
}

@CompilerDirectives.TruffleBoundary
public DynamicObject getSymbol(String string) {
return getSymbol(RopeOperations.create(ByteList.encode(string, "ISO-8859-1"), USASCIIEncoding.INSTANCE, CodeRange.CR_UNKNOWN));
lock.readLock().lock();

try {
final WeakReference<DynamicObject> symbolReference = symbolsTableByString.get(string);

if (symbolReference != null) {
final DynamicObject symbol = symbolReference.get();

if (symbol != null) {
return symbol;
}
}
} finally {
lock.readLock().unlock();
}

final Rope rope = StringOperations.createRope(string, USASCIIEncoding.INSTANCE);
final DynamicObject symbol = getSymbol(rope);

lock.writeLock().lock();

try {
symbolsTableByString.put(string, new WeakReference<>(symbol));

return symbol;
} finally {
lock.writeLock().unlock();
}
}

@CompilerDirectives.TruffleBoundary
Original file line number Diff line number Diff line change
@@ -74,6 +74,7 @@
import org.jruby.truffle.runtime.methods.Arity;
import org.jruby.truffle.runtime.methods.SharedMethodInfo;
import org.jruby.truffle.language.control.BreakID;
import org.jruby.truffle.runtime.rope.CodeRange;
import org.jruby.truffle.runtime.rope.Rope;
import org.jruby.util.ByteList;
import org.jruby.util.KeyValuePair;
@@ -1039,7 +1040,7 @@ public RubyNode visitConstNode(org.jruby.ast.ConstNode node) {

// TODO (pitr 01-Dec-2015): remove when RUBY_PLATFORM is set to "truffle"
if (name.equals("RUBY_PLATFORM") && getSourcePath(sourceSection).contains("test/xml_mini/jdom_engine_test.rb")) {
final LiteralNode ret = new LiteralNode(context, sourceSection, StringOperations.createString(context, StringOperations.encodeByteList("truffle", UTF8Encoding.INSTANCE)));
final LiteralNode ret = new LiteralNode(context, sourceSection, StringOperations.createString(context, StringOperations.encodeRope("truffle", UTF8Encoding.INSTANCE, CodeRange.CR_7BIT)));
return addNewlineIfNeeded(node, ret);
}

@@ -2815,9 +2816,8 @@ public RubyNode visitStrNode(org.jruby.ast.StrNode node) {

@Override
public RubyNode visitSymbolNode(org.jruby.ast.SymbolNode node) {
final ByteList byteList = StringOperations.createByteList(node.getName());
byteList.setEncoding(node.getEncoding());
final RubyNode ret = new LiteralNode(context, translate(node.getPosition()), context.getSymbol(byteList));
final Rope rope = StringOperations.createRope(node.getName(), node.getEncoding());
final RubyNode ret = new LiteralNode(context, translate(node.getPosition()), context.getSymbol(rope));
return addNewlineIfNeeded(node, ret);
}

Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@
import org.jruby.truffle.language.literal.LiteralNode;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.core.StringOperations;
import org.jruby.util.ByteList;
import org.jruby.truffle.runtime.rope.Rope;

public class ReadTimeZoneNode extends RubyNode {

@@ -33,7 +33,7 @@ public class ReadTimeZoneNode extends RubyNode {
private final ConditionProfile tzNilProfile = ConditionProfile.createBinaryProfile();
private final ConditionProfile tzStringProfile = ConditionProfile.createBinaryProfile();

private static final ByteList defaultZone = StringOperations.encodeByteList(DateTimeZone.getDefault().toString(), UTF8Encoding.INSTANCE);
private static final Rope defaultZone = StringOperations.encodeRope(DateTimeZone.getDefault().toString(), UTF8Encoding.INSTANCE);
private final DynamicObject TZ;

public ReadTimeZoneNode(RubyContext context, SourceSection sourceSection) {
@@ -51,7 +51,7 @@ public Object execute(VirtualFrame frame) {
// TODO CS 4-May-15 not sure how TZ ends up being nil

if (tzNilProfile.profile(tz == nil())) {
return createString(defaultZone.dup());
return createString(defaultZone);
} else if (tzStringProfile.profile(RubyGuards.isRubyString(tz))) {
return tz;
} else {
Original file line number Diff line number Diff line change
@@ -45,6 +45,7 @@
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.core.StringOperations;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.rope.CodeRange;

import java.math.BigInteger;
import java.util.Arrays;
@@ -166,7 +167,7 @@ protected static DynamicObject newBignum(RubyContext context, String value) {
}

protected static DynamicObject string(RubyContext context, String value) {
return StringOperations.create7BitString(context, StringOperations.encodeByteList(value, UTF8Encoding.INSTANCE));
return StringOperations.createString(context, StringOperations.encodeRope(value, UTF8Encoding.INSTANCE, CodeRange.CR_7BIT));
}

}
12 changes: 6 additions & 6 deletions truffle/src/main/java/org/jruby/truffle/runtime/RubyContext.java
Original file line number Diff line number Diff line change
@@ -296,7 +296,7 @@ private void initialize() {
for (IRubyObject arg : ((org.jruby.RubyArray) runtime.getObject().getConstant("ARGV")).toJavaArray()) {
assert arg != null;

ArrayOperations.append(coreLibrary.getArgv(), StringOperations.createString(this, StringOperations.encodeByteList(arg.toString(), UTF8Encoding.INSTANCE)));
ArrayOperations.append(coreLibrary.getArgv(), StringOperations.createString(this, StringOperations.encodeRope(arg.toString(), UTF8Encoding.INSTANCE)));
}

// Set the load path
@@ -315,7 +315,7 @@ private void initialize() {
pathString = SourceLoader.JRUBY_SCHEME + pathString.substring("uri:classloader:".length());
}

ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeByteList(pathString, UTF8Encoding.INSTANCE)));
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeRope(pathString, UTF8Encoding.INSTANCE)));
}
}

@@ -336,21 +336,21 @@ private void initialize() {
home = home + "/";

// Libraries copied unmodified from MRI
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeByteList(home + "lib/ruby/truffle/mri", UTF8Encoding.INSTANCE)));
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeRope(home + "lib/ruby/truffle/mri", UTF8Encoding.INSTANCE)));

// Our own implementations
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeByteList(home + "lib/ruby/truffle/truffle", UTF8Encoding.INSTANCE)));
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeRope(home + "lib/ruby/truffle/truffle", UTF8Encoding.INSTANCE)));

// Libraries from RubySL
for (String lib : Arrays.asList("rubysl-strscan", "rubysl-stringio",
"rubysl-complex", "rubysl-date", "rubysl-pathname",
"rubysl-tempfile", "rubysl-socket", "rubysl-securerandom",
"rubysl-timeout", "rubysl-webrick")) {
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeByteList(home + "lib/ruby/truffle/rubysl/" + lib + "/lib", UTF8Encoding.INSTANCE)));
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeRope(home + "lib/ruby/truffle/rubysl/" + lib + "/lib", UTF8Encoding.INSTANCE)));
}

// Shims
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeByteList(home + "lib/ruby/truffle/shims", UTF8Encoding.INSTANCE)));
ArrayOperations.append(loadPath, StringOperations.createString(this, StringOperations.encodeRope(home + "lib/ruby/truffle/shims", UTF8Encoding.INSTANCE)));
}

// TODO (eregon, 10/10/2015): this check could be done when a Symbol is created to be much cheaper
Original file line number Diff line number Diff line change
@@ -138,7 +138,7 @@ private RequireResult tryToRequireFile(String path, Node currentNode) throws IOE
}

// TODO (nirvdrum 15-Jan-15): If we fail to load, we should remove the path from the loaded features because subsequent requires of the same statement may succeed.
final DynamicObject pathString = StringOperations.createString(context, StringOperations.encodeByteList(expandedPath, UTF8Encoding.INSTANCE));
final DynamicObject pathString = StringOperations.createString(context, StringOperations.encodeRope(expandedPath, UTF8Encoding.INSTANCE));
ArrayOperations.append(loadedFeatures, pathString);
try {
context.loadFile(expandedPath, currentNode);
@@ -188,7 +188,7 @@ public boolean isAbsolutePath(String path) {
public static String expandPath(RubyContext context, String fileName) {
// TODO (nirvdrum 11-Feb-15) This needs to work on Windows without calling into non-Truffle JRuby.
if (context.isRunningOnWindows()) {
final org.jruby.RubyString path = context.toJRubyString(StringOperations.createString(context, StringOperations.encodeByteList(fileName, UTF8Encoding.INSTANCE)));
final org.jruby.RubyString path = context.toJRubyString(StringOperations.createString(context, StringOperations.encodeRope(fileName, UTF8Encoding.INSTANCE)));
final org.jruby.RubyString expanded = (org.jruby.RubyString) org.jruby.RubyFile.expand_path19(
context.getRuntime().getCurrentContext(),
null,
Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@
import org.jruby.truffle.core.StringOperations;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.loader.SourceLoader;
import org.jruby.truffle.runtime.rope.CodeRange;

import java.util.ArrayList;
import java.util.Collection;
@@ -63,7 +64,7 @@ public void setTraceFunc(final DynamicObject traceFunc) {
final TraceFuncEventFactory lineEventFactory = new TraceFuncEventFactory() {
@Override
public StandardInstrumentListener createInstrumentListener(RubyContext context, DynamicObject traceFunc) {
final DynamicObject event = StringOperations.create7BitString(context, StringOperations.encodeByteList("line", UTF8Encoding.INSTANCE));
final DynamicObject event = StringOperations.createString(context, StringOperations.encodeRope("line", UTF8Encoding.INSTANCE, CodeRange.CR_7BIT));

return new BaseEventInstrumentListener(context, traceFunc, event);
}
@@ -72,7 +73,7 @@ public StandardInstrumentListener createInstrumentListener(RubyContext context,
final TraceFuncEventFactory callEventFactory = new TraceFuncEventFactory() {
@Override
public StandardInstrumentListener createInstrumentListener(RubyContext context, DynamicObject traceFunc) {
final DynamicObject event = StringOperations.create7BitString(context, StringOperations.encodeByteList("call", UTF8Encoding.INSTANCE));
final DynamicObject event = StringOperations.createString(context, StringOperations.encodeRope("call", UTF8Encoding.INSTANCE, CodeRange.CR_7BIT));

return new CallEventInstrumentListener(context, traceFunc, event);
}
@@ -81,7 +82,7 @@ public StandardInstrumentListener createInstrumentListener(RubyContext context,
final TraceFuncEventFactory classEventFactory = new TraceFuncEventFactory() {
@Override
public StandardInstrumentListener createInstrumentListener(RubyContext context, DynamicObject traceFunc) {
final DynamicObject event = StringOperations.create7BitString(context, StringOperations.encodeByteList("class", UTF8Encoding.INSTANCE));
final DynamicObject event = StringOperations.createString(context, StringOperations.encodeRope("class", UTF8Encoding.INSTANCE, CodeRange.CR_7BIT));

return new BaseEventInstrumentListener(context, traceFunc, event);
}
@@ -154,7 +155,7 @@ public void onEnter(Probe probe, Node node, VirtualFrame frame) {
private void callSetTraceFunc(Node node, MaterializedFrame frame) {
final SourceSection sourceSection = node.getEncapsulatingSourceSection();

final DynamicObject file = StringOperations.createString(context, StringOperations.encodeByteList(sourceSection.getSource().getName(), UTF8Encoding.INSTANCE));
final DynamicObject file = StringOperations.createString(context, StringOperations.encodeRope(sourceSection.getSource().getName(), UTF8Encoding.INSTANCE));
final int line = sourceSection.getStartLine();

final Object classname = context.getCoreLibrary().getNilObject();
@@ -234,7 +235,7 @@ private void callSetTraceFunc(Node node, MaterializedFrame frame) {
line = -1;
}

final DynamicObject file = StringOperations.createString(context, StringOperations.encodeByteList(filename, UTF8Encoding.INSTANCE));
final DynamicObject file = StringOperations.createString(context, StringOperations.encodeRope(filename, UTF8Encoding.INSTANCE));

if (!context.getOptions().INCLUDE_CORE_FILE_CALLERS_IN_SET_TRACE_FUNC && filename.startsWith(SourceLoader.TRUFFLE_SCHEME)) {
return;

0 comments on commit ffa24f4

Please sign in to comment.