RubyEncoding.java
/*
* Copyright (c) 2014 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 org.jcodings.Encoding;
import org.jcodings.EncodingDB;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.objects.Allocator;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.util.ByteList;
import java.util.HashMap;
import java.util.Map;
/**
* This is a bridge between JRuby encoding and Truffle encoding
*/
public class RubyEncoding extends RubyBasicObject {
private static RubyEncoding[] encodingList = new RubyEncoding[EncodingDB.getEncodings().size()];
private static Map<String, RubyEncoding> lookup = new HashMap<>();
private final Encoding encoding;
private final ByteList name;
private final boolean dummy;
public static synchronized RubyEncoding getEncoding(RubyContext context, Encoding encoding) {
return lookup.get(new String(encoding.getName()).toLowerCase());
}
public static RubyEncoding getEncoding(RubyContext context, String name) {
return lookup.get(name.toLowerCase());
}
public static RubyEncoding getEncoding(int index) {
return encodingList[index];
}
public static void storeEncoding(int encodingListIndex, RubyEncoding encoding) {
encodingList[encodingListIndex] = encoding;
lookup.put(encoding.getName().toString().toLowerCase(), encoding);
}
public static void storeAlias(String aliasName, RubyEncoding encoding) {
lookup.put(aliasName.toLowerCase(), encoding);
}
public static RubyEncoding newEncoding(RubyContext context, Encoding encoding, byte[] name, int p, int end, boolean dummy) {
return new RubyEncoding(context.getCoreLibrary().getEncodingClass(), encoding, new ByteList(name, p, end), dummy);
}
private RubyEncoding(RubyClass encodingClass, Encoding encoding, ByteList name, boolean dummy) {
super(encodingClass);
this.encoding = encoding;
this.name = name;
this.dummy = dummy;
}
public Encoding getEncoding() {
return encoding;
}
public ByteList getName() {
return name;
}
public boolean isDummy() {
return dummy;
}
public static RubyEncoding[] cloneEncodingList() {
final RubyEncoding[] clone = new RubyEncoding[encodingList.length];
System.arraycopy(encodingList, 0, clone, 0, encodingList.length);
return clone;
}
public static class EncodingAllocator implements Allocator {
@Override
public RubyBasicObject allocate(RubyContext context, RubyClass rubyClass, RubyNode currentNode) {
throw new UnsupportedOperationException();
}
}
}