Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: e15f837dfd7c^
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: f172304fcdb4
Choose a head ref
  • 8 commits
  • 15 files changed
  • 1 contributor

Commits on Oct 28, 2016

  1. Copy the full SHA
    e15f837 View commit details

Commits on Oct 29, 2016

  1. Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    cae3e78 View commit details
  2. [Truffle] Keep track of default_external and default_internal encondi…

    …ngs in EncodingManager.
    
    A side effect of this change is we're no longer updating the JRuby runtime's default_external and default_internal values. As a result, we can't use methods from the JRuby runtime that rely on those values being up-to-date. Since RubyString#inspect is one such method, we have to move that back out to Ruby (String#inspect). This code has ping-ponged a few times between a Ruby and Java implementation. It appears whatever issue forced the move back to Java (i.e., RubyString#inspect) has been addressed.
    nirvdrum committed Oct 29, 2016

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    f7aae66 View commit details
  3. [Truffle] Simplified setting default_external and default_internal en…

    …codings.
    
    Also, started moving non-standard Encoding methods out to Truffle::Encoding.
    nirvdrum committed Oct 29, 2016

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    c4e535a View commit details
  4. [Truffle] Removed unnecessary boundaries.

    These methods became a lot simpler once we started tracking default_external and default_internal encodings in the EncodingManager.
    nirvdrum committed Oct 29, 2016

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    fb95da0 View commit details
  5. Copy the full SHA
    01b1bdb View commit details
  6. Copy the full SHA
    128f7dc View commit details
  7. Copy the full SHA
    f172304 View commit details
