Skip to content

Commit

Permalink
Showing 6 changed files with 17 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -100,7 +100,7 @@ public AsciiCompatibleNode(RubyContext context, SourceSection sourceSection) {
@Specialization
public Object isCompatible(DynamicObject encoding) {
CompilerDirectives.transferToInterpreter();
return EncodingOperations.getEncoding(getContext(), encoding).isAsciiCompatible();
return EncodingOperations.getEncoding(encoding).isAsciiCompatible();
}
}

@@ -126,8 +126,8 @@ public Object isCompatibleStringString(DynamicObject first, DynamicObject second
@TruffleBoundary
@Specialization(guards = {"isRubyEncoding(first)", "isRubyEncoding(second)"})
public Object isCompatibleEncodingEncoding(DynamicObject first, DynamicObject second) {
final Encoding firstEncoding = EncodingOperations.getEncoding(getContext(), first);
final Encoding secondEncoding = EncodingOperations.getEncoding(getContext(), second);
final Encoding firstEncoding = EncodingOperations.getEncoding(first);
final Encoding secondEncoding = EncodingOperations.getEncoding(second);
final Encoding compatibleEncoding = org.jruby.RubyEncoding.areCompatible(firstEncoding, secondEncoding);

if (compatibleEncoding != null) {
@@ -224,7 +224,7 @@ public Object isCompatibleSymbolSymbol(DynamicObject first, DynamicObject second
@TruffleBoundary
@Specialization(guards = {"isRubyString(first)", "isRubyEncoding(second)"})
public Object isCompatibleStringEncoding(DynamicObject first, DynamicObject second) {
final Encoding compatibleEncoding = org.jruby.RubyEncoding.areCompatible(Layouts.STRING.getByteList(first).getEncoding(), EncodingOperations.getEncoding(getContext(), second));
final Encoding compatibleEncoding = org.jruby.RubyEncoding.areCompatible(Layouts.STRING.getByteList(first).getEncoding(), EncodingOperations.getEncoding(second));

if (compatibleEncoding != null) {
return getEncoding(compatibleEncoding);
@@ -249,7 +249,7 @@ public SetDefaultExternalNode(RubyContext context, SourceSection sourceSection)
public DynamicObject defaultExternalEncoding(DynamicObject encoding) {
CompilerDirectives.transferToInterpreter();

getContext().getRuntime().setDefaultExternalEncoding(EncodingOperations.getEncoding(getContext(), encoding));
getContext().getRuntime().setDefaultExternalEncoding(EncodingOperations.getEncoding(encoding));

return encoding;
}
@@ -259,7 +259,7 @@ public DynamicObject defaultExternal(DynamicObject encodingString) {
CompilerDirectives.transferToInterpreter();

final DynamicObject rubyEncoding = getEncoding(encodingString.toString());
getContext().getRuntime().setDefaultExternalEncoding(EncodingOperations.getEncoding(getContext(), rubyEncoding));
getContext().getRuntime().setDefaultExternalEncoding(EncodingOperations.getEncoding(rubyEncoding));

return rubyEncoding;
}
@@ -295,7 +295,7 @@ public SetDefaultInternalNode(RubyContext context, SourceSection sourceSection)
public DynamicObject defaultInternal(DynamicObject encoding) {
CompilerDirectives.transferToInterpreter();

getContext().getRuntime().setDefaultInternalEncoding(EncodingOperations.getEncoding(getContext(), encoding));
getContext().getRuntime().setDefaultInternalEncoding(EncodingOperations.getEncoding(encoding));

return encoding;
}
@@ -319,7 +319,7 @@ public DynamicObject defaultInternal(VirtualFrame frame, Object encoding) {
}

final DynamicObject encodingName = toStrNode.executeToStr(frame, encoding);
getContext().getRuntime().setDefaultInternalEncoding(EncodingOperations.getEncoding(getContext(), getEncoding(encodingName.toString())));
getContext().getRuntime().setDefaultInternalEncoding(EncodingOperations.getEncoding(getEncoding(encodingName.toString())));

return encodingName;
}
Original file line number Diff line number Diff line change
@@ -153,7 +153,7 @@ public DynamicObject backtick(VirtualFrame frame, DynamicObject command) {
}

// TODO (nirvdrum 10-Mar-15) This should be using the default external encoding, rather than hard-coded to UTF-8.
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), RubyString.encodeBytelist(resultBuilder.toString(), EncodingOperations.getEncoding(getContext(), EncodingNodes.getEncoding("UTF-8"))), StringSupport.CR_UNKNOWN, null);
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), RubyString.encodeBytelist(resultBuilder.toString(), EncodingOperations.getEncoding(EncodingNodes.getEncoding("UTF-8"))), StringSupport.CR_UNKNOWN, null);
}

}
Original file line number Diff line number Diff line change
@@ -38,7 +38,6 @@
import org.jcodings.specific.ASCIIEncoding;
import org.jcodings.specific.USASCIIEncoding;
import org.jcodings.specific.UTF8Encoding;
import org.jruby.Ruby;
import org.jruby.RubyString;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.nodes.RubyNode;
@@ -1141,7 +1140,7 @@ public DynamicObject forceEncodingString(DynamicObject string, DynamicObject enc

@Specialization(guards = "isRubyEncoding(encoding)")
public DynamicObject forceEncodingEncoding(DynamicObject string, DynamicObject encoding) {
StringOperations.forceEncoding(string, EncodingOperations.getEncoding(getContext(), encoding));
StringOperations.forceEncoding(string, EncodingOperations.getEncoding(encoding));
return string;
}

Original file line number Diff line number Diff line change
@@ -560,7 +560,7 @@ public StringFromCodepointPrimitiveNode(RubyContext context, SourceSection sourc

@Specialization(guards = {"isRubyEncoding(encoding)", "isSimple(code, encoding)"})
public DynamicObject stringFromCodepointSimple(int code, DynamicObject encoding) {
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), new ByteList(new byte[]{(byte) code}, EncodingOperations.getEncoding(getContext(), encoding)), StringSupport.CR_UNKNOWN, null);
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), new ByteList(new byte[]{(byte) code}, EncodingOperations.getEncoding(encoding)), StringSupport.CR_UNKNOWN, null);
}

