@@ -4295,17 +4295,34 @@ else if(value instanceof Var)
42954295 gen .push (var .sym .toString ());
42964296 gen .invokeStatic (RT_TYPE , Method .getMethod ("clojure.lang.Var var(String,String)" ));
42974297 }
4298- else if (value instanceof IRecord )
4298+ else if (value instanceof IType )
42994299 {
4300- Method createMethod = Method .getMethod (value .getClass ().getName () + " create(clojure.lang.IPersistentMap)" );
4301- List entries = new ArrayList ();
4302- for (Map .Entry entry : (Set <Map .Entry >) ((Map ) value ).entrySet ())
4300+ Method ctor = new Method ("<init>" , Type .getConstructorDescriptor (value .getClass ().getConstructors ()[0 ]));
4301+ gen .newInstance (Type .getType (value .getClass ()));
4302+ gen .dup ();
4303+ IPersistentVector fields = (IPersistentVector ) Reflector .invokeStaticMethod (value .getClass (), "getBasis" , new Object []{});
4304+ for (ISeq s = RT .seq (fields ); s != null ; s = s .next ())
43034305 {
4304- entries .add (entry .getKey ());
4305- entries .add (entry .getValue ());
4306+ Symbol field = (Symbol ) s .first ();
4307+ Class k = tagClass (tagOf (field ));
4308+ Object val = Reflector .getInstanceField (value , field .name );
4309+ emitValue (val , gen );
4310+
4311+ if (k .isPrimitive ())
4312+ {
4313+ Type b = Type .getType (boxClass (k ));
4314+ String p = Type .getType (k ).getDescriptor ();
4315+ String n = k .getName ();
4316+
4317+ gen .invokeVirtual (b , new Method (n +"Value" , "()" +p ));
4318+ }
43064319 }
4307- emitListAsObjectArray (entries , gen );
4308- gen .invokeStatic (RT_TYPE , Method .getMethod ("clojure.lang.IPersistentMap map(Object[])" ));
4320+ gen .invokeConstructor (Type .getType (value .getClass ()), ctor );
4321+ }
4322+ else if (value instanceof IRecord )
4323+ {
4324+ Method createMethod = Method .getMethod (value .getClass ().getName () + " create(clojure.lang.IPersistentMap)" );
4325+ emitValue (PersistentArrayMap .create ((java .util .Map ) value ), gen );
43094326 gen .invokeStatic (getType (value .getClass ()), createMethod );
43104327 }
43114328 else if (value instanceof IPersistentMap )
@@ -6142,6 +6159,8 @@ else if(form instanceof IPersistentVector)
61426159 return VectorExpr .parse (context , (IPersistentVector ) form );
61436160 else if (form instanceof IRecord )
61446161 return new ConstantExpr (form );
6162+ else if (form instanceof IType )
6163+ return new ConstantExpr (form );
61456164 else if (form instanceof IPersistentMap )
61466165 return MapExpr .parse (context , (IPersistentMap ) form );
61476166 else if (form instanceof IPersistentSet )
@@ -6376,12 +6395,13 @@ public static Object eval(Object form, boolean freshLoader) {
63766395 eval (RT .first (s ), false );
63776396 return eval (RT .first (s ), false );
63786397 }
6379- else if (form instanceof IPersistentCollection
6380- && !(RT .first (form ) instanceof Symbol
6381- && ((Symbol ) RT .first (form )).name .startsWith ("def" )))
6398+ else if ((form instanceof IType ) ||
6399+ (form instanceof IPersistentCollection
6400+ && !(RT .first (form ) instanceof Symbol
6401+ && ((Symbol ) RT .first (form )).name .startsWith ("def" ))))
63826402 {
63836403 ObjExpr fexpr = (ObjExpr ) analyze (C .EXPRESSION , RT .list (FN , PersistentVector .EMPTY , form ),
6384- "eval" + RT .nextID ());
6404+ "eval" + RT .nextID ());
63856405 IFn fn = (IFn ) fexpr .eval ();
63866406 return fn .invoke ();
63876407 }
@@ -7809,23 +7829,22 @@ static Class boxClass(Class p) {
78097829 return p ;
78107830
78117831 Class c = null ;
7812- Type t = Type .getType (p );
78137832
7814- if (t == Type . INT_TYPE )
7833+ if (p == Integer . TYPE )
78157834 c = Integer .class ;
7816- else if (t == Type . LONG_TYPE )
7835+ else if (p == Long . TYPE )
78177836 c = Long .class ;
7818- else if (t == Type . FLOAT_TYPE )
7837+ else if (p == Float . TYPE )
78197838 c = Float .class ;
7820- else if (t == Type . DOUBLE_TYPE )
7839+ else if (p == Double . TYPE )
78217840 c = Double .class ;
7822- else if (t == Type . CHAR_TYPE )
7841+ else if (p == Character . TYPE )
78237842 c = Character .class ;
7824- else if (t == Type . SHORT_TYPE )
7843+ else if (p == Short . TYPE )
78257844 c = Short .class ;
7826- else if (t == Type . BYTE_TYPE )
7845+ else if (p == Byte . TYPE )
78277846 c = Byte .class ;
7828- else if (t == Type . BOOLEAN_TYPE )
7847+ else if (p == Boolean . TYPE )
78297848 c = Boolean .class ;
78307849
78317850 return c ;
0 commit comments