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: 2e7a90c72693
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 5955657c2208
Choose a head ref
  • 10 commits
  • 6 files changed
  • 1 contributor

Commits on Sep 20, 2016

  1. Copy the full SHA
    0c9befb View commit details
  2. [Truffle] SuppressWarnings.

    eregon committed Sep 20, 2016
    Copy the full SHA
    f56a908 View commit details
  3. [Truffle] Extract constant.

    eregon committed Sep 20, 2016
    Copy the full SHA
    431a2ac View commit details
  4. Copy the full SHA
    a15d91f View commit details
  5. Copy the full SHA
    b2c98a0 View commit details
  6. Copy the full SHA
    ec34182 View commit details
  7. Copy the full SHA
    8b5b5d9 View commit details
  8. Copy the full SHA
    69b814f View commit details
  9. 2
    Copy the full SHA
    d50342c View commit details
  10. [Truffle] Reorder and add boundary.

    * The index check needs it.
    eregon committed Sep 20, 2016
    Copy the full SHA
    5955657 View commit details
Original file line number Diff line number Diff line change
@@ -12,11 +12,11 @@
*/
package org.jruby.truffle.core.encoding;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.object.DynamicObject;
import org.jcodings.Encoding;
import org.jcodings.EncodingDB;
import org.jcodings.EncodingDB.Entry;
import org.jcodings.specific.ISO8859_16Encoding;
import org.jcodings.specific.USASCIIEncoding;
import org.jruby.truffle.Layouts;
@@ -27,19 +27,20 @@
import org.jruby.util.encoding.ISO_8859_16;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class EncodingManager {

private final List<DynamicObject> ENCODING_LIST_BY_ENCODING_LIST_INDEX = new ArrayList<DynamicObject>(EncodingDB.getEncodings().size());
private final Map<Integer, DynamicObject> ENCODING_LIST_BY_ENCODING_INDEX = new HashMap<Integer,DynamicObject>(EncodingDB.getEncodings().size());
private final Map<String, DynamicObject> LOOKUP = new HashMap<>();
private static final int INITIAL_NUMBER_OF_ENCODINGS = EncodingDB.getEncodings().size();

private final List<DynamicObject> ENCODING_LIST_BY_ENCODING_LIST_INDEX = new ArrayList<DynamicObject>(INITIAL_NUMBER_OF_ENCODINGS);
private final List<DynamicObject> ENCODING_LIST_BY_ENCODING_INDEX = new ArrayList<DynamicObject>(INITIAL_NUMBER_OF_ENCODINGS);
private final Map<String, DynamicObject> LOOKUP = new ConcurrentHashMap<>();

private final RubyContext context;

@@ -48,7 +49,7 @@ public EncodingManager(RubyContext context) {
}

@TruffleBoundary
public static DynamicObject newRubyEncoding(RubyContext context, Encoding encoding, byte[] name, int p, int end, boolean dummy) {
private static DynamicObject newRubyEncoding(RubyContext context, Encoding encoding, byte[] name, int p, int end, boolean dummy) {
// TODO (nirvdrum 21-Jun-16): We probably don't need to create a ByteList and two Ropes. Without any guarantees on the code range of the encoding name, however, we must be conservative.
final Rope rope = StringOperations.ropeFromByteList(new ByteList(name, p, end, USASCIIEncoding.INSTANCE, false));
final Rope cachedRope = context.getRopeTable().getRope(rope.getBytes(), rope.getEncoding(), rope.getCodeRange());
@@ -57,23 +58,8 @@ public static DynamicObject newRubyEncoding(RubyContext context, Encoding encodi
return Layouts.ENCODING.createEncoding(context.getCoreLibrary().getEncodingFactory(), encoding, string, dummy);
}

public List<DynamicObject> getUnsafeEncodingList() {
return ENCODING_LIST_BY_ENCODING_LIST_INDEX;
}

@TruffleBoundary
public DynamicObject getRubyEncoding(Encoding encoding) {
DynamicObject rubyEncoding = ENCODING_LIST_BY_ENCODING_INDEX.get(encoding.getIndex());

if (rubyEncoding == null) {
// Bounded by the number of encodings
CompilerDirectives.transferToInterpreterAndInvalidate();

rubyEncoding = LOOKUP.get(new String(encoding.getName(), StandardCharsets.UTF_8).toLowerCase(Locale.ENGLISH));
ENCODING_LIST_BY_ENCODING_INDEX.put(encoding.getIndex(),rubyEncoding);
}

return rubyEncoding;
public Object[] getEncodingList() {
return new ArrayList<>(ENCODING_LIST_BY_ENCODING_LIST_INDEX).toArray();
}

@TruffleBoundary
@@ -87,12 +73,23 @@ public DynamicObject getRubyEncoding(int encodingListIndex) {
}

@TruffleBoundary
public void defineEncoding(EncodingDB.Entry encodingEntry, byte[] name, int p, int end) {
public DynamicObject getRubyEncoding(Encoding encoding) {
return ENCODING_LIST_BY_ENCODING_INDEX.get(encoding.getIndex());
}

@TruffleBoundary
public synchronized DynamicObject defineEncoding(EncodingDB.Entry encodingEntry, byte[] name, int p, int end) {
final DynamicObject rubyEncoding = newRubyEncoding(context, null, name, p, end, encodingEntry.isDummy());
final Encoding encoding = encodingEntry.getEncoding();

assert ENCODING_LIST_BY_ENCODING_LIST_INDEX.size() == encodingEntry.getIndex();
ENCODING_LIST_BY_ENCODING_LIST_INDEX.add(encodingEntry.getIndex(), rubyEncoding);
ENCODING_LIST_BY_ENCODING_LIST_INDEX.add(rubyEncoding);
while (encoding.getIndex() >= ENCODING_LIST_BY_ENCODING_INDEX.size()) {
ENCODING_LIST_BY_ENCODING_INDEX.add(null);
}
ENCODING_LIST_BY_ENCODING_INDEX.set(encoding.getIndex(), rubyEncoding);
LOOKUP.put(Layouts.ENCODING.getName(rubyEncoding).toString().toLowerCase(Locale.ENGLISH), rubyEncoding);
return rubyEncoding;
}

@TruffleBoundary
@@ -102,6 +99,17 @@ public void defineAlias(int encodingListIndex, String name) {
LOOKUP.put(name.toLowerCase(Locale.ENGLISH), rubyEncoding);
}

public synchronized DynamicObject replicateEncoding(Encoding encoding, String name) {
if (getRubyEncoding(name) != null) {
return null;
}

EncodingDB.replicate(name, new String(encoding.getName()));
byte[] nameBytes = name.getBytes();
final Entry entry = EncodingDB.getEncodings().get(nameBytes);
return defineEncoding(entry, nameBytes, 0, nameBytes.length);
}

@TruffleBoundary
public Encoding getLocaleEncoding() {
return context.getJRubyRuntime().getEncodingService().getLocaleEncoding();
Original file line number Diff line number Diff line change
@@ -415,12 +415,8 @@ public abstract static class ListNode extends CoreMethodArrayArgumentsNode {
@TruffleBoundary
@Specialization
public DynamicObject list() {
final List<DynamicObject> encodingsList = getContext().getEncodingManager().getUnsafeEncodingList();

final Object[] arrayStore = new Object[encodingsList.size()];
getContext().getEncodingManager().getUnsafeEncodingList().toArray(arrayStore);

return createArray(arrayStore, arrayStore.length);
final Object[] encodingsList = getContext().getEncodingManager().getEncodingList();
return createArray(encodingsList, encodingsList.length);
}
}

@@ -563,18 +559,17 @@ public DynamicObject encodingGetObjectEncodingNil(DynamicObject object) {
@Primitive(name = "encoding_replicate")
public static abstract class EncodingReplicateNode extends PrimitiveArrayArgumentsNode {

@Specialization(guards = "isRubyString(name)")
public DynamicObject encodingReplicate(VirtualFrame frame, DynamicObject self, DynamicObject name, @Cached("new()") SnippetNode snippetNode) {
final String nameString = StringOperations.getString(name);
final DynamicObject existing = getContext().getEncodingManager().getRubyEncoding(nameString);
if (existing != null) {
throw new RaiseException(coreExceptions().argumentErrorEncodingAlreadyRegistered(nameString, this));
@Specialization(guards = "isRubyString(nameObject)")
public DynamicObject encodingReplicate(VirtualFrame frame, DynamicObject self, DynamicObject nameObject, @Cached("new()") SnippetNode snippetNode) {
final String name = StringOperations.getString(nameObject);
final Encoding encoding = EncodingOperations.getEncoding(self);

final DynamicObject newEncoding = getContext().getEncodingManager().replicateEncoding(encoding, name);
if (newEncoding == null) {
throw new RaiseException(coreExceptions().argumentErrorEncodingAlreadyRegistered(name, this));
}
final Encoding base = EncodingOperations.getEncoding(self);
EncodingDB.replicate(nameString, new String(base.getName()));
final Entry entry = EncodingDB.getEncodings().get(nameString.getBytes());
getContext().getEncodingManager().defineEncoding(entry, nameString.getBytes(), 0, nameString.getBytes().length);
final DynamicObject newEncoding = getContext().getEncodingManager().getRubyEncoding(nameString.toLowerCase(Locale.ENGLISH));

final Entry entry = EncodingDB.getEncodings().get(name.getBytes());
snippetNode.execute(frame, "Encoding::EncodingMap[enc.name.upcase.to_sym] = [nil, index]", "enc", newEncoding, "index", entry.getIndex());
return newEncoding;
}
Original file line number Diff line number Diff line change
@@ -79,7 +79,7 @@ public byte[] format(int width, int precision, long arg) {

final char fchar = this.getFormatCharacter();
final boolean sign = this.getSign(fchar);
final int base = this.getBase(fchar);
final int base = getBase(fchar);
final boolean zero = arg == 0;
final boolean negative = arg < 0;

@@ -101,7 +101,7 @@ public byte[] format(int width, int precision, DynamicObject value) {
final boolean zero = bigInteger.equals(BigInteger.ZERO);
final char fchar = this.getFormatCharacter();
final boolean sign = this.getSign(fchar);
final int base = this.getBase(fchar);
final int base = getBase(fchar);

final byte[] bytes;
if (negative && fchar == 'u') {
Original file line number Diff line number Diff line change
@@ -168,6 +168,6 @@ public class Options {

// Other tools

public static boolean CHAOS = TRUFFLE_CHAOS.load();
public boolean CHAOS = TRUFFLE_CHAOS.load();

}
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@

import org.jruby.truffle.platform.signal.Signal;

@SuppressWarnings("restriction")
public class SunMiscSignal implements Signal {

private final sun.misc.Signal sunMiscSignal;
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@SuppressWarnings("restriction")
public class SunMiscSignalManager implements SignalManager {

private final ConcurrentMap<sun.misc.Signal, sun.misc.SignalHandler> DEFAULT_HANDLERS = new ConcurrentHashMap<>();