LValue v = newContext.getVar("$$mon$$") ;
Var ex = (Var)newContext.getVar("$$ex$$") ;
Var vret = (Var)newContext.getVar("$$ra$$") ;
makeInit(newContext,varDecl.init,v.getType(),l) ;
l.add(new Dup(TypeCode.VOID,TypeCode.OBJECT)) ;
l.add(new Store(v)) ;
l.add(new MonitorEnter()) ;
Mark the_end = new Mark() ;
Mark start_pc = new Mark() ;
Mark end_pc = new Mark() ;
Mark handler = new Mark() ;
l.add(new Nop(start_pc)) ;
for(Statement s: statements) {
newContext.compile(s,l) ;
}
l.add(new Nop(end_pc)) ;
l.add(new JumpSub(finallyMark)) ;
l.add(new Goto(the_end)) ;
{
l.add(new ExceptionHandler(start_pc,end_pc,handler,TypeName.THROWABLE)) ;
l.add(new Nop(handler)) ;
l.add(new Store(ex)) ;
l.add(new JumpSub(finallyMark)) ;
l.add(new Load(ex)) ;
l.add(new Throw()) ;
}
l.add(new Nop(finallyMark)) ;
l.add(new Store(vret)) ;
l.add(new Load(v)) ;
l.add(new MonitorExit()) ;
l.add(new ReturnVar(vret.index)) ;
l.add(new Nop(the_end)) ;
}