home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import sun.tools.java.AmbiguousField;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Identifier;
-
- public class Context implements Constants {
- Context prev;
- Node node;
- int varNumber;
- LocalField locals;
- LocalField classes;
- FieldDefinition field;
- int scopeNumber;
- int frameNumber;
-
- public Context(Context var1, FieldDefinition var2) {
- this.field = var2;
- if (var1 == null) {
- this.frameNumber = 1;
- this.scopeNumber = 2;
- this.varNumber = 0;
- } else {
- this.prev = var1;
- this.locals = var1.locals;
- this.classes = var1.classes;
- if (var2 == null || !var2.isVariable() && !var2.isInitializer()) {
- this.frameNumber = var1.scopeNumber + 1;
- this.scopeNumber = this.frameNumber + 1;
- } else {
- this.frameNumber = var1.frameNumber;
- this.scopeNumber = var1.scopeNumber + 1;
- }
-
- this.varNumber = var1.varNumber;
- }
- }
-
- public Context(Context var1, ClassDefinition var2) {
- this(var1, (FieldDefinition)null);
- }
-
- Context(Context var1, Node var2) {
- if (var1 == null) {
- this.frameNumber = 1;
- this.scopeNumber = 2;
- this.varNumber = 0;
- } else {
- this.prev = var1;
- this.locals = var1.locals;
- this.varNumber = var1.varNumber;
- this.field = var1.field;
- this.frameNumber = var1.frameNumber;
- this.scopeNumber = var1.scopeNumber + 1;
- this.node = var2;
- }
- }
-
- public Context(Context var1) {
- this(var1, (Node)null);
- }
-
- public int declare(Environment var1, LocalField var2) {
- var2.scopeNumber = this.scopeNumber;
- if (this.field == null && Constants.idThis.equals(((FieldDefinition)var2).getName())) {
- ++var2.scopeNumber;
- }
-
- if (((FieldDefinition)var2).isInnerClass()) {
- var2.prev = this.classes;
- this.classes = var2;
- return 0;
- } else {
- ((FieldDefinition)var2).subModifiers(1048576);
- var2.prev = this.locals;
- this.locals = var2;
- var2.number = this.varNumber;
- this.varNumber += ((FieldDefinition)var2).getType().stackSize();
- return var2.number;
- }
- }
-
- public LocalField getLocalField(Identifier var1) {
- for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
- if (var1.equals(((FieldDefinition)var2).getName())) {
- return var2;
- }
- }
-
- return null;
- }
-
- public int getScopeNumber(ClassDefinition var1) {
- for(Context var2 = this; var2 != null; var2 = var2.prev) {
- if (var2.field != null && var2.field.getClassDefinition() == var1) {
- return var2.frameNumber;
- }
- }
-
- return -1;
- }
-
- private FieldDefinition getFieldCommon(Environment var1, Identifier var2, boolean var3) throws AmbiguousField, ClassNotFound {
- LocalField var4 = this.getLocalField(var2);
- int var5 = var4 == null ? -2 : var4.scopeNumber;
-
- for(ClassDefinition var6 = this.field.getClassDefinition(); var6 != null; var6 = var6.getOuterClass()) {
- FieldDefinition var7 = var6.getVariable(var1, var2);
- if (var7 != null && this.getScopeNumber(var6) > var5 && (!var3 || var7.getClassDefinition() == var6)) {
- return var7;
- }
- }
-
- return var4;
- }
-
- public int declareMemberNumber(FieldDefinition var1) {
- return this.declare((Environment)null, new LocalField(var1));
- }
-
- public int getMemberNumber(FieldDefinition var1) {
- for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
- if (var2.getMember() == var1) {
- return var2.number;
- }
- }
-
- return -1;
- }
-
- public FieldDefinition getElement(int var1) {
- for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
- if (var2.number == var1) {
- FieldDefinition var3 = var2.getMember();
- if (var3 != null) {
- return var3;
- }
-
- return var2;
- }
- }
-
- return null;
- }
-
- public LocalField getLocalClass(Identifier var1) {
- for(LocalField var2 = this.classes; var2 != null; var2 = var2.prev) {
- if (var1.equals(((FieldDefinition)var2).getName())) {
- return var2;
- }
- }
-
- return null;
- }
-
- private FieldDefinition getClassCommon(Environment var1, Identifier var2, boolean var3) throws ClassNotFound {
- LocalField var4 = this.getLocalClass(var2);
- int var5 = var4 == null ? -2 : var4.scopeNumber;
-
- for(ClassDefinition var6 = this.field.getClassDefinition(); var6 != null; var6 = var6.getOuterClass()) {
- FieldDefinition var7 = var6.getInnerClass(var1, var2);
- if (var7 != null && this.getScopeNumber(var6) > var5 && (!var3 || var7.getClassDefinition() == var6)) {
- return var7;
- }
- }
-
- return var4;
- }
-
- public final FieldDefinition getField(Environment var1, Identifier var2) throws AmbiguousField, ClassNotFound {
- return this.getFieldCommon(var1, var2, false);
- }
-
- public final FieldDefinition getApparentField(Environment var1, Identifier var2) throws AmbiguousField, ClassNotFound {
- return this.getFieldCommon(var1, var2, true);
- }
-
- public boolean isInScope(LocalField var1) {
- for(LocalField var2 = this.locals; var2 != null; var2 = var2.prev) {
- if (var1 == var2) {
- return true;
- }
- }
-
- return false;
- }
-
- public UplevelReference noteReference(Environment var1, LocalField var2) {
- int var3 = !this.isInScope(var2) ? -1 : var2.scopeNumber;
- UplevelReference var4 = null;
- int var5 = -1;
-
- for(Context var6 = this; var6 != null; var6 = var6.prev) {
- if (var5 != var6.frameNumber) {
- var5 = var6.frameNumber;
- if (var3 >= var5) {
- break;
- }
-
- ClassDefinition var7 = var6.field.getClassDefinition();
- UplevelReference var8 = var7.getReference(var2);
- var8.noteReference(var1, var6);
- if (var4 == null) {
- var4 = var8;
- }
- }
- }
-
- return var4;
- }
-
- public Expression makeReference(Environment var1, LocalField var2) {
- UplevelReference var3 = this.noteReference(var1, var2);
- if (var3 != null) {
- return var3.makeLocalReference(var1, this);
- } else {
- return (Expression)(Constants.idThis.equals(((FieldDefinition)var2).getName()) ? new ThisExpression(0, var2) : new IdentifierExpression(0, var2));
- }
- }
-
- public Expression findOuterLink(Environment var1, int var2, FieldDefinition var3) {
- ClassDefinition var4 = var3.getClassDefinition();
- ClassDefinition var5 = var3.isStatic() ? null : (!var3.isConstructor() ? var4 : (var4.isTopLevel() ? null : var4.getOuterClass()));
- return var5 == null ? null : this.findOuterLink(var1, var2, var5, var3);
- }
-
- private static boolean match(Environment var0, ClassDefinition var1, ClassDefinition var2) {
- try {
- return var1 == var2 || var2.implementedBy(var0, var1.getClassDeclaration());
- } catch (ClassNotFound var3) {
- return false;
- }
- }
-
- public Expression findOuterLink(Environment var1, int var2, ClassDefinition var3, FieldDefinition var4) {
- if (this.field.isStatic()) {
- if (var4 == null) {
- Identifier var14 = var3.getName().getFlatName().getName();
- var1.error(var2, "undef.var", Identifier.lookup(var14, Constants.idThis));
- } else if (var4.isConstructor()) {
- var1.error(var2, "no.outer.arg", var3, var4.getClassDeclaration());
- } else if (var4.isMethod()) {
- var1.error(var2, "no.static.meth.access", var4, var4.getClassDeclaration());
- } else {
- var1.error(var2, "no.static.field.access", var4.getName(), var4.getClassDeclaration());
- }
-
- ThisExpression var15 = new ThisExpression(var2, this);
- var15.type = var3.getType();
- return var15;
- } else if (!var1.innerClasses()) {
- return new ThisExpression(var2, this);
- } else {
- LocalField var5 = this.locals;
- Object var6 = null;
- Object var7 = null;
- ClassDefinition var8 = null;
- ClassDefinition var9 = null;
- if (this.field.isConstructor()) {
- var9 = this.field.getClassDefinition();
- }
-
- if (!this.field.isMethod()) {
- var8 = this.field.getClassDefinition();
- var6 = new ThisExpression(var2, this);
- }
-
- while(true) {
- if (var6 == null) {
- while(var5 != null && !Constants.idThis.equals(((FieldDefinition)var5).getName())) {
- var5 = var5.prev;
- }
-
- if (var5 == null) {
- break;
- }
-
- var6 = new ThisExpression(var2, var5);
- var8 = ((FieldDefinition)var5).getClassDefinition();
- var5 = var5.prev;
- }
-
- if (match(var1, var8, var3)) {
- break;
- }
-
- FieldDefinition var10 = var8.findOuterField();
- if (var10 == null) {
- var6 = null;
- } else {
- ClassDefinition var11 = var8;
- var8 = var8.getOuterClass();
- if (var11 == var9) {
- Identifier var12 = var10.getName();
- IdentifierExpression var13 = new IdentifierExpression(var2, var12);
- var13.bind(var1, this);
- var6 = var13;
- } else {
- var6 = new FieldExpression(var2, (Expression)var6, var10);
- }
- }
- }
-
- if (var6 != null) {
- return (Expression)var6;
- } else {
- if (var4 == null) {
- Identifier var16 = var3.getName().getFlatName().getName();
- var1.error(var2, "undef.var", Identifier.lookup(var16, Constants.idThis));
- } else if (var4.isConstructor()) {
- var1.error(var2, "no.outer.arg", var3, var4.getClassDefinition());
- } else {
- var1.error(var2, "no.static.field.access", var4, this.field);
- }
-
- ThisExpression var17 = new ThisExpression(var2, this);
- var17.type = var3.getType();
- return var17;
- }
- }
- }
-
- public static boolean outerLinkExists(Environment var0, ClassDefinition var1, ClassDefinition var2) {
- while(!match(var0, var2, var1)) {
- if (var2.isTopLevel()) {
- return false;
- }
-
- var2 = var2.getOuterClass();
- }
-
- return true;
- }
-
- public ClassDefinition findScope(Environment var1, ClassDefinition var2) {
- ClassDefinition var3;
- for(var3 = this.field.getClassDefinition(); var3 != null && !match(var1, var3, var2); var3 = var3.getOuterClass()) {
- }
-
- return var3;
- }
-
- Identifier resolveName(Environment var1, Identifier var2) {
- if (var1.innerClasses()) {
- if (var2.isQualified()) {
- Identifier var6 = this.resolveName(var1, var2.getHead());
- if (!var1.classExists(var6)) {
- return var1.resolvePackageQualifiedName(var2);
- }
-
- try {
- return var1.getClassDefinition(var6).resolveInnerClass(var1, var2.getTail());
- } catch (ClassNotFound var4) {
- return Identifier.lookupInner(var6, var2.getTail());
- }
- }
-
- try {
- FieldDefinition var3 = this.getClassCommon(var1, var2, false);
- if (var3 != null) {
- return var3.getInnerClass().getName();
- }
- } catch (ClassNotFound var5) {
- }
- }
-
- return var1.resolveName(var2);
- }
-
- public Identifier getApparentClassName(Environment var1, Identifier var2) {
- if (var1.innerClasses()) {
- if (var2.isQualified()) {
- Identifier var6 = this.getApparentClassName(var1, var2.getHead());
- if (var6 == null) {
- return Constants.idNull;
- }
-
- return Identifier.lookup(var6, var2.getTail());
- }
-
- try {
- FieldDefinition var3 = this.getClassCommon(var1, var2, true);
- if (var3 != null) {
- return var3.getInnerClass().getName();
- }
- } catch (ClassNotFound var4) {
- }
- }
-
- Identifier var5 = this.field.getClassDefinition().getTopClass().getName();
- return var5.getName().equals(var2) ? var5 : Constants.idNull;
- }
-
- public void checkBackBranch(Environment var1, Statement var2, Vset var3, Vset var4) {
- for(LocalField var5 = this.locals; var5 != null; var5 = var5.prev) {
- if (((FieldDefinition)var5).isBlankFinal() && var3.testVarUnassigned(var5.number) && !var4.testVarUnassigned(var5.number)) {
- var1.error(var2.where, "assign.to.blank.final.in.loop", ((FieldDefinition)var5).getName());
- }
- }
-
- }
-
- public boolean canReach(Environment var1, FieldDefinition var2) {
- return this.field.canReach(var1, var2);
- }
-
- public Context getLabelContext(Identifier var1) {
- for(Context var2 = this; var2 != null; var2 = var2.prev) {
- if (var2.node != null && var2.node instanceof Statement && ((Statement)var2.node).hasLabel(var1)) {
- return var2;
- }
- }
-
- return null;
- }
-
- public Context getBreakContext(Identifier var1) {
- if (var1 != null) {
- return this.getLabelContext(var1);
- } else {
- for(Context var2 = this; var2 != null; var2 = var2.prev) {
- if (var2.node != null) {
- switch (var2.node.op) {
- case 92:
- case 93:
- case 94:
- case 95:
- return var2;
- }
- }
- }
-
- return null;
- }
- }
-
- public Context getContinueContext(Identifier var1) {
- if (var1 != null) {
- return this.getLabelContext(var1);
- } else {
- for(Context var2 = this; var2 != null; var2 = var2.prev) {
- if (var2.node != null) {
- switch (var2.node.op) {
- case 92:
- case 93:
- case 94:
- return var2;
- }
- }
- }
-
- return null;
- }
- }
-
- public CheckContext getReturnContext() {
- for(Context var1 = this; var1 != null; var1 = var1.prev) {
- if (var1.node != null && var1.node.op == 47) {
- return (CheckContext)var1;
- }
- }
-
- return null;
- }
-
- Context getInlineContext() {
- for(Context var1 = this; var1 != null; var1 = var1.prev) {
- if (var1.node != null) {
- switch (var1.node.op) {
- case 150:
- case 151:
- return var1;
- }
- }
- }
-
- return null;
- }
-
- Context getInlineFieldContext(FieldDefinition var1) {
- for(Context var2 = this; var2 != null; var2 = var2.prev) {
- if (var2.node != null) {
- switch (var2.node.op) {
- case 150:
- if (((InlineMethodExpression)var2.node).field.equals(var1)) {
- return var2;
- }
- break;
- case 151:
- if (((InlineNewInstanceExpression)var2.node).field.equals(var1)) {
- return var2;
- }
- }
- }
- }
-
- return null;
- }
-
- public final Vset removeAdditionalVars(Vset var1) {
- return var1.removeAdditionalVars(this.varNumber);
- }
-
- public final int getVarNumber() {
- return this.varNumber;
- }
-
- public int getThisNumber() {
- LocalField var1 = this.getLocalField(Constants.idThis);
- return var1 != null && ((FieldDefinition)var1).getClassDefinition() == this.field.getClassDefinition() ? var1.number : this.varNumber;
- }
-
- public final FieldDefinition getField() {
- return this.field;
- }
-
- public static Environment newEnvironment(Environment var0, Context var1) {
- return new ContextEnvironment(var0, var1);
- }
- }
-