Changeset 12662


Ignore:
Timestamp:
05/09/10 15:44:04 (13 years ago)
Author:
astalla
Message:

JCLASS now supports an optional CLASS-LOADER argument.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/Java.java

    r12561 r12662  
    116116    }
    117117
    118     // ### jclass name-or-class-ref => class-ref
     118    // ### jclass name-or-class-ref &optional class-loader => class-ref
    119119    private static final Primitive JCLASS = new pf_jclass();
    120120    private static final class pf_jclass extends Primitive
     
    123123        {
    124124            super(Symbol.JCLASS, "name-or-class-ref",
    125                   "Returns a reference to the Java class designated by NAME-OR-CLASS-REF.");
     125                  "Returns a reference to the Java class designated by NAME-OR-CLASS-REF. If the CLASS-LOADER parameter is passed, the class is resolved with respect to the given ClassLoader.");
    126126        }
    127127
     
    130130        {
    131131            return JavaObject.getInstance(javaClass(arg));
     132        }
     133
     134        @Override
     135        public LispObject execute(LispObject className, LispObject classLoader)
     136        {
     137      ClassLoader loader = (ClassLoader) classLoader.javaInstance(ClassLoader.class);
     138      if(loader != null) {
     139    return JavaObject.getInstance(javaClass(className, loader));
     140      } else {
     141    return JavaObject.getInstance(javaClass(className));
     142      }
    132143        }
    133144    };
     
    11501161    }
    11511162   
    1152     static Class classForName(String className)
    1153     {
     1163    private static Class classForName(String className) {
     1164  return classForName(className, JavaClassLoader.getPersistentInstance());
     1165    }
     1166
     1167    private static Class classForName(String className, ClassLoader classLoader) {
    11541168        try {
    1155             return Class.forName(className);
     1169            return Class.forName(className, true, classLoader);
    11561170        }
    11571171        catch (ClassNotFoundException e) {
    1158             try {
    1159                 return Class.forName(className, true, JavaClassLoader.getPersistentInstance());
    1160             }
    1161             catch (ClassNotFoundException ex) {
    1162                 error(new LispError("Class not found: " + className));
    1163                 // Not reached.
    1164                 return null;
    1165             }
    1166         }
     1172      error(new LispError("Class not found: " + className));
     1173      // Not reached.
     1174      return null;
     1175        }
     1176    }
     1177
     1178    private static Class javaClass(LispObject obj) {
     1179  return javaClass(obj, null);
    11671180    }
    11681181
    11691182    // Supports Java primitive types too.
    1170     static Class javaClass(LispObject obj)
     1183    static Class javaClass(LispObject obj, ClassLoader classLoader)
    11711184    {
    11721185        if (obj instanceof AbstractString || obj instanceof Symbol) {
     
    11891202                return Double.TYPE;
    11901203            // Not a primitive Java type.
    1191             Class c = classForName(s);
     1204            Class c;
     1205      if(classLoader != null) {
     1206    c = classForName(s, classLoader);
     1207      } else {
     1208    c = classForName(s);
     1209      }
    11921210            if (c == null)
    11931211                error(new LispError(s + " does not designate a Java class."));
Note: See TracChangeset for help on using the changeset viewer.