From 4270163f8d3650c2ff1b67ead8c04c0776c35637 Mon Sep 17 00:00:00 2001
From: Michael Haupt <michael.haupt@oracle.com>
Date: Tue, 28 Jan 2014 11:34:12 +0100
Subject: [PATCH] make RContext instantiation more safe (private constructor,
 safety check)

---
 .../src/com/oracle/truffle/r/engine/REngine.java      |  3 +--
 .../src/com/oracle/truffle/r/runtime/RContext.java    | 11 +++++++++--
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
index 73345654c9..114953b6d8 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
@@ -51,9 +51,8 @@ public final class REngine {
 
     private REngine(String[] commandArgs, ConsoleHandler consoleHandler) {
         RDefaultPackages defaultPackages = RDefaultPackages.getInstance();
-        this.context = new RContext(defaultPackages, commandArgs, consoleHandler);
+        this.context = RContext.instantiate(defaultPackages, commandArgs, consoleHandler);
         defaultPackages.load(context);
-
     }
 
     /**
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java
index 88f6b4cca6..dd5d71c1db 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java
@@ -99,13 +99,20 @@ public final class RContext {
         return singleton;
     }
 
-    public RContext(RBuiltinLookup lookup, String[] commandArgs, ConsoleHandler consoleHandler) {
+    public static RContext instantiate(RBuiltinLookup lookup, String[] commandArgs, ConsoleHandler consoleHandler) {
+        if (singleton != null) {
+            throw new IllegalStateException("RContext already instantiated.");
+        }
+        singleton = new RContext(lookup, commandArgs, consoleHandler);
+        return singleton;
+    }
+
+    private RContext(RBuiltinLookup lookup, String[] commandArgs, ConsoleHandler consoleHandler) {
         this.sourceManager = new SourceManager();
         this.lookup = lookup;
         this.commandArgs = commandArgs;
         this.consoleHandler = consoleHandler;
         this.evalWarnings = null;
-        singleton = this;
     }
 
     public RBuiltinLookup getLookup() {
-- 
GitLab