Changeset 5126


Ignore:
Timestamp:
12/14/03 17:11:16 (17 years ago)
Author:
piso
Message:

Enforce lexical scope of GO tags.

File:
1 edited

Legend:

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

    r4838 r5126  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: Do.java,v 1.4 2003-11-19 16:16:48 piso Exp $
     5 * $Id: Do.java,v 1.5 2003-12-14 17:11:16 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    9696                break;
    9797        }
    98         Environment ext = new Environment(env);
     98        final Environment ext = new Environment(env);
    9999        for (int i = 0; i < length; i++) {
    100100            Symbol symbol = variables[i];
     
    111111        final int depth = thread.getStackDepth();
    112112        // Look for tags.
    113         Binding tags = null;
    114113        LispObject remaining = body;
    115114        while (remaining != NIL) {
     
    119118                continue;
    120119            // It's a tag.
    121             tags = new Binding(current, remaining, tags);
     120            ext.addTagBinding(current, remaining);
    122121        }
    123122        try {
     
    135134                            // Handle GO inline if possible.
    136135                            if (current.car() == Symbol.GO) {
    137                                 LispObject code = null;
    138136                                LispObject tag = current.cadr();
    139                                 for (Binding binding = tags; binding != null; binding = binding.next) {
    140                                     if (binding.symbol.eql(tag)) {
    141                                         code = binding.value;
    142                                         break;
    143                                     }
    144                                 }
    145                                 if (code != null) {
    146                                     remaining = code;
     137                                Binding binding = ext.getTagBinding(tag);
     138                                if (binding != null && binding.value != null) {
     139                                    remaining = binding.value;
    147140                                    continue;
    148141                                }
     
    152145                        }
    153146                        catch (Go go) {
    154                             LispObject code = null;
    155147                            LispObject tag = go.getTag();
    156                             for (Binding binding = tags; binding != null; binding = binding.next) {
    157                                 if (binding.symbol.eql(tag)) {
    158                                     code = binding.value;
    159                                     break;
    160                                 }
    161                             }
    162                             if (code != null) {
    163                                 remaining = code;
     148                            Binding binding = ext.getTagBinding(tag);
     149                            if (binding != null && binding.value != null) {
     150                                remaining = binding.value;
    164151                                thread.setStackDepth(depth);
    165152                                continue;
Note: See TracChangeset for help on using the changeset viewer.