Skip to content

Commit 8e43efb

Browse files
committed
[GR-15990] Use index to get Encoding literal value at runtime
PullRequest: truffleruby/2007
2 parents d0c3803 + d6e5e53 commit 8e43efb

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

src/main/java/org/truffleruby/core/encoding/EncodingManager.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public class EncodingManager {
5151
private static final int INITIAL_NUMBER_OF_ENCODINGS = EncodingDB.getEncodings().size();
5252

5353
private final List<RubyEncoding> ENCODING_LIST_BY_ENCODING_INDEX = new ArrayList<>(INITIAL_NUMBER_OF_ENCODINGS);
54+
@CompilationFinal(dimensions = 1) private final RubyEncoding[] BUILT_IN_ENCODINGS = //
55+
new RubyEncoding[INITIAL_NUMBER_OF_ENCODINGS];
5456
private final Map<String, RubyEncoding> LOOKUP = new ConcurrentHashMap<>();
5557

5658
private final RubyContext context;
@@ -79,7 +81,7 @@ private void initializeEncodings(RubyClass encodingClass) {
7981
final CaseInsensitiveBytesHashEntry<EncodingDB.Entry> e = hei.next();
8082
final EncodingDB.Entry encodingEntry = e.value;
8183
final RubyEncoding rubyEncoding = defineEncoding(encodingEntry, e.bytes, e.p, e.end);
82-
84+
BUILT_IN_ENCODINGS[encodingEntry.getEncoding().getIndex()] = rubyEncoding;
8385
for (String constName : EncodingUtils.encodingNames(e.bytes, e.p, e.end)) {
8486
encodingClass.fields.setConstant(context, null, constName, rubyEncoding);
8587
}
@@ -318,4 +320,9 @@ public void setDefaultInternalEncoding(Encoding defaultInternalEncoding) {
318320
public Encoding getDefaultInternalEncoding() {
319321
return defaultInternalEncoding;
320322
}
323+
324+
public RubyEncoding getBuiltInEncoding(int index) {
325+
return BUILT_IN_ENCODINGS[index];
326+
}
327+
321328
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright (c) 2020 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 2.0, or
7+
* GNU General Public License version 2, or
8+
* GNU Lesser General Public License version 2.1.
9+
*/
10+
package org.truffleruby.language.literal;
11+
12+
import com.oracle.truffle.api.frame.VirtualFrame;
13+
import org.truffleruby.language.RubyContextSourceNode;
14+
15+
public class EncodingLiteralNode extends RubyContextSourceNode {
16+
17+
private final int index;
18+
19+
public EncodingLiteralNode(int index) {
20+
this.index = index;
21+
}
22+
23+
@Override
24+
public Object execute(VirtualFrame frame) {
25+
return getContext().getEncodingManager().getBuiltInEncoding(index);
26+
}
27+
28+
}

src/main/java/org/truffleruby/parser/BodyTranslator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
import org.truffleruby.language.globals.ReadMatchReferenceNodes;
112112
import org.truffleruby.language.globals.WriteGlobalVariableNodeGen;
113113
import org.truffleruby.language.literal.BooleanLiteralNode;
114+
import org.truffleruby.language.literal.EncodingLiteralNode;
114115
import org.truffleruby.language.literal.FloatLiteralNode;
115116
import org.truffleruby.language.literal.IntegerFixnumLiteralNode;
116117
import org.truffleruby.language.literal.LongFixnumLiteralNode;
@@ -1308,7 +1309,7 @@ public RubyNode visitDotNode(DotParseNode node) {
13081309
@Override
13091310
public RubyNode visitEncodingNode(EncodingParseNode node) {
13101311
SourceIndexLength sourceSection = node.getPosition();
1311-
final RubyNode ret = new ObjectLiteralNode(context.getEncodingManager().getRubyEncoding(node.getEncoding()));
1312+
final RubyNode ret = new EncodingLiteralNode(node.getEncoding().getIndex());
13121313
ret.unsafeSetSourceSection(sourceSection);
13131314
return addNewlineIfNeeded(node, ret);
13141315
}

0 commit comments

Comments
 (0)