4 changes: 2 additions & 2 deletions core/pom.rb
Original file line number Diff line number Diff line change
@@ -49,8 +49,8 @@
jar 'com.github.jnr:jnr-enxio:0.13', :exclusions => ['com.github.jnr:jnr-ffi']
jar 'com.github.jnr:jnr-x86asm:1.0.2', :exclusions => ['com.github.jnr:jnr-ffi']
jar 'com.github.jnr:jnr-unixsocket:0.13', :exclusions => ['com.github.jnr:jnr-ffi']
jar 'com.github.jnr:jnr-posix:3.0.31', :exclusions => ['com.github.jnr:jnr-ffi']
jar 'com.github.jnr:jnr-constants:0.9.4', :exclusions => ['com.github.jnr:jnr-ffi']
jar 'com.github.jnr:jnr-posix:3.0.32-SNAPSHOT', :exclusions => ['com.github.jnr:jnr-ffi']
jar 'com.github.jnr:jnr-constants:0.9.5-SNAPSHOT', :exclusions => ['com.github.jnr:jnr-ffi']
jar 'com.github.jnr:jnr-ffi:2.1.0'
jar 'com.github.jnr:jffi:${jffi.version}'
jar 'com.github.jnr:jffi:${jffi.version}:native'
4 changes: 2 additions & 2 deletions core/pom.xml
Original file line number Diff line number Diff line change
@@ -137,7 +137,7 @@ DO NOT MODIFIY - GENERATED CODE
<dependency>
<groupId>com.github.jnr</groupId>
<artifactId>jnr-posix</artifactId>
<version>3.0.31</version>
<version>3.0.32-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>jnr-ffi</artifactId>
@@ -148,7 +148,7 @@ DO NOT MODIFIY - GENERATED CODE
<dependency>
<groupId>com.github.jnr</groupId>
<artifactId>jnr-constants</artifactId>
<version>0.9.4</version>
<version>0.9.5-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>jnr-ffi</artifactId>
Original file line number Diff line number Diff line change
@@ -239,8 +239,11 @@ public void defineAliases(EncodingAliasVisitor visitor) {
((CaseInsensitiveBytesHash.CaseInsensitiveBytesHashEntry<Entry>)hei.next());
Entry ee = e.value;

// The alias name should be exactly the one in the encodings DB.
visitor.defineAlias(ee.getIndex(), new String(e.bytes, e.p, e.end));

// The constant names must be treated by the the <code>encodingNames</code> helper.
for (String constName : encodingNames(e.bytes, e.p, e.end)) {
visitor.defineAlias(ee.getIndex(), constName);
visitor.defineConstant(ee.getIndex(), constName);
}
}
4 changes: 4 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/RubyContext.java
Original file line number Diff line number Diff line change
@@ -153,6 +153,10 @@ public RubyContext(Ruby jrubyRuntime, TruffleLanguage.Env env) {
nativePlatform = NativePlatformFactory.createPlatform(this);
rootLexicalScope = new LexicalScope(null, coreLibrary.getObjectClass());

// The encoding manager relies on POSIX having been initialized, so we can't process it during
// normal core library initialization.
coreLibrary.initializeEncodingConstants();

threadManager = new ThreadManager(this);
threadManager.initialize();

31 changes: 30 additions & 1 deletion truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
Original file line number Diff line number Diff line change
@@ -48,6 +48,8 @@
import org.jruby.truffle.core.dir.DirNodesFactory;
import org.jruby.truffle.core.encoding.EncodingConverterNodesFactory;
import org.jruby.truffle.core.encoding.EncodingNodesFactory;
import org.jruby.truffle.core.encoding.EncodingOperations;
import org.jruby.truffle.core.encoding.TruffleEncodingNodesFactory;
import org.jruby.truffle.core.exception.ExceptionNodesFactory;
import org.jruby.truffle.core.exception.NameErrorNodesFactory;
import org.jruby.truffle.core.exception.NoMethodErrorNodesFactory;
@@ -109,6 +111,7 @@
import org.jruby.truffle.language.TruffleBootNodesFactory;
import org.jruby.truffle.language.TruffleSafeNodesFactory;
import org.jruby.truffle.language.backtrace.BacktraceFormatter;
import org.jruby.truffle.language.control.ExitException;
import org.jruby.truffle.language.control.JavaException;
import org.jruby.truffle.language.control.RaiseException;
import org.jruby.truffle.language.control.TruffleFatalException;
@@ -585,6 +588,7 @@ public CoreLibrary(RubyContext context) {
defineModule(truffleModule, "Digest");
defineModule(truffleModule, "ObjSpace");
defineModule(truffleModule, "Etc");
defineModule(truffleModule, "Encoding");
defineModule(truffleModule, "Coverage");
defineModule(truffleModule, "Graal");
defineModule(truffleModule, "Ropes");
@@ -689,7 +693,6 @@ private void includeModules(DynamicObject comparableModule) {
public void initialize() {
initializeGlobalVariables();
initializeConstants();
initializeEncodingConstants();
initializeSignalConstants();
}

@@ -764,6 +767,7 @@ public void addCoreMethods(PrimitiveManager primitiveManager) {
TruffleBindingNodesFactory.getFactories(),
TruffleBootNodesFactory.getFactories(),
TruffleDebugNodesFactory.getFactories(),
TruffleEncodingNodesFactory.getFactories(),
TruffleFixnumNodesFactory.getFactories(),
TruffleGCNodesFactory.getFactories(),
TruffleGraalNodesFactory.getFactories(),
@@ -1107,6 +1111,31 @@ public void defineConstant(int encodingListIndex, String constName) {
Layouts.MODULE.getFields(encodingClass).setConstant(context, node, constName, rubyEncoding);
}
});

// External should always have a value, but Encoding.external_encoding{,=} will lazily setup
final String externalEncodingName = getContext().getJRubyRuntime().getInstanceConfig().getExternalEncoding();
if (externalEncodingName != null && !externalEncodingName.equals("")) {
final DynamicObject loadedEncoding = getContext().getEncodingManager().getRubyEncoding(externalEncodingName);
if (loadedEncoding == null) {
// TODO (nirvdrum 28-Oct-16): This should just print a nice error message and exit with a status code of 1 -- it's essentially an input validation error -- no need to show the user a full trace.
throw new RuntimeException("unknown encoding name - " + externalEncodingName);
} else {
getContext().getEncodingManager().setDefaultExternalEncoding(EncodingOperations.getEncoding(loadedEncoding));
}
} else {
getContext().getEncodingManager().setDefaultExternalEncoding(getContext().getEncodingManager().getLocaleEncoding());
}

final String internalEncodingName = getContext().getJRubyRuntime().getInstanceConfig().getInternalEncoding();
if (internalEncodingName != null && !internalEncodingName.equals("")) {
final DynamicObject rubyEncoding = getContext().getEncodingManager().getRubyEncoding(internalEncodingName);
if (rubyEncoding == null) {
// TODO (nirvdrum 28-Oct-16): This should just print a nice error message and exit with a status code of 1 -- it's essentially an input validation error -- no need to show the user a full trace.
throw new RuntimeException("unknown encoding name - " + internalEncodingName);
} else {
getContext().getEncodingManager().setDefaultInternalEncoding(EncodingOperations.getEncoding(rubyEncoding));
}
}
}

@TruffleBoundary
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@

import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.object.DynamicObject;
import jnr.constants.platform.LangInfo;
import org.jcodings.Encoding;
import org.jcodings.EncodingDB;
import org.jcodings.EncodingDB.Entry;
@@ -44,6 +45,9 @@ public class EncodingManager {

private final RubyContext context;

private Encoding defaultExternalEncoding;
private Encoding defaultInternalEncoding;

public EncodingManager(RubyContext context) {
this.context = context;
}
@@ -114,7 +118,10 @@ public synchronized DynamicObject replicateEncoding(Encoding encoding, String na

@TruffleBoundary
public Encoding getLocaleEncoding() {
return context.getJRubyRuntime().getEncodingService().getLocaleEncoding();
final String localEncodingName = context.getNativePlatform().getPosix().nl_langinfo(LangInfo.CODESET.intValue());
final DynamicObject rubyEncoding = getRubyEncoding(localEncodingName);

return EncodingOperations.getEncoding(rubyEncoding);
}

@TruffleBoundary
@@ -136,4 +143,19 @@ public static Charset charsetForEncoding(Encoding encoding) {
}
}

public void setDefaultExternalEncoding(Encoding defaultExternalEncoding) {
this.defaultExternalEncoding = defaultExternalEncoding;
}

public Encoding getDefaultExternalEncoding() {
return defaultExternalEncoding;
}

public void setDefaultInternalEncoding(Encoding defaultInternalEncoding) {
this.defaultInternalEncoding = defaultInternalEncoding;
}

public Encoding getDefaultInternalEncoding() {
return defaultInternalEncoding;
}
}
Original file line number Diff line number Diff line change
@@ -11,8 +11,6 @@
*/
package org.jruby.truffle.core.encoding;

import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.NodeChild;
@@ -26,30 +24,22 @@
import org.jcodings.EncodingDB;
import org.jcodings.EncodingDB.Entry;
import org.jcodings.specific.USASCIIEncoding;
import org.jcodings.util.CaseInsensitiveBytesHash.CaseInsensitiveBytesHashEntry;
import org.jcodings.util.Hash.HashEntry;
import org.jruby.runtime.Visibility;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.builtins.CoreClass;
import org.jruby.truffle.builtins.CoreMethod;
import org.jruby.truffle.builtins.CoreMethodArrayArgumentsNode;
import org.jruby.truffle.builtins.NonStandard;
import org.jruby.truffle.builtins.Primitive;
import org.jruby.truffle.builtins.PrimitiveArrayArgumentsNode;
import org.jruby.truffle.builtins.UnaryCoreMethodNode;
import org.jruby.truffle.builtins.YieldingCoreMethodNode;
import org.jruby.truffle.core.cast.ToEncodingNode;
import org.jruby.truffle.core.cast.ToStrNode;
import org.jruby.truffle.core.cast.ToStrNodeGen;
import org.jruby.truffle.core.rope.CodeRange;
import org.jruby.truffle.core.rope.Rope;
import org.jruby.truffle.core.string.StringOperations;
import org.jruby.truffle.language.RubyGuards;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.SnippetNode;
import org.jruby.truffle.language.control.RaiseException;
import org.jruby.util.ByteList;

@CoreClass("Encoding")
public abstract class EncodingNodes {
@@ -326,84 +316,6 @@ protected int getCacheLimit() {

}

@NonStandard
@CoreMethod(names = "default_external_jruby=", onSingleton = true, required = 1)
public abstract static class SetDefaultExternalNode extends CoreMethodArrayArgumentsNode {

@Child private ToStrNode toStrNode;

@TruffleBoundary
@Specialization(guards = "isRubyEncoding(encoding)")
public DynamicObject defaultExternalEncoding(DynamicObject encoding) {
getContext().getJRubyRuntime().setDefaultExternalEncoding(EncodingOperations.getEncoding(encoding));

return encoding;
}

@TruffleBoundary
@Specialization(guards = "isRubyString(encodingString)")
public DynamicObject defaultExternal(DynamicObject encodingString) {
final DynamicObject rubyEncoding = getContext().getEncodingManager().getRubyEncoding(encodingString.toString());
getContext().getJRubyRuntime().setDefaultExternalEncoding(EncodingOperations.getEncoding(rubyEncoding));

return rubyEncoding;
}

@TruffleBoundary
@Specialization(guards = "isNil(nil)")
public DynamicObject defaultExternal(Object nil) {
throw new RaiseException(coreExceptions().argumentError("default external can not be nil", this));
}

@Specialization(guards = { "!isRubyEncoding(encoding)", "!isRubyString(encoding)", "!isNil(encoding)" })
public DynamicObject defaultExternal(VirtualFrame frame, Object encoding) {
if (toStrNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
toStrNode = insert(ToStrNodeGen.create(getContext(), null, null));
}

return defaultExternal(toStrNode.executeToStr(frame, encoding));
}

}

@NonStandard
@CoreMethod(names = "default_internal_jruby=", onSingleton = true, required = 1)
public abstract static class SetDefaultInternalNode extends CoreMethodArrayArgumentsNode {

@Child private ToStrNode toStrNode;

@TruffleBoundary
@Specialization(guards = "isRubyEncoding(encoding)")
public DynamicObject defaultInternal(DynamicObject encoding) {
getContext().getJRubyRuntime().setDefaultInternalEncoding(EncodingOperations.getEncoding(encoding));

return encoding;
}

@TruffleBoundary
@Specialization(guards = "isNil(encoding)")
public DynamicObject defaultInternal(Object encoding) {
getContext().getJRubyRuntime().setDefaultInternalEncoding(null);

return nil();
}

@Specialization(guards = { "!isRubyEncoding(encoding)", "!isNil(encoding)" })
public DynamicObject defaultInternal(VirtualFrame frame, Object encoding) {
if (toStrNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
toStrNode = insert(ToStrNodeGen.create(getContext(), null, null));
}

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

return encodingName;
}

}

@CoreMethod(names = "list", onSingleton = true)
public abstract static class ListNode extends CoreMethodArrayArgumentsNode {

@@ -452,52 +364,6 @@ protected static boolean isDummy(DynamicObject encoding) {
}
}

@NonStandard
@CoreMethod(names = "each_alias", onSingleton = true, visibility = Visibility.PRIVATE, needsBlock = true)
public abstract static class EachAliasNode extends YieldingCoreMethodNode {

@Specialization
public DynamicObject eachAlias(VirtualFrame frame, DynamicObject block) {
CompilerAsserts.neverPartOfCompilation();
for (HashEntry<Entry> entry : EncodingDB.getAliases().entryIterator()) {
final CaseInsensitiveBytesHashEntry<Entry> e = (CaseInsensitiveBytesHashEntry<Entry>) entry;
final ByteList aliasName = new ByteList(e.bytes, e.p, e.end - e.p, USASCIIEncoding.INSTANCE, false);
yield(frame, block, createString(aliasName), entry.value.getIndex());
}
return nil();
}
}

@NonStandard
@CoreMethod(names = "get_default_encoding", onSingleton = true, visibility = Visibility.PRIVATE, required = 1)
public abstract static class GetDefaultEncodingNode extends CoreMethodArrayArgumentsNode {

@Specialization(guards = "isRubyString(name)")
public DynamicObject getDefaultEncoding(DynamicObject name) {
final Encoding encoding = getEncoding(StringOperations.getString(name));
if (encoding == null) {
return nil();
} else {
return getContext().getEncodingManager().getRubyEncoding(encoding);
}
}

@TruffleBoundary
private Encoding getEncoding(String name) {
switch (name) {
case "internal":
return getContext().getJRubyRuntime().getDefaultInternalEncoding();
case "external":
return getContext().getJRubyRuntime().getDefaultExternalEncoding();
case "locale":
case "filesystem":
return getContext().getEncodingManager().getLocaleEncoding();
default:
throw new UnsupportedOperationException();
}
}
}

@CoreMethod(names = { "name", "to_s" })
public abstract static class ToSNode extends CoreMethodArrayArgumentsNode {

Loading