Changeset 8380


Ignore:
Timestamp:
01/22/05 09:57:06 (16 years ago)
Author:
asimon
Message:

New primitive: REGISTER-JAVA-EXCEPTION.
Registered exceptions are signaled in JSTATIC-RAW JNEW JARRAY-REF-RAW JARRAY-SET JCALL-RAW.

File:
1 edited

Legend:

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

    r8087 r8380  
    33 *
    44 * Copyright (C) 2002-2004 Peter Graves
    5  * $Id: Java.java,v 1.45 2004-11-03 15:38:52 piso Exp $
     5 * $Id: Java.java,v 1.46 2005-01-22 09:57:06 asimon Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2828import java.lang.reflect.Modifier;
    2929import java.lang.reflect.Array;
     30import java.util.Map;
     31import java.util.WeakHashMap;
    3032
    3133public final class Java extends Lisp
    3234{
     35
     36    private static final Map registeredExceptions = new WeakHashMap();
     37
     38    // ### register-java-exception
     39    // register-java-exception exception-name condition-symbol
     40    private static final Primitive REGISTER_JAVA_EXCEPTION =
     41        new Primitive("register-java-exception", PACKAGE_JAVA, true, "exception-name condition-symbol")
     42    {
     43        public LispObject execute(LispObject className, LispObject symbol) throws ConditionThrowable
     44        {
     45            try {
     46                registeredExceptions.put(classForName(className.getStringValue()),symbol);
     47            }
     48            catch (ClassNotFoundException e) {
     49                signal(new LispError("exception not found: " + className));
     50            }
     51            return T;
     52        }
     53    };
     54
     55
    3356    // ### jclass
    3457    private static final Primitive JCLASS = new Primitive("jclass", PACKAGE_JAVA, true, "name")
     
    308331                            if (!Modifier.isStatic(method.getModifiers())
    309332                                || method.getParameterTypes().length != argCount)
    310               continue;
     333                                continue;
    311334                            if (method.getName().equals(methodName)) {
    312335                                m = method;
     
    332355            }
    333356            catch (Throwable t) {
     357                Class tClass = t.getClass();
     358                if (registeredExceptions.containsKey(tClass)) {
     359                    signal((Symbol)registeredExceptions.get(tClass));
     360                }
    334361                signal(new LispError(getMessage(t)));
    335362            }
     
    364391            }
    365392            catch (Throwable t) {
     393                Class tClass = t.getClass();
     394                if (registeredExceptions.containsKey(tClass)) {
     395                    signal((Symbol)registeredExceptions.get(tClass));
     396                }
    366397                signal(new LispError(getMessage(t)));
    367398            }
     
    425456            }
    426457            catch (Throwable t) {
     458                Class tClass = t.getClass();
     459                if (registeredExceptions.containsKey(tClass)) {
     460                    signal((Symbol)registeredExceptions.get(tClass));
     461                }
    427462                signal(new LispError(getMessage(t)));
    428463            }
     
    450485            }
    451486            catch (Throwable t) {
     487                Class tClass = t.getClass();
     488                if (registeredExceptions.containsKey(tClass)) {
     489                    signal((Symbol)registeredExceptions.get(tClass));
     490                }
    452491                signal(new LispError(getMessage(t)));
    453492            }
     
    497536            }
    498537            catch (Throwable t) {
     538                Class tClass = t.getClass();
     539                if (registeredExceptions.containsKey(tClass)) {
     540                    signal((Symbol)registeredExceptions.get(tClass));
     541                }
    499542                signal(new LispError(getMessage(t)));
    500543            }
     
    542585
    543586    private static final Primitive JAVA_OBJECT_P = new Primitive("java-object-p", PACKAGE_JAVA, true,
    544                                                                    "object")
     587                                                                 "object")
    545588    {
    546589        public LispObject execute(LispObject arg) throws ConditionThrowable
Note: See TracChangeset for help on using the changeset viewer.