RubyEncoding.java

  1. /*
  2.  * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. This
  3.  * code is released under a tri EPL/GPL/LGPL license. You can use it,
  4.  * redistribute it and/or modify it under the terms of the:
  5.  *
  6.  * Eclipse Public License version 1.0
  7.  * GNU General Public License version 2
  8.  * GNU Lesser General Public License version 2.1
  9.  */
  10. package org.jruby.truffle.runtime.core;

  11. import org.jcodings.Encoding;
  12. import org.jcodings.EncodingDB;
  13. import org.jruby.truffle.nodes.RubyNode;
  14. import org.jruby.truffle.nodes.objects.Allocator;
  15. import org.jruby.truffle.runtime.RubyContext;
  16. import org.jruby.util.ByteList;

  17. import java.util.HashMap;
  18. import java.util.Map;

  19. /**
  20.  * This is a bridge between JRuby encoding and Truffle encoding
  21.  */
  22. public class RubyEncoding extends RubyBasicObject {

  23.     private static RubyEncoding[] encodingList = new RubyEncoding[EncodingDB.getEncodings().size()];
  24.     private static Map<String, RubyEncoding> lookup = new HashMap<>();

  25.     private final Encoding encoding;
  26.     private final ByteList name;
  27.     private final boolean dummy;

  28.     public static synchronized RubyEncoding getEncoding(RubyContext context, Encoding encoding) {
  29.         return lookup.get(new String(encoding.getName()).toLowerCase());
  30.     }

  31.     public static RubyEncoding getEncoding(RubyContext context, String name) {
  32.         return lookup.get(name.toLowerCase());
  33.     }

  34.     public static RubyEncoding getEncoding(int index) {
  35.         return encodingList[index];
  36.     }

  37.     public static void storeEncoding(int encodingListIndex, RubyEncoding encoding) {
  38.         encodingList[encodingListIndex] = encoding;
  39.         lookup.put(encoding.getName().toString().toLowerCase(), encoding);
  40.     }

  41.     public static void storeAlias(String aliasName, RubyEncoding encoding) {
  42.         lookup.put(aliasName.toLowerCase(), encoding);
  43.     }

  44.     public static RubyEncoding newEncoding(RubyContext context, Encoding encoding, byte[] name, int p, int end, boolean dummy) {
  45.         return new RubyEncoding(context.getCoreLibrary().getEncodingClass(), encoding, new ByteList(name, p, end), dummy);
  46.     }

  47.     private RubyEncoding(RubyClass encodingClass, Encoding encoding, ByteList name, boolean dummy) {
  48.         super(encodingClass);
  49.         this.encoding = encoding;
  50.         this.name = name;
  51.         this.dummy = dummy;
  52.     }

  53.     public Encoding getEncoding() {
  54.         return encoding;
  55.     }

  56.     public ByteList getName() {
  57.         return name;
  58.     }

  59.     public boolean isDummy() {
  60.         return dummy;
  61.     }

  62.     public static RubyEncoding[] cloneEncodingList() {
  63.         final RubyEncoding[] clone = new RubyEncoding[encodingList.length];

  64.         System.arraycopy(encodingList, 0, clone, 0, encodingList.length);

  65.         return clone;
  66.     }

  67.     public static class EncodingAllocator implements Allocator {

  68.         @Override
  69.         public RubyBasicObject allocate(RubyContext context, RubyClass rubyClass, RubyNode currentNode) {
  70.             throw new UnsupportedOperationException();
  71.         }

  72.     }

  73. }