Changeset 8662


Ignore:
Timestamp:
02/28/05 17:17:05 (16 years ago)
Author:
piso
Message:

internAndExport()

File:
1 edited

Legend:

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

    r8198 r8662  
    33 *
    44 * Copyright (C) 2002-2004 Peter Graves
    5  * $Id: Package.java,v 1.60 2004-11-28 15:43:50 piso Exp $
     5 * $Id: Package.java,v 1.61 2005-02-28 17:17:05 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    3333    private final SymbolHashTable internalSymbols = new SymbolHashTable(16);
    3434    private final SymbolHashTable externalSymbols = new SymbolHashTable(16);
    35    
     35
    3636    private HashMap shadowingSymbols;
    3737    private ArrayList nicknames;
     
    157157        return (Symbol) externalSymbols.get(name);
    158158    }
    159    
     159
    160160    public synchronized Symbol findExternalSymbol(AbstractString name, int hash)
    161161    {
    162162        return (Symbol) externalSymbols.get(name, hash);
    163163    }
    164    
     164
    165165    // Returns null if symbol is not accessible in this package.
    166166    public synchronized Symbol findAccessibleSymbol(String name)
     
    173173        symbol = (Symbol) internalSymbols.get(name);
    174174        if (symbol != null)
    175             return symbol;           
     175            return symbol;
    176176        // Look in external symbols of used packages.
    177177        for (Iterator it = useList.iterator(); it.hasNext();) {
     
    195195        symbol = (Symbol) internalSymbols.get(name);
    196196        if (symbol != null)
    197             return thread.setValues(symbol, Keyword.INTERNAL);           
     197            return thread.setValues(symbol, Keyword.INTERNAL);
    198198        // Look in external symbols of used packages.
    199199        for (Iterator it = useList.iterator(); it.hasNext();) {
     
    237237        return symbol;
    238238    }
    239    
     239
    240240    private synchronized Symbol addSymbol(AbstractString name)
    241241    {
     
    335335        // Not found.
    336336        return (Symbol) thread.setValues(addSymbol(name), NIL);
     337    }
     338
     339    public synchronized Symbol internAndExport(String symbolName)
     340        throws ConditionThrowable
     341    {
     342        final SimpleString name = new SimpleString(symbolName);
     343        final int hash = name.sxhash();
     344        // Look in external and internal symbols of this package.
     345        Symbol symbol = (Symbol) externalSymbols.get(name, hash);
     346        if (symbol != null)
     347            return symbol;
     348        symbol = (Symbol) internalSymbols.get(name, hash);
     349        if (symbol != null) {
     350            export(symbol);
     351            return symbol;
     352        }
     353        if (useList.size() > 0) {
     354            // Look in external symbols of used packages.
     355            for (Iterator it = useList.iterator(); it.hasNext();) {
     356                Package pkg = (Package) it.next();
     357                symbol = pkg.findExternalSymbol(name, hash);
     358                if (symbol != null) {
     359                    export(symbol);
     360                    return symbol;
     361                }
     362            }
     363        }
     364        // Not found.
     365        symbol = new Symbol(name, hash, this);
     366        if (this == PACKAGE_KEYWORD) {
     367            symbol.setSymbolValue(symbol);
     368            symbol.setConstant(true);
     369        }
     370        externalSymbols.put(name, symbol);
     371        return symbol;
    337372    }
    338373
     
    454489            // No conflicts.
    455490            internalSymbols.remove(symbolName);
    456             externalSymbols.put(symbolName, symbol);               
     491            externalSymbols.put(symbolName, symbol);
    457492            return;
    458493        }
     
    496531        if (shadowingSymbols == null)
    497532            shadowingSymbols = new HashMap();
    498        
     533
    499534        Symbol symbol = (Symbol) externalSymbols.get(symbolName);
    500535        if (symbol != null) {
     
    556591        shadowingSymbols.put(symbolName, symbol);
    557592    }
    558    
     593
    559594    // "USE-PACKAGE causes PACKAGE to inherit all the external symbols of
    560595    // PACKAGES-TO-USE. The inherited symbols become accessible as internal
     
    698733                    list.add(symbol);
    699734            }
    700         }           
     735        }
    701736        return list;
    702737    }
     
    764799            array[i++] = symbol;
    765800        }
    766         return array;           
     801        return array;
    767802    }
    768803
Note: See TracChangeset for help on using the changeset viewer.