Changeset 13828
- Timestamp:
- 01/29/12 23:13:37 (10 years ago)
- Location:
- trunk/abcl/src/org/armedbear/lisp
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/src/org/armedbear/lisp/ArgumentListProcessor.java
r13821 r13828 472 472 } 473 473 474 public Symbol[] freeSpecials(LispObject specials) { 475 ArrayList<Symbol> list = new ArrayList<Symbol>(); 476 477 next_special: 478 while (specials != NIL) { 479 Symbol special = (Symbol)specials.car(); 480 specials = specials.cdr(); 481 482 for (Symbol v : variables) 483 if (v == special) 484 continue next_special; 485 486 list.add(special); 487 } 488 489 Symbol[] rv = new Symbol[list.size()]; 490 return list.toArray(rv); 491 } 492 474 493 public int getArity() { 475 494 return arity; … … 482 501 public int getMaxArgs() { 483 502 return maxArgs; 503 } 504 505 public Symbol[] getVariables() { 506 return variables; 484 507 } 485 508 -
trunk/abcl/src/org/armedbear/lisp/Closure.java
r13826 r13828 71 71 private int maxArgs; 72 72 73 private Symbol[] variables = new Symbol[0];74 73 private LispObject specials = NIL; 75 76 private boolean bindInitForms; 77 74 private Symbol[] freeSpecials = new Symbol[0]; 78 75 79 76 private ArgumentListProcessor arglist; … … 111 108 andKey = keys != NIL; 112 109 allowOtherKeys = moreKeys != NIL; 113 variables = processVariables();114 bindInitForms = false;115 110 116 111 // stuff we don't need: we're a compiled function … … 373 368 if (arity >= 0) 374 369 Debug.assertTrue(arity == minArgs); 375 variables = processVariables();376 370 377 371 arglist = new ArgumentListProcessor(this, lambdaList, specials); 372 freeSpecials = arglist.freeSpecials(specials); 378 373 } 379 374 … … 386 381 if (parameter.svar != NIL) 387 382 vars.add((Symbol)parameter.svar); 388 if (!bindInitForms) 389 if (!parameter.initForm.constantp()) 390 bindInitForms = true; 391 } 392 } 393 394 // Also sets bindInitForms. 395 private final Symbol[] processVariables() 396 { 397 ArrayList<Symbol> vars = new ArrayList<Symbol>(); 398 for (Parameter parameter : requiredParameters) 399 vars.add(parameter.var); 400 processParameters(vars, optionalParameters); 401 if (restVar != null) 402 { 403 vars.add(restVar); 404 } 405 processParameters(vars, keywordParameters); 406 Symbol[] array = new Symbol[vars.size()]; 407 vars.toArray(array); 408 return array; 383 } 409 384 } 410 385 … … 426 401 public final LispObject getVariableList() 427 402 { 403 Symbol[] variables = arglist.getVariables(); 428 404 LispObject result = NIL; 429 405 for (int i = variables.length; i-- > 0;) … … 611 587 } 612 588 613 private final void declareFreeSpecials(Environment ext) 614 615 { 616 LispObject s = specials; 617 special: 618 while (s != NIL) { 619 Symbol special = (Symbol)s.car(); 620 s = s.cdr(); 621 for (Symbol var : variables) 622 if (special == var) 623 continue special; 624 for (Parameter parameter : auxVars) 625 if (special == parameter.var) 626 continue special; 627 ext.declareSpecial(special); 628 } 589 private void declareFreeSpecials(Environment ext) 590 { 591 for (Symbol special : freeSpecials) 592 ext.declareSpecial(special); 629 593 } 630 594
Note: See TracChangeset
for help on using the changeset viewer.