diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 28 | ||||
-rw-r--r-- | src/proxy.clj | 5 |
3 files changed, 17 insertions, 20 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index b93005f2..209523ca 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -350,7 +350,7 @@ static class AssignExpr implements Expr{ public Expr parse(C context, Object frm) throws Exception{ ISeq form = (ISeq) frm; if(RT.length(form) != 3) - throw new IllegalArgumentException("Malformed assignment, expecting (= target val)"); + throw new IllegalArgumentException("Malformed assignment, expecting (set! target val)"); Expr target = analyze(C.EXPRESSION, RT.second(form)); if(!(target instanceof AssignableExpr)) throw new IllegalArgumentException("Invalid assignment target"); @@ -479,7 +479,7 @@ static interface AssignableExpr{ void emitAssign(C context, FnExpr fn, GeneratorAdapter gen, Expr val); } -static abstract class HostExpr implements Expr{ +static public abstract class HostExpr implements Expr{ final static Type BOOLEAN_TYPE = Type.getType(Boolean.class); final static Type CHAR_TYPE = Type.getType(Character.class); final static Type INTEGER_TYPE = Type.getType(Integer.class); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index defdd2d1..7fecdd49 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -228,24 +228,12 @@ static public Var var(String ns, String name){ return Var.intern(Namespace.findOrCreate(Symbol.intern(null, ns)), Symbol.intern(null, name)); } -static public void init() throws Exception{ +static void loadResourceScript(String name) throws Exception{ try { - Var.pushThreadBindings(RT.map(Compiler.SOURCE_PATH, "boot.clj", - Compiler.SOURCE, "boot.clj")); - InputStream ins = RT.class.getResourceAsStream("/boot.clj"); - Compiler.load(new InputStreamReader(ins)); - ins.close(); - ins = RT.class.getResourceAsStream("/proxy.clj"); - Compiler.load(new InputStreamReader(ins)); - ins.close(); - ins = RT.class.getResourceAsStream("/zip.clj"); - Compiler.load(new InputStreamReader(ins)); - ins.close(); - ins = RT.class.getResourceAsStream("/xml.clj"); - Compiler.load(new InputStreamReader(ins)); - ins.close(); - ins = RT.class.getResourceAsStream("/set.clj"); + Var.pushThreadBindings(RT.map(Compiler.SOURCE_PATH, name, + Compiler.SOURCE, name)); + InputStream ins = RT.class.getResourceAsStream("/" + name); Compiler.load(new InputStreamReader(ins)); ins.close(); } @@ -255,6 +243,14 @@ static public void init() throws Exception{ } } +static public void init() throws Exception{ + loadResourceScript("boot.clj"); + loadResourceScript("proxy.clj"); + loadResourceScript("zip.clj"); + loadResourceScript("xml.clj"); + loadResourceScript("set.clj"); +} + static public int nextID(){ return id.getAndIncrement(); } diff --git a/src/proxy.clj b/src/proxy.clj index f0463e11..6e3009e8 100644 --- a/src/proxy.clj +++ b/src/proxy.clj @@ -45,7 +45,8 @@ ex-type (totype java.lang.UnsupportedOperationException) gen-method (fn [#^java.lang.reflect.Method meth else-gen] - (let [ptypes (to-types (. meth (getParameterTypes))) + (let [pclasses (. meth (getParameterTypes)) + ptypes (to-types pclasses) rtype (totype (. meth (getReturnType))) m (new Method (. meth (getName)) rtype ptypes) gen (new GeneratorAdapter (. Opcodes ACC_PUBLIC) m nil nil cv) @@ -67,7 +68,7 @@ ;box args (dotimes i (count ptypes) (. gen (loadArg i)) - (. gen (box (nth ptypes i)))) + (. clojure.lang.Compiler$HostExpr (emitBoxReturn nil gen (nth pclasses i)))) ;call fn (. gen (invokeInterface ifn-type (new Method "invoke" obj-type (into-array (cons obj-type |