diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-27 21:22:18 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-28 07:53:21 -0400 |
commit | b2f9b4413ed0a7a299a286663e07c26445db013b (patch) | |
tree | 8d6a2fef6836db089051cac2022990d9998fe209 /src | |
parent | 4bea7a529bb14b99d48758cfaf0d71af0997f0ff (diff) |
#330 def/declare do not reset metadata unless init-expr is passed
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 29 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 1 |
2 files changed, 24 insertions, 6 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 2b382989..40acd58d 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -338,7 +338,19 @@ static class DefExpr implements Expr{ this.initProvided = initProvided; } - public Object eval() throws Exception{ + private boolean includesExplicitMetadata(MapExpr expr) { + for(int i=0; i < expr.keyvals.count(); i += 2) + { + Keyword k = ((KeywordExpr) expr.keyvals.nth(i)).k; + if ((k != RT.FILE_KEY) && + (k != RT.DECLARED_KEY) && + (k != RT.LINE_KEY)) + return true; + } + return false; + } + + public Object eval() throws Exception{ try { if(initProvided) @@ -350,7 +362,9 @@ static class DefExpr implements Expr{ } if(meta != null) { - var.setMeta((IPersistentMap) meta.eval()); + IPersistentMap metaMap = (IPersistentMap) meta.eval(); + if (initProvided || includesExplicitMetadata((MapExpr) meta)) + var.setMeta((IPersistentMap) meta.eval()); } return var; } @@ -367,10 +381,13 @@ static class DefExpr implements Expr{ objx.emitVar(gen, var); if(meta != null) { - gen.dup(); - meta.emit(C.EXPRESSION, objx, gen); - gen.checkCast(IPERSISTENTMAP_TYPE); - gen.invokeVirtual(VAR_TYPE, setMetaMethod); + if (initProvided || includesExplicitMetadata((MapExpr) meta)) + { + gen.dup(); + meta.emit(C.EXPRESSION, objx, gen); + gen.checkCast(IPERSISTENTMAP_TYPE); + gen.invokeVirtual(VAR_TYPE, setMetaMethod); + } } if(initProvided) { diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 44ad1474..e1016f57 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -183,6 +183,7 @@ final static public Var ASSERT = Var.intern(CLOJURE_NS, Symbol.create("*assert*" final static public Var MATH_CONTEXT = Var.intern(CLOJURE_NS, Symbol.create("*math-context*"), null); static Keyword LINE_KEY = Keyword.intern(null, "line"); static Keyword FILE_KEY = Keyword.intern(null, "file"); +static Keyword DECLARED_KEY = Keyword.intern(null, "declared"); final static public Var USE_CONTEXT_CLASSLOADER = Var.intern(CLOJURE_NS, Symbol.create("*use-context-classloader*"), T); //final static public Var CURRENT_MODULE = Var.intern(Symbol.create("clojure.core", "current-module"), |