summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStuart Halloway <stu@thinkrelevance.com>2010-05-27 21:22:18 -0400
committerStuart Halloway <stu@thinkrelevance.com>2010-05-28 07:53:21 -0400
commitb2f9b4413ed0a7a299a286663e07c26445db013b (patch)
tree8d6a2fef6836db089051cac2022990d9998fe209 /src
parent4bea7a529bb14b99d48758cfaf0d71af0997f0ff (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.java29
-rw-r--r--src/jvm/clojure/lang/RT.java1
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"),