home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.util.Hashtable;
- import sun.tools.asm.Assembler;
- import sun.tools.java.AmbiguousClass;
- 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 NewInstanceExpression extends NaryExpression {
- FieldDefinition field;
- Expression outerArg;
- ClassDefinition body;
- final int MAXINLINECOST;
-
- public NewInstanceExpression(int var1, Expression var2, Expression[] var3) {
- super(42, var1, Type.tError, var2, var3);
- this.MAXINLINECOST = 30;
- }
-
- public NewInstanceExpression(int var1, Expression var2, Expression[] var3, Expression var4, ClassDefinition var5) {
- this(var1, var2, var3);
- this.outerArg = var4;
- this.body = var5;
- }
-
- public Expression getOuterArg() {
- return this.outerArg;
- }
-
- int precedence() {
- return 100;
- }
-
- public Expression order() {
- if (this.outerArg != null && Constants.opPrecedence[46] > this.outerArg.precedence()) {
- UnaryExpression var1 = (UnaryExpression)this.outerArg;
- this.outerArg = var1.right;
- var1.right = this.order();
- return var1;
- } else {
- return this;
- }
- }
-
- public Vset checkValue(Environment var1, Context var2, Vset var3, Hashtable var4) {
- ClassDefinition var5 = null;
-
- try {
- if (this.outerArg != null) {
- var3 = this.outerArg.checkValue(var1, var2, var3, var4);
- Identifier var6 = FieldExpression.toIdentifier(super.right);
- if (var6 != null && this.outerArg.type.isType(10)) {
- ClassDefinition var7 = var1.getClassDefinition(this.outerArg.type);
- Identifier var8 = var7.resolveInnerClass(var1, var6);
- super.right = new TypeExpression(super.right.where, Type.tClass(var8));
- var1.resolve(super.right.where, var2.field.getClassDefinition(), super.right.type);
- } else {
- if (!this.outerArg.type.isType(13)) {
- var1.error(super.where, "invalid.field.reference", Constants.idNew, this.outerArg.type);
- }
-
- this.outerArg = null;
- }
- }
-
- if (!(super.right instanceof TypeExpression)) {
- super.right = new TypeExpression(super.right.where, super.right.toType(var1, var2));
- }
-
- if (super.right.type.isType(10)) {
- var5 = var1.getClassDefinition(super.right.type);
- }
- } catch (AmbiguousClass var17) {
- var1.error(super.where, "ambig.class", var17.name1, var17.name2);
- } catch (ClassNotFound var18) {
- var1.error(super.where, "class.not.found", var18.name, var2.field);
- }
-
- Type var19 = super.right.type;
- boolean var20 = var19.isType(13);
- if (!var19.isType(10) && !var20) {
- var1.error(super.where, "invalid.arg.type", var19, Constants.opNames[super.op]);
- var20 = true;
- }
-
- Expression[] var21 = super.args;
- var21 = insertOuterLink(var1, var2, super.where, var5, this.outerArg, var21);
- if (var21.length > super.args.length) {
- this.outerArg = var21[0];
- } else if (this.outerArg != null) {
- this.outerArg = new CommaExpression(this.outerArg.where, this.outerArg, (Expression)null);
- }
-
- Type[] var9 = new Type[var21.length];
-
- for(int var10 = 0; var10 < var21.length; ++var10) {
- var3 = var21[var10].checkValue(var1, var2, var3, var4);
- var9[var10] = var21[var10].type;
- var20 = var20 || var9[var10].isType(13);
- }
-
- try {
- if (this.body != null) {
- var3 = this.body.checkLocalClass(var1, var2, var3, var5, var21, var9);
- var5 = this.body;
- }
-
- if (var20) {
- super.type = Type.tError;
- return var3;
- }
-
- ClassDeclaration var11 = var1.getClassDeclaration(var19);
- if (var5.isInterface()) {
- var1.error(super.where, "new.intf", var11);
- return var3;
- }
-
- if (var5.isAbstract(var1)) {
- var1.error(super.where, "new.abstract", var11);
- return var3;
- }
-
- ClassDefinition var12 = var2.field.getClassDefinition();
- this.field = var5.matchMethod(var1, var12, Constants.idInit, var9);
- if (this.field == null) {
- FieldDefinition var27 = var5.findAnyMethod(var1, Constants.idInit);
- if (var27 != null && (new MethodExpression(super.where, super.right, var27, var21)).diagnoseMismatch(var1, var21, var9)) {
- return var3;
- }
-
- String var14 = var11.getName().getName().toString();
- var14 = Type.tMethod(Type.tError, var9).typeString(var14, false, false);
- var1.error(super.where, "unmatched.constr", var14, var11);
- return var3;
- }
-
- if (this.field.reportDeprecated(var1)) {
- var1.error(super.where, "warn.constr.is.deprecated", this.field, this.field.getClassDefinition());
- }
- } catch (ClassNotFound var15) {
- var1.error(super.where, "class.not.found", var15.name, Constants.opNames[super.op]);
- return var3;
- } catch (AmbiguousField var16) {
- var1.error(super.where, "ambig.constr", var16.field1, var16.field2);
- return var3;
- }
-
- var9 = this.field.getType().getArgumentTypes();
-
- for(int var24 = 0; var24 < var21.length; ++var24) {
- var21[var24] = ((Node)this).convert(var1, var2, var9[var24], var21[var24]);
- }
-
- if (var21.length > super.args.length) {
- this.outerArg = var21[0];
-
- for(int var25 = 1; var25 < var21.length; ++var25) {
- super.args[var25 - 1] = var21[var25];
- }
- }
-
- ClassDeclaration[] var26 = this.field.getExceptions(var1);
-
- for(int var13 = 0; var13 < var26.length; ++var13) {
- if (var4.get(var26[var13]) == null) {
- var4.put(var26[var13], this);
- }
- }
-
- super.type = var19;
- return var3;
- }
-
- public static Expression[] insertOuterLink(Environment var0, Context var1, int var2, ClassDefinition var3, Expression var4, Expression[] var5) {
- if (!var3.isTopLevel() && !var3.isLocal()) {
- Expression[] var6 = new Expression[1 + var5.length];
- System.arraycopy(var5, 0, var6, 1, var5.length);
-
- try {
- if (var4 == null) {
- var4 = var1.findOuterLink(var0, var2, var3.findAnyMethod(var0, Constants.idInit));
- }
- } catch (ClassNotFound var7) {
- }
-
- var6[0] = var4;
- var5 = var6;
- }
-
- return var5;
- }
-
- public Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
- return this.checkValue(var1, var2, var3, var4);
- }
-
- public Expression copyInline(Context var1) {
- NewInstanceExpression var2 = (NewInstanceExpression)super.copyInline(var1);
- if (this.outerArg != null) {
- var2.outerArg = this.outerArg.copyInline(var1);
- }
-
- return var2;
- }
-
- Expression inlineNewInstance(Environment var1, Context var2, Statement var3) {
- if (var1.dump()) {
- System.out.println("INLINE NEW INSTANCE " + this.field + " in " + var2.field);
- }
-
- LocalField[] var4 = LocalField.copyArguments(var2, this.field);
- Statement[] var5 = new Statement[var4.length + 2];
- byte var6 = 1;
- if (this.outerArg != null && !this.outerArg.type.isType(11)) {
- var6 = 2;
- var5[1] = new VarDeclarationStatement(super.where, var4[1], this.outerArg);
- } else if (this.outerArg != null) {
- var5[0] = new ExpressionStatement(super.where, this.outerArg);
- }
-
- for(int var7 = 0; var7 < super.args.length; ++var7) {
- var5[var7 + var6] = new VarDeclarationStatement(super.where, var4[var7 + var6], super.args[var7]);
- }
-
- var5[var5.length - 1] = var3 != null ? var3.copyInline(var2, false) : null;
- LocalField.doneWithArguments(var2, var4);
- return (new InlineNewInstanceExpression(super.where, super.type, this.field, new CompoundStatement(super.where, var5))).inline(var1, var2);
- }
-
- public Expression inline(Environment var1, Context var2) {
- return this.inlineValue(var1, var2);
- }
-
- public Expression inlineValue(Environment var1, Context var2) {
- if (this.body != null) {
- this.body.inlineLocalClass(var1);
- }
-
- ClassDefinition var3 = this.field.getClassDefinition();
- UplevelReference var4 = var3.getReferencesFrozen();
- if (var4 != null) {
- var4.willCodeArguments(var1, var2);
- }
-
- try {
- if (this.outerArg != null) {
- if (this.outerArg.type.isType(11)) {
- this.outerArg = this.outerArg.inline(var1, var2);
- } else {
- this.outerArg = this.outerArg.inlineValue(var1, var2);
- }
- }
-
- for(int var5 = 0; var5 < super.args.length; ++var5) {
- super.args[var5] = super.args[var5].inlineValue(var1, var2);
- }
- } catch (ClassNotFound var6) {
- throw new CompilerError(var6);
- }
-
- if (this.outerArg != null && this.outerArg.type.isType(11)) {
- Expression var7 = this.outerArg;
- this.outerArg = null;
- return new CommaExpression(super.where, var7, this);
- } else {
- return this;
- }
- }
-
- public int costInline(int var1, Environment var2, Context var3) {
- if (this.body != null) {
- return var1;
- } else if (var3 == null) {
- return 2 + super.costInline(var1, var2, var3);
- } else {
- ClassDefinition var4 = var3.field.getClassDefinition();
-
- try {
- if (var4.canAccess(var2, this.field.getClassDeclaration()) && var4.canAccess(var2, this.field)) {
- return 2 + super.costInline(var1, var2, var3);
- }
- } catch (ClassNotFound var5) {
- }
-
- return var1;
- }
- }
-
- public void code(Environment var1, Context var2, Assembler var3) {
- this.codeCommon(var1, var2, var3, false);
- }
-
- public void codeValue(Environment var1, Context var2, Assembler var3) {
- this.codeCommon(var1, var2, var3, true);
- }
-
- private void codeCommon(Environment var1, Context var2, Assembler var3, boolean var4) {
- var3.add(super.where, 187, this.field.getClassDeclaration());
- if (var4) {
- var3.add(super.where, 89);
- }
-
- ClassDefinition var5 = this.field.getClassDefinition();
- UplevelReference var6 = var5.getReferencesFrozen();
- if (var6 != null) {
- var6.codeArguments(var1, var2, var3, super.where, this.field);
- }
-
- if (this.outerArg != null) {
- this.outerArg.codeValue(var1, var2, var3);
- switch (this.outerArg.op) {
- case 46:
- FieldDefinition var7 = ((FieldExpression)this.outerArg).field;
- if (var7 != null && var7.isNeverNull()) {
- break;
- }
- default:
- try {
- ClassDefinition var10 = var1.getClassDefinition(Constants.idJavaLangObject);
- FieldDefinition var8 = var10.getFirstMatch(Constants.idGetClass);
- var3.add(super.where, 89);
- var3.add(super.where, 182, var8);
- var3.add(super.where, 87);
- } catch (ClassNotFound var9) {
- }
- case 49:
- case 82:
- case 83:
- }
- }
-
- for(int var11 = 0; var11 < super.args.length; ++var11) {
- super.args[var11].codeValue(var1, var2, var3);
- }
-
- var3.add(super.where, 183, this.field);
- }
- }
-