Changeset 4075


Ignore:
Timestamp:
09/26/03 18:27:24 (19 years ago)
Author:
piso
Message:

EXT:BACKTRACE-AS-LIST

File:
1 edited

Legend:

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

    r4070 r4075  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: LispThread.java,v 1.15 2003-09-26 15:04:46 piso Exp $
     5 * $Id: LispThread.java,v 1.16 2003-09-26 18:27:24 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    264264    }
    265265
     266    public LispObject backtraceAsList(int limit) throws ConditionThrowable
     267    {
     268        LispObject result = NIL;
     269        if (stack.size() > 0) {
     270            int count = 0;
     271            try {
     272                for (int i = stack.size(); i-- > 0;) {
     273                    StackFrame frame = (StackFrame) stack.get(i);
     274                    LispObject obj = NIL;
     275                    LispObject[] argv = frame.getArgumentVector();
     276                    for (int j = argv.length; j-- > 0;)
     277                        obj = new Cons(argv[j], obj);
     278                    Functional functional = frame.getFunctional();
     279                    if (functional.getLambdaName() != null)
     280                        obj = new Cons(functional.getLambdaName(), obj);
     281                    else
     282                        obj = new Cons(functional, obj);
     283                    result = new Cons(obj, result);
     284                    if (limit > 0 && ++count == limit)
     285                        break;
     286                }
     287            }
     288            catch (Throwable t) {
     289                t.printStackTrace();
     290            }
     291        }
     292        return Primitives.NREVERSE.execute(result);
     293    }
     294
    266295    private static void pprint(LispObject obj, int indentBy,
    267296        CharacterOutputStream stream) throws ConditionThrowable
     
    416445        }
    417446    };
     447
     448    // ### backtrace-as-list
     449    private static final Primitive BACKTRACE_AS_LIST =
     450        new Primitive("backtrace-as-list", PACKAGE_EXT, true)
     451    {
     452        public LispObject execute(LispObject[] args)
     453            throws ConditionThrowable
     454        {
     455            if (args.length > 1)
     456                throw new ConditionThrowable(new WrongNumberOfArgumentsException(this));
     457            int count = args.length > 0 ? Fixnum.getValue(args[0]) : 0;
     458            LispThread thread = currentThread();
     459            return thread.backtraceAsList(count);
     460        }
     461    };
    418462}
Note: See TracChangeset for help on using the changeset viewer.