summaryrefslogtreecommitdiff
path: root/src/jvm
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-11-27 15:04:03 -0500
committerRich Hickey <richhickey@gmail.com>2010-11-27 15:04:03 -0500
commitaa7d26336faff6ccc65e4405e28e471221f35fc4 (patch)
tree97f829df1d3528a57c298406003684eddd48e492 /src/jvm
parent3e644c768b1f769217ecd484c019580384c7a670 (diff)
added *unchecked-math* support, temporarily disabled name propagation to fns
Diffstat (limited to 'src/jvm')
-rw-r--r--src/jvm/clojure/lang/Compiler.java53
1 files changed, 40 insertions, 13 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 16022b95..9794d648 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -234,6 +234,10 @@ static final public Var INSTANCE = Var.intern(Namespace.findOrCreate(Symbol.inte
static final public Var ADD_ANNOTATIONS = Var.intern(Namespace.findOrCreate(Symbol.intern("clojure.core")),
Symbol.intern("add-annotations"));
+//boolean
+static final public Var UNCHECKED_MATH = Var.intern(Namespace.findOrCreate(Symbol.intern("clojure.core")),
+ Symbol.intern("*unchecked-math*"), Boolean.FALSE).setDynamic();
+
//Integer
static final public Var LINE = Var.create(0).setDynamic();
@@ -797,18 +801,36 @@ static public abstract class HostExpr implements Expr, MaybePrimitiveExpr{
{
Method m = null;
gen.checkCast(NUMBER_TYPE);
- if(paramType == int.class)
- m = Method.getMethod("int intCast(Object)");
- else if(paramType == float.class)
- m = Method.getMethod("float floatCast(Object)");
- else if(paramType == double.class)
- m = Method.getMethod("double doubleCast(Object)");
- else if(paramType == long.class)
- m = Method.getMethod("long longCast(Object)");
- else if(paramType == byte.class)
- m = Method.getMethod("byte byteCast(Object)");
- else if(paramType == short.class)
- m = Method.getMethod("short shortCast(Object)");
+ if(RT.booleanCast(UNCHECKED_MATH.deref()))
+ {
+ if(paramType == int.class)
+ m = Method.getMethod("int uncheckedIntCast(Object)");
+ else if(paramType == float.class)
+ m = Method.getMethod("float uncheckedFloatCast(Object)");
+ else if(paramType == double.class)
+ m = Method.getMethod("double uncheckedDoubleCast(Object)");
+ else if(paramType == long.class)
+ m = Method.getMethod("long uncheckedLongCast(Object)");
+ else if(paramType == byte.class)
+ m = Method.getMethod("byte uncheckedByteCast(Object)");
+ else if(paramType == short.class)
+ m = Method.getMethod("short uncheckedShortCast(Object)");
+ }
+ else
+ {
+ if(paramType == int.class)
+ m = Method.getMethod("int intCast(Object)");
+ else if(paramType == float.class)
+ m = Method.getMethod("float floatCast(Object)");
+ else if(paramType == double.class)
+ m = Method.getMethod("double doubleCast(Object)");
+ else if(paramType == long.class)
+ m = Method.getMethod("long longCast(Object)");
+ else if(paramType == byte.class)
+ m = Method.getMethod("byte byteCast(Object)");
+ else if(paramType == short.class)
+ m = Method.getMethod("short shortCast(Object)");
+ }
gen.invokeStatic(RT_TYPE, m);
}
}
@@ -1204,7 +1226,10 @@ static abstract class MethodExpr extends HostExpr{
{
final MaybePrimitiveExpr pe = (MaybePrimitiveExpr) e;
pe.emitUnboxed(C.EXPRESSION, objx, gen);
- gen.invokeStatic(RT_TYPE, Method.getMethod("int intCast(long)"));
+ if(RT.booleanCast(UNCHECKED_MATH.deref()))
+ gen.invokeStatic(RT_TYPE, Method.getMethod("int uncheckedIntCast(long)"));
+ else
+ gen.invokeStatic(RT_TYPE, Method.getMethod("int intCast(long)"));
}
else if(primc == float.class && parameterTypes[i] == double.class)
{
@@ -6598,6 +6623,7 @@ public static Object load(Reader rdr, String sourcePath, String sourceName) thro
RT.CURRENT_NS, RT.CURRENT_NS.deref(),
LINE_BEFORE, pushbackReader.getLineNumber(),
LINE_AFTER, pushbackReader.getLineNumber()
+ ,UNCHECKED_MATH, UNCHECKED_MATH.deref()
));
try
@@ -6714,6 +6740,7 @@ public static Object compile(Reader rdr, String sourcePath, String sourceName) t
CONSTANT_IDS, new IdentityHashMap(),
KEYWORDS, PersistentHashMap.EMPTY,
VARS, PersistentHashMap.EMPTY
+ ,UNCHECKED_MATH, UNCHECKED_MATH.deref()
// ,LOADER, RT.makeClassLoader()
));