Changeset 5237


Ignore:
Timestamp:
12/20/03 22:39:07 (17 years ago)
Author:
asimon
Message:

JNEW-ARRAY
JARRAY-SET
JARRAY-REF

File:
1 edited

Legend:

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

    r5217 r5237  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Java.java,v 1.29 2003-12-20 09:04:39 asimon Exp $
     5 * $Id: Java.java,v 1.30 2003-12-20 22:39:07 asimon Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2727import java.lang.reflect.Field;
    2828import java.lang.reflect.Modifier;
     29import java.lang.reflect.Array;
    2930
    3031public final class Java extends Lisp
     
    7879     */
    7980    private static final Primitive JFIELD =
    80       new Primitive("jfield", PACKAGE_JAVA, true,
    81                     "class-ref-or-field field-or-instance &optional instance value")
     81        new Primitive("jfield", PACKAGE_JAVA, true,
     82                      "class-ref-or-field field-or-instance &optional instance value")
    8283    {
    8384        public LispObject execute(LispObject[] args) throws ConditionThrowable
     
    331332    };
    332333
     334    // ### jnew-array
     335    // jnew-array element-type &rest dimensions
     336    private static final Primitive JNEW_ARRAY = new Primitive("jnew-array", PACKAGE_JAVA, true,
     337                                                              "element-type &rest dimensions")
     338    {
     339        public LispObject execute(LispObject[] args) throws ConditionThrowable
     340        {
     341            if (args.length < 2)
     342                signal(new WrongNumberOfArgumentsException(this));
     343            try {
     344                Class c = forClassRef(args[0]);
     345                int[] dimensions = new int[args.length - 1];
     346                for (int i = 1; i < args.length; i++)
     347                    dimensions[i-1] = ((Integer)args[i].javaInstance()).intValue();
     348                return new JavaObject(Array.newInstance(c, dimensions));
     349            }
     350            catch (ClassNotFoundException e) {
     351                signal(new LispError("class not found: " + e.getMessage()));
     352            }
     353            catch (Throwable t) {
     354                signal(new LispError(getMessage(t)));
     355            }
     356            // Not reached.
     357            return NIL;
     358        }
     359    };
     360
     361    // ### jarray-ref
     362    // jarray-ref java-array &rest indices
     363    private static final Primitive JARRAY_REF = new Primitive("jarray-ref", PACKAGE_JAVA, true,
     364                                                              "java-array &rest indices")
     365    {
     366        public LispObject execute(LispObject[] args) throws ConditionThrowable
     367        {
     368            if (args.length < 2)
     369                signal(new WrongNumberOfArgumentsException(this));
     370            try {
     371                Object a = args[0].javaInstance();
     372                for (int i = 1; i<args.length - 1; i++)
     373                    a = Array.get(a, ((Integer)args[i].javaInstance()).intValue());
     374                return makeLispObject(Array.get(a, ((Integer)args[args.length - 1].javaInstance()).intValue()));
     375            }
     376            catch (Throwable t) {
     377                signal(new LispError(getMessage(t)));
     378            }
     379            // Not reached.
     380            return NIL;
     381        }
     382    };
     383
     384    // ### jarray-set
     385    // jarray-set java-array new-value &rest indices
     386    private static final Primitive JARRAY_SET = new Primitive("jarray-set", PACKAGE_JAVA, true,
     387                                                              "java-array new-value &rest indices")
     388    {
     389        public LispObject execute(LispObject[] args) throws ConditionThrowable
     390        {
     391            if (args.length < 3)
     392                signal(new WrongNumberOfArgumentsException(this));
     393            try {
     394                Object a = args[0].javaInstance();
     395                LispObject v = args[1];
     396                for (int i = 2; i<args.length - 1; i++)
     397                    a = Array.get(a, ((Integer)args[i].javaInstance()).intValue());
     398                Array.set(a, ((Integer)args[args.length - 1].javaInstance()).intValue(), v.javaInstance());
     399                return v;
     400            }
     401            catch (Throwable t) {
     402                signal(new LispError(getMessage(t)));
     403            }
     404            // Not reached.
     405            return NIL;
     406        }
     407    };
     408
    333409    // ### jcall
    334410    // jcall method instance &rest args
     
    365441    // make-immediate-object object &optional type
    366442    private static final Primitive MAKE_IMMEDIATE_OBJECT =
    367       new Primitive("make-immediate-object", PACKAGE_JAVA, true, "object &optional type")
     443        new Primitive("make-immediate-object", PACKAGE_JAVA, true, "object &optional type")
    368444    {
    369445        public LispObject execute(LispObject[] args) throws ConditionThrowable
Note: See TracChangeset for help on using the changeset viewer.