Skip to content

Commit

Permalink
Showing 8 changed files with 68 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -29,6 +29,7 @@
import org.jruby.truffle.nodes.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.EncodingOperations;
import org.jruby.truffle.runtime.core.StringOperations;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.util.ByteList;
@@ -99,7 +100,7 @@ public AsciiCompatibleNode(RubyContext context, SourceSection sourceSection) {
@Specialization
public Object isCompatible(DynamicObject encoding) {
CompilerDirectives.transferToInterpreter();
return Layouts.ENCODING.getEncoding(encoding).isAsciiCompatible();
return EncodingOperations.getEncoding(getContext(), encoding).isAsciiCompatible();
}
}

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

if (compatibleEncoding != null) {
return getEncoding(compatibleEncoding);
@@ -221,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(), Layouts.ENCODING.getEncoding(second));
final Encoding compatibleEncoding = org.jruby.RubyEncoding.areCompatible(Layouts.STRING.getByteList(first).getEncoding(), EncodingOperations.getEncoding(getContext(), second));

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

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

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

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

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

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

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

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

return encodingName;
}
@@ -447,8 +450,10 @@ public Object indexLookup(DynamicObject[] encodings, Encoding encoding) {
return nil();
}

final ByteList encodingName = new ByteList(encoding.getName());

for (int i = 0; i < encodings.length; i++) {
if (Layouts.ENCODING.getEncoding(encodings[i]) == encoding) {
if (Layouts.ENCODING.getName(encodings[i]).equals(encodingName)) {
return i;
}
}
Original file line number Diff line number Diff line change
@@ -67,6 +67,7 @@
import org.jruby.truffle.runtime.backtrace.Backtrace;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.ArrayOperations;
import org.jruby.truffle.runtime.core.EncodingOperations;
import org.jruby.truffle.runtime.core.MethodFilter;
import org.jruby.truffle.runtime.core.StringOperations;
import org.jruby.truffle.runtime.hash.HashOperations;
@@ -152,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(), Layouts.ENCODING.getEncoding(EncodingNodes.getEncoding("UTF-8"))), StringSupport.CR_UNKNOWN, null);
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), RubyString.encodeBytelist(resultBuilder.toString(), EncodingOperations.getEncoding(getContext(), EncodingNodes.getEncoding("UTF-8"))), StringSupport.CR_UNKNOWN, null);
}

}
Original file line number Diff line number Diff line change
@@ -63,6 +63,7 @@
import org.jruby.truffle.runtime.NotProvided;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.EncodingOperations;
import org.jruby.truffle.runtime.core.StringOperations;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.util.*;
@@ -1105,7 +1106,7 @@ public DynamicObject forceEncodingString(DynamicObject string, DynamicObject enc

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

Original file line number Diff line number Diff line change
@@ -124,7 +124,13 @@ protected Shape transitionWithNewField(Shape oldShape, Object value) {
return copy.getShape();
}
} else {
final Location location = oldShape.allocator().locationForValue(value,
Class type = value.getClass();

if (value instanceof Long) {
type = long.class;
}

final Location location = oldShape.allocator().locationForType(type,
EnumSet.of(LocationModifier.Final, LocationModifier.NonNull));
final Property newProperty = Property.create(name, location, 0);
return oldShape.addProperty(newProperty);
Original file line number Diff line number Diff line change
@@ -76,6 +76,7 @@
import org.jruby.truffle.runtime.NotProvided;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.control.RaiseException;
import org.jruby.truffle.runtime.core.EncodingOperations;
import org.jruby.truffle.runtime.core.StringOperations;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.util.ByteList;
@@ -540,7 +541,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}, Layouts.ENCODING.getEncoding(encoding)), StringSupport.CR_UNKNOWN, null);
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), new ByteList(new byte[]{(byte) code}, EncodingOperations.getEncoding(getContext(), encoding)), StringSupport.CR_UNKNOWN, null);
}

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

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

try {
Layouts.ENCODING.getEncoding(encoding).codeToMbc(code, bytes, 0);
EncodingOperations.getEncoding(getContext(), 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, Layouts.ENCODING.getEncoding(encoding)), StringSupport.CR_UNKNOWN, null);
return Layouts.STRING.createString(getContext().getCoreLibrary().getStringFactory(), new ByteList(bytes, EncodingOperations.getEncoding(getContext(), encoding)), StringSupport.CR_UNKNOWN, null);
}

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

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

}
Original file line number Diff line number Diff line change
@@ -18,7 +18,6 @@
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.source.SourceSection;
import jnr.constants.platform.Errno;
import org.jcodings.Encoding;
import org.jcodings.EncodingDB;
import org.jcodings.specific.UTF8Encoding;
import org.jcodings.transcode.EConvFlags;
@@ -714,9 +713,7 @@ public void initializeEncodingConstants() {
getContext().getRuntime().getEncodingService().defineEncodings(new EncodingService.EncodingDefinitionVisitor() {
@Override
public void defineEncoding(EncodingDB.Entry encodingEntry, byte[] name, int p, int end) {
Encoding e = encodingEntry.getEncoding();

DynamicObject re = EncodingNodes.newEncoding(encodingClass, e, name, p, end, encodingEntry.isDummy());
DynamicObject re = EncodingNodes.newEncoding(encodingClass, null, name, p, end, encodingEntry.isDummy());
EncodingNodes.storeEncoding(encodingEntry.getIndex(), re);
}

@@ -1163,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, Layouts.ENCODING.getEncoding(encoding)), currentNode);
return rangeError(String.format("invalid codepoint %x in %s", code, EncodingOperations.getEncoding(getContext(), encoding)), currentNode);
}

public DynamicObject rangeError(String type, String value, String range, Node currentNode) {
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/

package org.jruby.truffle.runtime.core;

import com.oracle.truffle.api.object.DynamicObject;
import org.jcodings.Encoding;
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) {
Encoding encoding = Layouts.ENCODING.getEncoding(rubyEncoding);

if (encoding == null) {
final ByteList name = Layouts.ENCODING.getName(rubyEncoding);
encoding = context.getRuntime().getEncodingService().loadEncoding(name);
Layouts.ENCODING.setEncoding(rubyEncoding, encoding);
}

return encoding;
}

}
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.oracle.truffle.api.object.DynamicObjectFactory;
import org.jcodings.Encoding;
import org.jruby.truffle.om.dsl.api.Layout;
import org.jruby.truffle.om.dsl.api.Nullable;
import org.jruby.util.ByteList;

@Layout
@@ -22,14 +23,15 @@ DynamicObjectFactory createEncodingShape(DynamicObject logicalClass,
DynamicObject metaClass);

DynamicObject createEncoding(DynamicObjectFactory factory,
Encoding encoding,
@Nullable Encoding encoding,
ByteList name,
boolean dummy);

boolean isEncoding(DynamicObject object);
boolean isEncoding(Object object);

Encoding getEncoding(DynamicObject object);
void setEncoding(DynamicObject object, Encoding encoding);

ByteList getName(DynamicObject object);

0 comments on commit 3c164ca

Please sign in to comment.