summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-09-19 18:59:15 +0000
committerRich Hickey <richhickey@gmail.com>2008-09-19 18:59:15 +0000
commit1aa40dbfa8270e6d05469606be56a54a86b87909 (patch)
tree3e6e0550aef39f90207945ac80019c751c3cae47 /src
parent25d8907f1ad42056ea57ec78141a2b7d34e0c897 (diff)
made many things public for ClojureScript, patch from Chouser
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java269
-rw-r--r--src/jvm/clojure/lang/RT.java1
2 files changed, 165 insertions, 105 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index a44aa2e5..aae4cc9b 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -195,7 +195,7 @@ static final public Var RET_LOCAL_NUM = Var.create();
//DynamicClassLoader
static final public Var LOADER = Var.create();
-enum C{
+public enum C{
STATEMENT, //value ignored
EXPRESSION, //value required
RETURN, //tail position relative to enclosing recur frame
@@ -212,7 +212,7 @@ interface Expr{
Class getJavaClass() throws Exception;
}
-static abstract class UntypedExpr implements Expr{
+public static abstract class UntypedExpr implements Expr{
public Class getJavaClass(){
throw new IllegalArgumentException("Has no Java class");
@@ -257,12 +257,12 @@ static Symbol resolveSymbol(Symbol sym){
}
static class DefExpr implements Expr{
- final Var var;
- final Expr init;
- final Expr meta;
- final boolean initProvided;
- final String source;
- final int line;
+ public final Var var;
+ public final Expr init;
+ public final Expr meta;
+ public final boolean initProvided;
+ public final String source;
+ public final int line;
final static Method bindRootMethod = Method.getMethod("void bindRoot(Object)");
final static Method setTagMethod = Method.getMethod("void setTag(clojure.lang.Symbol)");
final static Method setMetaMethod = Method.getMethod("void setMeta(clojure.lang.IPersistentMap)");
@@ -361,10 +361,9 @@ static class DefExpr implements Expr{
}
}
-static class AssignExpr implements Expr{
- final AssignableExpr target;
- final Expr val;
-
+public static class AssignExpr implements Expr{
+ public final AssignableExpr target;
+ public final Expr val;
public AssignExpr(AssignableExpr target, Expr val){
this.target = target;
@@ -400,9 +399,9 @@ static class AssignExpr implements Expr{
}
}
-static class VarExpr implements Expr, AssignableExpr{
- final Var var;
- final Object tag;
+public static class VarExpr implements Expr, AssignableExpr{
+ public final Var var;
+ public final Object tag;
final static Method getMethod = Method.getMethod("Object get()");
final static Method setMethod = Method.getMethod("Object set(Object)");
@@ -446,8 +445,8 @@ static class VarExpr implements Expr, AssignableExpr{
}
}
-static class TheVarExpr implements Expr{
- final Var var;
+public static class TheVarExpr implements Expr{
+ public final Var var;
public TheVarExpr(Var var){
this.var = var;
@@ -482,8 +481,8 @@ static class TheVarExpr implements Expr{
}
}
-static class KeywordExpr implements Expr{
- final Keyword k;
+public static class KeywordExpr implements Expr{
+ public final Keyword k;
public KeywordExpr(Keyword k){
this.k = k;
@@ -509,7 +508,7 @@ static class KeywordExpr implements Expr{
}
}
-static abstract class LiteralExpr implements Expr{
+public static abstract class LiteralExpr implements Expr{
abstract Object val();
public Object eval(){
@@ -830,11 +829,11 @@ static abstract class FieldExpr extends HostExpr{
}
static class InstanceFieldExpr extends FieldExpr implements AssignableExpr{
- final Expr target;
- final Class targetClass;
- final java.lang.reflect.Field field;
- final String fieldName;
- final int line;
+ public final Expr target;
+ public final Class targetClass;
+ public final java.lang.reflect.Field field;
+ public final String fieldName;
+ public final int line;
final static Method invokeNoArgInstanceMember = Method.getMethod("Object invokeNoArgInstanceMember(Object,String)");
final static Method setInstanceFieldMethod = Method.getMethod("Object setInstanceField(Object,String,Object)");
@@ -930,9 +929,9 @@ static class InstanceFieldExpr extends FieldExpr implements AssignableExpr{
static class StaticFieldExpr extends FieldExpr implements AssignableExpr{
//final String className;
- final String fieldName;
- final Class c;
- final java.lang.reflect.Field field;
+ public final String fieldName;
+ public final Class c;
+ public final java.lang.reflect.Field field;
final static Method getStaticFieldMethod = Method.getMethod("Object getStaticField(String,String)");
final static Method setStaticFieldMethod = Method.getMethod("Object setStaticField(String,String,Object)");
final int line;
@@ -1054,12 +1053,12 @@ static abstract class MethodExpr extends HostExpr{
}
static class InstanceMethodExpr extends MethodExpr{
- final Expr target;
- final String methodName;
- final IPersistentVector args;
- final String source;
- final int line;
- final java.lang.reflect.Method method;
+ public final Expr target;
+ public final String methodName;
+ public final IPersistentVector args;
+ public final String source;
+ public final int line;
+ public final java.lang.reflect.Method method;
final static Method invokeInstanceMethodMethod =
Method.getMethod("Object invokeInstanceMethod(Object,String,Object[])");
@@ -1205,12 +1204,12 @@ static class InstanceMethodExpr extends MethodExpr{
static class StaticMethodExpr extends MethodExpr{
//final String className;
- final Class c;
- final String methodName;
- final IPersistentVector args;
- final String source;
- final int line;
- final java.lang.reflect.Method method;
+ public final Class c;
+ public final String methodName;
+ public final IPersistentVector args;
+ public final String source;
+ public final int line;
+ public final java.lang.reflect.Method method;
final static Method invokeStaticMethodMethod =
Method.getMethod("Object invokeStaticMethod(String,String,Object[])");
@@ -1326,12 +1325,36 @@ static class StaticMethodExpr extends MethodExpr{
}
}
+static class UnresolvedVarExpr implements Expr{
+ public final Symbol symbol;
+
+ public UnresolvedVarExpr(Symbol symbol) {
+ this.symbol = symbol;
+ }
+
+ public boolean hasJavaClass(){
+ return false;
+ }
+
+ public Class getJavaClass() throws Exception{
+ throw new IllegalArgumentException(
+ "UnresolvedVarExpr has no Java class");
+ }
+
+ public void emit(C context, FnExpr fn, GeneratorAdapter gen){
+ }
+
+ public Object eval() throws Exception{
+ throw new IllegalArgumentException(
+ "UnresolvedVarExpr cannot be evalled");
+ }
+}
static class ConstantExpr extends LiteralExpr{
//stuff quoted vals in classloader at compile time, pull out at runtime
//this won't work for static compilation...
- final Object v;
- final int id;
+ public final Object v;
+ public final int id;
public ConstantExpr(Object v){
this.v = v;
@@ -1415,7 +1438,7 @@ static class NilExpr extends LiteralExpr{
final static NilExpr NIL_EXPR = new NilExpr();
static class BooleanExpr extends LiteralExpr{
- final boolean val;
+ public final boolean val;
public BooleanExpr(boolean val){
@@ -1450,7 +1473,7 @@ final static BooleanExpr TRUE_EXPR = new BooleanExpr(true);
final static BooleanExpr FALSE_EXPR = new BooleanExpr(false);
static class StringExpr extends LiteralExpr{
- final String str;
+ public final String str;
public StringExpr(String str){
this.str = str;
@@ -1621,18 +1644,18 @@ static class MonitorExitExpr extends UntypedExpr{
}
-static class TryExpr implements Expr{
- final Expr tryExpr;
- final Expr finallyExpr;
- final PersistentVector catchExprs;
- final int retLocal;
- final int finallyLocal;
+public static class TryExpr implements Expr{
+ public final Expr tryExpr;
+ public final Expr finallyExpr;
+ public final PersistentVector catchExprs;
+ public final int retLocal;
+ public final int finallyLocal;
- static class CatchClause{
+ public static class CatchClause{
//final String className;
- final Class c;
- final LocalBinding lb;
- final Expr handler;
+ public final Class c;
+ public final LocalBinding lb;
+ public final Expr handler;
Label label;
Label endLabel;
@@ -1874,7 +1897,7 @@ static class TryExpr implements Expr{
//}
static class ThrowExpr extends UntypedExpr{
- final Expr excExpr;
+ public final Expr excExpr;
public ThrowExpr(Expr excExpr){
this.excExpr = excExpr;
@@ -2001,10 +2024,10 @@ static int getMatchingParams(String methodName, ArrayList<Class[]> paramlists, I
return matchIdx;
}
-static class NewExpr implements Expr{
- final IPersistentVector args;
- final Constructor ctor;
- final Class c;
+public static class NewExpr implements Expr{
+ public final IPersistentVector args;
+ public final Constructor ctor;
+ public final Class c;
final static Method invokeConstructorMethod =
Method.getMethod("Object invokeConstructor(Class,Object[])");
final static Method forNameMethod = Method.getMethod("Class classForName(String)");
@@ -2216,9 +2239,9 @@ static class NewExpr implements Expr{
// }
//}
-static class MetaExpr implements Expr{
- final Expr expr;
- final MapExpr meta;
+public static class MetaExpr implements Expr{
+ public final Expr expr;
+ public final MapExpr meta;
final static Type IOBJ_TYPE = Type.getType(IObj.class);
final static Method withMetaMethod = Method.getMethod("clojure.lang.IObj withMeta(clojure.lang.IPersistentMap)");
@@ -2253,11 +2276,11 @@ static class MetaExpr implements Expr{
}
}
-static class IfExpr implements Expr{
- final Expr testExpr;
- final Expr thenExpr;
- final Expr elseExpr;
- final int line;
+public static class IfExpr implements Expr{
+ public final Expr testExpr;
+ public final Expr thenExpr;
+ public final Expr elseExpr;
+ public final int line;
public IfExpr(int line, Expr testExpr, Expr thenExpr, Expr elseExpr){
@@ -2382,8 +2405,8 @@ static public String munge(String name){
return sb.toString();
}
-static class EmptyExpr implements Expr{
- final Object coll;
+public static class EmptyExpr implements Expr{
+ public final Object coll;
final static Type HASHMAP_TYPE = Type.getType(PersistentHashMap.class);
final static Type HASHSET_TYPE = Type.getType(PersistentHashSet.class);
final static Type VECTOR_TYPE = Type.getType(PersistentVector.class);
@@ -2434,8 +2457,8 @@ static class EmptyExpr implements Expr{
}
}
-static class ListExpr implements Expr{
- final IPersistentVector args;
+public static class ListExpr implements Expr{
+ public final IPersistentVector args;
final static Method arrayToListMethod = Method.getMethod("clojure.lang.ISeq arrayToList(Object[])");
@@ -2467,8 +2490,8 @@ static class ListExpr implements Expr{
}
-static class MapExpr implements Expr{
- final IPersistentVector keyvals;
+public static class MapExpr implements Expr{
+ public final IPersistentVector keyvals;
final static Method mapMethod = Method.getMethod("clojure.lang.IPersistentMap map(Object[])");
@@ -2516,8 +2539,8 @@ static class MapExpr implements Expr{
}
}
-static class SetExpr implements Expr{
- final IPersistentVector keys;
+public static class SetExpr implements Expr{
+ public final IPersistentVector keys;
final static Method setMethod = Method.getMethod("clojure.lang.IPersistentSet set(Object[])");
@@ -2564,8 +2587,8 @@ static class SetExpr implements Expr{
}
}
-static class VectorExpr implements Expr{
- final IPersistentVector args;
+public static class VectorExpr implements Expr{
+ public final IPersistentVector args;
final static Method vectorMethod = Method.getMethod("clojure.lang.IPersistentVector vector(Object[])");
@@ -2610,11 +2633,11 @@ static class VectorExpr implements Expr{
}
static class InvokeExpr implements Expr{
- final Expr fexpr;
- final Object tag;
- final IPersistentVector args;
- final int line;
- final String source;
+ public final Expr fexpr;
+ public final Object tag;
+ public final IPersistentVector args;
+ public final int line;
+ public final String source;
public InvokeExpr(String source, int line, Symbol tag, Expr fexpr, IPersistentVector args){
this.source = source;
@@ -2746,7 +2769,7 @@ static public class FnExpr implements Expr{
String internalName;
String thisName;
Type fntype;
- final Object tag;
+ public final Object tag;
//localbinding->itself
IPersistentMap closes = PersistentHashMap.EMPTY;
//Keyword->KeywordExpr
@@ -2756,6 +2779,20 @@ static public class FnExpr implements Expr{
int line;
PersistentVector constants;
int constantsID;
+ public final IPersistentCollection methods() { return methods;}
+ public final FnMethod variadicMethod() { return variadicMethod;}
+ public final String name() { return name;}
+ public final String simpleName() { return simpleName;}
+ public final String internalName() { return internalName;}
+ public final String thisName() { return thisName;}
+ public final Type fntype() { return fntype;}
+ public final IPersistentMap closes() { return closes;}
+ public final IPersistentMap keywords() { return keywords;}
+ public final IPersistentMap vars() { return vars;}
+ public final Class compiledClass() { return compiledClass;}
+ public final int line() { return line;}
+ public final PersistentVector constants() { return constants;}
+ public final int constantsID() { return constantsID;}
final static Method kwintern = Method.getMethod("clojure.lang.Keyword intern(String, String)");
final static Method symcreate = Method.getMethod("clojure.lang.Symbol create(String)");
@@ -3192,10 +3229,10 @@ enum PSTATE{
}
-static class FnMethod{
+public static class FnMethod{
//when closures are defined inside other closures,
//the closed over locals need to be propagated to the enclosing fn
- final FnMethod parent;
+ public final FnMethod parent;
//localbinding->localbinding
IPersistentMap locals = null;
//localbinding->localbinding
@@ -3207,6 +3244,14 @@ static class FnMethod{
int maxLocal = 0;
int line;
PersistentHashSet localsUsedInCatchFinally = PersistentHashSet.EMPTY;
+ public final IPersistentMap locals() { return locals;}
+ public final PersistentVector reqParms() { return reqParms;}
+ public final LocalBinding restParm() { return restParm;}
+ public final Expr body() { return body;}
+ public final FnExpr fn() { return fn;}
+ public final PersistentVector argLocals() { return argLocals;}
+ public final int maxLocal() { return maxLocal;}
+ public final int line() { return line;}
public FnMethod(FnExpr fn, FnMethod parent){
this.parent = parent;
@@ -3346,12 +3391,12 @@ static class FnMethod{
}
}
-static class LocalBinding{
- final Symbol sym;
- final Symbol tag;
- final Expr init;
- final int idx;
- final String name;
+public static class LocalBinding{
+ public final Symbol sym;
+ public final Symbol tag;
+ public final Expr init;
+ public final int idx;
+ public final String name;
public LocalBinding(int num, Symbol sym, Symbol tag, Expr init) throws Exception{
if(maybePrimitiveType(init) != null && tag != null)
@@ -3382,9 +3427,9 @@ static class LocalBinding{
}
}
-static class LocalBindingExpr implements Expr, MaybePrimitiveExpr{
- final LocalBinding b;
- final Symbol tag;
+public static class LocalBindingExpr implements Expr, MaybePrimitiveExpr{
+ public final LocalBinding b;
+ public final Symbol tag;
public LocalBindingExpr(LocalBinding b, Symbol tag) throws Exception{
if(b.getPrimitiveType() != null && tag != null)
@@ -3419,8 +3464,9 @@ static class LocalBindingExpr implements Expr, MaybePrimitiveExpr{
}
-static class BodyExpr implements Expr{
+public static class BodyExpr implements Expr{
PersistentVector exprs;
+ public final PersistentVector exprs() { return exprs;}
public BodyExpr(PersistentVector exprs){
this.exprs = exprs;
@@ -3480,9 +3526,11 @@ static class BodyExpr implements Expr{
}
}
-static class BindingInit{
+public static class BindingInit{
LocalBinding binding;
Expr init;
+ public final LocalBinding binding() { return binding;}
+ public final Expr init() { return init;}
public BindingInit(LocalBinding binding, Expr init){
this.binding = binding;
@@ -3490,10 +3538,10 @@ static class BindingInit{
}
}
-static class LetExpr implements Expr{
- final PersistentVector bindingInits;
- final Expr body;
- final boolean isLoop;
+public static class LetExpr implements Expr{
+ public final PersistentVector bindingInits;
+ public final Expr body;
+ public final boolean isLoop;
public LetExpr(PersistentVector bindingInits, Expr body, boolean isLoop){
this.bindingInits = bindingInits;
@@ -3616,9 +3664,9 @@ static class LetExpr implements Expr{
}
}
-static class RecurExpr implements Expr{
- final IPersistentVector args;
- final IPersistentVector loopLocals;
+public static class RecurExpr implements Expr{
+ public final IPersistentVector args;
+ public final IPersistentVector loopLocals;
public RecurExpr(IPersistentVector loopLocals, IPersistentVector args){
this.loopLocals = loopLocals;
@@ -3720,7 +3768,7 @@ private static int getAndIncLocalNum(){
return num;
}
-private static Expr analyze(C context, Object form) throws Exception{
+public static Expr analyze(C context, Object form) throws Exception{
return analyze(context, form, null);
}
@@ -4021,6 +4069,8 @@ private static Expr analyzeSymbol(Symbol sym) throws Exception{
}
else if(o instanceof Class)
return new ConstantExpr(o);
+ else if(o instanceof Symbol)
+ return new UnresolvedVarExpr((Symbol) o);
throw new Exception("Unable to resolve symbol: " + sym + " in this context");
@@ -4074,7 +4124,16 @@ static public Object resolveIn(Namespace n, Symbol sym) throws Exception{
{
Object o = n.getMapping(sym);
if(o == null)
- throw new Exception("Unable to resolve symbol: " + sym + " in this context");
+ {
+ if( RT.booleanCast(RT.ALLOW_UNRESOLVED_VARS.get()))
+ {
+ return sym;
+ }
+ else
+ {
+ throw new Exception("Unable to resolve symbol: " + sym + " in this context");
+ }
+ }
return o;
}
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 2ce55e4f..06379eb3 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -198,6 +198,7 @@ final static Var FLUSH_ON_NEWLINE = Var.intern(CLOJURE_NS, Symbol.create("*flush
final static Var PRINT_META = Var.intern(CLOJURE_NS, Symbol.create("*print-meta*"), F);
final static Var PRINT_READABLY = Var.intern(CLOJURE_NS, Symbol.create("*print-readably*"), T);
final static Var WARN_ON_REFLECTION = Var.intern(CLOJURE_NS, Symbol.create("*warn-on-reflection*"), F);
+final static Var ALLOW_UNRESOLVED_VARS = Var.intern(CLOJURE_NS, Symbol.create("*allow-unresolved-vars*"), F);
final static Var IN_NS_VAR = Var.intern(CLOJURE_NS, Symbol.create("in-ns"), F);
final static Var NS_VAR = Var.intern(CLOJURE_NS, Symbol.create("ns"), F);