home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- class Scope implements Constants {
- private static ScopeEntry sentinel = new ScopeEntry((Obj)null, (ScopeEntry)null, (ScopeEntry)null, (Scope)null);
- static final int HASH_MASK = 127;
- static final int HASH_SIZE = 128;
- ScopeEntry elems;
- ScopeEntry[] hashtable;
- Obj owner;
- Scope next;
-
- ScopeEntry elements() {
- return this.elems;
- }
-
- ScopeEntry lookup(Name var1) {
- ScopeEntry var2;
- for(var2 = this.hashtable[var1.index & 127]; var2.scope != null && var2.obj.name.index != var1.index; var2 = var2.shadowed) {
- }
-
- return var2;
- }
-
- void baseOn(Scope var1) {
- if (var1 != null) {
- for(int var2 = 0; var2 < 128; ++var2) {
- ScopeEntry var3 = this.hashtable[var2];
- if (var3.scope == null) {
- this.hashtable[var2] = var1.hashtable[var2];
- } else {
- while(var3.shadowed.scope != null) {
- var3 = var3.shadowed;
- }
-
- var3.shadowed = var1.hashtable[var2];
- }
- }
- }
-
- this.next = var1;
- }
-
- void include(Scope var1) {
- if (var1 != null) {
- if (var1.next != null && var1.next.owner == var1.owner) {
- this.include(var1.next);
- }
-
- for(ScopeEntry var2 = var1.elements(); var2 != null; var2 = var2.sibling) {
- this.enter(var2.obj);
- }
- }
-
- }
-
- void enter(Obj var1) {
- int var2 = var1.name.index & 127;
- ScopeEntry var3 = new ScopeEntry(var1, this.hashtable[var2], this.elems, this);
- this.hashtable[var2] = var3;
- this.elems = var3;
- if (var1.owner == null) {
- var1.owner = this.owner;
- }
-
- }
-
- void restore() {
- for(ScopeEntry var1 = this.elems; var1 != null; var1 = var1.sibling) {
- int var2 = var1.obj.name.index & 127;
- var1.shadowed = this.hashtable[var2];
- this.hashtable[var2] = var1;
- }
-
- }
-
- void leave() {
- for(ScopeEntry var1 = this.elems; var1 != null; var1 = var1.sibling) {
- int var2 = var1.obj.name.index & 127;
- this.hashtable[var2] = this.hashtable[var2].shadowed;
- }
-
- }
-
- Scope duplicate() {
- return new Scope(this, this.owner, this.hashtable);
- }
-
- Scope(Scope var1, Obj var2) {
- this(var1, var2, new ScopeEntry[128]);
- if (var1 == null) {
- for(int var3 = 0; var3 < 128; ++var3) {
- this.hashtable[var3] = sentinel;
- }
- } else {
- for(int var4 = 0; var4 < 128; ++var4) {
- this.hashtable[var4] = var1.hashtable[var4];
- }
- }
-
- }
-
- Scope(Scope var1, Obj var2, ScopeEntry[] var3) {
- this.next = var1;
- this.owner = var2;
- this.hashtable = var3;
- this.elems = null;
- }
- }
-