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 / Context.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  10.9 KB  |  525 lines

  1. package sun.tools.tree;
  2.  
  3. import sun.tools.java.AmbiguousField;
  4. import sun.tools.java.ClassDefinition;
  5. import sun.tools.java.ClassNotFound;
  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.  
  11. public class Context implements Constants {
  12.    Context prev;
  13.    Node node;
  14.    int varNumber;
  15.    LocalField locals;
  16.    LocalField classes;
  17.    FieldDefinition field;
  18.    int scopeNumber;
  19.    int frameNumber;
  20.  
  21.    public Context(Context var1, FieldDefinition var2) {
  22.       this.field = var2;
  23.       if (var1 == null) {
  24.          this.frameNumber = 1;
  25.          this.scopeNumber = 2;
  26.          this.varNumber = 0;
  27.       } else {
  28.          this.prev = var1;
  29.          this.locals = var1.locals;
  30.          this.classes = var1.classes;
  31.          if (var2 == null || !var2.isVariable() && !var2.isInitializer()) {
  32.             this.frameNumber = var1.scopeNumber + 1;
  33.             this.scopeNumber = this.frameNumber + 1;
  34.          } else {
  35.             this.frameNumber = var1.frameNumber;
  36.             this.scopeNumber = var1.scopeNumber + 1;
  37.          }
  38.  
  39.          this.varNumber = var1.varNumber;
  40.       }
  41.    }
  42.  
  43.    public Context(Context var1, ClassDefinition var2) {
  44.       this(var1, (FieldDefinition)null);
  45.    }
  46.  
  47.    Context(Context var1, Node var2) {
  48.       if (var1 == null) {
  49.          this.frameNumber = 1;
  50.          this.scopeNumber = 2;
  51.          this.varNumber = 0;
  52.       } else {
  53.          this.prev = var1;
  54.          this.locals = var1.locals;
  55.          this.varNumber = var1.varNumber;
  56.          this.field = var1.field;
  57.          this.frameNumber = var1.frameNumber;
  58.          this.scopeNumber = var1.scopeNumber + 1;
  59.          this.node = var2;
  60.       }
  61.    }
  62.  
  63.    public Context(Context var1) {
  64.       this(var1, (Node)null);
  65.    }
  66.  
  67.    public int declare(Environment var1, LocalField var2) {
  68.       var2.scopeNumber = this.scopeNumber;
  69.       if (this.field == null && Constants.idThis.equals(((FieldDefinition)var2).getName())) {
  70.          ++var2.scopeNumber;
  71.       }
  72.  
  73.       if (((FieldDefinition)var2).isInnerClass()) {
  74.          var2.prev = this.classes;
  75.          this.classes = var2;
  76.          return 0;
  77.       } else {
  78.          ((FieldDefinition)var2).subModifiers(1048576);
  79.          var2.prev = this.locals;
  80.          this.locals = var2;
  81.          var2.number = this.varNumber;
  82.          this.varNumber += ((FieldDefinition)var2).getType().stackSize();
  83.          return var2.number;
  84.       }
  85.    }
  86.  
  87.    public LocalField getLocalField(Identifier var1) {
  88.       for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
  89.          if (var1.equals(((FieldDefinition)var2).getName())) {
  90.             return var2;
  91.          }
  92.       }
  93.  
  94.       return null;
  95.    }
  96.  
  97.    public int getScopeNumber(ClassDefinition var1) {
  98.       for(Context var2 = this; var2 != null; var2 = var2.prev) {
  99.          if (var2.field != null && var2.field.getClassDefinition() == var1) {
  100.             return var2.frameNumber;
  101.          }
  102.       }
  103.  
  104.       return -1;
  105.    }
  106.  
  107.    private FieldDefinition getFieldCommon(Environment var1, Identifier var2, boolean var3) throws AmbiguousField, ClassNotFound {
  108.       LocalField var4 = this.getLocalField(var2);
  109.       int var5 = var4 == null ? -2 : var4.scopeNumber;
  110.  
  111.       for(ClassDefinition var6 = this.field.getClassDefinition(); var6 != null; var6 = var6.getOuterClass()) {
  112.          FieldDefinition var7 = var6.getVariable(var1, var2);
  113.          if (var7 != null && this.getScopeNumber(var6) > var5 && (!var3 || var7.getClassDefinition() == var6)) {
  114.             return var7;
  115.          }
  116.       }
  117.  
  118.       return var4;
  119.    }
  120.  
  121.    public int declareMemberNumber(FieldDefinition var1) {
  122.       return this.declare((Environment)null, new LocalField(var1));
  123.    }
  124.  
  125.    public int getMemberNumber(FieldDefinition var1) {
  126.       for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
  127.          if (var2.getMember() == var1) {
  128.             return var2.number;
  129.          }
  130.       }
  131.  
  132.       return -1;
  133.    }
  134.  
  135.    public FieldDefinition getElement(int var1) {
  136.       for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
  137.          if (var2.number == var1) {
  138.             FieldDefinition var3 = var2.getMember();
  139.             if (var3 != null) {
  140.                return var3;
  141.             }
  142.  
  143.             return var2;
  144.          }
  145.       }
  146.  
  147.       return null;
  148.    }
  149.  
  150.    public LocalField getLocalClass(Identifier var1) {
  151.       for(LocalField var2 = this.classes; var2 != null; var2 = var2.prev) {
  152.          if (var1.equals(((FieldDefinition)var2).getName())) {
  153.             return var2;
  154.          }
  155.       }
  156.  
  157.       return null;
  158.    }
  159.  
  160.    private FieldDefinition getClassCommon(Environment var1, Identifier var2, boolean var3) throws ClassNotFound {
  161.       LocalField var4 = this.getLocalClass(var2);
  162.       int var5 = var4 == null ? -2 : var4.scopeNumber;
  163.  
  164.       for(ClassDefinition var6 = this.field.getClassDefinition(); var6 != null; var6 = var6.getOuterClass()) {
  165.          FieldDefinition var7 = var6.getInnerClass(var1, var2);
  166.          if (var7 != null && this.getScopeNumber(var6) > var5 && (!var3 || var7.getClassDefinition() == var6)) {
  167.             return var7;
  168.          }
  169.       }
  170.  
  171.       return var4;
  172.    }
  173.  
  174.    public final FieldDefinition getField(Environment var1, Identifier var2) throws AmbiguousField, ClassNotFound {
  175.       return this.getFieldCommon(var1, var2, false);
  176.    }
  177.  
  178.    public final FieldDefinition getApparentField(Environment var1, Identifier var2) throws AmbiguousField, ClassNotFound {
  179.       return this.getFieldCommon(var1, var2, true);
  180.    }
  181.  
  182.    public boolean isInScope(LocalField var1) {
  183.       for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
  184.          if (var1 == var2) {
  185.             return true;
  186.          }
  187.       }
  188.  
  189.       return false;
  190.    }
  191.  
  192.    public UplevelReference noteReference(Environment var1, LocalField var2) {
  193.       int var3 = !this.isInScope(var2) ? -1 : var2.scopeNumber;
  194.       UplevelReference var4 = null;
  195.       int var5 = -1;
  196.  
  197.       for(Context var6 = this; var6 != null; var6 = var6.prev) {
  198.          if (var5 != var6.frameNumber) {
  199.             var5 = var6.frameNumber;
  200.             if (var3 >= var5) {
  201.                break;
  202.             }
  203.  
  204.             ClassDefinition var7 = var6.field.getClassDefinition();
  205.             UplevelReference var8 = var7.getReference(var2);
  206.             var8.noteReference(var1, var6);
  207.             if (var4 == null) {
  208.                var4 = var8;
  209.             }
  210.          }
  211.       }
  212.  
  213.       return var4;
  214.    }
  215.  
  216.    public Expression makeReference(Environment var1, LocalField var2) {
  217.       UplevelReference var3 = this.noteReference(var1, var2);
  218.       if (var3 != null) {
  219.          return var3.makeLocalReference(var1, this);
  220.       } else {
  221.          return (Expression)(Constants.idThis.equals(((FieldDefinition)var2).getName()) ? new ThisExpression(0, var2) : new IdentifierExpression(0, var2));
  222.       }
  223.    }
  224.  
  225.    public Expression findOuterLink(Environment var1, int var2, FieldDefinition var3) {
  226.       ClassDefinition var4 = var3.getClassDefinition();
  227.       ClassDefinition var5 = var3.isStatic() ? null : (!var3.isConstructor() ? var4 : (var4.isTopLevel() ? null : var4.getOuterClass()));
  228.       return var5 == null ? null : this.findOuterLink(var1, var2, var5, var3);
  229.    }
  230.  
  231.    private static boolean match(Environment var0, ClassDefinition var1, ClassDefinition var2) {
  232.       try {
  233.          return var1 == var2 || var2.implementedBy(var0, var1.getClassDeclaration());
  234.       } catch (ClassNotFound var3) {
  235.          return false;
  236.       }
  237.    }
  238.  
  239.    public Expression findOuterLink(Environment var1, int var2, ClassDefinition var3, FieldDefinition var4) {
  240.       if (this.field.isStatic()) {
  241.          if (var4 == null) {
  242.             Identifier var14 = var3.getName().getFlatName().getName();
  243.             var1.error(var2, "undef.var", Identifier.lookup(var14, Constants.idThis));
  244.          } else if (var4.isConstructor()) {
  245.             var1.error(var2, "no.outer.arg", var3, var4.getClassDeclaration());
  246.          } else if (var4.isMethod()) {
  247.             var1.error(var2, "no.static.meth.access", var4, var4.getClassDeclaration());
  248.          } else {
  249.             var1.error(var2, "no.static.field.access", var4.getName(), var4.getClassDeclaration());
  250.          }
  251.  
  252.          ThisExpression var15 = new ThisExpression(var2, this);
  253.          var15.type = var3.getType();
  254.          return var15;
  255.       } else if (!var1.innerClasses()) {
  256.          return new ThisExpression(var2, this);
  257.       } else {
  258.          LocalField var5 = this.locals;
  259.          Object var6 = null;
  260.          Object var7 = null;
  261.          ClassDefinition var8 = null;
  262.          ClassDefinition var9 = null;
  263.          if (this.field.isConstructor()) {
  264.             var9 = this.field.getClassDefinition();
  265.          }
  266.  
  267.          if (!this.field.isMethod()) {
  268.             var8 = this.field.getClassDefinition();
  269.             var6 = new ThisExpression(var2, this);
  270.          }
  271.  
  272.          while(true) {
  273.             if (var6 == null) {
  274.                while(var5 != null && !Constants.idThis.equals(((FieldDefinition)var5).getName())) {
  275.                   var5 = var5.prev;
  276.                }
  277.  
  278.                if (var5 == null) {
  279.                   break;
  280.                }
  281.  
  282.                var6 = new ThisExpression(var2, var5);
  283.                var8 = ((FieldDefinition)var5).getClassDefinition();
  284.                var5 = var5.prev;
  285.             }
  286.  
  287.             if (match(var1, var8, var3)) {
  288.                break;
  289.             }
  290.  
  291.             FieldDefinition var10 = var8.findOuterField();
  292.             if (var10 == null) {
  293.                var6 = null;
  294.             } else {
  295.                ClassDefinition var11 = var8;
  296.                var8 = var8.getOuterClass();
  297.                if (var11 == var9) {
  298.                   Identifier var12 = var10.getName();
  299.                   IdentifierExpression var13 = new IdentifierExpression(var2, var12);
  300.                   var13.bind(var1, this);
  301.                   var6 = var13;
  302.                } else {
  303.                   var6 = new FieldExpression(var2, (Expression)var6, var10);
  304.                }
  305.             }
  306.          }
  307.  
  308.          if (var6 != null) {
  309.             return (Expression)var6;
  310.          } else {
  311.             if (var4 == null) {
  312.                Identifier var16 = var3.getName().getFlatName().getName();
  313.                var1.error(var2, "undef.var", Identifier.lookup(var16, Constants.idThis));
  314.             } else if (var4.isConstructor()) {
  315.                var1.error(var2, "no.outer.arg", var3, var4.getClassDefinition());
  316.             } else {
  317.                var1.error(var2, "no.static.field.access", var4, this.field);
  318.             }
  319.  
  320.             ThisExpression var17 = new ThisExpression(var2, this);
  321.             var17.type = var3.getType();
  322.             return var17;
  323.          }
  324.       }
  325.    }
  326.  
  327.    public static boolean outerLinkExists(Environment var0, ClassDefinition var1, ClassDefinition var2) {
  328.       while(!match(var0, var2, var1)) {
  329.          if (var2.isTopLevel()) {
  330.             return false;
  331.          }
  332.  
  333.          var2 = var2.getOuterClass();
  334.       }
  335.  
  336.       return true;
  337.    }
  338.  
  339.    public ClassDefinition findScope(Environment var1, ClassDefinition var2) {
  340.       ClassDefinition var3;
  341.       for(var3 = this.field.getClassDefinition(); var3 != null && !match(var1, var3, var2); var3 = var3.getOuterClass()) {
  342.       }
  343.  
  344.       return var3;
  345.    }
  346.  
  347.    Identifier resolveName(Environment var1, Identifier var2) {
  348.       if (var1.innerClasses()) {
  349.          if (var2.isQualified()) {
  350.             Identifier var6 = this.resolveName(var1, var2.getHead());
  351.             if (!var1.classExists(var6)) {
  352.                return var1.resolvePackageQualifiedName(var2);
  353.             }
  354.  
  355.             try {
  356.                return var1.getClassDefinition(var6).resolveInnerClass(var1, var2.getTail());
  357.             } catch (ClassNotFound var4) {
  358.                return Identifier.lookupInner(var6, var2.getTail());
  359.             }
  360.          }
  361.  
  362.          try {
  363.             FieldDefinition var3 = this.getClassCommon(var1, var2, false);
  364.             if (var3 != null) {
  365.                return var3.getInnerClass().getName();
  366.             }
  367.          } catch (ClassNotFound var5) {
  368.          }
  369.       }
  370.  
  371.       return var1.resolveName(var2);
  372.    }
  373.  
  374.    public Identifier getApparentClassName(Environment var1, Identifier var2) {
  375.       if (var1.innerClasses()) {
  376.          if (var2.isQualified()) {
  377.             Identifier var6 = this.getApparentClassName(var1, var2.getHead());
  378.             if (var6 == null) {
  379.                return Constants.idNull;
  380.             }
  381.  
  382.             return Identifier.lookup(var6, var2.getTail());
  383.          }
  384.  
  385.          try {
  386.             FieldDefinition var3 = this.getClassCommon(var1, var2, true);
  387.             if (var3 != null) {
  388.                return var3.getInnerClass().getName();
  389.             }
  390.          } catch (ClassNotFound var4) {
  391.          }
  392.       }
  393.  
  394.       Identifier var5 = this.field.getClassDefinition().getTopClass().getName();
  395.       return var5.getName().equals(var2) ? var5 : Constants.idNull;
  396.    }
  397.  
  398.    public void checkBackBranch(Environment var1, Statement var2, Vset var3, Vset var4) {
  399.       for(LocalField var5 = this.locals; var5 != null; var5 = var5.prev) {
  400.          if (((FieldDefinition)var5).isBlankFinal() && var3.testVarUnassigned(var5.number) && !var4.testVarUnassigned(var5.number)) {
  401.             var1.error(var2.where, "assign.to.blank.final.in.loop", ((FieldDefinition)var5).getName());
  402.          }
  403.       }
  404.  
  405.    }
  406.  
  407.    public boolean canReach(Environment var1, FieldDefinition var2) {
  408.       return this.field.canReach(var1, var2);
  409.    }
  410.  
  411.    public Context getLabelContext(Identifier var1) {
  412.       for(Context var2 = this; var2 != null; var2 = var2.prev) {
  413.          if (var2.node != null && var2.node instanceof Statement && ((Statement)var2.node).hasLabel(var1)) {
  414.             return var2;
  415.          }
  416.       }
  417.  
  418.       return null;
  419.    }
  420.  
  421.    public Context getBreakContext(Identifier var1) {
  422.       if (var1 != null) {
  423.          return this.getLabelContext(var1);
  424.       } else {
  425.          for(Context var2 = this; var2 != null; var2 = var2.prev) {
  426.             if (var2.node != null) {
  427.                switch (var2.node.op) {
  428.                   case 92:
  429.                   case 93:
  430.                   case 94:
  431.                   case 95:
  432.                      return var2;
  433.                }
  434.             }
  435.          }
  436.  
  437.          return null;
  438.       }
  439.    }
  440.  
  441.    public Context getContinueContext(Identifier var1) {
  442.       if (var1 != null) {
  443.          return this.getLabelContext(var1);
  444.       } else {
  445.          for(Context var2 = this; var2 != null; var2 = var2.prev) {
  446.             if (var2.node != null) {
  447.                switch (var2.node.op) {
  448.                   case 92:
  449.                   case 93:
  450.                   case 94:
  451.                      return var2;
  452.                }
  453.             }
  454.          }
  455.  
  456.          return null;
  457.       }
  458.    }
  459.  
  460.    public CheckContext getReturnContext() {
  461.       for(Context var1 = this; var1 != null; var1 = var1.prev) {
  462.          if (var1.node != null && var1.node.op == 47) {
  463.             return (CheckContext)var1;
  464.          }
  465.       }
  466.  
  467.       return null;
  468.    }
  469.  
  470.    Context getInlineContext() {
  471.       for(Context var1 = this; var1 != null; var1 = var1.prev) {
  472.          if (var1.node != null) {
  473.             switch (var1.node.op) {
  474.                case 150:
  475.                case 151:
  476.                   return var1;
  477.             }
  478.          }
  479.       }
  480.  
  481.       return null;
  482.    }
  483.  
  484.    Context getInlineFieldContext(FieldDefinition var1) {
  485.       for(Context var2 = this; var2 != null; var2 = var2.prev) {
  486.          if (var2.node != null) {
  487.             switch (var2.node.op) {
  488.                case 150:
  489.                   if (((InlineMethodExpression)var2.node).field.equals(var1)) {
  490.                      return var2;
  491.                   }
  492.                   break;
  493.                case 151:
  494.                   if (((InlineNewInstanceExpression)var2.node).field.equals(var1)) {
  495.                      return var2;
  496.                   }
  497.             }
  498.          }
  499.       }
  500.  
  501.       return null;
  502.    }
  503.  
  504.    public final Vset removeAdditionalVars(Vset var1) {
  505.       return var1.removeAdditionalVars(this.varNumber);
  506.    }
  507.  
  508.    public final int getVarNumber() {
  509.       return this.varNumber;
  510.    }
  511.  
  512.    public int getThisNumber() {
  513.       LocalField var1 = this.getLocalField(Constants.idThis);
  514.       return var1 != null && ((FieldDefinition)var1).getClassDefinition() == this.field.getClassDefinition() ? var1.number : this.varNumber;
  515.    }
  516.  
  517.    public final FieldDefinition getField() {
  518.       return this.field;
  519.    }
  520.  
  521.    public static Environment newEnvironment(Environment var0, Context var1) {
  522.       return new ContextEnvironment(var0, var1);
  523.    }
  524. }
  525.