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

  1. package sun.tools.tree;
  2.  
  3. import java.util.Hashtable;
  4. import sun.tools.asm.Assembler;
  5. import sun.tools.java.AmbiguousClass;
  6. import sun.tools.java.AmbiguousField;
  7. import sun.tools.java.ClassDeclaration;
  8. import sun.tools.java.ClassDefinition;
  9. import sun.tools.java.ClassNotFound;
  10. import sun.tools.java.CompilerError;
  11. import sun.tools.java.Constants;
  12. import sun.tools.java.Environment;
  13. import sun.tools.java.FieldDefinition;
  14. import sun.tools.java.Identifier;
  15. import sun.tools.java.Type;
  16.  
  17. public class NewInstanceExpression extends NaryExpression {
  18.    FieldDefinition field;
  19.    Expression outerArg;
  20.    ClassDefinition body;
  21.    final int MAXINLINECOST;
  22.  
  23.    public NewInstanceExpression(int var1, Expression var2, Expression[] var3) {
  24.       super(42, var1, Type.tError, var2, var3);
  25.       this.MAXINLINECOST = 30;
  26.    }
  27.  
  28.    public NewInstanceExpression(int var1, Expression var2, Expression[] var3, Expression var4, ClassDefinition var5) {
  29.       this(var1, var2, var3);
  30.       this.outerArg = var4;
  31.       this.body = var5;
  32.    }
  33.  
  34.    public Expression getOuterArg() {
  35.       return this.outerArg;
  36.    }
  37.  
  38.    int precedence() {
  39.       return 100;
  40.    }
  41.  
  42.    public Expression order() {
  43.       if (this.outerArg != null && Constants.opPrecedence[46] > this.outerArg.precedence()) {
  44.          UnaryExpression var1 = (UnaryExpression)this.outerArg;
  45.          this.outerArg = var1.right;
  46.          var1.right = this.order();
  47.          return var1;
  48.       } else {
  49.          return this;
  50.       }
  51.    }
  52.  
  53.    public Vset checkValue(Environment var1, Context var2, Vset var3, Hashtable var4) {
  54.       ClassDefinition var5 = null;
  55.  
  56.       try {
  57.          if (this.outerArg != null) {
  58.             var3 = this.outerArg.checkValue(var1, var2, var3, var4);
  59.             Identifier var6 = FieldExpression.toIdentifier(super.right);
  60.             if (var6 != null && this.outerArg.type.isType(10)) {
  61.                ClassDefinition var7 = var1.getClassDefinition(this.outerArg.type);
  62.                Identifier var8 = var7.resolveInnerClass(var1, var6);
  63.                super.right = new TypeExpression(super.right.where, Type.tClass(var8));
  64.                var1.resolve(super.right.where, var2.field.getClassDefinition(), super.right.type);
  65.             } else {
  66.                if (!this.outerArg.type.isType(13)) {
  67.                   var1.error(super.where, "invalid.field.reference", Constants.idNew, this.outerArg.type);
  68.                }
  69.  
  70.                this.outerArg = null;
  71.             }
  72.          }
  73.  
  74.          if (!(super.right instanceof TypeExpression)) {
  75.             super.right = new TypeExpression(super.right.where, super.right.toType(var1, var2));
  76.          }
  77.  
  78.          if (super.right.type.isType(10)) {
  79.             var5 = var1.getClassDefinition(super.right.type);
  80.          }
  81.       } catch (AmbiguousClass var17) {
  82.          var1.error(super.where, "ambig.class", var17.name1, var17.name2);
  83.       } catch (ClassNotFound var18) {
  84.          var1.error(super.where, "class.not.found", var18.name, var2.field);
  85.       }
  86.  
  87.       Type var19 = super.right.type;
  88.       boolean var20 = var19.isType(13);
  89.       if (!var19.isType(10) && !var20) {
  90.          var1.error(super.where, "invalid.arg.type", var19, Constants.opNames[super.op]);
  91.          var20 = true;
  92.       }
  93.  
  94.       Expression[] var21 = super.args;
  95.       var21 = insertOuterLink(var1, var2, super.where, var5, this.outerArg, var21);
  96.       if (var21.length > super.args.length) {
  97.          this.outerArg = var21[0];
  98.       } else if (this.outerArg != null) {
  99.          this.outerArg = new CommaExpression(this.outerArg.where, this.outerArg, (Expression)null);
  100.       }
  101.  
  102.       Type[] var9 = new Type[var21.length];
  103.  
  104.       for(int var10 = 0; var10 < var21.length; ++var10) {
  105.          var3 = var21[var10].checkValue(var1, var2, var3, var4);
  106.          var9[var10] = var21[var10].type;
  107.          var20 = var20 || var9[var10].isType(13);
  108.       }
  109.  
  110.       try {
  111.          if (this.body != null) {
  112.             var3 = this.body.checkLocalClass(var1, var2, var3, var5, var21, var9);
  113.             var5 = this.body;
  114.          }
  115.  
  116.          if (var20) {
  117.             super.type = Type.tError;
  118.             return var3;
  119.          }
  120.  
  121.          ClassDeclaration var11 = var1.getClassDeclaration(var19);
  122.          if (var5.isInterface()) {
  123.             var1.error(super.where, "new.intf", var11);
  124.             return var3;
  125.          }
  126.  
  127.          if (var5.isAbstract(var1)) {
  128.             var1.error(super.where, "new.abstract", var11);
  129.             return var3;
  130.          }
  131.  
  132.          ClassDefinition var12 = var2.field.getClassDefinition();
  133.          this.field = var5.matchMethod(var1, var12, Constants.idInit, var9);
  134.          if (this.field == null) {
  135.             FieldDefinition var27 = var5.findAnyMethod(var1, Constants.idInit);
  136.             if (var27 != null && (new MethodExpression(super.where, super.right, var27, var21)).diagnoseMismatch(var1, var21, var9)) {
  137.                return var3;
  138.             }
  139.  
  140.             String var14 = var11.getName().getName().toString();
  141.             var14 = Type.tMethod(Type.tError, var9).typeString(var14, false, false);
  142.             var1.error(super.where, "unmatched.constr", var14, var11);
  143.             return var3;
  144.          }
  145.  
  146.          if (this.field.reportDeprecated(var1)) {
  147.             var1.error(super.where, "warn.constr.is.deprecated", this.field, this.field.getClassDefinition());
  148.          }
  149.       } catch (ClassNotFound var15) {
  150.          var1.error(super.where, "class.not.found", var15.name, Constants.opNames[super.op]);
  151.          return var3;
  152.       } catch (AmbiguousField var16) {
  153.          var1.error(super.where, "ambig.constr", var16.field1, var16.field2);
  154.          return var3;
  155.       }
  156.  
  157.       var9 = this.field.getType().getArgumentTypes();
  158.  
  159.       for(int var24 = 0; var24 < var21.length; ++var24) {
  160.          var21[var24] = ((Node)this).convert(var1, var2, var9[var24], var21[var24]);
  161.       }
  162.  
  163.       if (var21.length > super.args.length) {
  164.          this.outerArg = var21[0];
  165.  
  166.          for(int var25 = 1; var25 < var21.length; ++var25) {
  167.             super.args[var25 - 1] = var21[var25];
  168.          }
  169.       }
  170.  
  171.       ClassDeclaration[] var26 = this.field.getExceptions(var1);
  172.  
  173.       for(int var13 = 0; var13 < var26.length; ++var13) {
  174.          if (var4.get(var26[var13]) == null) {
  175.             var4.put(var26[var13], this);
  176.          }
  177.       }
  178.  
  179.       super.type = var19;
  180.       return var3;
  181.    }
  182.  
  183.    public static Expression[] insertOuterLink(Environment var0, Context var1, int var2, ClassDefinition var3, Expression var4, Expression[] var5) {
  184.       if (!var3.isTopLevel() && !var3.isLocal()) {
  185.          Expression[] var6 = new Expression[1 + var5.length];
  186.          System.arraycopy(var5, 0, var6, 1, var5.length);
  187.  
  188.          try {
  189.             if (var4 == null) {
  190.                var4 = var1.findOuterLink(var0, var2, var3.findAnyMethod(var0, Constants.idInit));
  191.             }
  192.          } catch (ClassNotFound var7) {
  193.          }
  194.  
  195.          var6[0] = var4;
  196.          var5 = var6;
  197.       }
  198.  
  199.       return var5;
  200.    }
  201.  
  202.    public Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
  203.       return this.checkValue(var1, var2, var3, var4);
  204.    }
  205.  
  206.    public Expression copyInline(Context var1) {
  207.       NewInstanceExpression var2 = (NewInstanceExpression)super.copyInline(var1);
  208.       if (this.outerArg != null) {
  209.          var2.outerArg = this.outerArg.copyInline(var1);
  210.       }
  211.  
  212.       return var2;
  213.    }
  214.  
  215.    Expression inlineNewInstance(Environment var1, Context var2, Statement var3) {
  216.       if (var1.dump()) {
  217.          System.out.println("INLINE NEW INSTANCE " + this.field + " in " + var2.field);
  218.       }
  219.  
  220.       LocalField[] var4 = LocalField.copyArguments(var2, this.field);
  221.       Statement[] var5 = new Statement[var4.length + 2];
  222.       byte var6 = 1;
  223.       if (this.outerArg != null && !this.outerArg.type.isType(11)) {
  224.          var6 = 2;
  225.          var5[1] = new VarDeclarationStatement(super.where, var4[1], this.outerArg);
  226.       } else if (this.outerArg != null) {
  227.          var5[0] = new ExpressionStatement(super.where, this.outerArg);
  228.       }
  229.  
  230.       for(int var7 = 0; var7 < super.args.length; ++var7) {
  231.          var5[var7 + var6] = new VarDeclarationStatement(super.where, var4[var7 + var6], super.args[var7]);
  232.       }
  233.  
  234.       var5[var5.length - 1] = var3 != null ? var3.copyInline(var2, false) : null;
  235.       LocalField.doneWithArguments(var2, var4);
  236.       return (new InlineNewInstanceExpression(super.where, super.type, this.field, new CompoundStatement(super.where, var5))).inline(var1, var2);
  237.    }
  238.  
  239.    public Expression inline(Environment var1, Context var2) {
  240.       return this.inlineValue(var1, var2);
  241.    }
  242.  
  243.    public Expression inlineValue(Environment var1, Context var2) {
  244.       if (this.body != null) {
  245.          this.body.inlineLocalClass(var1);
  246.       }
  247.  
  248.       ClassDefinition var3 = this.field.getClassDefinition();
  249.       UplevelReference var4 = var3.getReferencesFrozen();
  250.       if (var4 != null) {
  251.          var4.willCodeArguments(var1, var2);
  252.       }
  253.  
  254.       try {
  255.          if (this.outerArg != null) {
  256.             if (this.outerArg.type.isType(11)) {
  257.                this.outerArg = this.outerArg.inline(var1, var2);
  258.             } else {
  259.                this.outerArg = this.outerArg.inlineValue(var1, var2);
  260.             }
  261.          }
  262.  
  263.          for(int var5 = 0; var5 < super.args.length; ++var5) {
  264.             super.args[var5] = super.args[var5].inlineValue(var1, var2);
  265.          }
  266.       } catch (ClassNotFound var6) {
  267.          throw new CompilerError(var6);
  268.       }
  269.  
  270.       if (this.outerArg != null && this.outerArg.type.isType(11)) {
  271.          Expression var7 = this.outerArg;
  272.          this.outerArg = null;
  273.          return new CommaExpression(super.where, var7, this);
  274.       } else {
  275.          return this;
  276.       }
  277.    }
  278.  
  279.    public int costInline(int var1, Environment var2, Context var3) {
  280.       if (this.body != null) {
  281.          return var1;
  282.       } else if (var3 == null) {
  283.          return 2 + super.costInline(var1, var2, var3);
  284.       } else {
  285.          ClassDefinition var4 = var3.field.getClassDefinition();
  286.  
  287.          try {
  288.             if (var4.canAccess(var2, this.field.getClassDeclaration()) && var4.canAccess(var2, this.field)) {
  289.                return 2 + super.costInline(var1, var2, var3);
  290.             }
  291.          } catch (ClassNotFound var5) {
  292.          }
  293.  
  294.          return var1;
  295.       }
  296.    }
  297.  
  298.    public void code(Environment var1, Context var2, Assembler var3) {
  299.       this.codeCommon(var1, var2, var3, false);
  300.    }
  301.  
  302.    public void codeValue(Environment var1, Context var2, Assembler var3) {
  303.       this.codeCommon(var1, var2, var3, true);
  304.    }
  305.  
  306.    private void codeCommon(Environment var1, Context var2, Assembler var3, boolean var4) {
  307.       var3.add(super.where, 187, this.field.getClassDeclaration());
  308.       if (var4) {
  309.          var3.add(super.where, 89);
  310.       }
  311.  
  312.       ClassDefinition var5 = this.field.getClassDefinition();
  313.       UplevelReference var6 = var5.getReferencesFrozen();
  314.       if (var6 != null) {
  315.          var6.codeArguments(var1, var2, var3, super.where, this.field);
  316.       }
  317.  
  318.       if (this.outerArg != null) {
  319.          this.outerArg.codeValue(var1, var2, var3);
  320.          switch (this.outerArg.op) {
  321.             case 46:
  322.                FieldDefinition var7 = ((FieldExpression)this.outerArg).field;
  323.                if (var7 != null && var7.isNeverNull()) {
  324.                   break;
  325.                }
  326.             default:
  327.                try {
  328.                   ClassDefinition var10 = var1.getClassDefinition(Constants.idJavaLangObject);
  329.                   FieldDefinition var8 = var10.getFirstMatch(Constants.idGetClass);
  330.                   var3.add(super.where, 89);
  331.                   var3.add(super.where, 182, var8);
  332.                   var3.add(super.where, 87);
  333.                } catch (ClassNotFound var9) {
  334.                }
  335.             case 49:
  336.             case 82:
  337.             case 83:
  338.          }
  339.       }
  340.  
  341.       for(int var11 = 0; var11 < super.args.length; ++var11) {
  342.          super.args[var11].codeValue(var1, var2, var3);
  343.       }
  344.  
  345.       var3.add(super.where, 183, this.field);
  346.    }
  347. }
  348.