Changeset 10216


Ignore:
Timestamp:
10/24/05 21:13:26 (16 years ago)
Author:
piso
Message:

DESCRIBE-JAVA-OBJECT

File:
1 edited

Legend:

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

    r10180 r10216  
    33 *
    44 * Copyright (C) 2002-2005 Peter Graves
    5  * $Id: JavaObject.java,v 1.18 2005-10-22 14:11:08 piso Exp $
     5 * $Id: JavaObject.java,v 1.19 2005-10-24 21:13:26 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    105105        return unreadableString(sb.toString());
    106106    }
     107
     108    // ### describe-java-object
     109    private static final Primitive DESCRIBE_JAVA_OBJECT =
     110        new Primitive("describe-java-object", PACKAGE_JAVA, true)
     111    {
     112        public LispObject execute(LispObject first, LispObject second)
     113            throws ConditionThrowable
     114        {
     115            if (!(first instanceof JavaObject))
     116                return signalTypeError(first, Symbol.JAVA_OBJECT);
     117            final Stream stream;
     118            try {
     119                stream = (Stream) second;
     120            }
     121            catch (ClassCastException e) {
     122                return signalTypeError(second, Symbol.STREAM);
     123            }
     124            final JavaObject javaObject = (JavaObject) first;
     125            final Object obj = javaObject.getObject();
     126            final FastStringBuffer sb =
     127                new FastStringBuffer(javaObject.writeToString());
     128            sb.append(" is an object of type ");
     129            sb.append(Symbol.JAVA_OBJECT.writeToString());
     130            sb.append(".");
     131            sb.append(System.getProperty("line.separator"));
     132            sb.append("The wrapped Java object is an ");
     133            final Class c = obj.getClass();
     134            String className = c.getName();
     135            if (c.isArray()) {
     136                sb.append("array of ");
     137                if (className.startsWith("[L") && className.endsWith(";")) {
     138                    className = className.substring(1, className.length() - 1);
     139                    sb.append(className);
     140                    sb.append(" objects");
     141                } else if (className.startsWith("[") && className.length() > 1) {
     142                    char descriptor = className.charAt(1);
     143                    final String type;
     144                    switch (descriptor) {
     145                        case 'B': type = "bytes"; break;
     146                        case 'C': type = "chars"; break;
     147                        case 'D': type = "doubles"; break;
     148                        case 'F': type = "floats"; break;
     149                        case 'I': type = "ints"; break;
     150                        case 'J': type = "longs"; break;
     151                        case 'S': type = "shorts"; break;
     152                        case 'Z': type = "booleans"; break;
     153                        default:
     154                            type = "unknown type";
     155                    }
     156                    sb.append(type);
     157                }
     158                    sb.append(" with ");
     159                final int length = java.lang.reflect.Array.getLength(obj);
     160                sb.append(length);
     161                sb.append(" element");
     162                if (length != 1)
     163                    sb.append('s');
     164                sb.append('.');
     165            } else {
     166                sb.append("instance of ");
     167                sb.append(className);
     168                sb.append(':');
     169                sb.append(System.getProperty("line.separator"));
     170                sb.append("  \"");
     171                sb.append(obj.toString());
     172                sb.append('"');
     173            }
     174            stream._writeString(sb.toString());
     175            return LispThread.currentThread().nothing();
     176        }
     177    };
    107178}
Note: See TracChangeset for help on using the changeset viewer.