diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-04-26 13:31:11 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-04-26 13:31:11 -0400 |
commit | 29dcb68be1eb9e2bfbe5bc627a1f1d6b3e0b7a29 (patch) | |
tree | 68e1e5baec52ea938910298c147d87a5770d7cf5 /src/jvm/clojure | |
parent | 787938361128c2bc21ed896dd4523651b59cb420 (diff) |
support parameter annotations in deftype/record
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index ffb5c928..035f78d8 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -5441,7 +5441,7 @@ static PathNode commonPath(PathNode n1, PathNode n2){ static void addAnnotation(Object visitor, IPersistentMap meta){ try{ - if(ADD_ANNOTATIONS.isBound()) + if(meta != null && ADD_ANNOTATIONS.isBound()) ADD_ANNOTATIONS.invoke(visitor, meta); } catch (Exception e) @@ -5450,6 +5450,17 @@ static void addAnnotation(Object visitor, IPersistentMap meta){ } } +static void addParameterAnnotation(Object visitor, IPersistentMap meta, int i){ + try{ + if(meta != null && ADD_ANNOTATIONS.isBound()) + ADD_ANNOTATIONS.invoke(visitor, meta, i); + } + catch (Exception e) + { + throw new RuntimeException(e); + } +} + private static Expr analyzeSymbol(Symbol sym) throws Exception{ Symbol tag = tagOf(sym); if(sym.ns == null) //ns-qualified syms are always Vars @@ -6322,6 +6333,7 @@ public static class NewInstanceMethod extends ObjMethod{ Class[] exclasses; static Symbol dummyThis = Symbol.intern(null,"dummy_this_dlskjsdfower"); + private IPersistentVector parms; public NewInstanceMethod(ObjExpr objx, ObjMethod parent){ super(objx, parent); @@ -6471,6 +6483,7 @@ public static class NewInstanceMethod extends ObjMethod{ LOOP_LOCALS.set(argLocals); method.name = name.name; method.methodMeta = RT.meta(name); + method.parms = parms; method.argLocals = argLocals; method.body = (new BodyExpr.Parser()).parse(C.RETURN, body); return method; @@ -6521,6 +6534,11 @@ public static class NewInstanceMethod extends ObjMethod{ extypes, cv); addAnnotation(gen,methodMeta); + for(int i = 0; i < parms.count(); i++) + { + IPersistentMap meta = RT.meta(parms.nth(i)); + addParameterAnnotation(gen, meta, i); + } gen.visitCode(); Label loopLabel = gen.mark(); gen.visitLineNumber(line, loopLabel); |