From 711086cc3829b86e7f68067c94c1e38ff478f52a Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Thu, 10 Aug 2017 13:58:46 +0200 Subject: [PATCH] Fixed race in RInternalCode. --- .../com/oracle/truffle/r/runtime/RInternalCode.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java index a5287eceb2..2a29784e9d 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RInternalCode.java @@ -44,7 +44,7 @@ public final class RInternalCode { private final String basePackage; private final Source source; - private REnvironment evaluatedEnvironment; + private volatile REnvironment evaluatedEnvironment; private RInternalCode(RContext context, String basePackage, Source source) { this.context = context; @@ -57,7 +57,7 @@ public final class RInternalCode { return Utils.getResourceAsSource(clazz, fileName); } - private REnvironment evaluate() { + private synchronized REnvironment evaluate() { try { RExpression parsedCode = context.getThisEngine().parse(source); REnvironment statsPackage = REnvironment.getRegisteredNamespace(context, basePackage); @@ -72,13 +72,15 @@ public final class RInternalCode { } } - public RFunction lookupFunction(String name) { + public synchronized RFunction lookupFunction(String name) { REnvironment env = this.evaluatedEnvironment; if (env == null) { env = evaluate(); this.evaluatedEnvironment = env; } - return (RFunction) env.get(name); + RFunction fun = (RFunction) env.get(name); + assert fun != null; + return fun; } public static RInternalCode lookup(RContext context, String basePackage, Source source) { -- GitLab