use of lucee.transformer.bytecode.visitor.TryCatchFinallyVisitor in project Lucee by lucee.
the class TryCatchFinally method _writeOut.
/**
* @see lucee.transformer.bytecode.statement.StatementBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter)
*/
@Override
public void _writeOut(BytecodeContext bc) throws TransformerException {
final GeneratorAdapter adapter = bc.getAdapter();
adapter.visitLabel(begin);
// Reference ref=null;
final int lRef = adapter.newLocal(Types.REFERENCE);
adapter.visitInsn(Opcodes.ACONST_NULL);
adapter.storeLocal(lRef);
// has no try body, if there is no try body, no catches are executed, only finally
if (!tryBody.hasStatements()) {
if (finallyBody != null)
finallyBody.writeOut(bc);
return;
}
// PageExceptionImpl old=pc.getCatch();
final int old = adapter.newLocal(Types.PAGE_EXCEPTION);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, TagTry.GET_CATCH);
adapter.storeLocal(old);
TryCatchFinallyVisitor tcfv = new TryCatchFinallyVisitor(new OnFinally() {
@Override
public void _writeOut(BytecodeContext bc) throws TransformerException {
adapter.loadArg(0);
adapter.loadLocal(old);
adapter.invokeVirtual(Types.PAGE_CONTEXT, TagTry.SET_CATCH_PE);
_writeOutFinally(bc, lRef);
}
}, getFlowControlFinal());
// try
tcfv.visitTryBegin(bc);
tryBody.writeOut(bc);
int lThrow = tcfv.visitTryEndCatchBeging(bc);
_writeOutCatch(bc, lRef, lThrow, old);
tcfv.visitCatchEnd(bc);
}
use of lucee.transformer.bytecode.visitor.TryCatchFinallyVisitor in project Lucee by lucee.
the class TagHelper method writeOut.
/**
* writes out the tag
* @param tag
* @param bc
* @param doReuse
* @throws TransformerException
* @throws BundleException
* @throws ClassException
*/
public static void writeOut(Tag tag, BytecodeContext bc, boolean doReuse, final FlowControlFinal fcf) throws TransformerException {
final GeneratorAdapter adapter = bc.getAdapter();
final TagLibTag tlt = tag.getTagLibTag();
final ClassDefinition cd = tlt.getTagClassDefinition();
final boolean fromBundle = cd.getName() != null;
final Type currType;
if (fromBundle) {
try {
if (Reflector.isInstaneOf(cd.getClazz(), BodyTag.class))
currType = BODY_TAG;
else
currType = TAG;
} catch (Exception e) {
if (e instanceof TransformerException)
throw (TransformerException) e;
throw new TransformerException(e, tag.getStart());
}
} else
currType = getTagType(tag);
final int currLocal = adapter.newLocal(currType);
Label tagBegin = new Label();
Label tagEnd = new Label();
ExpressionUtil.visitLine(bc, tag.getStart());
// TODO adapter.visitLocalVariable("tag", "L"+currType.getInternalName()+";", null, tagBegin, tagEnd, currLocal);
adapter.visitLabel(tagBegin);
// tag=pc.use(String tagClassName,String tagBundleName, String tagBundleVersion, String fullname,int attrType) throws PageException {
adapter.loadArg(0);
adapter.checkCast(Types.PAGE_CONTEXT_IMPL);
adapter.push(cd.getClassName());
// has bundle info/version
if (fromBundle) {
// name
adapter.push(cd.getName());
// version
if (cd.getVersion() != null)
adapter.push(cd.getVersionAsString());
else
ASMConstants.NULL(adapter);
}
adapter.push(tlt.getFullName());
adapter.push(tlt.getAttributeType());
adapter.invokeVirtual(Types.PAGE_CONTEXT_IMPL, fromBundle ? USE5 : USE3);
if (currType != TAG)
adapter.checkCast(currType);
adapter.storeLocal(currLocal);
TryFinallyVisitor outerTcfv = new TryFinallyVisitor(new OnFinally() {
@Override
public void _writeOut(BytecodeContext bc) {
adapter.loadArg(0);
adapter.checkCast(Types.PAGE_CONTEXT_IMPL);
adapter.loadLocal(currLocal);
if (cd.getName() != null) {
adapter.push(cd.getName());
if (cd.getVersion() != null)
adapter.push(cd.getVersionAsString());
else
ASMConstants.NULL(adapter);
}
adapter.invokeVirtual(Types.PAGE_CONTEXT_IMPL, fromBundle ? RE_USE3 : RE_USE1);
}
}, null);
if (doReuse)
outerTcfv.visitTryBegin(bc);
// appendix
if (tlt.hasAppendix()) {
adapter.loadLocal(currLocal);
adapter.push(tag.getAppendix());
if (// PageContextUtil.setAppendix(tag,appendix)
fromBundle)
ASMUtil.invoke(ASMUtil.STATIC, adapter, Types.TAG_UTIL, SET_APPENDIX2);
else
// tag.setAppendix(appendix)
ASMUtil.invoke(ASMUtil.VIRTUAL, adapter, currType, SET_APPENDIX1);
}
// hasBody
boolean hasBody = tag.getBody() != null;
if (tlt.isBodyFree() && tlt.hasBodyMethodExists()) {
adapter.loadLocal(currLocal);
adapter.push(hasBody);
if (// PageContextUtil.setAppendix(tag,appendix)
fromBundle)
ASMUtil.invoke(ASMUtil.STATIC, adapter, Types.TAG_UTIL, HAS_BODY2);
else
// tag.setAppendix(appendix)
ASMUtil.invoke(ASMUtil.VIRTUAL, adapter, currType, HAS_BODY1);
}
// default attributes (get overwritten by attributeCollection because of that set before)
setAttributes(bc, tag, currLocal, currType, true, fromBundle);
// attributeCollection
Attribute attrColl = tag.getAttribute("attributecollection");
if (attrColl != null) {
int attrType = tag.getTagLibTag().getAttributeType();
if (TagLibTag.ATTRIBUTE_TYPE_NONAME != attrType) {
tag.removeAttribute("attributecollection");
// TagUtil.setAttributeCollection(Tag, Struct)
adapter.loadArg(0);
adapter.loadLocal(currLocal);
if (currType != TAG)
adapter.cast(currType, TAG);
// /
TagLibTagAttr[] missings = tag.getMissingAttributes();
if (!ArrayUtil.isEmpty(missings)) {
ArrayVisitor av = new ArrayVisitor();
av.visitBegin(adapter, MISSING_ATTRIBUTE, missings.length);
int count = 0;
TagLibTagAttr miss;
for (int i = 0; i < missings.length; i++) {
miss = missings[i];
av.visitBeginItem(adapter, count++);
bc.getFactory().registerKey(bc, bc.getFactory().createLitString(miss.getName()), false);
adapter.push(miss.getType());
if (ArrayUtil.isEmpty(miss.getAlias()))
adapter.invokeStatic(MISSING_ATTRIBUTE, NEW_INSTANCE_MAX2);
else {
new LiteralStringArray(bc.getFactory(), miss.getAlias()).writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(MISSING_ATTRIBUTE, NEW_INSTANCE_MAX3);
}
av.visitEndItem(bc.getAdapter());
}
av.visitEnd();
} else {
ASMConstants.NULL(adapter);
}
// /
attrColl.getValue().writeOut(bc, Expression.MODE_REF);
adapter.push(attrType);
adapter.invokeStatic(TAG_UTIL, SET_ATTRIBUTE_COLLECTION);
}
}
// metadata
Attribute attr;
Map<String, Attribute> metadata = tag.getMetaData();
if (metadata != null) {
Iterator<Attribute> it = metadata.values().iterator();
while (it.hasNext()) {
attr = it.next();
adapter.loadLocal(currLocal);
adapter.push(attr.getName());
attr.getValue().writeOut(bc, Expression.MODE_REF);
if (fromBundle)
ASMUtil.invoke(ASMUtil.STATIC, adapter, Types.TAG_UTIL, SET_META_DATA3);
else
ASMUtil.invoke(ASMUtil.VIRTUAL, adapter, currType, SET_META_DATA2);
}
}
// set attributes
setAttributes(bc, tag, currLocal, currType, false, fromBundle);
// Body
if (hasBody) {
final int state = adapter.newLocal(Types.INT_VALUE);
// int state=tag.doStartTag();
adapter.loadLocal(currLocal);
ASMUtil.invoke(fromBundle ? ASMUtil.INTERFACE : ASMUtil.VIRTUAL, adapter, currType, DO_START_TAG);
// adapter.invokeVirtual(currType, DO_START_TAG);
adapter.storeLocal(state);
// if (state!=Tag.SKIP_BODY)
Label endBody = new Label();
adapter.loadLocal(state);
adapter.push(javax.servlet.jsp.tagext.Tag.SKIP_BODY);
adapter.visitJumpInsn(Opcodes.IF_ICMPEQ, endBody);
// pc.initBody(tag, state);
adapter.loadArg(0);
adapter.loadLocal(currLocal);
adapter.loadLocal(state);
adapter.invokeVirtual(Types.PAGE_CONTEXT, INIT_BODY);
OnFinally onFinally = new OnFinally() {
@Override
public void _writeOut(BytecodeContext bc) {
Label endIf = new Label();
/*if(tlt.handleException() && fcf!=null && fcf.getAfterFinalGOTOLabel()!=null){
ASMUtil.visitLabel(adapter, fcf.getFinalEntryLabel());
}*/
adapter.loadLocal(state);
adapter.push(javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE);
adapter.visitJumpInsn(Opcodes.IF_ICMPEQ, endIf);
// ... pc.popBody();
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, POP_BODY);
adapter.pop();
adapter.visitLabel(endIf);
// tag.doFinally();
if (tlt.handleException()) {
adapter.loadLocal(currLocal);
ASMUtil.invoke(fromBundle ? ASMUtil.INTERFACE : ASMUtil.VIRTUAL, adapter, currType, DO_FINALLY);
// adapter.invokeVirtual(currType, DO_FINALLY);
}
// GOTO after execution body, used when a continue/break was called before
/*if(fcf!=null) {
Label l = fcf.getAfterFinalGOTOLabel();
if(l!=null)adapter.visitJumpInsn(Opcodes.GOTO, l);
}*/
}
};
if (tlt.handleException()) {
TryCatchFinallyVisitor tcfv = new TryCatchFinallyVisitor(onFinally, fcf);
tcfv.visitTryBegin(bc);
doTry(bc, adapter, tag, currLocal, currType, fromBundle);
int t = tcfv.visitTryEndCatchBeging(bc);
// tag.doCatch(t);
adapter.loadLocal(currLocal);
adapter.loadLocal(t);
// adapter.visitVarInsn(Opcodes.ALOAD,t);
ASMUtil.invoke(fromBundle ? ASMUtil.INTERFACE : ASMUtil.VIRTUAL, adapter, currType, DO_CATCH);
// adapter.invokeVirtual(currType, DO_CATCH);
tcfv.visitCatchEnd(bc);
} else {
TryFinallyVisitor tfv = new TryFinallyVisitor(onFinally, fcf);
tfv.visitTryBegin(bc);
doTry(bc, adapter, tag, currLocal, currType, fromBundle);
tfv.visitTryEnd(bc);
}
adapter.visitLabel(endBody);
} else {
// tag.doStartTag();
adapter.loadLocal(currLocal);
ASMUtil.invoke(fromBundle ? ASMUtil.INTERFACE : ASMUtil.VIRTUAL, adapter, currType, DO_START_TAG);
// adapter.invokeVirtual(currType, DO_START_TAG);
adapter.pop();
}
// if (tag.doEndTag()==Tag.SKIP_PAGE) throw new Abort(0<!-- SCOPE_PAGE -->);
Label endDoEndTag = new Label();
adapter.loadLocal(currLocal);
ASMUtil.invoke(fromBundle ? ASMUtil.INTERFACE : ASMUtil.VIRTUAL, adapter, currType, DO_END_TAG);
// adapter.invokeVirtual(currType, DO_END_TAG);
adapter.push(javax.servlet.jsp.tagext.Tag.SKIP_PAGE);
adapter.visitJumpInsn(Opcodes.IF_ICMPNE, endDoEndTag);
adapter.push(Abort.SCOPE_PAGE);
adapter.invokeStatic(ABORT, NEW_INSTANCE);
adapter.throwException();
adapter.visitLabel(endDoEndTag);
if (doReuse) {
// } finally{pc.reuse(tag);}
outerTcfv.visitTryEnd(bc);
}
adapter.visitLabel(tagEnd);
ExpressionUtil.visitLine(bc, tag.getEnd());
}
use of lucee.transformer.bytecode.visitor.TryCatchFinallyVisitor in project Lucee by lucee.
the class SourceLastModifiedClassAdapter method writeOutStaticConstructor.
private void writeOutStaticConstructor(ConstrBytecodeContext constr, List<LitString> keys, ClassWriter cw, TagCIObject component, String name) throws TransformerException {
// if(true) return;
final GeneratorAdapter adapter = new GeneratorAdapter(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, STATIC_COMPONENT_CONSTR, null, new Type[] { Types.PAGE_EXCEPTION }, cw);
BytecodeContext bc = new BytecodeContext(null, constr, this, keys, cw, name, adapter, STATIC_COMPONENT_CONSTR, writeLog(), suppressWSbeforeArg, output, returnValue);
Label methodBegin = new Label();
Label methodEnd = new Label();
// Scope oldData=null;
final int oldData = adapter.newLocal(Types.VARIABLES);
ASMConstants.NULL(adapter);
adapter.storeLocal(oldData);
// push body
int localBC = adapter.newLocal(Types.BODY_CONTENT);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, PUSH_BODY);
adapter.storeLocal(localBC);
// int oldCheckArgs= pc.undefinedScope().setMode(Undefined.MODE_NO_LOCAL_AND_ARGUMENTS);
final int oldCheckArgs = adapter.newLocal(Types.INT_VALUE);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, UNDEFINED_SCOPE);
adapter.push(Undefined.MODE_NO_LOCAL_AND_ARGUMENTS);
adapter.invokeInterface(Types.UNDEFINED, SET_MODE);
adapter.storeLocal(oldCheckArgs);
TryCatchFinallyVisitor tcf = new TryCatchFinallyVisitor(new OnFinally() {
public void _writeOut(BytecodeContext bc) {
// undefined.setMode(oldMode);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, UNDEFINED_SCOPE);
adapter.loadLocal(oldCheckArgs, Types.INT_VALUE);
adapter.invokeInterface(Types.UNDEFINED, SET_MODE);
adapter.pop();
// c.afterCall(pc,_oldData);
// adapter.loadThis();
adapter.loadArg(1);
adapter.loadArg(0);
// old variables scope
adapter.loadLocal(oldData);
adapter.invokeVirtual(Types.COMPONENT_IMPL, AFTER_STATIC_CONSTR);
}
}, null);
tcf.visitTryBegin(bc);
// oldData=c.beforeCall(pc);
adapter.loadArg(1);
adapter.loadArg(0);
adapter.invokeVirtual(Types.COMPONENT_IMPL, BEFORE_STATIC_CONSTR);
adapter.storeLocal(oldData);
// ExpressionUtil.visitLine(bc, component.getStart());
List<StaticBody> list = component.getStaticBodies();
if (list != null) {
writeOutConstrBody(bc, list, IFunction.PAGE_TYPE_COMPONENT);
}
// ExpressionUtil.visitLine(bc, component.getEnd());
int t = tcf.visitTryEndCatchBeging(bc);
// BodyContentUtil.flushAndPop(pc,bc);
adapter.loadArg(0);
adapter.loadLocal(localBC);
adapter.invokeStatic(Types.BODY_CONTENT_UTIL, FLUSH_AND_POP);
// throw Caster.toPageException(t);
adapter.loadLocal(t);
adapter.invokeStatic(Types.CASTER, TO_PAGE_EXCEPTION);
adapter.throwException();
tcf.visitCatchEnd(bc);
adapter.loadArg(0);
adapter.loadLocal(localBC);
// TODO why does the body constuctor call clear and it works?
adapter.invokeStatic(Types.BODY_CONTENT_UTIL, FLUSH_AND_POP);
adapter.returnValue();
adapter.visitLabel(methodEnd);
adapter.endMethod();
}
use of lucee.transformer.bytecode.visitor.TryCatchFinallyVisitor in project Lucee by lucee.
the class SourceLastModifiedClassAdapter method writeOutInitComponent.
private void writeOutInitComponent(ConstrBytecodeContext constr, List<LitString> keys, ClassWriter cw, Tag component, String name) throws TransformerException {
final GeneratorAdapter adapter = new GeneratorAdapter(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL, INIT_COMPONENT3, null, new Type[] { Types.PAGE_EXCEPTION }, cw);
BytecodeContext bc = new BytecodeContext(null, constr, this, keys, cw, name, adapter, INIT_COMPONENT3, writeLog(), suppressWSbeforeArg, output, returnValue);
Label methodBegin = new Label();
Label methodEnd = new Label();
adapter.visitLocalVariable("this", "L" + name + ";", null, methodBegin, methodEnd, 0);
adapter.visitLabel(methodBegin);
// Scope oldData=null;
final int oldData = adapter.newLocal(Types.VARIABLES);
ASMConstants.NULL(adapter);
adapter.storeLocal(oldData);
int localBC = adapter.newLocal(Types.BODY_CONTENT);
ConditionVisitor cv = new ConditionVisitor();
cv.visitBefore();
cv.visitWhenBeforeExpr();
adapter.loadArg(1);
adapter.invokeVirtual(Types.COMPONENT_IMPL, GET_OUTPUT);
cv.visitWhenAfterExprBeforeBody(bc);
ASMConstants.NULL(adapter);
cv.visitWhenAfterBody(bc);
cv.visitOtherviseBeforeBody();
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, PUSH_BODY);
cv.visitOtherviseAfterBody();
cv.visitAfter(bc);
adapter.storeLocal(localBC);
// c.init(pc,this);
adapter.loadArg(1);
adapter.loadArg(0);
adapter.loadThis();
adapter.loadArg(2);
// adapter.visitVarInsn(Opcodes.ALOAD, 0);
adapter.invokeVirtual(Types.COMPONENT_IMPL, INIT_COMPONENT);
// return when executeConstr is false
adapter.loadArg(2);
Label afterIf = new Label();
adapter.visitJumpInsn(Opcodes.IFNE, afterIf);
adapter.loadArg(0);
adapter.loadLocal(localBC);
adapter.invokeStatic(Types.BODY_CONTENT_UTIL, CLEAR_AND_POP);
adapter.visitInsn(Opcodes.RETURN);
adapter.visitLabel(afterIf);
// int oldCheckArgs= pc.undefinedScope().setMode(Undefined.MODE_NO_LOCAL_AND_ARGUMENTS);
final int oldCheckArgs = adapter.newLocal(Types.INT_VALUE);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, UNDEFINED_SCOPE);
adapter.push(Undefined.MODE_NO_LOCAL_AND_ARGUMENTS);
adapter.invokeInterface(Types.UNDEFINED, SET_MODE);
adapter.storeLocal(oldCheckArgs);
TryCatchFinallyVisitor tcf = new TryCatchFinallyVisitor(new OnFinally() {
public void _writeOut(BytecodeContext bc) {
// undefined.setMode(oldMode);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, UNDEFINED_SCOPE);
adapter.loadLocal(oldCheckArgs, Types.INT_VALUE);
adapter.invokeInterface(Types.UNDEFINED, SET_MODE);
adapter.pop();
// c.afterCall(pc,_oldData);
adapter.loadArg(1);
adapter.loadArg(0);
adapter.loadLocal(oldData);
adapter.invokeVirtual(Types.COMPONENT_IMPL, AFTER_CALL);
}
}, null);
tcf.visitTryBegin(bc);
// oldData=c.beforeCall(pc);
adapter.loadArg(1);
adapter.loadArg(0);
adapter.invokeVirtual(Types.COMPONENT_IMPL, BEFORE_CALL);
adapter.storeLocal(oldData);
ExpressionUtil.visitLine(bc, component.getStart());
writeOutCallBody(bc, component.getBody(), IFunction.PAGE_TYPE_COMPONENT);
ExpressionUtil.visitLine(bc, component.getEnd());
int t = tcf.visitTryEndCatchBeging(bc);
// BodyContentUtil.flushAndPop(pc,bc);
adapter.loadArg(0);
adapter.loadLocal(localBC);
adapter.invokeStatic(Types.BODY_CONTENT_UTIL, FLUSH_AND_POP);
// throw Caster.toPageException(t);
adapter.loadLocal(t);
adapter.invokeStatic(Types.CASTER, TO_PAGE_EXCEPTION);
adapter.throwException();
tcf.visitCatchEnd(bc);
adapter.loadArg(0);
adapter.loadLocal(localBC);
adapter.invokeStatic(Types.BODY_CONTENT_UTIL, CLEAR_AND_POP);
adapter.returnValue();
adapter.visitLabel(methodEnd);
adapter.endMethod();
}
use of lucee.transformer.bytecode.visitor.TryCatchFinallyVisitor in project Lucee by lucee.
the class TagTry method _writeOut.
@Override
public void _writeOut(BytecodeContext bc) throws TransformerException {
final GeneratorAdapter adapter = bc.getAdapter();
adapter.visitLabel(begin);
Body tryBody = new BodyBase(getFactory());
List<Tag> catches = new ArrayList<Tag>();
Tag tmpFinal = null;
tryBody.setParent(getBody().getParent());
List<Statement> statements = getBody().getStatements();
Statement stat;
Tag tag;
{
Iterator<Statement> it = statements.iterator();
while (it.hasNext()) {
stat = it.next();
if (stat instanceof Tag) {
tag = (Tag) stat;
if (tag.getTagLibTag().getTagClassDefinition().isClassNameEqualTo("lucee.runtime.tag.Catch")) {
catches.add(tag);
continue;
} else if (tag.getTagLibTag().getTagClassDefinition().isClassNameEqualTo("lucee.runtime.tag.Finally")) {
tmpFinal = tag;
continue;
}
}
tryBody.addStatement(stat);
}
;
}
final Tag _finally = tmpFinal;
// has no try body, if there is no try body, no catches are executed, only finally
if (!tryBody.hasStatements()) {
if (_finally != null && _finally.getBody() != null) {
BodyBase.writeOut(bc, _finally.getBody());
// ExpressionUtil.writeOut(_finally.getBody(), bc);
}
return;
}
final int old = adapter.newLocal(Types.PAGE_EXCEPTION);
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_CATCH);
adapter.storeLocal(old);
TryCatchFinallyVisitor tcfv = new TryCatchFinallyVisitor(new OnFinally() {
@Override
public void _writeOut(BytecodeContext bc) throws TransformerException {
adapter.loadArg(0);
adapter.loadLocal(old);
adapter.invokeVirtual(Types.PAGE_CONTEXT, SET_CATCH_PE);
if (_finally != null) {
ExpressionUtil.visitLine(bc, _finally.getStart());
BodyBase.writeOut(bc, _finally.getBody());
// ExpressionUtil.writeOut(_finally.getBody(), bc);
}
}
}, getFlowControlFinal());
// Try
tcfv.visitTryBegin(bc);
BodyBase.writeOut(bc, tryBody);
// ExpressionUtil.writeOut(tryBody, bc);
int e = tcfv.visitTryEndCatchBeging(bc);
// if(e instanceof lucee.runtime.exp.Abort) throw e;
Label abortEnd = new Label();
adapter.loadLocal(e);
// Abort.isAbort(t);
adapter.invokeStatic(Types.ABORT, TryCatchFinally.IS_ABORT);
// adapter.instanceOf(Types.ABORT);
adapter.ifZCmp(Opcodes.IFEQ, abortEnd);
adapter.loadLocal(e);
adapter.throwException();
adapter.visitLabel(abortEnd);
// PageExceptionImpl old=pc.getCatch();
// PageException pe=Caster.toPageEception(e);
int pe = adapter.newLocal(Types.PAGE_EXCEPTION);
adapter.loadLocal(e);
adapter.invokeStatic(Types.CASTER, TO_PAGE_EXCEPTION);
adapter.storeLocal(pe);
Iterator<Tag> it = catches.iterator();
Attribute attrType;
Expression type;
Label endAllIfs = new Label();
Tag tagElse = null;
while (it.hasNext()) {
tag = it.next();
Label endIf = new Label();
attrType = tag.getAttribute("type");
type = bc.getFactory().createLitString("any");
if (attrType != null)
type = attrType.getValue();
if (type instanceof LitString && ((LitString) type).getString().equalsIgnoreCase("any")) {
tagElse = tag;
continue;
}
ExpressionUtil.visitLine(bc, tag.getStart());
// if(pe.typeEqual(@type)
adapter.loadLocal(pe);
type.writeOut(bc, Expression.MODE_REF);
adapter.invokeVirtual(Types.PAGE_EXCEPTION, TYPE_EQUAL);
adapter.ifZCmp(Opcodes.IFEQ, endIf);
catchBody(bc, adapter, tag, pe, true, true);
adapter.visitJumpInsn(Opcodes.GOTO, endAllIfs);
adapter.visitLabel(endIf);
}
// else
if (tagElse != null) {
catchBody(bc, adapter, tagElse, pe, true, true);
} else {
// pc.setCatch(pe,true);
adapter.loadArg(0);
adapter.loadLocal(pe);
adapter.push(false);
adapter.push(true);
adapter.invokeVirtual(Types.PAGE_CONTEXT, SET_CATCH3);
// throw pe;
adapter.loadLocal(pe);
adapter.throwException();
}
adapter.visitLabel(endAllIfs);
// PageExceptionImpl old=pc.getCatch();
tcfv.visitCatchEnd(bc);
}
Aggregations