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 / javac / SourceField.class (.txt) < prev   
Encoding:
Java Class File  |  1997-07-08  |  13.5 KB  |  562 lines

  1. package sun.tools.javac;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Enumeration;
  5. import java.util.Hashtable;
  6. import java.util.Vector;
  7. import sun.tools.asm.Assembler;
  8. import sun.tools.java.ClassDeclaration;
  9. import sun.tools.java.ClassDefinition;
  10. import sun.tools.java.ClassNotFound;
  11. import sun.tools.java.CompilerError;
  12. import sun.tools.java.Constants;
  13. import sun.tools.java.Environment;
  14. import sun.tools.java.FieldDefinition;
  15. import sun.tools.java.Identifier;
  16. import sun.tools.java.IdentifierToken;
  17. import sun.tools.java.Type;
  18. import sun.tools.tree.Context;
  19. import sun.tools.tree.Expression;
  20. import sun.tools.tree.ExpressionStatement;
  21. import sun.tools.tree.LocalField;
  22. import sun.tools.tree.MethodExpression;
  23. import sun.tools.tree.Node;
  24. import sun.tools.tree.NullExpression;
  25. import sun.tools.tree.Statement;
  26. import sun.tools.tree.SuperExpression;
  27. import sun.tools.tree.UplevelReference;
  28. import sun.tools.tree.Vset;
  29.  
  30. public class SourceField extends FieldDefinition implements Constants {
  31.    Vector args;
  32.    FieldDefinition abstractSource;
  33.    int status;
  34.    static final int PARSED = 0;
  35.    static final int CHECKING = 1;
  36.    static final int CHECKED = 2;
  37.    static final int INLINING = 3;
  38.    static final int INLINED = 4;
  39.    static final int ERROR = 5;
  40.  
  41.    public Vector getArguments() {
  42.       return this.args;
  43.    }
  44.  
  45.    public SourceField(int var1, ClassDefinition var2, String var3, int var4, Type var5, Identifier var6, Vector var7, IdentifierToken[] var8, Node var9) {
  46.       super(var1, var2, var4, var5, var6, var8, var9);
  47.       super.documentation = var3;
  48.       this.args = var7;
  49.       if (ClassDefinition.containsDeprecated(super.documentation)) {
  50.          super.modifiers |= 262144;
  51.       }
  52.  
  53.    }
  54.  
  55.    void createArgumentFields(Vector var1) {
  56.       if (((FieldDefinition)this).isMethod()) {
  57.          this.args = new Vector();
  58.          if (((FieldDefinition)this).isConstructor() || !((FieldDefinition)this).isStatic() && !((FieldDefinition)this).isInitializer()) {
  59.             this.args.addElement(((SourceClass)super.clazz).getThisArgument());
  60.          }
  61.  
  62.          if (var1 != null) {
  63.             Enumeration var2 = var1.elements();
  64.             Type[] var3 = ((FieldDefinition)this).getType().getArgumentTypes();
  65.  
  66.             for(int var4 = 0; var4 < var3.length; ++var4) {
  67.                Object var5 = var2.nextElement();
  68.                if (var5 instanceof LocalField) {
  69.                   this.args = var1;
  70.                   return;
  71.                }
  72.  
  73.                Identifier var6;
  74.                int var7;
  75.                int var8;
  76.                if (var5 instanceof Identifier) {
  77.                   var6 = (Identifier)var5;
  78.                   var7 = 0;
  79.                   var8 = ((FieldDefinition)this).getWhere();
  80.                } else {
  81.                   IdentifierToken var9 = (IdentifierToken)var5;
  82.                   var6 = var9.getName();
  83.                   var7 = var9.getModifiers();
  84.                   var8 = var9.getWhere();
  85.                }
  86.  
  87.                this.args.addElement(new LocalField(var8, super.clazz, var7, var3[var4], var6));
  88.             }
  89.          }
  90.       }
  91.  
  92.    }
  93.  
  94.    void addUplevelArguments(boolean var1) {
  95.       UplevelReference var2 = super.clazz.getReferences();
  96.       if (!var1) {
  97.          super.clazz.getReferencesFrozen();
  98.       }
  99.  
  100.       byte var3 = 1;
  101.       if (!var1 && var2 != null && var2.isClientOuterField()) {
  102.          var2 = var2.getNext();
  103.          var3 = 2;
  104.       }
  105.  
  106.       if (var2 != null) {
  107.          int var4 = 0;
  108.  
  109.          for(UplevelReference var5 = var2; var5 != null; var5 = var5.getNext()) {
  110.             ++var4;
  111.             if (var1 != var5.isClientOuterField()) {
  112.                throw new CompilerError("isClientOuterField " + var5);
  113.             }
  114.          }
  115.  
  116.          Type[] var6 = super.type.getArgumentTypes();
  117.          Type[] var7 = new Type[var6.length + var4];
  118.          int var8 = 0;
  119.  
  120.          for(UplevelReference var9 = var2; var9 != null; var9 = var9.getNext()) {
  121.             LocalField var10 = var9.getLocalArgument();
  122.             this.args.insertElementAt(var10, var3 + var8);
  123.             var7[var8++] = ((FieldDefinition)var10).getType();
  124.          }
  125.  
  126.          for(int var11 = 0; var11 < var6.length; ++var11) {
  127.             var7[var8++] = var6[var11];
  128.          }
  129.  
  130.          super.type = Type.tMethod(super.type.getReturnType(), var7);
  131.       }
  132.    }
  133.  
  134.    public SourceField(ClassDefinition var1) {
  135.       super(var1);
  136.    }
  137.  
  138.    public SourceField(FieldDefinition var1, ClassDefinition var2, Environment var3) {
  139.       this(var1.getWhere(), var2, var1.getDocumentation(), var1.getModifiers() | 1024, var1.getType(), var1.getName(), (Vector)null, var1.getExceptionIds(), (Node)null);
  140.       this.args = var1.getArguments();
  141.       this.abstractSource = var1;
  142.       super.exp = var1.getExceptions(var3);
  143.    }
  144.  
  145.    public ClassDeclaration[] getExceptions(Environment var1) {
  146.       if (((FieldDefinition)this).isMethod() && super.exp == null) {
  147.          if (super.expIds == null) {
  148.             super.exp = new ClassDeclaration[0];
  149.             return super.exp;
  150.          } else {
  151.             var1 = ((SourceClass)((FieldDefinition)this).getClassDefinition()).setupEnv(var1);
  152.             super.exp = new ClassDeclaration[super.expIds.length];
  153.  
  154.             for(int var2 = 0; var2 < super.exp.length; ++var2) {
  155.                Identifier var3 = super.expIds[var2].getName();
  156.                Identifier var4 = ((FieldDefinition)this).getClassDefinition().resolveName(var1, var3);
  157.                super.exp[var2] = var1.getClassDeclaration(var4);
  158.             }
  159.  
  160.             return super.exp;
  161.          }
  162.       } else {
  163.          return super.exp;
  164.       }
  165.    }
  166.  
  167.    public void resolveTypeStructure(Environment var1) {
  168.       super.resolveTypeStructure(var1);
  169.       if (((FieldDefinition)this).isInnerClass()) {
  170.          ClassDefinition var3 = ((FieldDefinition)this).getInnerClass();
  171.          if (var3 instanceof SourceClass && !var3.isLocal()) {
  172.             ((SourceClass)var3).resolveTypeStructure(var1);
  173.          }
  174.  
  175.          super.type = super.innerClass.getType();
  176.       } else {
  177.          super.type = var1.resolveNames(((FieldDefinition)this).getClassDefinition(), super.type);
  178.          this.getExceptions(var1);
  179.          if (((FieldDefinition)this).isMethod()) {
  180.             Vector var2 = this.args;
  181.             this.args = null;
  182.             this.createArgumentFields(var2);
  183.             if (((FieldDefinition)this).isConstructor()) {
  184.                this.addUplevelArguments(true);
  185.             }
  186.          }
  187.  
  188.       }
  189.    }
  190.  
  191.    public ClassDeclaration getDefiningClassDeclaration() {
  192.       return this.abstractSource == null ? super.getDefiningClassDeclaration() : this.abstractSource.getDefiningClassDeclaration();
  193.    }
  194.  
  195.    public boolean reportDeprecated(Environment var1) {
  196.       return false;
  197.    }
  198.  
  199.    public void check(Environment var1) throws ClassNotFound {
  200.       if (this.status == 0) {
  201.          if (((FieldDefinition)this).isSynthetic() && ((FieldDefinition)this).getValue() == null) {
  202.             this.status = 2;
  203.             return;
  204.          }
  205.  
  206.          super.clazz.check(var1);
  207.          if (this.status == 0) {
  208.             if (((FieldDefinition)this).getClassDefinition().getError()) {
  209.                this.status = 5;
  210.                return;
  211.             }
  212.  
  213.             throw new CompilerError("check failed");
  214.          }
  215.       }
  216.  
  217.    }
  218.  
  219.    public Vset check(Environment var1, Context var2, Vset var3) throws ClassNotFound {
  220.       if (this.status == 0) {
  221.          if (((FieldDefinition)this).isInnerClass()) {
  222.             ClassDefinition var22 = ((FieldDefinition)this).getInnerClass();
  223.             if (var22 instanceof SourceClass && !var22.isLocal() && var22.isInsideLocal()) {
  224.                this.status = 1;
  225.                var3 = ((SourceClass)var22).checkInsideClass(var1, var2, var3);
  226.             }
  227.  
  228.             this.status = 2;
  229.             return var3;
  230.          }
  231.  
  232.          if (var1.dump()) {
  233.             System.out.println("[check field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  234.             if (((FieldDefinition)this).getValue() != null) {
  235.                ((FieldDefinition)this).getValue().print(System.out);
  236.                System.out.println();
  237.             }
  238.          }
  239.  
  240.          var1 = new Environment(var1, this);
  241.          var1.resolve(super.where, ((FieldDefinition)this).getClassDefinition(), ((FieldDefinition)this).getType());
  242.          if (((FieldDefinition)this).isMethod()) {
  243.             ClassDeclaration var4 = var1.getClassDeclaration(Constants.idJavaLangThrowable);
  244.             ClassDeclaration[] var5 = this.getExceptions(var1);
  245.  
  246.             for(int var6 = 0; var6 < var5.length; ++var6) {
  247.                int var8 = ((FieldDefinition)this).getWhere();
  248.                if (super.expIds != null && var6 < super.expIds.length) {
  249.                   var8 = IdentifierToken.getWhere(super.expIds[var6], var8);
  250.                }
  251.  
  252.                ClassDefinition var7;
  253.                try {
  254.                   var7 = var5[var6].getClassDefinition(var1);
  255.                } catch (ClassNotFound var16) {
  256.                   var1.error(var8, "class.not.found", var16.name, "throws");
  257.                   break;
  258.                }
  259.  
  260.                var7.noteUsedBy(((FieldDefinition)this).getClassDefinition(), var8, var1);
  261.                if (!((FieldDefinition)this).getClassDefinition().canAccess(var1, var7.getClassDeclaration())) {
  262.                   var1.error(var8, "cant.access.class", var7);
  263.                } else if (!var7.subClassOf(var1, var4)) {
  264.                   var1.error(var8, "throws.not.throwable", var7);
  265.                }
  266.             }
  267.          }
  268.  
  269.          this.status = 1;
  270.          if (((FieldDefinition)this).isMethod() && this.args != null) {
  271.             int var19 = this.args.size();
  272.  
  273.             label160:
  274.             for(int var23 = 0; var23 < var19; ++var23) {
  275.                LocalField var26 = (LocalField)this.args.elementAt(var23);
  276.                Identifier var32 = ((FieldDefinition)var26).getName();
  277.  
  278.                for(int var36 = var23 + 1; var36 < var19; ++var36) {
  279.                   LocalField var9 = (LocalField)this.args.elementAt(var36);
  280.                   Identifier var10 = ((FieldDefinition)var9).getName();
  281.                   if (var32.equals(var10)) {
  282.                      var1.error(((FieldDefinition)var9).getWhere(), "duplicate.argument", var32);
  283.                      break label160;
  284.                   }
  285.                }
  286.             }
  287.          }
  288.  
  289.          if (((FieldDefinition)this).getValue() != null) {
  290.             var2 = new Context(var2, this);
  291.             if (((FieldDefinition)this).isMethod()) {
  292.                Statement var20 = (Statement)((FieldDefinition)this).getValue();
  293.                Enumeration var24 = this.args.elements();
  294.  
  295.                while(var24.hasMoreElements()) {
  296.                   LocalField var27 = (LocalField)var24.nextElement();
  297.                   var3.addVar(var2.declare(var1, var27));
  298.                }
  299.  
  300.                if (((FieldDefinition)this).isConstructor()) {
  301.                   var3.clearVar(var2.getThisNumber());
  302.                   Expression var28 = var20.firstConstructor();
  303.                   if (var28 == null && ((FieldDefinition)this).getClassDefinition().getSuperClass() != null) {
  304.                      var28 = this.getDefaultSuperCall(var1);
  305.                      ExpressionStatement var33 = new ExpressionStatement(super.where, var28);
  306.                      var20 = Statement.insertStatement(var33, var20);
  307.                      ((FieldDefinition)this).setValue(var20);
  308.                   }
  309.                }
  310.  
  311.                ClassDeclaration[] var30 = this.getExceptions(var1);
  312.                int var34 = var30.length > 3 ? 17 : 7;
  313.                Hashtable var37 = new Hashtable(var34);
  314.                var3 = var20.checkMethod(var1, var2, var3, var37);
  315.                ClassDeclaration var39 = var1.getClassDeclaration(Constants.idJavaLangError);
  316.                ClassDeclaration var41 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
  317.                Enumeration var11 = var37.keys();
  318.  
  319.                while(var11.hasMoreElements()) {
  320.                   ClassDeclaration var12 = (ClassDeclaration)var11.nextElement();
  321.                   ClassDefinition var13 = var12.getClassDefinition(var1);
  322.                   if (!var13.subClassOf(var1, var39) && !var13.subClassOf(var1, var41)) {
  323.                      boolean var14 = false;
  324.                      if (!((FieldDefinition)this).isInitializer()) {
  325.                         for(int var15 = 0; var15 < var30.length; ++var15) {
  326.                            if (var13.subClassOf(var1, var30[var15])) {
  327.                               var14 = true;
  328.                            }
  329.                         }
  330.                      }
  331.  
  332.                      if (!var14) {
  333.                         Node var44 = (Node)var37.get(var12);
  334.                         var1.error(var44.getWhere(), ((FieldDefinition)this).isInitializer() ? "initializer.exception" : "uncaught.exception", var12.getName());
  335.                      }
  336.                   }
  337.                }
  338.             } else {
  339.                Hashtable var21 = new Hashtable(3);
  340.                Expression var25 = (Expression)((FieldDefinition)this).getValue();
  341.                var3 = var25.checkInitializer(var1, var2, var3, ((FieldDefinition)this).getType(), var21);
  342.                ((FieldDefinition)this).setValue(((Node)var25).convert(var1, var2, ((FieldDefinition)this).getType(), var25));
  343.                ClassDeclaration var31 = var1.getClassDeclaration(Constants.idJavaLangThrowable);
  344.                ClassDeclaration var35 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
  345.                Enumeration var38 = var21.keys();
  346.  
  347.                while(var38.hasMoreElements()) {
  348.                   ClassDeclaration var40 = (ClassDeclaration)var38.nextElement();
  349.                   ClassDefinition var42 = var40.getClassDefinition(var1);
  350.                   if (!var42.subClassOf(var1, var35) && var42.subClassOf(var1, var31)) {
  351.                      Node var43 = (Node)var21.get(var40);
  352.                      var1.error(var43.getWhere(), "initializer.exception", var40.getName());
  353.                   }
  354.                }
  355.             }
  356.  
  357.             if (var1.dump()) {
  358.                ((FieldDefinition)this).getValue().print(System.out);
  359.                System.out.println();
  360.             }
  361.          }
  362.  
  363.          this.status = ((FieldDefinition)this).getClassDefinition().getError() ? 5 : 2;
  364.       }
  365.  
  366.       return var3;
  367.    }
  368.  
  369.    private Expression getDefaultSuperCall(Environment var1) {
  370.       SuperExpression var2 = null;
  371.       ClassDefinition var3 = ((FieldDefinition)this).getClassDefinition().getSuperClass().getClassDefinition();
  372.       ClassDefinition var4 = var3 == null ? null : (var3.isTopLevel() ? null : var3.getOuterClass());
  373.       ClassDefinition var5 = ((FieldDefinition)this).getClassDefinition();
  374.       if (var4 != null && !Context.outerLinkExists(var1, var4, var5)) {
  375.          var2 = new SuperExpression(super.where, new NullExpression(super.where));
  376.          var1.error(super.where, "no.default.outer.arg", var4, ((FieldDefinition)this).getClassDefinition());
  377.       }
  378.  
  379.       if (var2 == null) {
  380.          var2 = new SuperExpression(super.where);
  381.       }
  382.  
  383.       return new MethodExpression(super.where, var2, Constants.idInit, new Expression[0]);
  384.    }
  385.  
  386.    void inline(Environment var1) throws ClassNotFound {
  387.       switch (this.status) {
  388.          case 0:
  389.             this.check(var1);
  390.             this.inline(var1);
  391.             return;
  392.          case 1:
  393.          default:
  394.             return;
  395.          case 2:
  396.             if (var1.dump()) {
  397.                System.out.println("[inline field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  398.             }
  399.  
  400.             this.status = 3;
  401.             var1 = new Environment(var1, this);
  402.             if (((FieldDefinition)this).isMethod()) {
  403.                if (!((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) {
  404.                   Statement var2 = (Statement)((FieldDefinition)this).getValue();
  405.                   Context var3 = new Context((Context)null, this);
  406.                   Enumeration var4 = this.args.elements();
  407.  
  408.                   while(var4.hasMoreElements()) {
  409.                      LocalField var5 = (LocalField)var4.nextElement();
  410.                      var3.declare(var1, var5);
  411.                   }
  412.  
  413.                   ((FieldDefinition)this).setValue(var2.inline(var1, var3));
  414.                }
  415.             } else {
  416.                if (((FieldDefinition)this).isInnerClass()) {
  417.                   ClassDefinition var8 = ((FieldDefinition)this).getInnerClass();
  418.                   if (var8 instanceof SourceClass && !var8.isLocal() && var8.isInsideLocal()) {
  419.                      this.status = 3;
  420.                      ((SourceClass)var8).inlineLocalClass(var1);
  421.                   }
  422.  
  423.                   this.status = 4;
  424.                   return;
  425.                }
  426.  
  427.                if (((FieldDefinition)this).getValue() != null) {
  428.                   Context var7 = new Context((Context)null, this);
  429.                   if (!((FieldDefinition)this).isStatic()) {
  430.                      LocalField var9 = ((SourceClass)super.clazz).getThisArgument();
  431.                      var7.declare(var1, var9);
  432.                   }
  433.  
  434.                   ((FieldDefinition)this).setValue(((Expression)((FieldDefinition)this).getValue()).inlineValue(var1, var7));
  435.                }
  436.             }
  437.  
  438.             if (var1.dump()) {
  439.                System.out.println("[inlined field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  440.                if (((FieldDefinition)this).getValue() != null) {
  441.                   ((FieldDefinition)this).getValue().print(System.out);
  442.                   System.out.println();
  443.                } else {
  444.                   System.out.println("<empty>");
  445.                }
  446.             }
  447.  
  448.             this.status = 4;
  449.       }
  450.    }
  451.  
  452.    public Node getValue(Environment var1) throws ClassNotFound {
  453.       Node var2 = ((FieldDefinition)this).getValue();
  454.       if (var2 != null && this.status != 4) {
  455.          var1 = ((SourceClass)super.clazz).setupEnv(var1);
  456.          this.inline(var1);
  457.          var2 = this.status == 4 ? ((FieldDefinition)this).getValue() : null;
  458.       }
  459.  
  460.       return var2;
  461.    }
  462.  
  463.    public boolean isInlineable(Environment var1, boolean var2) throws ClassNotFound {
  464.       if (super.isInlineable(var1, var2)) {
  465.          this.getValue(var1);
  466.          return this.status == 4 && !((FieldDefinition)this).getClassDefinition().getError();
  467.       } else {
  468.          return false;
  469.       }
  470.    }
  471.  
  472.    public Object getInitialValue() {
  473.       return !((FieldDefinition)this).isMethod() && ((FieldDefinition)this).getValue() != null && ((FieldDefinition)this).isFinal() && this.status == 4 ? ((Expression)((FieldDefinition)this).getValue()).getValue() : null;
  474.    }
  475.  
  476.    public void code(Environment var1, Assembler var2) throws ClassNotFound {
  477.       switch (this.status) {
  478.          case 0:
  479.             this.check(var1);
  480.             this.code(var1, var2);
  481.             return;
  482.          case 2:
  483.             this.inline(var1);
  484.             this.code(var1, var2);
  485.             return;
  486.          case 4:
  487.             if (var1.dump()) {
  488.                System.out.println("[code field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  489.             }
  490.  
  491.             if (((FieldDefinition)this).isMethod() && !((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) {
  492.                var1 = new Environment(var1, this);
  493.                Context var3 = new Context((Context)null, this);
  494.                Statement var4 = (Statement)((FieldDefinition)this).getValue();
  495.                Enumeration var5 = this.args.elements();
  496.  
  497.                while(var5.hasMoreElements()) {
  498.                   LocalField var6 = (LocalField)var5.nextElement();
  499.                   var3.declare(var1, var6);
  500.                }
  501.  
  502.                if (var4 != null) {
  503.                   var4.code(var1, var3, var2);
  504.                }
  505.  
  506.                if (((FieldDefinition)this).getType().getReturnType().isType(11) && !((FieldDefinition)this).isInitializer()) {
  507.                   var2.add(((FieldDefinition)this).getWhere(), 177, true);
  508.                }
  509.             }
  510.  
  511.             return;
  512.          default:
  513.       }
  514.    }
  515.  
  516.    public void codeInit(Environment var1, Context var2, Assembler var3) throws ClassNotFound {
  517.       if (!((FieldDefinition)this).isMethod()) {
  518.          switch (this.status) {
  519.             case 0:
  520.                this.check(var1);
  521.                this.codeInit(var1, var2, var3);
  522.                return;
  523.             case 2:
  524.                this.inline(var1);
  525.                this.codeInit(var1, var2, var3);
  526.                return;
  527.             case 4:
  528.                if (var1.dump()) {
  529.                   System.out.println("[code initializer  " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  530.                }
  531.  
  532.                if (((FieldDefinition)this).getValue() != null) {
  533.                   Expression var4 = (Expression)((FieldDefinition)this).getValue();
  534.                   if (((FieldDefinition)this).isStatic()) {
  535.                      if (this.getInitialValue() == null && !var4.equalsDefault()) {
  536.                         var4.codeValue(var1, var2, var3);
  537.                         var3.add(((FieldDefinition)this).getWhere(), 179, this);
  538.                         return;
  539.                      }
  540.                   } else if (!var4.equalsDefault()) {
  541.                      var3.add(((FieldDefinition)this).getWhere(), 25, new Integer(0));
  542.                      var4.codeValue(var1, var2, var3);
  543.                      var3.add(((FieldDefinition)this).getWhere(), 181, this);
  544.                   }
  545.                }
  546.  
  547.                return;
  548.             default:
  549.          }
  550.       }
  551.    }
  552.  
  553.    public void print(PrintStream var1) {
  554.       super.print(var1);
  555.       if (((FieldDefinition)this).getValue() != null) {
  556.          ((FieldDefinition)this).getValue().print(var1);
  557.          var1.println();
  558.       }
  559.  
  560.    }
  561. }
  562.