home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.javac;
-
- import java.io.PrintStream;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.tools.asm.Assembler;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Identifier;
- import sun.tools.java.IdentifierToken;
- import sun.tools.java.Type;
- import sun.tools.tree.Context;
- import sun.tools.tree.Expression;
- import sun.tools.tree.ExpressionStatement;
- import sun.tools.tree.LocalField;
- import sun.tools.tree.MethodExpression;
- import sun.tools.tree.Node;
- import sun.tools.tree.NullExpression;
- import sun.tools.tree.Statement;
- import sun.tools.tree.SuperExpression;
- import sun.tools.tree.UplevelReference;
- import sun.tools.tree.Vset;
-
- public class SourceField extends FieldDefinition implements Constants {
- Vector args;
- FieldDefinition abstractSource;
- int status;
- static final int PARSED = 0;
- static final int CHECKING = 1;
- static final int CHECKED = 2;
- static final int INLINING = 3;
- static final int INLINED = 4;
- static final int ERROR = 5;
-
- public Vector getArguments() {
- return this.args;
- }
-
- public SourceField(int var1, ClassDefinition var2, String var3, int var4, Type var5, Identifier var6, Vector var7, IdentifierToken[] var8, Node var9) {
- super(var1, var2, var4, var5, var6, var8, var9);
- super.documentation = var3;
- this.args = var7;
- if (ClassDefinition.containsDeprecated(super.documentation)) {
- super.modifiers |= 262144;
- }
-
- }
-
- void createArgumentFields(Vector var1) {
- if (((FieldDefinition)this).isMethod()) {
- this.args = new Vector();
- if (((FieldDefinition)this).isConstructor() || !((FieldDefinition)this).isStatic() && !((FieldDefinition)this).isInitializer()) {
- this.args.addElement(((SourceClass)super.clazz).getThisArgument());
- }
-
- if (var1 != null) {
- Enumeration var2 = var1.elements();
- Type[] var3 = ((FieldDefinition)this).getType().getArgumentTypes();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- Object var5 = var2.nextElement();
- if (var5 instanceof LocalField) {
- this.args = var1;
- return;
- }
-
- Identifier var6;
- int var7;
- int var8;
- if (var5 instanceof Identifier) {
- var6 = (Identifier)var5;
- var7 = 0;
- var8 = ((FieldDefinition)this).getWhere();
- } else {
- IdentifierToken var9 = (IdentifierToken)var5;
- var6 = var9.getName();
- var7 = var9.getModifiers();
- var8 = var9.getWhere();
- }
-
- this.args.addElement(new LocalField(var8, super.clazz, var7, var3[var4], var6));
- }
- }
- }
-
- }
-
- void addUplevelArguments(boolean var1) {
- UplevelReference var2 = super.clazz.getReferences();
- if (!var1) {
- super.clazz.getReferencesFrozen();
- }
-
- byte var3 = 1;
- if (!var1 && var2 != null && var2.isClientOuterField()) {
- var2 = var2.getNext();
- var3 = 2;
- }
-
- if (var2 != null) {
- int var4 = 0;
-
- for(UplevelReference var5 = var2; var5 != null; var5 = var5.getNext()) {
- ++var4;
- if (var1 != var5.isClientOuterField()) {
- throw new CompilerError("isClientOuterField " + var5);
- }
- }
-
- Type[] var6 = super.type.getArgumentTypes();
- Type[] var7 = new Type[var6.length + var4];
- int var8 = 0;
-
- for(UplevelReference var9 = var2; var9 != null; var9 = var9.getNext()) {
- LocalField var10 = var9.getLocalArgument();
- this.args.insertElementAt(var10, var3 + var8);
- var7[var8++] = ((FieldDefinition)var10).getType();
- }
-
- for(int var11 = 0; var11 < var6.length; ++var11) {
- var7[var8++] = var6[var11];
- }
-
- super.type = Type.tMethod(super.type.getReturnType(), var7);
- }
- }
-
- public SourceField(ClassDefinition var1) {
- super(var1);
- }
-
- public SourceField(FieldDefinition var1, ClassDefinition var2, Environment var3) {
- this(var1.getWhere(), var2, var1.getDocumentation(), var1.getModifiers() | 1024, var1.getType(), var1.getName(), (Vector)null, var1.getExceptionIds(), (Node)null);
- this.args = var1.getArguments();
- this.abstractSource = var1;
- super.exp = var1.getExceptions(var3);
- }
-
- public ClassDeclaration[] getExceptions(Environment var1) {
- if (((FieldDefinition)this).isMethod() && super.exp == null) {
- if (super.expIds == null) {
- super.exp = new ClassDeclaration[0];
- return super.exp;
- } else {
- var1 = ((SourceClass)((FieldDefinition)this).getClassDefinition()).setupEnv(var1);
- super.exp = new ClassDeclaration[super.expIds.length];
-
- for(int var2 = 0; var2 < super.exp.length; ++var2) {
- Identifier var3 = super.expIds[var2].getName();
- Identifier var4 = ((FieldDefinition)this).getClassDefinition().resolveName(var1, var3);
- super.exp[var2] = var1.getClassDeclaration(var4);
- }
-
- return super.exp;
- }
- } else {
- return super.exp;
- }
- }
-
- public void resolveTypeStructure(Environment var1) {
- super.resolveTypeStructure(var1);
- if (((FieldDefinition)this).isInnerClass()) {
- ClassDefinition var3 = ((FieldDefinition)this).getInnerClass();
- if (var3 instanceof SourceClass && !var3.isLocal()) {
- ((SourceClass)var3).resolveTypeStructure(var1);
- }
-
- super.type = super.innerClass.getType();
- } else {
- super.type = var1.resolveNames(((FieldDefinition)this).getClassDefinition(), super.type);
- this.getExceptions(var1);
- if (((FieldDefinition)this).isMethod()) {
- Vector var2 = this.args;
- this.args = null;
- this.createArgumentFields(var2);
- if (((FieldDefinition)this).isConstructor()) {
- this.addUplevelArguments(true);
- }
- }
-
- }
- }
-
- public ClassDeclaration getDefiningClassDeclaration() {
- return this.abstractSource == null ? super.getDefiningClassDeclaration() : this.abstractSource.getDefiningClassDeclaration();
- }
-
- public boolean reportDeprecated(Environment var1) {
- return false;
- }
-
- public void check(Environment var1) throws ClassNotFound {
- if (this.status == 0) {
- if (((FieldDefinition)this).isSynthetic() && ((FieldDefinition)this).getValue() == null) {
- this.status = 2;
- return;
- }
-
- super.clazz.check(var1);
- if (this.status == 0) {
- if (((FieldDefinition)this).getClassDefinition().getError()) {
- this.status = 5;
- return;
- }
-
- throw new CompilerError("check failed");
- }
- }
-
- }
-
- public Vset check(Environment var1, Context var2, Vset var3) throws ClassNotFound {
- if (this.status == 0) {
- if (((FieldDefinition)this).isInnerClass()) {
- ClassDefinition var22 = ((FieldDefinition)this).getInnerClass();
- if (var22 instanceof SourceClass && !var22.isLocal() && var22.isInsideLocal()) {
- this.status = 1;
- var3 = ((SourceClass)var22).checkInsideClass(var1, var2, var3);
- }
-
- this.status = 2;
- return var3;
- }
-
- if (var1.dump()) {
- System.out.println("[check field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
- if (((FieldDefinition)this).getValue() != null) {
- ((FieldDefinition)this).getValue().print(System.out);
- System.out.println();
- }
- }
-
- var1 = new Environment(var1, this);
- var1.resolve(super.where, ((FieldDefinition)this).getClassDefinition(), ((FieldDefinition)this).getType());
- if (((FieldDefinition)this).isMethod()) {
- ClassDeclaration var4 = var1.getClassDeclaration(Constants.idJavaLangThrowable);
- ClassDeclaration[] var5 = this.getExceptions(var1);
-
- for(int var6 = 0; var6 < var5.length; ++var6) {
- int var8 = ((FieldDefinition)this).getWhere();
- if (super.expIds != null && var6 < super.expIds.length) {
- var8 = IdentifierToken.getWhere(super.expIds[var6], var8);
- }
-
- ClassDefinition var7;
- try {
- var7 = var5[var6].getClassDefinition(var1);
- } catch (ClassNotFound var16) {
- var1.error(var8, "class.not.found", var16.name, "throws");
- break;
- }
-
- var7.noteUsedBy(((FieldDefinition)this).getClassDefinition(), var8, var1);
- if (!((FieldDefinition)this).getClassDefinition().canAccess(var1, var7.getClassDeclaration())) {
- var1.error(var8, "cant.access.class", var7);
- } else if (!var7.subClassOf(var1, var4)) {
- var1.error(var8, "throws.not.throwable", var7);
- }
- }
- }
-
- this.status = 1;
- if (((FieldDefinition)this).isMethod() && this.args != null) {
- int var19 = this.args.size();
-
- label160:
- for(int var23 = 0; var23 < var19; ++var23) {
- LocalField var26 = (LocalField)this.args.elementAt(var23);
- Identifier var32 = ((FieldDefinition)var26).getName();
-
- for(int var36 = var23 + 1; var36 < var19; ++var36) {
- LocalField var9 = (LocalField)this.args.elementAt(var36);
- Identifier var10 = ((FieldDefinition)var9).getName();
- if (var32.equals(var10)) {
- var1.error(((FieldDefinition)var9).getWhere(), "duplicate.argument", var32);
- break label160;
- }
- }
- }
- }
-
- if (((FieldDefinition)this).getValue() != null) {
- var2 = new Context(var2, this);
- if (((FieldDefinition)this).isMethod()) {
- Statement var20 = (Statement)((FieldDefinition)this).getValue();
- Enumeration var24 = this.args.elements();
-
- while(var24.hasMoreElements()) {
- LocalField var27 = (LocalField)var24.nextElement();
- var3.addVar(var2.declare(var1, var27));
- }
-
- if (((FieldDefinition)this).isConstructor()) {
- var3.clearVar(var2.getThisNumber());
- Expression var28 = var20.firstConstructor();
- if (var28 == null && ((FieldDefinition)this).getClassDefinition().getSuperClass() != null) {
- var28 = this.getDefaultSuperCall(var1);
- ExpressionStatement var33 = new ExpressionStatement(super.where, var28);
- var20 = Statement.insertStatement(var33, var20);
- ((FieldDefinition)this).setValue(var20);
- }
- }
-
- ClassDeclaration[] var30 = this.getExceptions(var1);
- int var34 = var30.length > 3 ? 17 : 7;
- Hashtable var37 = new Hashtable(var34);
- var3 = var20.checkMethod(var1, var2, var3, var37);
- ClassDeclaration var39 = var1.getClassDeclaration(Constants.idJavaLangError);
- ClassDeclaration var41 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
- Enumeration var11 = var37.keys();
-
- while(var11.hasMoreElements()) {
- ClassDeclaration var12 = (ClassDeclaration)var11.nextElement();
- ClassDefinition var13 = var12.getClassDefinition(var1);
- if (!var13.subClassOf(var1, var39) && !var13.subClassOf(var1, var41)) {
- boolean var14 = false;
- if (!((FieldDefinition)this).isInitializer()) {
- for(int var15 = 0; var15 < var30.length; ++var15) {
- if (var13.subClassOf(var1, var30[var15])) {
- var14 = true;
- }
- }
- }
-
- if (!var14) {
- Node var44 = (Node)var37.get(var12);
- var1.error(var44.getWhere(), ((FieldDefinition)this).isInitializer() ? "initializer.exception" : "uncaught.exception", var12.getName());
- }
- }
- }
- } else {
- Hashtable var21 = new Hashtable(3);
- Expression var25 = (Expression)((FieldDefinition)this).getValue();
- var3 = var25.checkInitializer(var1, var2, var3, ((FieldDefinition)this).getType(), var21);
- ((FieldDefinition)this).setValue(((Node)var25).convert(var1, var2, ((FieldDefinition)this).getType(), var25));
- ClassDeclaration var31 = var1.getClassDeclaration(Constants.idJavaLangThrowable);
- ClassDeclaration var35 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
- Enumeration var38 = var21.keys();
-
- while(var38.hasMoreElements()) {
- ClassDeclaration var40 = (ClassDeclaration)var38.nextElement();
- ClassDefinition var42 = var40.getClassDefinition(var1);
- if (!var42.subClassOf(var1, var35) && var42.subClassOf(var1, var31)) {
- Node var43 = (Node)var21.get(var40);
- var1.error(var43.getWhere(), "initializer.exception", var40.getName());
- }
- }
- }
-
- if (var1.dump()) {
- ((FieldDefinition)this).getValue().print(System.out);
- System.out.println();
- }
- }
-
- this.status = ((FieldDefinition)this).getClassDefinition().getError() ? 5 : 2;
- }
-
- return var3;
- }
-
- private Expression getDefaultSuperCall(Environment var1) {
- SuperExpression var2 = null;
- ClassDefinition var3 = ((FieldDefinition)this).getClassDefinition().getSuperClass().getClassDefinition();
- ClassDefinition var4 = var3 == null ? null : (var3.isTopLevel() ? null : var3.getOuterClass());
- ClassDefinition var5 = ((FieldDefinition)this).getClassDefinition();
- if (var4 != null && !Context.outerLinkExists(var1, var4, var5)) {
- var2 = new SuperExpression(super.where, new NullExpression(super.where));
- var1.error(super.where, "no.default.outer.arg", var4, ((FieldDefinition)this).getClassDefinition());
- }
-
- if (var2 == null) {
- var2 = new SuperExpression(super.where);
- }
-
- return new MethodExpression(super.where, var2, Constants.idInit, new Expression[0]);
- }
-
- void inline(Environment var1) throws ClassNotFound {
- switch (this.status) {
- case 0:
- this.check(var1);
- this.inline(var1);
- return;
- case 1:
- default:
- return;
- case 2:
- if (var1.dump()) {
- System.out.println("[inline field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
- }
-
- this.status = 3;
- var1 = new Environment(var1, this);
- if (((FieldDefinition)this).isMethod()) {
- if (!((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) {
- Statement var2 = (Statement)((FieldDefinition)this).getValue();
- Context var3 = new Context((Context)null, this);
- Enumeration var4 = this.args.elements();
-
- while(var4.hasMoreElements()) {
- LocalField var5 = (LocalField)var4.nextElement();
- var3.declare(var1, var5);
- }
-
- ((FieldDefinition)this).setValue(var2.inline(var1, var3));
- }
- } else {
- if (((FieldDefinition)this).isInnerClass()) {
- ClassDefinition var8 = ((FieldDefinition)this).getInnerClass();
- if (var8 instanceof SourceClass && !var8.isLocal() && var8.isInsideLocal()) {
- this.status = 3;
- ((SourceClass)var8).inlineLocalClass(var1);
- }
-
- this.status = 4;
- return;
- }
-
- if (((FieldDefinition)this).getValue() != null) {
- Context var7 = new Context((Context)null, this);
- if (!((FieldDefinition)this).isStatic()) {
- LocalField var9 = ((SourceClass)super.clazz).getThisArgument();
- var7.declare(var1, var9);
- }
-
- ((FieldDefinition)this).setValue(((Expression)((FieldDefinition)this).getValue()).inlineValue(var1, var7));
- }
- }
-
- if (var1.dump()) {
- System.out.println("[inlined field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
- if (((FieldDefinition)this).getValue() != null) {
- ((FieldDefinition)this).getValue().print(System.out);
- System.out.println();
- } else {
- System.out.println("<empty>");
- }
- }
-
- this.status = 4;
- }
- }
-
- public Node getValue(Environment var1) throws ClassNotFound {
- Node var2 = ((FieldDefinition)this).getValue();
- if (var2 != null && this.status != 4) {
- var1 = ((SourceClass)super.clazz).setupEnv(var1);
- this.inline(var1);
- var2 = this.status == 4 ? ((FieldDefinition)this).getValue() : null;
- }
-
- return var2;
- }
-
- public boolean isInlineable(Environment var1, boolean var2) throws ClassNotFound {
- if (super.isInlineable(var1, var2)) {
- this.getValue(var1);
- return this.status == 4 && !((FieldDefinition)this).getClassDefinition().getError();
- } else {
- return false;
- }
- }
-
- public Object getInitialValue() {
- return !((FieldDefinition)this).isMethod() && ((FieldDefinition)this).getValue() != null && ((FieldDefinition)this).isFinal() && this.status == 4 ? ((Expression)((FieldDefinition)this).getValue()).getValue() : null;
- }
-
- public void code(Environment var1, Assembler var2) throws ClassNotFound {
- switch (this.status) {
- case 0:
- this.check(var1);
- this.code(var1, var2);
- return;
- case 2:
- this.inline(var1);
- this.code(var1, var2);
- return;
- case 4:
- if (var1.dump()) {
- System.out.println("[code field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
- }
-
- if (((FieldDefinition)this).isMethod() && !((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) {
- var1 = new Environment(var1, this);
- Context var3 = new Context((Context)null, this);
- Statement var4 = (Statement)((FieldDefinition)this).getValue();
- Enumeration var5 = this.args.elements();
-
- while(var5.hasMoreElements()) {
- LocalField var6 = (LocalField)var5.nextElement();
- var3.declare(var1, var6);
- }
-
- if (var4 != null) {
- var4.code(var1, var3, var2);
- }
-
- if (((FieldDefinition)this).getType().getReturnType().isType(11) && !((FieldDefinition)this).isInitializer()) {
- var2.add(((FieldDefinition)this).getWhere(), 177, true);
- }
- }
-
- return;
- default:
- }
- }
-
- public void codeInit(Environment var1, Context var2, Assembler var3) throws ClassNotFound {
- if (!((FieldDefinition)this).isMethod()) {
- switch (this.status) {
- case 0:
- this.check(var1);
- this.codeInit(var1, var2, var3);
- return;
- case 2:
- this.inline(var1);
- this.codeInit(var1, var2, var3);
- return;
- case 4:
- if (var1.dump()) {
- System.out.println("[code initializer " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
- }
-
- if (((FieldDefinition)this).getValue() != null) {
- Expression var4 = (Expression)((FieldDefinition)this).getValue();
- if (((FieldDefinition)this).isStatic()) {
- if (this.getInitialValue() == null && !var4.equalsDefault()) {
- var4.codeValue(var1, var2, var3);
- var3.add(((FieldDefinition)this).getWhere(), 179, this);
- return;
- }
- } else if (!var4.equalsDefault()) {
- var3.add(((FieldDefinition)this).getWhere(), 25, new Integer(0));
- var4.codeValue(var1, var2, var3);
- var3.add(((FieldDefinition)this).getWhere(), 181, this);
- }
- }
-
- return;
- default:
- }
- }
- }
-
- public void print(PrintStream var1) {
- super.print(var1);
- if (((FieldDefinition)this).getValue() != null) {
- ((FieldDefinition)this).getValue().print(var1);
- var1.println();
- }
-
- }
- }
-