Skip to content

Commit

Permalink
[Truffle] Load Encoding instances eagerly.
Browse files Browse the repository at this point in the history
* It's just so much simpler, especially with concurrency.
* We are already doing it to populate ENCODING_LIST_BY_ENCODING_INDEX eagerly.
  • Loading branch information
eregon committed Sep 20, 2016
1 parent 18b0d01 commit 2e9d367
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 48 deletions.
Expand Up @@ -12,7 +12,6 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.object.dsl.Layout;
import com.oracle.truffle.api.object.dsl.Nullable;
import org.jcodings.Encoding;
import org.jruby.truffle.core.basicobject.BasicObjectLayout;

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

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

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

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

DynamicObject getName(DynamicObject object);

Expand Down
Expand Up @@ -80,8 +80,8 @@ public DynamicObject getRubyEncoding(Encoding encoding) {

@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();
final DynamicObject rubyEncoding = newRubyEncoding(context, encoding, name, p, end, encodingEntry.isDummy());

assert ENCODING_LIST_BY_ENCODING_LIST_INDEX.size() == encodingEntry.getIndex();
ENCODING_LIST_BY_ENCODING_LIST_INDEX.add(rubyEncoding);
Expand Down
Expand Up @@ -12,56 +12,15 @@
*/
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.jruby.truffle.Layouts;
import org.jruby.truffle.core.rope.Rope;
import org.jruby.truffle.core.string.StringOperations;

import com.oracle.truffle.api.object.DynamicObject;

public abstract class EncodingOperations {

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

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

final Rope name = StringOperations.rope(Layouts.ENCODING.getName(rubyEncoding));
encoding = loadEncoding(name);
Layouts.ENCODING.setEncoding(rubyEncoding, encoding);
}

return encoding;
}

@TruffleBoundary
private static EncodingDB.Entry findEncodingEntry(Rope name) {
return EncodingDB.getEncodings().get(name.getBytes(), 0, name.byteLength());
}

@TruffleBoundary
private static EncodingDB.Entry findAliasEntry(Rope name) {
return EncodingDB.getAliases().get(name.getBytes(), 0, name.byteLength());
}

private static EncodingDB.Entry findEncodingOrAliasEntry(Rope name) {
final EncodingDB.Entry e = findEncodingEntry(name);
return e != null ? e : findAliasEntry(name);
}

@TruffleBoundary
private static Encoding loadEncoding(Rope name) {
final EncodingDB.Entry entry = findEncodingOrAliasEntry(name);

if (entry == null) {
return null;
}

return entry.getEncoding();
return Layouts.ENCODING.getEncoding(rubyEncoding);
}

}

0 comments on commit 2e9d367

Please sign in to comment.