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

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Enumeration;
  5. import java.util.Hashtable;
  6. import sun.tools.asm.Assembler;
  7. import sun.tools.asm.CatchData;
  8. import sun.tools.asm.TryData;
  9. import sun.tools.java.ClassDeclaration;
  10. import sun.tools.java.ClassDefinition;
  11. import sun.tools.java.ClassNotFound;
  12. import sun.tools.java.CompilerError;
  13. import sun.tools.java.Constants;
  14. import sun.tools.java.Environment;
  15. import sun.tools.java.Type;
  16.  
  17. public class TryStatement extends Statement {
  18.    Statement body;
  19.    Statement[] args;
  20.    int arrayCloneWhere;
  21.  
  22.    public TryStatement(int var1, Statement var2, Statement[] var3) {
  23.       super(101, var1);
  24.       this.body = var2;
  25.       this.args = var3;
  26.    }
  27.  
  28.    Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
  29.       try {
  30.          var3 = ((Statement)this).reach(var1, var3);
  31.          Hashtable var5 = new Hashtable();
  32.          CheckContext var6 = new CheckContext(var2, this);
  33.          Vset var7 = this.body.check(var1, var6, var3.copy(), var5);
  34.  
  35.          for(int var8 = 0; var8 < this.args.length; ++var8) {
  36.             var7 = var7.join(this.args[var8].check(var1, var6, var3.copy(), var4));
  37.          }
  38.  
  39.          for(int var9 = 1; var9 < this.args.length; ++var9) {
  40.             CatchStatement var10 = (CatchStatement)this.args[var9];
  41.             if (var10.field != null) {
  42.                Type var11 = var10.field.getType();
  43.                ClassDefinition var12 = var1.getClassDefinition(var11);
  44.  
  45.                for(int var13 = 0; var13 < var9; ++var13) {
  46.                   CatchStatement var14 = (CatchStatement)this.args[var13];
  47.                   if (var14.field != null) {
  48.                      Type var15 = var14.field.getType();
  49.                      ClassDeclaration var16 = var1.getClassDeclaration(var15);
  50.                      if (var12.subClassOf(var1, var16)) {
  51.                         var1.error(this.args[var9].where, "catch.not.reached");
  52.                         break;
  53.                      }
  54.                   }
  55.                }
  56.             }
  57.          }
  58.  
  59.          ClassDeclaration var22 = var1.getClassDeclaration(Constants.idJavaLangError);
  60.          ClassDeclaration var23 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
  61.  
  62.          for(int var24 = 0; var24 < this.args.length; ++var24) {
  63.             CatchStatement var25 = (CatchStatement)this.args[var24];
  64.             if (var25.field != null) {
  65.                Type var27 = var25.field.getType();
  66.                if (var27.isType(10)) {
  67.                   ClassDefinition var29 = var1.getClassDefinition(var27);
  68.                   if (!var29.subClassOf(var1, var22) && !var29.superClassOf(var1, var22) && !var29.subClassOf(var1, var23) && !var29.superClassOf(var1, var23)) {
  69.                      boolean var31 = false;
  70.                      Enumeration var17 = var5.keys();
  71.  
  72.                      while(var17.hasMoreElements()) {
  73.                         ClassDeclaration var18 = (ClassDeclaration)var17.nextElement();
  74.                         if (var29.superClassOf(var1, var18) || var29.subClassOf(var1, var18)) {
  75.                            var31 = true;
  76.                            break;
  77.                         }
  78.                      }
  79.  
  80.                      if (!var31 && this.arrayCloneWhere != 0 && var29.getName().toString().equals("java.lang.CloneNotSupportedException")) {
  81.                         var1.error(this.arrayCloneWhere, "warn.array.clone.supported", var29.getName());
  82.                      }
  83.  
  84.                      if (!var31) {
  85.                         var1.error(var25.where, "catch.not.thrown", var29.getName());
  86.                      }
  87.                   }
  88.                }
  89.             }
  90.          }
  91.  
  92.          Enumeration var26 = var5.keys();
  93.  
  94.          while(var26.hasMoreElements()) {
  95.             ClassDeclaration var28 = (ClassDeclaration)var26.nextElement();
  96.             ClassDefinition var30 = var28.getClassDefinition(var1);
  97.             boolean var32 = true;
  98.  
  99.             for(int var33 = 0; var33 < this.args.length; ++var33) {
  100.                CatchStatement var34 = (CatchStatement)this.args[var33];
  101.                if (var34.field != null) {
  102.                   Type var19 = var34.field.getType();
  103.                   if (!var19.isType(13) && var30.subClassOf(var1, var1.getClassDeclaration(var19))) {
  104.                      var32 = false;
  105.                      break;
  106.                   }
  107.                }
  108.             }
  109.  
  110.             if (var32) {
  111.                var4.put(var28, var5.get(var28));
  112.             }
  113.          }
  114.  
  115.          return var2.removeAdditionalVars(var7.join(var6.vsBreak));
  116.       } catch (ClassNotFound var20) {
  117.          var1.error(super.where, "class.not.found", var20.name, Constants.opNames[super.op]);
  118.          return var3;
  119.       }
  120.    }
  121.  
  122.    public Statement inline(Environment var1, Context var2) {
  123.       if (this.body != null) {
  124.          this.body = this.body.inline(var1, new Context(var2, this));
  125.       }
  126.  
  127.       if (this.body == null) {
  128.          return null;
  129.       } else {
  130.          for(int var3 = 0; var3 < this.args.length; ++var3) {
  131.             if (this.args[var3] != null) {
  132.                this.args[var3] = this.args[var3].inline(var1, new Context(var2, this));
  133.             }
  134.          }
  135.  
  136.          if (this.args.length == 0) {
  137.             return ((Statement)this).eliminate(var1, this.body);
  138.          } else {
  139.             return this;
  140.          }
  141.       }
  142.    }
  143.  
  144.    public Statement copyInline(Context var1, boolean var2) {
  145.       throw new CompilerError("copyInline");
  146.    }
  147.  
  148.    public void code(Environment var1, Context var2, Assembler var3) {
  149.       CodeContext var4 = new CodeContext(var2, this);
  150.       TryData var5 = new TryData();
  151.  
  152.       for(int var6 = 0; var6 < this.args.length; ++var6) {
  153.          Type var7 = ((CatchStatement)this.args[var6]).field.getType();
  154.          if (var7.isType(10)) {
  155.             var5.add(var1.getClassDeclaration(var7));
  156.          } else {
  157.             var5.add(var7);
  158.          }
  159.       }
  160.  
  161.       var3.add(super.where, -3, var5);
  162.       if (this.body != null) {
  163.          this.body.code(var1, var4, var3);
  164.       }
  165.  
  166.       var3.add(var5.getEndLabel());
  167.       var3.add(super.where, 167, var4.breakLabel);
  168.  
  169.       for(int var9 = 0; var9 < this.args.length; ++var9) {
  170.          CatchData var8 = var5.getCatch(var9);
  171.          var3.add(var8.getLabel());
  172.          this.args[var9].code(var1, var4, var3);
  173.          var3.add(super.where, 167, var4.breakLabel);
  174.       }
  175.  
  176.       var3.add(var4.breakLabel);
  177.    }
  178.  
  179.    public void print(PrintStream var1, int var2) {
  180.       super.print(var1, var2);
  181.       var1.print("try ");
  182.       if (this.body != null) {
  183.          this.body.print(var1, var2);
  184.       } else {
  185.          var1.print("<empty>");
  186.       }
  187.  
  188.       for(int var3 = 0; var3 < this.args.length; ++var3) {
  189.          var1.print(" ");
  190.          this.args[var3].print(var1, var2);
  191.       }
  192.  
  193.    }
  194. }
  195.