home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.io.PrintStream;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import sun.tools.asm.Assembler;
- import sun.tools.asm.CatchData;
- import sun.tools.asm.TryData;
- 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.Type;
-
- public class TryStatement extends Statement {
- Statement body;
- Statement[] args;
- int arrayCloneWhere;
-
- public TryStatement(int var1, Statement var2, Statement[] var3) {
- super(101, var1);
- this.body = var2;
- this.args = var3;
- }
-
- Vset check(Environment var1, Context var2, Vset var3, Hashtable var4) {
- try {
- var3 = ((Statement)this).reach(var1, var3);
- Hashtable var5 = new Hashtable();
- CheckContext var6 = new CheckContext(var2, this);
- Vset var7 = this.body.check(var1, var6, var3.copy(), var5);
-
- for(int var8 = 0; var8 < this.args.length; ++var8) {
- var7 = var7.join(this.args[var8].check(var1, var6, var3.copy(), var4));
- }
-
- for(int var9 = 1; var9 < this.args.length; ++var9) {
- CatchStatement var10 = (CatchStatement)this.args[var9];
- if (var10.field != null) {
- Type var11 = var10.field.getType();
- ClassDefinition var12 = var1.getClassDefinition(var11);
-
- for(int var13 = 0; var13 < var9; ++var13) {
- CatchStatement var14 = (CatchStatement)this.args[var13];
- if (var14.field != null) {
- Type var15 = var14.field.getType();
- ClassDeclaration var16 = var1.getClassDeclaration(var15);
- if (var12.subClassOf(var1, var16)) {
- var1.error(this.args[var9].where, "catch.not.reached");
- break;
- }
- }
- }
- }
- }
-
- ClassDeclaration var22 = var1.getClassDeclaration(Constants.idJavaLangError);
- ClassDeclaration var23 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
-
- for(int var24 = 0; var24 < this.args.length; ++var24) {
- CatchStatement var25 = (CatchStatement)this.args[var24];
- if (var25.field != null) {
- Type var27 = var25.field.getType();
- if (var27.isType(10)) {
- ClassDefinition var29 = var1.getClassDefinition(var27);
- if (!var29.subClassOf(var1, var22) && !var29.superClassOf(var1, var22) && !var29.subClassOf(var1, var23) && !var29.superClassOf(var1, var23)) {
- boolean var31 = false;
- Enumeration var17 = var5.keys();
-
- while(var17.hasMoreElements()) {
- ClassDeclaration var18 = (ClassDeclaration)var17.nextElement();
- if (var29.superClassOf(var1, var18) || var29.subClassOf(var1, var18)) {
- var31 = true;
- break;
- }
- }
-
- if (!var31 && this.arrayCloneWhere != 0 && var29.getName().toString().equals("java.lang.CloneNotSupportedException")) {
- var1.error(this.arrayCloneWhere, "warn.array.clone.supported", var29.getName());
- }
-
- if (!var31) {
- var1.error(var25.where, "catch.not.thrown", var29.getName());
- }
- }
- }
- }
- }
-
- Enumeration var26 = var5.keys();
-
- while(var26.hasMoreElements()) {
- ClassDeclaration var28 = (ClassDeclaration)var26.nextElement();
- ClassDefinition var30 = var28.getClassDefinition(var1);
- boolean var32 = true;
-
- for(int var33 = 0; var33 < this.args.length; ++var33) {
- CatchStatement var34 = (CatchStatement)this.args[var33];
- if (var34.field != null) {
- Type var19 = var34.field.getType();
- if (!var19.isType(13) && var30.subClassOf(var1, var1.getClassDeclaration(var19))) {
- var32 = false;
- break;
- }
- }
- }
-
- if (var32) {
- var4.put(var28, var5.get(var28));
- }
- }
-
- return var2.removeAdditionalVars(var7.join(var6.vsBreak));
- } catch (ClassNotFound var20) {
- var1.error(super.where, "class.not.found", var20.name, Constants.opNames[super.op]);
- return var3;
- }
- }
-
- public Statement inline(Environment var1, Context var2) {
- if (this.body != null) {
- this.body = this.body.inline(var1, new Context(var2, this));
- }
-
- if (this.body == null) {
- return null;
- } else {
- for(int var3 = 0; var3 < this.args.length; ++var3) {
- if (this.args[var3] != null) {
- this.args[var3] = this.args[var3].inline(var1, new Context(var2, this));
- }
- }
-
- if (this.args.length == 0) {
- return ((Statement)this).eliminate(var1, this.body);
- } else {
- return this;
- }
- }
- }
-
- public Statement copyInline(Context var1, boolean var2) {
- throw new CompilerError("copyInline");
- }
-
- public void code(Environment var1, Context var2, Assembler var3) {
- CodeContext var4 = new CodeContext(var2, this);
- TryData var5 = new TryData();
-
- for(int var6 = 0; var6 < this.args.length; ++var6) {
- Type var7 = ((CatchStatement)this.args[var6]).field.getType();
- if (var7.isType(10)) {
- var5.add(var1.getClassDeclaration(var7));
- } else {
- var5.add(var7);
- }
- }
-
- var3.add(super.where, -3, var5);
- if (this.body != null) {
- this.body.code(var1, var4, var3);
- }
-
- var3.add(var5.getEndLabel());
- var3.add(super.where, 167, var4.breakLabel);
-
- for(int var9 = 0; var9 < this.args.length; ++var9) {
- CatchData var8 = var5.getCatch(var9);
- var3.add(var8.getLabel());
- this.args[var9].code(var1, var4, var3);
- var3.add(super.where, 167, var4.breakLabel);
- }
-
- var3.add(var4.breakLabel);
- }
-
- public void print(PrintStream var1, int var2) {
- super.print(var1, var2);
- var1.print("try ");
- if (this.body != null) {
- this.body.print(var1, var2);
- } else {
- var1.print("<empty>");
- }
-
- for(int var3 = 0; var3 < this.args.length; ++var3) {
- var1.print(" ");
- this.args[var3].print(var1, var2);
- }
-
- }
- }
-