|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.tools.tree; |
|
|
|
import sun.tools.java.*; |
|
import sun.tools.asm.Assembler; |
|
import sun.tools.asm.LocalVariable; |
|
import sun.tools.asm.Label; |
|
import java.io.PrintStream; |
|
import java.util.Hashtable; |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public |
|
class CatchStatement extends Statement { |
|
int mod; |
|
Expression texpr; |
|
Identifier id; |
|
Statement body; |
|
LocalMember field; |
|
|
|
|
|
|
|
*/ |
|
public CatchStatement(long where, Expression texpr, IdentifierToken id, Statement body) { |
|
super(CATCH, where); |
|
this.mod = id.getModifiers(); |
|
this.texpr = texpr; |
|
this.id = id.getName(); |
|
this.body = body; |
|
} |
|
|
|
@Deprecated |
|
public CatchStatement(long where, Expression texpr, Identifier id, Statement body) { |
|
super(CATCH, where); |
|
this.texpr = texpr; |
|
this.id = id; |
|
this.body = body; |
|
} |
|
|
|
|
|
|
|
*/ |
|
Vset check(Environment env, Context ctx, Vset vset, Hashtable exp) { |
|
vset = reach(env, vset); |
|
ctx = new Context(ctx, this); |
|
Type type = texpr.toType(env, ctx); |
|
|
|
try { |
|
if (ctx.getLocalField(id) != null) { |
|
env.error(where, "local.redefined", id); |
|
} |
|
|
|
if (type.isType(TC_ERROR)) { |
|
// error message printed out elsewhere |
|
} else if (!type.isType(TC_CLASS)) { |
|
env.error(where, "catch.not.throwable", type); |
|
} else { |
|
ClassDefinition def = env.getClassDefinition(type); |
|
if (!def.subClassOf(env, |
|
env.getClassDeclaration(idJavaLangThrowable))) { |
|
env.error(where, "catch.not.throwable", def); |
|
} |
|
} |
|
|
|
field = new LocalMember(where, ctx.field.getClassDefinition(), mod, type, id); |
|
ctx.declare(env, field); |
|
vset.addVar(field.number); |
|
|
|
return body.check(env, ctx, vset, exp); |
|
} catch (ClassNotFound e) { |
|
env.error(where, "class.not.found", e.name, opNames[op]); |
|
return vset; |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
public Statement inline(Environment env, Context ctx) { |
|
ctx = new Context(ctx, this); |
|
if (field.isUsed()) { |
|
ctx.declare(env, field); |
|
} |
|
if (body != null) { |
|
body = body.inline(env, ctx); |
|
} |
|
return this; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public Statement copyInline(Context ctx, boolean valNeeded) { |
|
CatchStatement s = (CatchStatement)clone(); |
|
if (body != null) { |
|
s.body = body.copyInline(ctx, valNeeded); |
|
} |
|
if (field != null) { |
|
s.field = field.copyInline(ctx); |
|
} |
|
return s; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public int costInline(int thresh, Environment env, Context ctx){ |
|
int cost = 1; |
|
if (body != null) { |
|
cost += body.costInline(thresh, env,ctx); |
|
} |
|
return cost; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void code(Environment env, Context ctx, Assembler asm) { |
|
CodeContext newctx = new CodeContext(ctx, this); |
|
if (field.isUsed()) { |
|
newctx.declare(env, field); |
|
asm.add(where, opc_astore, new LocalVariable(field, field.number)); |
|
} else { |
|
asm.add(where, opc_pop); |
|
} |
|
if (body != null) { |
|
body.code(env, newctx, asm); |
|
} |
|
//asm.add(newctx.breakLabel); |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void print(PrintStream out, int indent) { |
|
super.print(out, indent); |
|
out.print("catch ("); |
|
texpr.print(out); |
|
out.print(" " + id + ") "); |
|
if (body != null) { |
|
body.print(out, indent); |
|
} else { |
|
out.print("<empty>"); |
|
} |
|
} |
|
} |