Skip to content

Commit da97e4b

Browse files
committed
faster loading wip
1 parent 43fbb49 commit da97e4b

File tree

4 files changed

+152
-126
lines changed

4 files changed

+152
-126
lines changed

src/clj/clojure/core.clj

+1-1
Original file line numberDiff line numberDiff line change
@@ -6272,9 +6272,9 @@
62726272
(load "genclass")
62736273
(load "core_deftype")
62746274
(load "core/protocols")
6275-
(load "gvec")
62766275
(load "instant")
62776276
(load "uuid")
6277+
(load "gvec")
62786278

62796279
(defn reduce
62806280
"f should be a function of 2 arguments. If val is not supplied,

src/jvm/clojure/lang/Compiler.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ public Object eval() {
413413
if(initProvided)
414414
{
415415
// if(init instanceof FnExpr && ((FnExpr) init).closes.count()==0)
416-
// var.bindRoot(new FnLoaderThunk((FnExpr) init,var));
416+
// var.bindRoot(new FnLoaderThunk(var, ((FnExpr) init).getCompiledClass().getName().replace('/','.')));
417417
// else
418418
var.bindRoot(init.eval());
419419
}
@@ -436,6 +436,10 @@ public Object eval() {
436436

437437
public void emit(C context, ObjExpr objx, GeneratorAdapter gen){
438438
objx.emitVar(gen, var);
439+
// gen.push(var.ns.name.toString());
440+
// gen.push(var.sym.toString());
441+
// gen.invokeStatic(RT_TYPE, Method.getMethod("clojure.lang.Var var(String,String)"));
442+
439443
if(isDynamic)
440444
{
441445
gen.push(isDynamic);
@@ -491,6 +495,7 @@ else if(!(RT.second(form) instanceof Symbol))
491495
throw Util.runtimeException("First argument to def must be a Symbol");
492496
Symbol sym = (Symbol) RT.second(form);
493497
Var v = lookupVar(sym, true);
498+
//Var v = lookupVar(sym, true, true, false);
494499
if(v == null)
495500
throw Util.runtimeException("Can't refer to qualified var that doesn't exist");
496501
if(!v.ns.equals(currentNS()))
@@ -7004,7 +7009,7 @@ else if(sym.equals(IN_NS))
70047009
}
70057010

70067011

7007-
static Var lookupVar(Symbol sym, boolean internNew, boolean registerMacro) {
7012+
static Var lookupVar(Symbol sym, boolean internNew, boolean registerMacro, boolean registerVar) {
70087013
Var var = null;
70097014

70107015
//note - ns-qualified vars in other namespaces must already exist
@@ -7043,10 +7048,15 @@ else if(o instanceof Var)
70437048
throw Util.runtimeException("Expecting var, but " + sym + " is mapped to " + o);
70447049
}
70457050
}
7046-
if(var != null && (!var.isMacro() || registerMacro))
7051+
if(registerVar && var != null && (!var.isMacro() || registerMacro))
70477052
registerVar(var);
70487053
return var;
70497054
}
7055+
7056+
static Var lookupVar(Symbol sym, boolean internNew, boolean registerMacro) {
7057+
return lookupVar(sym, internNew, registerMacro, true);
7058+
}
7059+
70507060
static Var lookupVar(Symbol sym, boolean internNew) {
70517061
return lookupVar(sym, internNew, true);
70527062
}

src/jvm/clojure/lang/Namespace.java

+34-26
Original file line numberDiff line numberDiff line change
@@ -175,37 +175,45 @@ public Var refer(Symbol sym, Var var){
175175

176176
public boolean initWith(Namespace ns){
177177
// System.out.println("initWith: " + name + ", " + ns.name);
178+
178179
synchronized(lock){
179-
IPersistentMap ms = ns.mappings.get();
180-
if(ms == lastCore)
180+
IPersistentMap ms = ns.mappings.get();
181+
IPersistentMap tm = mappings.get();
182+
IPersistentMap dimp = RT.DEFAULT_IMPORTS;
183+
if(lastCore != ms)
184+
{
185+
// System.out.println("initWith REMERGE: " + name + ", " + ns.name + ", " + ms.count() + ", " +
186+
// (lastCore == null?0:lastCore.count()));
187+
188+
IPersistentMap merge = (lastMerge != null)?lastMerge:dimp;
189+
for(Object o : ms)
181190
{
182-
// System.out.println("initWith reuse: " + name + ", " + ns.name);
183-
return mappings.compareAndSet(RT.DEFAULT_IMPORTS,lastMerge);
191+
Map.Entry e = (Map.Entry) o;
192+
Symbol s = (Symbol) e.getKey();
193+
Var v = (e.getValue() instanceof Var) ? (Var) e.getValue() : null;
194+
if(v != null && v.ns == ns && v.isPublic() && merge.valAt(s) != v)
195+
merge = merge.assoc(s,v);
184196
}
185-
// System.out.println("initWith no reuse: " + name + ", " + ns.name);
186-
IPersistentMap tm = mappings.get();
187-
if(mappings.get() == RT.DEFAULT_IMPORTS)
197+
lastCore = ms;
198+
lastMerge = merge;
199+
}
200+
if(tm == dimp)
201+
{
202+
// System.out.println("initWith REUSE: " + name + ", " + ns.name);
203+
return mappings.compareAndSet(tm,lastMerge);
204+
}
205+
else
206+
{
207+
// System.out.println("initWith ADD: " + name + ", " + ns.name);
208+
IPersistentMap m = lastMerge;
209+
for(Object o : tm)
188210
{
189-
for(Object o : ms)
190-
{
191-
Map.Entry<Object,Object> e = (Map.Entry<Object, Object>) o;
192-
193-
Symbol s = (Symbol) e.getKey();
194-
Var v = (e.getValue() instanceof Var) ? (Var) e.getValue() :null;
195-
if(v != null && v.ns == ns && v.isPublic())
196-
{
197-
// System.out.println("refer: " + s);
198-
tm = tm.assoc(s, v);
199-
}
200-
// else
201-
// System.out.println("not refer: " + s);
202-
}
203-
IPersistentMap m = tm;
204-
lastCore = ms;
205-
lastMerge = m;
206-
return mappings.compareAndSet(RT.DEFAULT_IMPORTS,m);
211+
Map.Entry e = (Map.Entry) o;
212+
if(m.valAt(e.getKey()) != e.getValue())
213+
m = m.assoc(e.getKey(),e.getValue());
207214
}
208-
return false;
215+
return mappings.compareAndSet(tm,m);
216+
}
209217
}
210218
}
211219

src/jvm/clojure/lang/RT.java

+104-96
Original file line numberDiff line numberDiff line change
@@ -50,102 +50,102 @@ public class RT{
5050
// Symbol.intern("IPersistentMap"), "clojure.lang.IPersistentMap",
5151
// Symbol.intern("IPersistentList"), "clojure.lang.IPersistentList",
5252
// Symbol.intern("IPersistentVector"), "clojure.lang.IPersistentVector",
53-
Symbol.intern("Boolean"), Boolean.class,
54-
Symbol.intern("Byte"), Byte.class,
55-
Symbol.intern("Character"), Character.class,
56-
Symbol.intern("Class"), Class.class,
57-
Symbol.intern("ClassLoader"), ClassLoader.class,
58-
Symbol.intern("Compiler"), Compiler.class,
59-
Symbol.intern("Double"), Double.class,
60-
Symbol.intern("Enum"), Enum.class,
61-
Symbol.intern("Float"), Float.class,
62-
Symbol.intern("InheritableThreadLocal"), InheritableThreadLocal.class,
63-
Symbol.intern("Integer"), Integer.class,
64-
Symbol.intern("Long"), Long.class,
65-
Symbol.intern("Math"), Math.class,
66-
Symbol.intern("Number"), Number.class,
67-
Symbol.intern("Object"), Object.class,
68-
Symbol.intern("Package"), Package.class,
69-
Symbol.intern("Process"), Process.class,
70-
Symbol.intern("ProcessBuilder"), ProcessBuilder.class,
71-
Symbol.intern("Runtime"), Runtime.class,
72-
Symbol.intern("RuntimePermission"), RuntimePermission.class,
73-
Symbol.intern("SecurityManager"), SecurityManager.class,
74-
Symbol.intern("Short"), Short.class,
75-
Symbol.intern("StackTraceElement"), StackTraceElement.class,
76-
Symbol.intern("StrictMath"), StrictMath.class,
77-
Symbol.intern("String"), String.class,
78-
Symbol.intern("StringBuffer"), StringBuffer.class,
79-
Symbol.intern("StringBuilder"), StringBuilder.class,
80-
Symbol.intern("System"), System.class,
81-
Symbol.intern("Thread"), Thread.class,
82-
Symbol.intern("ThreadGroup"), ThreadGroup.class,
83-
Symbol.intern("ThreadLocal"), ThreadLocal.class,
84-
Symbol.intern("Throwable"), Throwable.class,
85-
Symbol.intern("Void"), Void.class,
86-
Symbol.intern("Appendable"), Appendable.class,
87-
Symbol.intern("CharSequence"), CharSequence.class,
88-
Symbol.intern("Cloneable"), Cloneable.class,
89-
Symbol.intern("Comparable"), Comparable.class,
90-
Symbol.intern("Iterable"), Iterable.class,
91-
Symbol.intern("Readable"), Readable.class,
92-
Symbol.intern("Runnable"), Runnable.class,
93-
Symbol.intern("Callable"), Callable.class,
94-
Symbol.intern("BigInteger"), BigInteger.class,
95-
Symbol.intern("BigDecimal"), BigDecimal.class,
96-
Symbol.intern("ArithmeticException"), ArithmeticException.class,
97-
Symbol.intern("ArrayIndexOutOfBoundsException"), ArrayIndexOutOfBoundsException.class,
98-
Symbol.intern("ArrayStoreException"), ArrayStoreException.class,
99-
Symbol.intern("ClassCastException"), ClassCastException.class,
100-
Symbol.intern("ClassNotFoundException"), ClassNotFoundException.class,
101-
Symbol.intern("CloneNotSupportedException"), CloneNotSupportedException.class,
102-
Symbol.intern("EnumConstantNotPresentException"), EnumConstantNotPresentException.class,
103-
Symbol.intern("Exception"), Exception.class,
104-
Symbol.intern("IllegalAccessException"), IllegalAccessException.class,
105-
Symbol.intern("IllegalArgumentException"), IllegalArgumentException.class,
106-
Symbol.intern("IllegalMonitorStateException"), IllegalMonitorStateException.class,
107-
Symbol.intern("IllegalStateException"), IllegalStateException.class,
108-
Symbol.intern("IllegalThreadStateException"), IllegalThreadStateException.class,
109-
Symbol.intern("IndexOutOfBoundsException"), IndexOutOfBoundsException.class,
110-
Symbol.intern("InstantiationException"), InstantiationException.class,
111-
Symbol.intern("InterruptedException"), InterruptedException.class,
112-
Symbol.intern("NegativeArraySizeException"), NegativeArraySizeException.class,
113-
Symbol.intern("NoSuchFieldException"), NoSuchFieldException.class,
114-
Symbol.intern("NoSuchMethodException"), NoSuchMethodException.class,
115-
Symbol.intern("NullPointerException"), NullPointerException.class,
116-
Symbol.intern("NumberFormatException"), NumberFormatException.class,
117-
Symbol.intern("RuntimeException"), RuntimeException.class,
118-
Symbol.intern("SecurityException"), SecurityException.class,
119-
Symbol.intern("StringIndexOutOfBoundsException"), StringIndexOutOfBoundsException.class,
120-
Symbol.intern("TypeNotPresentException"), TypeNotPresentException.class,
121-
Symbol.intern("UnsupportedOperationException"), UnsupportedOperationException.class,
122-
Symbol.intern("AbstractMethodError"), AbstractMethodError.class,
123-
Symbol.intern("AssertionError"), AssertionError.class,
124-
Symbol.intern("ClassCircularityError"), ClassCircularityError.class,
125-
Symbol.intern("ClassFormatError"), ClassFormatError.class,
126-
Symbol.intern("Error"), Error.class,
127-
Symbol.intern("ExceptionInInitializerError"), ExceptionInInitializerError.class,
128-
Symbol.intern("IllegalAccessError"), IllegalAccessError.class,
129-
Symbol.intern("IncompatibleClassChangeError"), IncompatibleClassChangeError.class,
130-
Symbol.intern("InstantiationError"), InstantiationError.class,
131-
Symbol.intern("InternalError"), InternalError.class,
132-
Symbol.intern("LinkageError"), LinkageError.class,
133-
Symbol.intern("NoClassDefFoundError"), NoClassDefFoundError.class,
134-
Symbol.intern("NoSuchFieldError"), NoSuchFieldError.class,
135-
Symbol.intern("NoSuchMethodError"), NoSuchMethodError.class,
136-
Symbol.intern("OutOfMemoryError"), OutOfMemoryError.class,
137-
Symbol.intern("StackOverflowError"), StackOverflowError.class,
138-
Symbol.intern("ThreadDeath"), ThreadDeath.class,
139-
Symbol.intern("UnknownError"), UnknownError.class,
140-
Symbol.intern("UnsatisfiedLinkError"), UnsatisfiedLinkError.class,
141-
Symbol.intern("UnsupportedClassVersionError"), UnsupportedClassVersionError.class,
142-
Symbol.intern("VerifyError"), VerifyError.class,
143-
Symbol.intern("VirtualMachineError"), VirtualMachineError.class,
144-
Symbol.intern("Thread$UncaughtExceptionHandler"), Thread.UncaughtExceptionHandler.class,
145-
Symbol.intern("Thread$State"), Thread.State.class,
146-
Symbol.intern("Deprecated"), Deprecated.class,
147-
Symbol.intern("Override"), Override.class,
148-
Symbol.intern("SuppressWarnings"), SuppressWarnings.class
53+
Symbol.intern("Boolean"), Boolean.class,
54+
Symbol.intern("Byte"), Byte.class,
55+
Symbol.intern("Character"), Character.class,
56+
Symbol.intern("Class"), Class.class,
57+
Symbol.intern("ClassLoader"), ClassLoader.class,
58+
Symbol.intern("Compiler"), Compiler.class,
59+
Symbol.intern("Double"), Double.class,
60+
Symbol.intern("Enum"), Enum.class,
61+
Symbol.intern("Float"), Float.class,
62+
Symbol.intern("InheritableThreadLocal"), InheritableThreadLocal.class,
63+
Symbol.intern("Integer"), Integer.class,
64+
Symbol.intern("Long"), Long.class,
65+
Symbol.intern("Math"), Math.class,
66+
Symbol.intern("Number"), Number.class,
67+
Symbol.intern("Object"), Object.class,
68+
Symbol.intern("Package"), Package.class,
69+
Symbol.intern("Process"), Process.class,
70+
Symbol.intern("ProcessBuilder"), ProcessBuilder.class,
71+
Symbol.intern("Runtime"), Runtime.class,
72+
Symbol.intern("RuntimePermission"), RuntimePermission.class,
73+
Symbol.intern("SecurityManager"), SecurityManager.class,
74+
Symbol.intern("Short"), Short.class,
75+
Symbol.intern("StackTraceElement"), StackTraceElement.class,
76+
Symbol.intern("StrictMath"), StrictMath.class,
77+
Symbol.intern("String"), String.class,
78+
Symbol.intern("StringBuffer"), StringBuffer.class,
79+
Symbol.intern("StringBuilder"), StringBuilder.class,
80+
Symbol.intern("System"), System.class,
81+
Symbol.intern("Thread"), Thread.class,
82+
Symbol.intern("ThreadGroup"), ThreadGroup.class,
83+
Symbol.intern("ThreadLocal"), ThreadLocal.class,
84+
Symbol.intern("Throwable"), Throwable.class,
85+
Symbol.intern("Void"), Void.class,
86+
Symbol.intern("Appendable"), Appendable.class,
87+
Symbol.intern("CharSequence"), CharSequence.class,
88+
Symbol.intern("Cloneable"), Cloneable.class,
89+
Symbol.intern("Comparable"), Comparable.class,
90+
Symbol.intern("Iterable"), Iterable.class,
91+
Symbol.intern("Readable"), Readable.class,
92+
Symbol.intern("Runnable"), Runnable.class,
93+
Symbol.intern("Callable"), Callable.class,
94+
Symbol.intern("BigInteger"), BigInteger.class,
95+
Symbol.intern("BigDecimal"), BigDecimal.class,
96+
Symbol.intern("ArithmeticException"), ArithmeticException.class,
97+
Symbol.intern("ArrayIndexOutOfBoundsException"), ArrayIndexOutOfBoundsException.class,
98+
Symbol.intern("ArrayStoreException"), ArrayStoreException.class,
99+
Symbol.intern("ClassCastException"), ClassCastException.class,
100+
Symbol.intern("ClassNotFoundException"), ClassNotFoundException.class,
101+
Symbol.intern("CloneNotSupportedException"), CloneNotSupportedException.class,
102+
Symbol.intern("EnumConstantNotPresentException"), EnumConstantNotPresentException.class,
103+
Symbol.intern("Exception"), Exception.class,
104+
Symbol.intern("IllegalAccessException"), IllegalAccessException.class,
105+
Symbol.intern("IllegalArgumentException"), IllegalArgumentException.class,
106+
Symbol.intern("IllegalMonitorStateException"), IllegalMonitorStateException.class,
107+
Symbol.intern("IllegalStateException"), IllegalStateException.class,
108+
Symbol.intern("IllegalThreadStateException"), IllegalThreadStateException.class,
109+
Symbol.intern("IndexOutOfBoundsException"), IndexOutOfBoundsException.class,
110+
Symbol.intern("InstantiationException"), InstantiationException.class,
111+
Symbol.intern("InterruptedException"), InterruptedException.class,
112+
Symbol.intern("NegativeArraySizeException"), NegativeArraySizeException.class,
113+
Symbol.intern("NoSuchFieldException"), NoSuchFieldException.class,
114+
Symbol.intern("NoSuchMethodException"), NoSuchMethodException.class,
115+
Symbol.intern("NullPointerException"), NullPointerException.class,
116+
Symbol.intern("NumberFormatException"), NumberFormatException.class,
117+
Symbol.intern("RuntimeException"), RuntimeException.class,
118+
Symbol.intern("SecurityException"), SecurityException.class,
119+
Symbol.intern("StringIndexOutOfBoundsException"), StringIndexOutOfBoundsException.class,
120+
Symbol.intern("TypeNotPresentException"), TypeNotPresentException.class,
121+
Symbol.intern("UnsupportedOperationException"), UnsupportedOperationException.class,
122+
Symbol.intern("AbstractMethodError"), AbstractMethodError.class,
123+
Symbol.intern("AssertionError"), AssertionError.class,
124+
Symbol.intern("ClassCircularityError"), ClassCircularityError.class,
125+
Symbol.intern("ClassFormatError"), ClassFormatError.class,
126+
Symbol.intern("Error"), Error.class,
127+
Symbol.intern("ExceptionInInitializerError"), ExceptionInInitializerError.class,
128+
Symbol.intern("IllegalAccessError"), IllegalAccessError.class,
129+
Symbol.intern("IncompatibleClassChangeError"), IncompatibleClassChangeError.class,
130+
Symbol.intern("InstantiationError"), InstantiationError.class,
131+
Symbol.intern("InternalError"), InternalError.class,
132+
Symbol.intern("LinkageError"), LinkageError.class,
133+
Symbol.intern("NoClassDefFoundError"), NoClassDefFoundError.class,
134+
Symbol.intern("NoSuchFieldError"), NoSuchFieldError.class,
135+
Symbol.intern("NoSuchMethodError"), NoSuchMethodError.class,
136+
Symbol.intern("OutOfMemoryError"), OutOfMemoryError.class,
137+
Symbol.intern("StackOverflowError"), StackOverflowError.class,
138+
Symbol.intern("ThreadDeath"), ThreadDeath.class,
139+
Symbol.intern("UnknownError"), UnknownError.class,
140+
Symbol.intern("UnsatisfiedLinkError"), UnsatisfiedLinkError.class,
141+
Symbol.intern("UnsupportedClassVersionError"), UnsupportedClassVersionError.class,
142+
Symbol.intern("VerifyError"), VerifyError.class,
143+
Symbol.intern("VirtualMachineError"), VirtualMachineError.class,
144+
Symbol.intern("Thread$UncaughtExceptionHandler"), Thread.UncaughtExceptionHandler.class,
145+
Symbol.intern("Thread$State"), Thread.State.class,
146+
Symbol.intern("Deprecated"), Deprecated.class,
147+
Symbol.intern("Override"), Override.class,
148+
Symbol.intern("SuppressWarnings"), SuppressWarnings.class
149149

150150
// Symbol.intern("Collection"), "java.util.Collection",
151151
// Symbol.intern("Comparator"), "java.util.Comparator",
@@ -431,16 +431,24 @@ static public void load(String scriptbase, boolean failIfNotFound) throws IOExce
431431
WARN_ON_REFLECTION, WARN_ON_REFLECTION.deref()
432432
,RT.UNCHECKED_MATH, RT.UNCHECKED_MATH.deref()));
433433
loaded = (loadClassForName(scriptbase.replace('/', '.') + LOADER_SUFFIX) != null);
434+
// if(loaded)
435+
// System.out.println("Loaded CLASS:" + scriptbase);
434436
}
435437
finally {
436438
Var.popThreadBindings();
437439
}
438440
}
439441
if(!loaded && cljURL != null) {
440442
if(booleanCast(Compiler.COMPILE_FILES.deref()))
443+
{
444+
// System.out.println("COMPILING:" + cljfile);
441445
compile(cljfile);
446+
}
442447
else
448+
{
449+
// System.out.println("LOADING:" + cljfile);
443450
loadResourceScript(RT.class, cljfile);
451+
}
444452
}
445453
else if(!loaded && failIfNotFound)
446454
throw new FileNotFoundException(String.format("Could not locate %s or %s on classpath: ", classfile, cljfile));

0 commit comments

Comments
 (0)