@TruffleBoundary
@@ -569,7 +569,7 @@ public DynamicObject stringFromCodepoint(int code, DynamicObject encoding) {
final int length;

try {
length = EncodingOperations.getEncoding(getContext(), encoding).codeToMbcLength(code);
length = EncodingOperations.getEncoding(encoding).codeToMbcLength(code);
} catch (EncodingException e) {
throw new RaiseException(getContext().getCoreLibrary().rangeError(code, encoding, this));
}
@@ -581,13 +581,13 @@ public DynamicObject stringFromCodepoint(int code, DynamicObject encoding) {
final byte[] bytes = new byte[length];

try {
EncodingOperations.getEncoding(getContext(), encoding).codeToMbc(code, bytes, 0);
EncodingOperations.getEncoding(encoding).codeToMbc(code, bytes, 0);
} catch (EncodingException e) {
CompilerDirectives.transferToInterpreter();
throw new RaiseException(getContext().getCoreLibrary().rangeError(code, encoding, this));
}

return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), new ByteList(bytes, EncodingOperations.getEncoding(getContext(), encoding)), StringSupport.CR_UNKNOWN, null);
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), new ByteList(bytes, EncodingOperations.getEncoding(encoding)), StringSupport.CR_UNKNOWN, null);
}

@Specialization(guards = "isRubyEncoding(encoding)")
@@ -601,7 +601,7 @@ public DynamicObject stringFromCodepointSimple(long code, DynamicObject encoding
}

protected boolean isSimple(int code, DynamicObject encoding) {
return EncodingOperations.getEncoding(getContext(), encoding) == ASCIIEncoding.INSTANCE && code >= 0x00 && code <= 0xFF;
return EncodingOperations.getEncoding(encoding) == ASCIIEncoding.INSTANCE && code >= 0x00 && code <= 0xFF;
}

}
Original file line number Diff line number Diff line change
@@ -1160,7 +1160,7 @@ public DynamicObject ioError(String fileName, Node currentNode) {
public DynamicObject rangeError(int code, DynamicObject encoding, Node currentNode) {
CompilerAsserts.neverPartOfCompilation();
assert RubyGuards.isRubyEncoding(encoding);
return rangeError(String.format("invalid codepoint %x in %s", code, EncodingOperations.getEncoding(getContext(), encoding)), currentNode);
return rangeError(String.format("invalid codepoint %x in %s", code, EncodingOperations.getEncoding(encoding)), currentNode);
}

public DynamicObject rangeError(String type, String value, String range, Node currentNode) {
Original file line number Diff line number Diff line change
@@ -16,13 +16,12 @@
import com.oracle.truffle.api.object.DynamicObject;
import org.jcodings.Encoding;
import org.jcodings.EncodingDB;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.util.ByteList;

public abstract class EncodingOperations {

public static Encoding getEncoding(RubyContext context, DynamicObject rubyEncoding) {
public static Encoding getEncoding(DynamicObject rubyEncoding) {
Encoding encoding = Layouts.ENCODING.getEncoding(rubyEncoding);

if (encoding == null) {

This comment has been minimized.

Copy link
@eregon

eregon Sep 28, 2015

Member

This whole branch should probably transfer to interpreter, I think it's not so interesting to compile the write+read if we transfer for the loading anyway.

This comment has been minimized.

Copy link
@nirvdrum

nirvdrum Sep 28, 2015

Author Contributor

I was looking at a way to add a ConditionProfile on this, but wasn't clear on who would own the profile reference. I guess a straight transfer would do about the same thing.

This comment has been minimized.

Copy link
@eregon

eregon Sep 28, 2015

Member

Since we need to transfer later then moving the transfer up seems like a good solution.
If the whole branch needs to be on the fast path, then yeah a profile would be needed.
But I assume this is called mostly in guards and so will be assigned on the first call so compiling the branch is not useful.

0 comments on commit c97f626

Please sign in to comment.