Cache the compiled code per class, not globally
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Mon, 10 Dec 2012 12:03:22 +0100
changeset 297a20721a10717
parent 296 fbf8eb98a8ef
child 306 f36b3c273de6
Cache the compiled code per class, not globally
vm/src/test/java/org/apidesign/vm4brwsr/CompareVMs.java
     1.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/CompareVMs.java	Mon Dec 10 11:26:32 2012 +0100
     1.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/CompareVMs.java	Mon Dec 10 12:03:22 2012 +0100
     1.3 @@ -18,6 +18,8 @@
     1.4  package org.apidesign.vm4brwsr;
     1.5  
     1.6  import java.lang.reflect.Method;
     1.7 +import java.util.Map;
     1.8 +import java.util.WeakHashMap;
     1.9  import javax.script.Invocable;
    1.10  import javax.script.ScriptEngine;
    1.11  import javax.script.ScriptEngineManager;
    1.12 @@ -85,16 +87,20 @@
    1.13          private final Method m;
    1.14          private final boolean js;
    1.15          Object value;
    1.16 -        private static Invocable code;
    1.17 -        private static CharSequence codeSeq;
    1.18 +        private Invocable code;
    1.19 +        private CharSequence codeSeq;
    1.20 +        private static final Map<Class,Object[]> compiled = new WeakHashMap<Class,Object[]>();
    1.21  
    1.22          private Run(Method m, boolean js) {
    1.23              this.m = m;
    1.24              this.js = js;
    1.25          }
    1.26  
    1.27 -        private static void compileTheCode(Class<?> clazz) throws Exception {
    1.28 -            if (code != null) {
    1.29 +        private void compileTheCode(Class<?> clazz) throws Exception {
    1.30 +            final Object[] data = compiled.get(clazz);
    1.31 +            if (data != null) {
    1.32 +                code = (Invocable) data[0];
    1.33 +                codeSeq = (CharSequence) data[1];
    1.34                  return;
    1.35              }
    1.36              StringBuilder sb = new StringBuilder();
    1.37 @@ -123,6 +129,7 @@
    1.38              Assert.assertTrue(js instanceof Invocable, "It is invocable object: " + res);
    1.39              code = (Invocable) js;
    1.40              codeSeq = sb;
    1.41 +            compiled.put(clazz, new Object[] { code, codeSeq });
    1.42          }
    1.43  
    1.44          @Test(groups = "run") public void executeCode() throws Throwable {