Changeset 8527


Ignore:
Timestamp:
02/10/05 12:58:34 (16 years ago)
Author:
piso
Message:

checkRedefinition()
%DEFUN
FSET

File:
1 edited

Legend:

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

    r8513 r8527  
    33 *
    44 * Copyright (C) 2002-2005 Peter Graves
    5  * $Id: Primitives.java,v 1.732 2005-02-09 18:37:12 piso Exp $
     5 * $Id: Primitives.java,v 1.733 2005-02-10 12:58:34 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    14451445        throws ConditionThrowable
    14461446    {
    1447         if (_WARN_ON_REDEFINITION_.symbolValue() != NIL) {
     1447        final LispThread thread = LispThread.currentThread();
     1448        if (_WARN_ON_REDEFINITION_.symbolValue(thread) != NIL) {
    14481449            if (arg instanceof Symbol) {
    14491450                LispObject oldDefinition = arg.getSymbolFunction();
    1450                 if (oldDefinition != null && !(oldDefinition instanceof Autoload))
    1451                     Symbol.STYLE_WARN.execute(new SimpleString("redefining ~S"),
    1452                                               arg);
     1451                if (oldDefinition != null && !(oldDefinition instanceof Autoload)) {
     1452                    LispObject oldSource =
     1453                        Extensions.SOURCE_PATHNAME.execute(arg);
     1454                    LispObject currentSource =
     1455                        Load._FASL_SOURCE_.symbolValue(thread);
     1456                    if (currentSource == NIL)
     1457                        currentSource = _LOAD_TRUENAME_.symbolValue(thread);
     1458                    if (currentSource == NIL)
     1459                        currentSource = Keyword.TOP_LEVEL;
     1460                    if (oldSource != NIL) {
     1461                        if (currentSource.equal(oldSource))
     1462                            return; // OK
     1463                    }
     1464                    if (currentSource == Keyword.TOP_LEVEL) {
     1465                        Symbol.STYLE_WARN.execute(new SimpleString("redefining ~S at top level"),
     1466                                                  arg);
     1467
     1468                    } else {
     1469                        Binding lastSpecialBinding = thread.lastSpecialBinding;
     1470                        thread.bindSpecial(_PACKAGE_, PACKAGE_CL);
     1471                        try {
     1472                            Symbol.STYLE_WARN.execute(new SimpleString("redefining ~S in ~S"),
     1473                                                      arg, currentSource);
     1474                        }
     1475                        finally {
     1476                            thread.lastSpecialBinding = lastSpecialBinding;
     1477                        }
     1478                    }
     1479                }
    14531480            }
    14541481        }
     
    14901517                return signal(new TypeError(first.writeToString() +
    14911518                                            " is not a valid function name."));
    1492             checkRedefinition(first);
    14931519            LispObject arglist = checkList(second);
    14941520            LispObject body = checkList(third);
     
    15151541            Closure closure = new Closure(first instanceof Symbol ? symbol : null,
    15161542                                          arglist, body, env);
    1517             closure.setArglist(arglist);
    1518             if (first instanceof Symbol) {
    1519                 symbol.setSymbolFunction(closure);
    1520             } else {
    1521                 // SETF function
    1522                 put(symbol, Symbol._SETF_FUNCTION, closure);
    1523             }
     1543            FSET.execute(first, closure, NIL, arglist);
    15241544            // Clear function table entry (if any).
    15251545            if (FUNCTION_TABLE != null) {
     
    29132933                Symbol symbol = (Symbol) first;
    29142934                symbol.setSymbolFunction(second);
    2915                 LispObject source = Load._FASL_SOURCE_.symbolValue();
    2916                 if (source != NIL) {
    2917                     if (third != NIL)
    2918                         put(symbol, Symbol._SOURCE, new Cons(source, third));
    2919                     else
    2920                         put(symbol, Symbol._SOURCE, source);
    2921                 }
     2935                final LispThread thread = LispThread.currentThread();
     2936                LispObject source = Load._FASL_SOURCE_.symbolValue(thread);
     2937                if (source == NIL)
     2938                    source = _LOAD_TRUENAME_.symbolValue(thread);
     2939                if (source == NIL)
     2940                    source = Keyword.TOP_LEVEL;
     2941                if (source != Keyword.TOP_LEVEL && third != NIL)
     2942                    put(symbol, Symbol._SOURCE, new Cons(source, third));
     2943                else
     2944                    put(symbol, Symbol._SOURCE, source);
    29222945            } else if (first instanceof Cons && first.car() == Symbol.SETF) {
    29232946                // SETF function
Note: See TracChangeset for help on using the changeset viewer.