home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / tree / UplevelReference.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  6.1 KB  |  205 lines

  1. package sun.tools.tree;
  2.  
  3. import sun.tools.asm.Assembler;
  4. import sun.tools.java.ClassDefinition;
  5. import sun.tools.java.CompilerError;
  6. import sun.tools.java.Constants;
  7. import sun.tools.java.Environment;
  8. import sun.tools.java.FieldDefinition;
  9. import sun.tools.java.Identifier;
  10. import sun.tools.java.IdentifierToken;
  11.  
  12. public class UplevelReference implements Constants {
  13.    ClassDefinition client;
  14.    LocalField target;
  15.    LocalField localArgument;
  16.    FieldDefinition localField;
  17.    UplevelReference next;
  18.  
  19.    public UplevelReference(ClassDefinition var1, LocalField var2) {
  20.       this.client = var1;
  21.       this.target = var2;
  22.       Identifier var3;
  23.       if (((FieldDefinition)var2).getName().equals(Constants.idThis)) {
  24.          ClassDefinition var4 = ((FieldDefinition)var2).getClassDefinition();
  25.          int var5 = 0;
  26.  
  27.          for(ClassDefinition var6 = var4; !var6.isTopLevel(); var6 = var6.getOuterClass()) {
  28.             ++var5;
  29.          }
  30.  
  31.          var3 = Identifier.lookup("this$" + var5);
  32.       } else {
  33.          var3 = Identifier.lookup("val$" + ((FieldDefinition)var2).getName());
  34.       }
  35.  
  36.       Identifier var8 = var3;
  37.       int var9 = 0;
  38.  
  39.       while(true) {
  40.          boolean var10 = var1.getFirstMatch(var3) != null;
  41.  
  42.          for(UplevelReference var7 = var1.getReferences(); var7 != null; var7 = var7.next) {
  43.             if (var7.target.getName().equals(var3)) {
  44.                var10 = true;
  45.             }
  46.          }
  47.  
  48.          if (!var10) {
  49.             this.localArgument = new LocalField(((FieldDefinition)var2).getWhere(), var1, 524304, ((FieldDefinition)var2).getType(), var3);
  50.             return;
  51.          }
  52.  
  53.          StringBuffer var10000 = (new StringBuffer(String.valueOf(var8))).append("$");
  54.          ++var9;
  55.          var3 = Identifier.lookup(var10000.append(var9).toString());
  56.       }
  57.    }
  58.  
  59.    public UplevelReference insertInto(UplevelReference var1) {
  60.       if (var1 != null && !this.isEarlierThan(var1)) {
  61.          UplevelReference var2;
  62.          for(var2 = var1; var2.next != null && !this.isEarlierThan(var2.next); var2 = var2.next) {
  63.          }
  64.  
  65.          this.next = var2.next;
  66.          var2.next = this;
  67.          return var1;
  68.       } else {
  69.          this.next = var1;
  70.          return this;
  71.       }
  72.    }
  73.  
  74.    public final boolean isEarlierThan(UplevelReference var1) {
  75.       if (this.isClientOuterField()) {
  76.          return true;
  77.       } else if (var1.isClientOuterField()) {
  78.          return false;
  79.       } else {
  80.          LocalField var2 = var1.target;
  81.          Identifier var3 = this.target.getName();
  82.          Identifier var4 = ((FieldDefinition)var2).getName();
  83.          int var5 = var3.toString().compareTo(var4.toString());
  84.          if (var5 != 0) {
  85.             return var5 < 0;
  86.          } else {
  87.             Identifier var6 = this.target.getClassDefinition().getName();
  88.             Identifier var7 = ((FieldDefinition)var2).getClassDefinition().getName();
  89.             int var8 = var6.toString().compareTo(var7.toString());
  90.             return var8 < 0;
  91.          }
  92.       }
  93.    }
  94.  
  95.    public final LocalField getTarget() {
  96.       return this.target;
  97.    }
  98.  
  99.    public final LocalField getLocalArgument() {
  100.       return this.localArgument;
  101.    }
  102.  
  103.    public final FieldDefinition getLocalField() {
  104.       return this.localField;
  105.    }
  106.  
  107.    public final FieldDefinition getLocalField(Environment var1) {
  108.       if (this.localField == null) {
  109.          this.makeLocalField(var1);
  110.       }
  111.  
  112.       return this.localField;
  113.    }
  114.  
  115.    public final ClassDefinition getClient() {
  116.       return this.client;
  117.    }
  118.  
  119.    public final UplevelReference getNext() {
  120.       return this.next;
  121.    }
  122.  
  123.    public boolean isClientOuterField() {
  124.       FieldDefinition var1 = this.client.findOuterField();
  125.       return var1 != null && this.localField == var1;
  126.    }
  127.  
  128.    public boolean localArgumentAvailable(Environment var1, Context var2) {
  129.       FieldDefinition var3 = var2.field;
  130.       if (var3.getClassDefinition() != this.client) {
  131.          throw new CompilerError("localArgumentAvailable");
  132.       } else {
  133.          return var3.isConstructor() || var3.isVariable() || var3.isInitializer();
  134.       }
  135.    }
  136.  
  137.    public void noteReference(Environment var1, Context var2) {
  138.       if (this.localField == null && !this.localArgumentAvailable(var1, var2)) {
  139.          this.makeLocalField(var1);
  140.       }
  141.  
  142.    }
  143.  
  144.    private void makeLocalField(Environment var1) {
  145.       this.client.referencesMustNotBeFrozen();
  146.       int var2 = 524306;
  147.       this.localField = var1.makeFieldDefinition(var1, this.localArgument.getWhere(), this.client, (String)null, var2, this.localArgument.getType(), this.localArgument.getName(), (IdentifierToken[])null, (IdentifierToken[])null, (Object)null);
  148.    }
  149.  
  150.    public Expression makeLocalReference(Environment var1, Context var2) {
  151.       if (var2.field.getClassDefinition() != this.client) {
  152.          throw new CompilerError("makeLocalReference");
  153.       } else {
  154.          return (Expression)(this.localArgumentAvailable(var1, var2) ? new IdentifierExpression(0, this.localArgument) : this.makeFieldReference(var1, var2));
  155.       }
  156.    }
  157.  
  158.    public Expression makeFieldReference(Environment var1, Context var2) {
  159.       Expression var3 = var2.findOuterLink(var1, 0, this.localField);
  160.       return new FieldExpression(0, var3, this.localField);
  161.    }
  162.  
  163.    public void willCodeArguments(Environment var1, Context var2) {
  164.       if (!this.isClientOuterField()) {
  165.          var2.noteReference(var1, this.target);
  166.       }
  167.  
  168.       if (this.next != null) {
  169.          this.next.willCodeArguments(var1, var2);
  170.       }
  171.  
  172.    }
  173.  
  174.    public void codeArguments(Environment var1, Context var2, Assembler var3, int var4, FieldDefinition var5) {
  175.       if (!this.isClientOuterField()) {
  176.          Expression var6 = var2.makeReference(var1, this.target);
  177.          var6.codeValue(var1, var2, var3);
  178.       }
  179.  
  180.       if (this.next != null) {
  181.          this.next.codeArguments(var1, var2, var3, var4, var5);
  182.       }
  183.  
  184.    }
  185.  
  186.    public void codeInitialization(Environment var1, Context var2, Assembler var3, int var4, FieldDefinition var5) {
  187.       if (this.localField != null) {
  188.          Expression var6 = var2.makeReference(var1, this.target);
  189.          Expression var7 = this.makeFieldReference(var1, var2);
  190.          AssignExpression var8 = new AssignExpression(((Node)var6).getWhere(), var7, var6);
  191.          var8.type = this.localField.getType();
  192.          ((Expression)var8).code(var1, var2, var3);
  193.       }
  194.  
  195.       if (this.next != null) {
  196.          this.next.codeInitialization(var1, var2, var3, var4, var5);
  197.       }
  198.  
  199.    }
  200.  
  201.    public String toString() {
  202.       return "[" + this.localArgument + " in " + this.client + "]";
  203.    }
  204. }
  205.