Changeset 12959
- Timestamp:
- 10/08/10 22:08:43 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/Package.java
r12713 r12959 37 37 38 38 import java.util.ArrayList; 39 import java.util.Collection; 39 40 import java.util.HashMap; 40 41 import java.util.Iterator; 41 42 import java.util.List; 43 import java.util.concurrent.ConcurrentHashMap; 42 44 43 45 public final class Package extends LispObject implements java.io.Serializable … … 48 50 private transient LispObject propertyList; 49 51 50 private transient final SymbolHashTable internalSymbols = new SymbolHashTable(16); 51 private transient final SymbolHashTable externalSymbols = new SymbolHashTable(16); 52 private transient final ConcurrentHashMap<String, Symbol> internalSymbols 53 = new ConcurrentHashMap<String, Symbol>(16); 54 private transient final ConcurrentHashMap<String, Symbol> externalSymbols 55 = new ConcurrentHashMap<String, Symbol>(16); 52 56 53 57 private transient HashMap<String,Symbol> shadowingSymbols; … … 142 146 if (name != null) { 143 147 Packages.deletePackage(this); 144 List internals = internalSymbols.getSymbols(); 145 for (int i = internals.size(); i-- > 0;) { 146 Symbol symbol = (Symbol) internals.get(i); 147 if (symbol.getPackage() == this) 148 symbol.setPackage(NIL); 149 internalSymbols.remove(symbol); 150 } 151 List externals = externalSymbols.getSymbols(); 152 for (int i = externals.size(); i-- > 0;) { 153 Symbol symbol = (Symbol) externals.get(i); 154 if (symbol.getPackage() == this) 155 symbol.setPackage(NIL); 156 externalSymbols.remove(symbol); 157 } 148 internalSymbols.clear(); 149 externalSymbols.clear(); 150 158 151 name = null; 159 152 lispName = null; 160 153 nicknames = null; 154 161 155 return true; 162 156 } … … 184 178 } 185 179 186 public synchronizedSymbol findInternalSymbol(SimpleString name)187 { 188 return internalSymbols.get(name );189 } 190 191 public synchronizedSymbol findExternalSymbol(SimpleString name)192 { 193 return externalSymbols.get(name );194 } 195 196 public synchronizedSymbol findExternalSymbol(SimpleString name, int hash)197 { 198 return externalSymbols.get(name , hash);180 public Symbol findInternalSymbol(SimpleString name) 181 { 182 return internalSymbols.get(name.toString()); 183 } 184 185 public Symbol findExternalSymbol(SimpleString name) 186 { 187 return externalSymbols.get(name.toString()); 188 } 189 190 public Symbol findExternalSymbol(SimpleString name, int hash) 191 { 192 return externalSymbols.get(name.toString()); 199 193 } 200 194 201 195 // Returns null if symbol is not accessible in this package. 202 public synchronizedSymbol findAccessibleSymbol(String name)196 public Symbol findAccessibleSymbol(String name) 203 197 204 198 { … … 207 201 208 202 // Returns null if symbol is not accessible in this package. 209 public synchronizedSymbol findAccessibleSymbol(SimpleString name)203 public Symbol findAccessibleSymbol(SimpleString name) 210 204 211 205 { 212 206 // Look in external and internal symbols of this package. 213 Symbol symbol = externalSymbols.get(name );207 Symbol symbol = externalSymbols.get(name.toString()); 214 208 if (symbol != null) 215 209 return symbol; 216 symbol = internalSymbols.get(name );210 symbol = internalSymbols.get(name.toString()); 217 211 if (symbol != null) 218 212 return symbol; … … 232 226 } 233 227 234 public synchronizedLispObject findSymbol(String name)228 public LispObject findSymbol(String name) 235 229 236 230 { … … 238 232 final LispThread thread = LispThread.currentThread(); 239 233 // Look in external and internal symbols of this package. 240 Symbol symbol = externalSymbols.get( s);234 Symbol symbol = externalSymbols.get(name); 241 235 if (symbol != null) 242 236 return thread.setValues(symbol, Keyword.EXTERNAL); 243 symbol = internalSymbols.get( s);237 symbol = internalSymbols.get(name); 244 238 if (symbol != null) 245 239 return thread.setValues(symbol, Keyword.INTERNAL); … … 260 254 261 255 // Helper function to add NIL to PACKAGE_CL. 262 public synchronizedvoid addSymbol(Symbol symbol)256 public void addSymbol(Symbol symbol) 263 257 { 264 258 Debug.assertTrue(symbol.getPackage() == this); 265 259 Debug.assertTrue(symbol.getName().equals("NIL")); 266 externalSymbols.put(symbol.name , symbol);267 } 268 269 private synchronized Symbol addSymbol(SimpleString name, int hash)270 { 271 Symbol symbol = new Symbol(name, hash,this);260 externalSymbols.put(symbol.name.toString(), symbol); 261 } 262 263 private Symbol addSymbol(String name) 264 { 265 Symbol symbol = new Symbol(name, this); 272 266 if (this == PACKAGE_KEYWORD) { 273 267 symbol.initializeConstant(symbol); 274 externalSymbols.put(name , symbol);268 externalSymbols.put(name.toString(), symbol); 275 269 } else 276 internalSymbols.put(name , symbol);270 internalSymbols.put(name.toString(), symbol); 277 271 278 272 return symbol; 279 273 } 280 274 281 public synchronized Symbol addInternalSymbol(String symbolName) 275 private Symbol addSymbol(SimpleString name) 276 { 277 return addSymbol(name.toString()); 278 } 279 280 public Symbol addInternalSymbol(String symbolName) 282 281 { 283 282 final Symbol symbol = new Symbol(symbolName, this); 284 internalSymbols.put(symbol );283 internalSymbols.put(symbolName, symbol); 285 284 return symbol; 286 285 } 287 286 288 public synchronizedSymbol addExternalSymbol(String symbolName)287 public Symbol addExternalSymbol(String symbolName) 289 288 { 290 289 final Symbol symbol = new Symbol(symbolName, this); 291 externalSymbols.put(symbol );290 externalSymbols.put(symbolName, symbol); 292 291 return symbol; 293 292 } 294 293 294 public synchronized Symbol intern(SimpleString symbolName) 295 { 296 return intern(symbolName.toString()); 297 } 298 295 299 public synchronized Symbol intern(String symbolName) 296 300 { 297 return intern(new SimpleString(symbolName));298 }299 300 public synchronized Symbol intern(SimpleString symbolName)301 {302 final int hash = symbolName.sxhash();303 301 // Look in external and internal symbols of this package. 304 Symbol symbol = externalSymbols.get(symbolName , hash);302 Symbol symbol = externalSymbols.get(symbolName); 305 303 if (symbol != null) 306 304 return symbol; 307 symbol = internalSymbols.get(symbolName , hash);305 symbol = internalSymbols.get(symbolName); 308 306 if (symbol != null) 309 307 return symbol; … … 313 311 while (usedPackages != NIL) { 314 312 Package pkg = (Package) usedPackages.car(); 315 symbol = pkg. findExternalSymbol(symbolName, hash);313 symbol = pkg.externalSymbols.get(symbolName); 316 314 if (symbol != null) 317 315 return symbol; … … 320 318 } 321 319 // Not found. 322 return addSymbol(symbolName , hash);320 return addSymbol(symbolName); 323 321 } 324 322 … … 326 324 final LispThread thread) 327 325 { 328 final int hash = s.sxhash();329 326 // Look in external and internal symbols of this package. 330 Symbol symbol = externalSymbols.get(s , hash);327 Symbol symbol = externalSymbols.get(s.toString()); 331 328 if (symbol != null) 332 329 return (Symbol) thread.setValues(symbol, Keyword.EXTERNAL); 333 symbol = internalSymbols.get(s , hash);330 symbol = internalSymbols.get(s.toString()); 334 331 if (symbol != null) 335 332 return (Symbol) thread.setValues(symbol, Keyword.INTERNAL); … … 339 336 while (usedPackages != NIL) { 340 337 Package pkg = (Package) usedPackages.car(); 341 symbol = pkg.findExternalSymbol(s , hash);338 symbol = pkg.findExternalSymbol(s); 342 339 if (symbol != null) 343 340 return (Symbol) thread.setValues(symbol, Keyword.INHERITED); … … 346 343 } 347 344 // Not found. 348 return (Symbol) thread.setValues(addSymbol(s , hash), NIL);345 return (Symbol) thread.setValues(addSymbol(s), NIL); 349 346 } 350 347 … … 353 350 { 354 351 final SimpleString s = new SimpleString(symbolName); 355 final int hash = s.sxhash();356 352 // Look in external and internal symbols of this package. 357 Symbol symbol = externalSymbols.get(s , hash);353 Symbol symbol = externalSymbols.get(s.toString()); 358 354 if (symbol != null) 359 355 return symbol; 360 symbol = internalSymbols.get(s , hash);356 symbol = internalSymbols.get(s.toString()); 361 357 if (symbol != null) { 362 358 export(symbol); … … 368 364 while (usedPackages != NIL) { 369 365 Package pkg = (Package) usedPackages.car(); 370 symbol = pkg.findExternalSymbol(s , hash);366 symbol = pkg.findExternalSymbol(s); 371 367 if (symbol != null) { 372 368 export(symbol); … … 377 373 } 378 374 // Not found. 379 symbol = new Symbol(s, hash,this);375 symbol = new Symbol(s, this); 380 376 if (this == PACKAGE_KEYWORD) 381 377 symbol.initializeConstant(symbol); 382 externalSymbols.put(s , symbol);378 externalSymbols.put(s.toString(), symbol); 383 379 return symbol; 384 380 } … … 421 417 } 422 418 // Reaching here, it's OK to remove the symbol. 423 if (internalSymbols.get(symbol.name ) == symbol)424 internalSymbols.remove(symbol.name );425 else if (externalSymbols.get(symbol.name ) == symbol)426 externalSymbols.remove(symbol.name );419 if (internalSymbols.get(symbol.name.toString()) == symbol) 420 internalSymbols.remove(symbol.name.toString()); 421 else if (externalSymbols.get(symbol.name.toString()) == symbol) 422 externalSymbols.remove(symbol.name.toString()); 427 423 else 428 424 // Not found. … … 450 446 error(new PackageError(sb.toString())); 451 447 } 452 internalSymbols.put(symbol.name , symbol);448 internalSymbols.put(symbol.name.toString(), symbol); 453 449 if (symbol.getPackage() == NIL) 454 450 symbol.setPackage(this); … … 470 466 return; 471 467 } 472 internalSymbols.put(symbol.name , symbol);468 internalSymbols.put(symbol.name.toString(), symbol); 473 469 added = true; 474 470 } 475 if (added || internalSymbols.get(symbol.name ) == symbol) {471 if (added || internalSymbols.get(symbol.name.toString()) == symbol) { 476 472 if (usedByList != null) { 477 473 for (Iterator it = usedByList.iterator(); it.hasNext();) { … … 495 491 } 496 492 // No conflicts. 497 internalSymbols.remove(symbol.name );498 externalSymbols.put(symbol.name , symbol);493 internalSymbols.remove(symbol.name.toString()); 494 externalSymbols.put(symbol.name.toString(), symbol); 499 495 return; 500 496 } 501 if (externalSymbols.get(symbol.name ) == symbol)497 if (externalSymbols.get(symbol.name.toString()) == symbol) 502 498 // Symbol is already exported; there's nothing to do. 503 499 return; … … 514 510 { 515 511 if (symbol.getPackage() == this) { 516 if (externalSymbols.get(symbol.name ) == symbol) {517 externalSymbols.remove(symbol.name );518 internalSymbols.put(symbol.name , symbol);512 if (externalSymbols.get(symbol.name.toString()) == symbol) { 513 externalSymbols.remove(symbol.name.toString()); 514 internalSymbols.put(symbol.name.toString(), symbol); 519 515 } 520 516 } else { … … 543 539 shadowingSymbols = new HashMap<String,Symbol>(); 544 540 final SimpleString s = new SimpleString(symbolName); 545 Symbol symbol = externalSymbols.get(s );541 Symbol symbol = externalSymbols.get(s.toString()); 546 542 if (symbol != null) { 547 543 shadowingSymbols.put(symbolName, symbol); 548 544 return; 549 545 } 550 symbol = internalSymbols.get(s );546 symbol = internalSymbols.get(s.toString()); 551 547 if (symbol != null) { 552 548 shadowingSymbols.put(symbolName, symbol); … … 556 552 return; 557 553 symbol = new Symbol(s, this); 558 internalSymbols.put(s , symbol);554 internalSymbols.put(s.toString(), symbol); 559 555 shadowingSymbols.put(symbolName, symbol); 560 556 } … … 564 560 LispObject where = NIL; 565 561 final String symbolName = symbol.getName(); 566 Symbol sym = externalSymbols.get(symbol.name );562 Symbol sym = externalSymbols.get(symbol.name.toString()); 567 563 if (sym != null) { 568 564 where = Keyword.EXTERNAL; 569 565 } else { 570 sym = internalSymbols.get(symbol.name );566 sym = internalSymbols.get(symbol.name.toString()); 571 567 if (sym != null) { 572 568 where = Keyword.INTERNAL; … … 601 597 } 602 598 } 603 internalSymbols.put(symbol.name , symbol);599 internalSymbols.put(symbol.name.toString(), symbol); 604 600 if (shadowingSymbols == null) 605 601 shadowingSymbols = new HashMap<String,Symbol>(); … … 618 614 // "USE-PACKAGE checks for name conflicts between the newly 619 615 // imported symbols and those already accessible in package." 620 Listsymbols = pkg.getExternalSymbols();621 for ( int i = symbols.size(); i-- > 0;) {622 Symbol symbol = (Symbol) symbols.get(i);616 Collection symbols = pkg.getExternalSymbols(); 617 for (Iterator<Symbol> i = symbols.iterator(); i.hasNext();) { 618 Symbol symbol = i.next(); 623 619 Symbol existing = findAccessibleSymbol(symbol.name); 624 620 if (existing != null && existing != symbol) { … … 732 728 } 733 729 734 public synchronized ListgetExternalSymbols()735 { 736 return externalSymbols. getSymbols();730 public synchronized Collection getExternalSymbols() 731 { 732 return externalSymbols.values(); 737 733 } 738 734 … … 740 736 { 741 737 ArrayList<Symbol> list = new ArrayList<Symbol>(); 742 list.addAll(internalSymbols. getSymbols());743 list.addAll(externalSymbols. getSymbols());738 list.addAll(internalSymbols.values()); 739 list.addAll(externalSymbols.values()); 744 740 if (useList instanceof Cons) { 745 741 LispObject usedPackages = useList; 746 742 while (usedPackages != NIL) { 747 743 Package pkg = (Package) usedPackages.car(); 748 List<Symbol> symbols = pkg.externalSymbols.getSymbols(); 749 for (int i = 0; i < symbols.size(); i++) { 750 Symbol symbol = (Symbol) symbols.get(i); 751 if (shadowingSymbols == null || shadowingSymbols.get(symbol.getName()) == null) 752 list.add(symbol); 753 } 744 list.addAll(pkg.externalSymbols.values()); 745 754 746 usedPackages = usedPackages.cdr(); 755 747 } … … 761 753 { 762 754 LispObject list = NIL; 763 List symbols = internalSymbols.getSymbols();764 for ( int i = symbols.size(); i-- > 0;)765 list = new Cons( (Symbol)symbols.get(i), list);755 Collection symbols = internalSymbols.values(); 756 for (Iterator<Symbol> i = symbols.iterator(); i.hasNext();) 757 list = new Cons(i.next(), list); 766 758 return list; 767 759 } … … 770 762 { 771 763 LispObject list = NIL; 772 List symbols = externalSymbols.getSymbols();773 for ( int i = symbols.size(); i-- > 0;)774 list = new Cons( (Symbol)symbols.get(i), list);764 Collection symbols = externalSymbols.values(); 765 for (Iterator<Symbol> i = symbols.iterator(); i.hasNext();) 766 list = new Cons(i.next(), list); 775 767 return list; 776 768 } … … 783 775 while (usedPackages != NIL) { 784 776 Package pkg = (Package) usedPackages.car(); 785 Listexternals = pkg.getExternalSymbols();786 for ( int i = externals.size(); i-- > 0;) {787 Symbol symbol = (Symbol) externals.get(i);777 Collection externals = pkg.getExternalSymbols(); 778 for (Iterator<Symbol> i = externals.iterator(); i.hasNext();) { 779 Symbol symbol = i.next(); 788 780 if (shadowingSymbols != null && shadowingSymbols.get(symbol.getName()) != null) 789 781 continue; 790 if (externalSymbols.get(symbol.name ) == symbol)782 if (externalSymbols.get(symbol.name.toString()) == symbol) 791 783 continue; 792 784 list = new Cons(symbol, list); … … 801 793 { 802 794 LispObject list = NIL; 803 List internals = internalSymbols.getSymbols();804 for ( int i = internals.size(); i-- > 0;)805 list = new Cons( (Symbol)internals.get(i), list);806 List externals = externalSymbols.getSymbols();807 for ( int i = externals.size(); i-- > 0;)808 list = new Cons( (Symbol)externals.get(i), list);795 Collection internals = internalSymbols.values(); 796 for (Iterator<Symbol> i = internals.iterator(); i.hasNext();) 797 list = new Cons(i.next(), list); 798 Collection externals = externalSymbols.values(); 799 for (Iterator<Symbol> i = externals.iterator(); i.hasNext();) 800 list = new Cons(i.next(), list); 809 801 return list; 810 802 } … … 812 804 public synchronized Symbol[] symbols() 813 805 { 814 List internals = internalSymbols.getSymbols();815 List externals = externalSymbols.getSymbols();806 Collection internals = internalSymbols.values(); 807 Collection externals = externalSymbols.values(); 816 808 Symbol[] array = new Symbol[internals.size() + externals.size()]; 817 809 int i = 0;
Note: See TracChangeset
for help on using the changeset viewer.