summaryrefslogtreecommitdiff
path: root/src/jvm/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-04-26 13:31:11 -0400
committerRich Hickey <richhickey@gmail.com>2010-04-26 13:31:11 -0400
commit29dcb68be1eb9e2bfbe5bc627a1f1d6b3e0b7a29 (patch)
tree68e1e5baec52ea938910298c147d87a5770d7cf5 /src/jvm/clojure
parent787938361128c2bc21ed896dd4523651b59cb420 (diff)
support parameter annotations in deftype/record
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r--src/jvm/clojure/lang/Compiler.java20
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);