summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java4
-rw-r--r--src/jvm/clojure/lang/RT.java28
-rw-r--r--src/proxy.clj5
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