home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.io.PrintStream;
- import java.util.Hashtable;
- import sun.tools.asm.Assembler;
- import sun.tools.java.AmbiguousField;
- 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.Type;
-
- public class MethodExpression extends NaryExpression {
- // $FF: renamed from: id sun.tools.java.Identifier
- Identifier field_0;
- ClassDefinition clazz;
- FieldDefinition field;
- Expression implementation;
- static final int MAXINLINECOST = 30;
-
- public MethodExpression(int var1, Expression var2, Identifier var3, Expression[] var4) {
- super(47, var1, Type.tError, var2, var4);
- this.field_0 = var3;
- }
-
- public MethodExpression(int var1, Expression var2, FieldDefinition var3, Expression[] var4) {
- super(47, var1, var3.getType().getReturnType(), var2, var4);
- this.field_0 = var3.getName();
- this.field = var3;
- this.clazz = var3.getClassDefinition();
- }
-
- public Expression getImplementation() {
- return (Expression)(this.implementation != null ? this.implementation : this);
- }
-
- public Vset checkValue(Environment var1, Context var2, Vset var3, Hashtable var4) {
- Object var5 = null;
- boolean var6 = false;
- boolean var7 = false;
- Expression[] var8 = super.args;
- if (this.field_0.equals(Constants.idInit)) {
- ClassDefinition var9 = var2.field.getClassDefinition();
-
- try {
- Expression var10 = null;
- if (super.right instanceof SuperExpression) {
- var9 = var9.getSuperClass().getClassDefinition(var1);
- var10 = ((SuperExpression)super.right).outerArg;
- }
-
- var8 = NewInstanceExpression.insertOuterLink(var1, var2, super.where, var9, var10, var8);
- } catch (ClassNotFound var15) {
- }
- }
-
- Type[] var20 = new Type[var8.length];
-
- try {
- ClassDeclaration var19;
- if (super.right != null) {
- if (this.field_0.equals(Constants.idInit)) {
- int var23 = var2.getThisNumber();
- if (!var2.field.isConstructor()) {
- var1.error(super.where, "invalid.constr.invoke");
- return var3.addVar(var23);
- }
-
- if (var3.testVar(var23)) {
- var1.error(super.where, "constr.invoke.not.first");
- return var3;
- }
-
- var3 = var3.addVar(var23);
- if (super.right instanceof SuperExpression) {
- var3 = super.right.checkAmbigName(var1, var2, var3, var4, this);
- } else {
- var3 = super.right.checkValue(var1, var2, var3, var4);
- }
- } else {
- var3 = super.right.checkAmbigName(var1, var2, var3, var4, this);
- if (super.right.type == Type.tPackage) {
- FieldExpression.reportFailedPackagePrefix(var1, super.right);
- return var3;
- }
-
- if (super.right instanceof TypeExpression) {
- var7 = true;
- }
- }
-
- if (super.right.type.isType(10)) {
- var19 = var1.getClassDeclaration(super.right.type);
- } else {
- if (!super.right.type.isType(9)) {
- if (!super.right.type.isType(13)) {
- var1.error(super.where, "invalid.method.invoke", super.right.type);
- }
-
- return var3;
- }
-
- var6 = true;
- var19 = var1.getClassDeclaration(Type.tObject);
- }
- } else {
- var7 = var2.field.isStatic();
- ClassDefinition var22 = var2.field.getClassDefinition();
-
- FieldDefinition var11;
- for(var11 = null; var22 != null; var22 = var22.getOuterClass()) {
- var11 = var22.findAnyMethod(var1, this.field_0);
- if (var11 != null) {
- break;
- }
- }
-
- if (var11 == null) {
- var19 = var2.field.getClassDeclaration();
- } else {
- var19 = var22.getClassDeclaration();
- if (var11.getClassDefinition() != var22) {
- ClassDefinition var12 = var22;
-
- while((var12 = var12.getOuterClass()) != null) {
- FieldDefinition var13 = var12.findAnyMethod(var1, this.field_0);
- if (var13 != null && var13.getClassDefinition() == var12) {
- var1.error(super.where, "inherited.hides.method", this.field_0, var22.getClassDeclaration(), var12.getClassDeclaration());
- break;
- }
- }
- }
- }
- }
-
- boolean var24 = false;
- if (this.field_0.equals(Constants.idInit)) {
- var3 = var3.clearVar(var2.getThisNumber());
- }
-
- for(int var26 = 0; var26 < var8.length; ++var26) {
- var3 = var8[var26].checkValue(var1, var2, var3, var4);
- var20[var26] = var8[var26].type;
- var24 = var24 || var20[var26].isType(13);
- }
-
- if (this.field_0.equals(Constants.idInit)) {
- var3 = var3.addVar(var2.getThisNumber());
- }
-
- if (var24) {
- return var3;
- }
-
- this.clazz = var19.getClassDefinition(var1);
- ClassDefinition var30 = var2.field.getClassDefinition();
- this.field = this.clazz.matchMethod(var1, var30, this.field_0, var20);
- if (this.field == null) {
- if (this.field_0.equals(Constants.idInit)) {
- if (this.diagnoseMismatch(var1, var8, var20)) {
- return var3;
- }
-
- String var37 = this.clazz.getName().getName().toString();
- var37 = Type.tMethod(Type.tError, var20).typeString(var37, false, false);
- var1.error(super.where, "unmatched.constr", var37, var19);
- return var3;
- }
-
- String var35 = this.field_0.toString();
- var35 = Type.tMethod(Type.tError, var20).typeString(var35, false, false);
- if (this.clazz.findAnyMethod(var1, this.field_0) == null) {
- if (var2.getField(var1, this.field_0) != null) {
- var1.error(super.where, "invalid.method", this.field_0, var19);
- } else {
- var1.error(super.where, "undef.meth", var35, var19);
- }
- } else if (!this.diagnoseMismatch(var1, var8, var20)) {
- var1.error(super.where, "unmatched.meth", var35, var19);
- }
-
- return var3;
- }
-
- super.type = this.field.getType().getReturnType();
- if (var7 && !this.field.isStatic()) {
- var1.error(super.where, "no.static.meth.access", this.field, this.field.getClassDeclaration());
- return var3;
- }
-
- if (this.field.isProtected() && super.right != null && !(super.right instanceof SuperExpression) && !var30.protectedAccess(var1, this.field, super.right.type)) {
- var1.error(super.where, "invalid.protected.method.use", this.field.getName(), this.field.getClassDeclaration(), super.right.type);
- return var3;
- }
-
- if (this.field.isPrivate()) {
- ClassDefinition var34 = this.field.getClassDefinition();
- if (var34 != var30) {
- FieldDefinition var14 = var34.getAccessField(var1, var2, this.field);
- if (var14 != null) {
- this.field = var14;
- } else {
- var1.error(super.where, "uplevel.private", this.field, var34);
- }
- }
- }
-
- if (this.field.isAbstract() && super.right != null && super.right.op == 83) {
- var1.error(super.where, "invoke.abstract", this.field, this.field.getClassDeclaration());
- return var3;
- }
-
- if (this.field.reportDeprecated(var1)) {
- var1.error(super.where, "warn.meth.is.deprecated", this.field, this.field.getClassDefinition());
- }
-
- if (this.field.isConstructor() && var2.field.equals(this.field)) {
- var1.error(super.where, "recursive.constr", this.field);
- }
-
- var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
- } catch (ClassNotFound var16) {
- var1.error(super.where, "class.not.found", var16.name, var2.field);
- return var3;
- } catch (AmbiguousField var17) {
- var1.error(super.where, "ambig.field", this.field_0, var17.field1, var17.field2);
- return var3;
- }
-
- if (super.right == null && !this.field.isStatic()) {
- super.right = var2.findOuterLink(var1, super.where, this.field);
- var3 = super.right.checkValue(var1, var2, var3, var4);
- }
-
- var20 = this.field.getType().getArgumentTypes();
-
- for(int var25 = 0; var25 < var8.length; ++var25) {
- var8[var25] = ((Node)this).convert(var1, var2, var20[var25], var8[var25]);
- }
-
- if (var8.length > super.args.length) {
- Object var27;
- if (super.right instanceof SuperExpression) {
- var27 = new SuperExpression(super.right.where, var2);
- ((SuperExpression)super.right).outerArg = var8[0];
- } else {
- if (!(super.right instanceof ThisExpression)) {
- throw new CompilerError("this.init");
- }
-
- var27 = new ThisExpression(super.right.where, var2);
- }
-
- for(int var31 = 1; var31 < var8.length; ++var31) {
- super.args[var31 - 1] = var8[var31];
- }
-
- this.implementation = new MethodExpression(super.where, (Expression)var27, this.field, var8);
- this.implementation.type = super.type;
- }
-
- if (var2.field.isConstructor() && this.field.isConstructor() && super.right != null && super.right.op == 83) {
- Expression var28 = this.makeVarInits(var1, var2);
- if (var28 != null) {
- if (this.implementation == null) {
- this.implementation = (Expression)((Node)this).clone();
- }
-
- this.implementation = new CommaExpression(super.where, this.implementation, var28);
- }
- }
-
- ClassDeclaration[] var29 = this.field.getExceptions(var1);
- if (var6 && this.field.getName() == Constants.idClone && this.field.getType().getArgumentTypes().length == 0) {
- var29 = new ClassDeclaration[0];
-
- for(Context var32 = var2; var32 != null; var32 = var32.prev) {
- if (var32.node != null && var32.node.op == 101) {
- ((TryStatement)var32.node).arrayCloneWhere = super.where;
- }
- }
- }
-
- for(int var33 = 0; var33 < var29.length; ++var33) {
- if (var4.get(var29[var33]) == null) {
- var4.put(var29[var33], this);
- }
- }
-
- return var3;
- }
-
- public Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
- return this.checkValue(var1, var2, var3, var4);
- }
-
- boolean diagnoseMismatch(Environment var1, Expression[] var2, Type[] var3) throws ClassNotFound {
- Type[] var4 = new Type[1];
- boolean var5 = false;
-
- int var9;
- for(int var6 = 0; var6 < var3.length; var6 = var9 + 1) {
- int var7 = this.clazz.diagnoseMismatch(var1, this.field_0, var3, var6, var4);
- String var8 = this.field_0.equals(Constants.idInit) ? "constructor" : Constants.opNames[super.op];
- if (var7 == -2) {
- var1.error(super.where, "wrong.number.args", var8);
- var5 = true;
- }
-
- if (var7 < 0) {
- break;
- }
-
- var9 = var7 >> 2;
- boolean var10 = (var7 & 2) != 0;
- Type var11 = var4[0];
- String var12 = String.valueOf(var11);
- if (var10) {
- var1.error(var2[var9].where, "explicit.cast.needed", var8, var3[var9], var12);
- } else {
- var1.error(var2[var9].where, "incompatible.type", var8, var3[var9], var12);
- }
-
- var5 = true;
- }
-
- return var5;
- }
-
- private Expression inlineMethod(Environment var1, Context var2, Statement var3, boolean var4) {
- if (var1.dump()) {
- System.out.println("INLINE METHOD " + this.field + " in " + var2.field);
- }
-
- LocalField[] var5 = LocalField.copyArguments(var2, this.field);
- Statement[] var6 = new Statement[var5.length + 2];
- int var7 = 0;
- if (this.field.isStatic()) {
- var6[0] = new ExpressionStatement(super.where, super.right);
- } else {
- if (super.right != null && super.right.op == 83) {
- super.right = new ThisExpression(super.right.where, var2);
- }
-
- var6[0] = new VarDeclarationStatement(super.where, var5[var7++], super.right);
- }
-
- for(int var8 = 0; var8 < super.args.length; ++var8) {
- var6[var8 + 1] = new VarDeclarationStatement(super.where, var5[var7++], super.args[var8]);
- }
-
- var6[var6.length - 1] = var3 != null ? var3.copyInline(var2, var4) : null;
- LocalField.doneWithArguments(var2, var5);
- Type var9 = var4 ? super.type : Type.tVoid;
- InlineMethodExpression var10 = new InlineMethodExpression(super.where, var9, this.field, new CompoundStatement(super.where, var6));
- return var4 ? ((Expression)var10).inlineValue(var1, var2) : ((Expression)var10).inline(var1, var2);
- }
-
- public Expression inline(Environment var1, Context var2) {
- if (this.implementation != null) {
- return this.implementation.inline(var1, var2);
- } else {
- try {
- if (super.right != null) {
- super.right = this.field.isStatic() ? super.right.inline(var1, var2) : super.right.inlineValue(var1, var2);
- }
-
- for(int var3 = 0; var3 < super.args.length; ++var3) {
- super.args[var3] = super.args[var3].inlineValue(var1, var2);
- }
-
- Object var4 = this;
- if (var1.optimize() && this.field.isInlineable(var1, this.clazz.isFinal()) && (this.field_0 == null || !this.field_0.equals(Constants.idInit)) && !var2.field.isInitializer() && var2.field.isMethod() && var2.getInlineFieldContext(this.field) == null) {
- Statement var5 = (Statement)this.field.getValue(var1);
- if (var5 == null || var5.costInline(30, var1, var2) < 30) {
- var4 = this.inlineMethod(var1, var2, var5, false);
- }
- }
-
- return (Expression)var4;
- } catch (ClassNotFound var6) {
- throw new CompilerError(var6);
- }
- }
- }
-
- public Expression inlineValue(Environment var1, Context var2) {
- if (this.implementation != null) {
- return this.implementation.inlineValue(var1, var2);
- } else {
- try {
- if (super.right != null) {
- super.right = this.field.isStatic() ? super.right.inline(var1, var2) : super.right.inlineValue(var1, var2);
- }
-
- if (this.field.getName().equals(Constants.idInit)) {
- ClassDefinition var3 = this.field.getClassDefinition();
- UplevelReference var4 = var3.getReferencesFrozen();
- if (var4 != null) {
- var4.willCodeArguments(var1, var2);
- }
- }
-
- for(int var6 = 0; var6 < super.args.length; ++var6) {
- super.args[var6] = super.args[var6].inlineValue(var1, var2);
- }
-
- if (var1.optimize() && this.field.isInlineable(var1, this.clazz.isFinal()) && !var2.field.isInitializer() && var2.field.isMethod() && var2.getInlineFieldContext(this.field) == null) {
- Statement var7 = (Statement)this.field.getValue(var1);
- if (var7 == null || var7.costInline(30, var1, var2) < 30) {
- return this.inlineMethod(var1, var2, var7, true);
- }
- }
-
- return this;
- } catch (ClassNotFound var5) {
- throw new CompilerError(var5);
- }
- }
- }
-
- public Expression copyInline(Context var1) {
- return this.implementation != null ? this.implementation.copyInline(var1) : super.copyInline(var1);
- }
-
- public int costInline(int var1, Environment var2, Context var3) {
- if (this.implementation != null) {
- return this.implementation.costInline(var1, var2, var3);
- } else if (super.right != null && super.right.op == 83) {
- return var1;
- } else if (var3 == null) {
- return super.costInline(var1, var2, var3);
- } else {
- ClassDefinition var4 = var3.field.getClassDefinition();
-
- try {
- if (var4.canAccess(var2, this.field.getClassDeclaration()) && var4.canAccess(var2, this.field)) {
- if (super.right == null) {
- return super.costInline(var1, var2, var3);
- }
-
- ClassDeclaration var5 = var2.getClassDeclaration(super.right.type);
- if (var4.canAccess(var2, var5)) {
- return super.costInline(var1, var2, var3);
- }
- }
- } catch (ClassNotFound var6) {
- }
-
- return var1;
- }
- }
-
- private Expression makeVarInits(Environment var1, Context var2) {
- ClassDefinition var3 = var2.field.getClassDefinition();
- Object var4 = null;
-
- for(FieldDefinition var5 = var3.getFirstField(); var5 != null; var5 = var5.getNextField()) {
- if ((var5.isVariable() || var5.isInitializer()) && !var5.isStatic()) {
- try {
- var5.check(var1);
- } catch (ClassNotFound var10) {
- var1.error(var5.getWhere(), "class.not.found", var10.name, var5.getClassDefinition());
- }
-
- Object var6 = null;
- if (var5.isUplevelValue()) {
- if (var5 != var3.findOuterField()) {
- continue;
- }
-
- IdentifierExpression var7 = new IdentifierExpression(super.where, var5.getName());
- if (!var7.bind(var1, var2)) {
- throw new CompilerError("bind " + var7.id);
- }
-
- var6 = var7;
- } else if (var5.isInitializer()) {
- Statement var13 = (Statement)var5.getValue();
- var6 = new InlineMethodExpression(super.where, Type.tVoid, var5, var13);
- } else {
- var6 = (Expression)var5.getValue();
- }
-
- if (var6 != null && !((Expression)var6).equals(0)) {
- int var14 = var5.getWhere();
- Expression var12 = ((Expression)var6).copyInline(var2);
- Object var8 = var12;
- if (var5.isVariable()) {
- ThisExpression var9 = new ThisExpression(var14, var2);
- FieldExpression var15 = new FieldExpression(var14, var9, var5);
- var8 = new AssignExpression(var14, var15, var12);
- }
-
- var4 = var4 == null ? var8 : new CommaExpression(var14, (Expression)var4, (Expression)var8);
- }
- }
- }
-
- return (Expression)var4;
- }
-
- public void codeValue(Environment var1, Context var2, Assembler var3) {
- if (this.implementation != null) {
- throw new CompilerError("codeValue");
- } else {
- boolean var4 = false;
- int var5 = 0;
- if (this.field.isStatic()) {
- if (super.right != null) {
- super.right.code(var1, var2, var3);
- }
- } else if (super.right == null) {
- var3.add(super.where, 25, new Integer(0));
- } else if (super.right.op == 83) {
- var4 = true;
- super.right.codeValue(var1, var2, var3);
- if (Constants.idInit.equals(this.field_0)) {
- ClassDefinition var6 = this.field.getClassDefinition();
- UplevelReference var7 = var6.getReferencesFrozen();
- if (var7 != null) {
- if (var7.isClientOuterField()) {
- super.args[var5++].codeValue(var1, var2, var3);
- }
-
- var7.codeArguments(var1, var2, var3, super.where, this.field);
- }
- }
- } else {
- super.right.codeValue(var1, var2, var3);
- }
-
- while(var5 < super.args.length) {
- super.args[var5].codeValue(var1, var2, var3);
- ++var5;
- }
-
- if (this.field.isStatic()) {
- var3.add(super.where, 184, this.field);
- } else if (!this.field.isConstructor() && !this.field.isPrivate() && !var4) {
- if (this.field.getClassDefinition().isInterface()) {
- var3.add(super.where, 185, this.field);
- } else {
- var3.add(super.where, 182, this.field);
- }
- } else {
- var3.add(super.where, 183, this.field);
- }
-
- if (var4 && Constants.idInit.equals(this.field_0)) {
- ClassDefinition var8 = var2.field.getClassDefinition();
- UplevelReference var9 = var8.getReferencesFrozen();
- if (var9 != null) {
- var9.codeInitialization(var1, var2, var3, super.where, this.field);
- }
- }
-
- }
- }
-
- public Expression firstConstructor() {
- return this.field_0.equals(Constants.idInit) ? this : null;
- }
-
- public void print(PrintStream var1) {
- var1.print("(" + Constants.opNames[super.op]);
- if (super.right != null) {
- var1.print(" ");
- super.right.print(var1);
- }
-
- var1.print(" " + (this.field_0 == null ? Constants.idInit : this.field_0));
-
- for(int var2 = 0; var2 < super.args.length; ++var2) {
- var1.print(" ");
- if (super.args[var2] != null) {
- super.args[var2].print(var1);
- } else {
- var1.print("<null>");
- }
- }
-
- var1.print(")");
- if (this.implementation != null) {
- var1.print("/IMPL=");
- this.implementation.print(var1);
- }
-
- }
- }
-