Skip to content

Commit 6e7eb99

Browse files
committed
Use the parse cache for Kernel#load(wrap=false)
* Refactor to avoid duplication.
1 parent 7fbb0ec commit 6e7eb99

File tree

5 files changed

+44
-45
lines changed

5 files changed

+44
-45
lines changed

src/main/java/org/truffleruby/RubyContext.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public class RubyContext {
111111

112112
private final SafepointManager safepointManager;
113113
private final InteropManager interopManager = new InteropManager(this);
114-
private final CodeLoader codeLoader = new CodeLoader(this);
114+
private final CodeLoader codeLoader;
115115
private final FeatureLoader featureLoader;
116116
private final TraceManager traceManager;
117117
private final ReferenceProcessor referenceProcessor;
@@ -177,6 +177,7 @@ public RubyContext(RubyLanguage language, TruffleLanguage.Env env) {
177177
coreExceptions = new CoreExceptions(this, language);
178178
encodingManager = new EncodingManager(this, language);
179179

180+
codeLoader = new CodeLoader(language, this);
180181
featureLoader = new FeatureLoader(this, language);
181182
referenceProcessor = new ReferenceProcessor(this);
182183
finalizationService = new FinalizationService(this, referenceProcessor);

src/main/java/org/truffleruby/core/CoreLibrary.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
import org.truffleruby.language.methods.SharedMethodInfo;
6666
import org.truffleruby.language.objects.SingletonClassNode;
6767
import org.truffleruby.parser.ParserContext;
68-
import org.truffleruby.parser.ParsingParameters;
6968
import org.truffleruby.parser.TranslatorDriver;
7069
import org.truffleruby.parser.ast.RootParseNode;
7170
import org.truffleruby.platform.NativeConfiguration;
@@ -756,28 +755,18 @@ public void loadRubyCoreLibraryAndPostBoot() {
756755
state = State.LOADING_RUBY_CORE;
757756

758757
try {
759-
for (int n = 0; n < CORE_FILES.length; n++) {
760-
final String file = CORE_FILES[n];
758+
for (String file : CORE_FILES) {
761759
if (file == POST_BOOT_FILE) {
762760
afterLoadCoreLibrary();
763761
state = State.LOADED;
764762
}
765763

766764
final Pair<Source, Rope> sourceRopePair = loadCoreFileSource(language.coreLoadPath + file);
767765
final Source source = sourceRopePair.getLeft();
768-
language.parsingRequestParams.set(new ParsingParameters(
769-
node,
770-
sourceRopePair.getRight(),
771-
source));
772-
final RootCallTarget rootCallTarget;
773-
try {
774-
rootCallTarget = (RootCallTarget) context.getEnv().parseInternal(source);
775-
} finally {
776-
language.parsingRequestParams.set(null);
777-
}
766+
final RootCallTarget callTarget = context.getCodeLoader().parseTopLevelWithCache(sourceRopePair, node);
778767

779768
final CodeLoader.DeferredCall deferredCall = context.getCodeLoader().prepareExecute(
780-
rootCallTarget,
769+
callTarget,
781770
ParserContext.TOP_LEVEL,
782771
DeclarationContext.topLevel(context),
783772
null,

src/main/java/org/truffleruby/core/kernel/TruffleKernelNodes.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -102,35 +102,35 @@ protected boolean load(Object file, boolean wrap,
102102
@CachedLibrary(limit = "2") RubyStringLibrary strings,
103103
@Cached IndirectCallNode callNode) {
104104
final String feature = strings.getJavaString(file);
105-
final RubySource source;
105+
final Pair<Source, Rope> sourceRopePair;
106106
try {
107107
final FileLoader fileLoader = new FileLoader(getContext(), getLanguage());
108-
final Pair<Source, Rope> sourceRopePair = fileLoader.loadFile(feature);
109-
source = new RubySource(sourceRopePair.getLeft(), feature, sourceRopePair.getRight());
108+
sourceRopePair = fileLoader.loadFile(feature);
110109
} catch (IOException e) {
111110
throw new RaiseException(getContext(), coreExceptions().loadErrorCannotLoad(feature, this));
112111
}
113112

114-
final RubyModule wrapModule;
115-
if (wrap) {
116-
wrapModule = ModuleNodes
117-
.createModule(getContext(), null, coreLibrary().moduleClass, null, null, this);
118-
} else {
119-
wrapModule = null;
120-
}
121-
122-
final RootCallTarget callTarget = getContext()
123-
.getCodeLoader()
124-
.parse(source, ParserContext.TOP_LEVEL, null, wrapModule, true, this);
125-
126113
final RubyBasicObject mainObject = getContext().getCoreLibrary().mainObject;
114+
115+
final RootCallTarget callTarget;
127116
final DeclarationContext declarationContext;
128117
final Object self;
118+
if (!wrap) {
119+
callTarget = getContext().getCodeLoader().parseTopLevelWithCache(sourceRopePair, this);
129120

130-
if (wrapModule == null) {
131121
declarationContext = DeclarationContext.topLevel(getContext());
132122
self = mainObject;
133123
} else {
124+
final RubyModule wrapModule = ModuleNodes
125+
.createModule(getContext(), null, coreLibrary().moduleClass, null, null, this);
126+
final RubySource rubySource = new RubySource(
127+
sourceRopePair.getLeft(),
128+
feature,
129+
sourceRopePair.getRight());
130+
callTarget = getContext()
131+
.getCodeLoader()
132+
.parse(rubySource, ParserContext.TOP_LEVEL, null, wrapModule, true, this);
133+
134134
declarationContext = DeclarationContext.topLevel(wrapModule);
135135
self = DispatchNode.getUncached().call(mainObject, "clone");
136136
DispatchNode.getUncached().call(self, "extend", wrapModule);

src/main/java/org/truffleruby/language/loader/CodeLoader.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@
99
*/
1010
package org.truffleruby.language.loader;
1111

12+
import com.oracle.truffle.api.source.Source;
13+
import org.graalvm.collections.Pair;
1214
import org.truffleruby.RubyContext;
15+
import org.truffleruby.RubyLanguage;
1316
import org.truffleruby.core.module.RubyModule;
17+
import org.truffleruby.core.rope.Rope;
1418
import org.truffleruby.language.LexicalScope;
1519
import org.truffleruby.language.Nil;
1620
import org.truffleruby.language.RubyNode;
@@ -20,6 +24,7 @@
2024
import org.truffleruby.language.methods.DeclarationContext;
2125
import org.truffleruby.language.methods.InternalMethod;
2226
import org.truffleruby.parser.ParserContext;
27+
import org.truffleruby.parser.ParsingParameters;
2328
import org.truffleruby.parser.RubySource;
2429
import org.truffleruby.parser.TranslatorDriver;
2530

@@ -31,12 +36,27 @@
3136

3237
public class CodeLoader {
3338

39+
private final RubyLanguage language;
3440
private final RubyContext context;
3541

36-
public CodeLoader(RubyContext context) {
42+
public CodeLoader(RubyLanguage language, RubyContext context) {
43+
this.language = language;
3744
this.context = context;
3845
}
3946

47+
@TruffleBoundary
48+
public RootCallTarget parseTopLevelWithCache(Pair<Source, Rope> sourceRopePair, Node currentNode) {
49+
final Source source = sourceRopePair.getLeft();
50+
final Rope rope = sourceRopePair.getRight();
51+
52+
language.parsingRequestParams.set(new ParsingParameters(currentNode, rope, source));
53+
try {
54+
return (RootCallTarget) context.getEnv().parseInternal(source);
55+
} finally {
56+
language.parsingRequestParams.set(null);
57+
}
58+
}
59+
4060
@TruffleBoundary
4161
public RootCallTarget parse(RubySource source,
4262
ParserContext parserContext,

src/main/java/org/truffleruby/language/loader/RequireNode.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import org.truffleruby.language.methods.DeclarationContext;
3939
import org.truffleruby.language.methods.TranslateExceptionNode;
4040
import org.truffleruby.parser.ParserContext;
41-
import org.truffleruby.parser.ParsingParameters;
4241
import org.truffleruby.shared.Metrics;
4342

4443
import com.oracle.truffle.api.CompilerDirectives;
@@ -221,20 +220,10 @@ private boolean parseAndCall(String feature, String expandedPath) {
221220
return false;
222221
}
223222

224-
final Source source = sourceRopePair.getLeft();
225-
getLanguage().parsingRequestParams.set(new ParsingParameters(
226-
this,
227-
sourceRopePair.getRight(),
228-
source));
229-
final RootCallTarget rootCallTarget;
230-
try {
231-
rootCallTarget = (RootCallTarget) getContext().getEnv().parseInternal(source);
232-
} finally {
233-
getLanguage().parsingRequestParams.set(null);
234-
}
223+
final RootCallTarget callTarget = getContext().getCodeLoader().parseTopLevelWithCache(sourceRopePair, this);
235224

236225
final CodeLoader.DeferredCall deferredCall = getContext().getCodeLoader().prepareExecute(
237-
rootCallTarget,
226+
callTarget,
238227
ParserContext.TOP_LEVEL,
239228
DeclarationContext.topLevel(getContext()),
240229
null,

0 commit comments

Comments
 (0)