F(CallActivationProperty, callActivationProperty) \
F(CallBuiltinThrow, callBuiltinThrow) \
F(CallBuiltinCreateExceptionHandler, callBuiltinCreateExceptionHandler) \
- F(CallBuiltinDeleteExceptionHandler, callBuiltinDeleteExceptionHandler) \
+ F(CallBuiltinFinishTry, callBuiltinFinishTry) \
F(CallBuiltinGetException, callBuiltinGetException) \
F(CallBuiltinPushScope, callBuiltinPushScope) \
F(CallBuiltinPushCatchScope, callBuiltinPushCatchScope) \
MOTH_INSTR_HEADER
Param result;
};
- struct instr_callBuiltinDeleteExceptionHandler {
+ struct instr_callBuiltinFinishTry {
MOTH_INSTR_HEADER
};
struct instr_callBuiltinGetException {
instr_callActivationProperty callActivationProperty;
instr_callBuiltinThrow callBuiltinThrow;
instr_callBuiltinCreateExceptionHandler callBuiltinCreateExceptionHandler;
- instr_callBuiltinDeleteExceptionHandler callBuiltinDeleteExceptionHandler;
+ instr_callBuiltinFinishTry callBuiltinFinishTry;
instr_callBuiltinGetException callBuiltinGetException;
instr_callBuiltinPushScope callBuiltinPushScope;
instr_callBuiltinPushCatchScope callBuiltinPushCatchScope;
addInstruction(call);
}
-void InstructionSelection::callBuiltinDeleteExceptionHandler()
+void InstructionSelection::callBuiltinFinishTry()
{
- Instruction::CallBuiltinDeleteExceptionHandler call;
+ Instruction::CallBuiltinFinishTry call;
addInstruction(call);
}
virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result);
virtual void callBuiltinThrow(IR::Temp *arg);
virtual void callBuiltinCreateExceptionHandler(IR::Temp *result);
- virtual void callBuiltinDeleteExceptionHandler();
+ virtual void callBuiltinFinishTry();
virtual void callBuiltinGetException(IR::Temp *result);
virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result);
virtual void callBuiltinForeachNextPropertyname(IR::Temp *arg, IR::Temp *result);
}
MOTH_END_INSTR(CallBuiltinCreateExceptionHandler)
- MOTH_BEGIN_INSTR(CallBuiltinDeleteExceptionHandler)
+ MOTH_BEGIN_INSTR(CallBuiltinFinishTry)
return VM::Value();
- MOTH_END_INSTR(CallBuiltinDeleteExceptionHandler)
+ MOTH_END_INSTR(CallBuiltinFinishTry)
MOTH_BEGIN_INSTR(CallBuiltinGetException)
__qmljs_get_exception(context, VALUEPTR(instr.result));
// Pass the hidden "inCatch" and "hasException" TEMPs to the
// builtin_delete_exception_handler, in order to have those TEMPs alive for
// the duration of the exception handling block.
- IR::ExprList *deleteExceptionArgs = _function->New<IR::ExprList>();
- deleteExceptionArgs->init(_block->TEMP(hasException));
+ IR::ExprList *finishTryArgs = _function->New<IR::ExprList>();
+ finishTryArgs->init(_block->TEMP(hasException));
if (inCatch) {
- deleteExceptionArgs->next = _function->New<IR::ExprList>();
- deleteExceptionArgs->next->init(_block->TEMP(inCatch));
+ finishTryArgs->next = _function->New<IR::ExprList>();
+ finishTryArgs->next->init(_block->TEMP(inCatch));
}
- ScopeAndFinally tcf(_scopeAndFinally, ast->finallyExpression, deleteExceptionArgs);
+ ScopeAndFinally tcf(_scopeAndFinally, ast->finallyExpression, finishTryArgs);
_scopeAndFinally = &tcf;
_block->CJUMP(_block->TEMP(hasException), catchBody ? catchBody : finallyBody, tryBody);
int exception_to_rethrow = _block->newTemp();
move(_block->TEMP(exception_to_rethrow), _block->CALL(_block->NAME(IR::Name::builtin_get_exception, 0, 0), 0));
- _block->EXP(_block->CALL(_block->NAME(IR::Name::builtin_delete_exception_handler, 0, 0), deleteExceptionArgs));
+ _block->EXP(_block->CALL(_block->NAME(IR::Name::builtin_finish_try, 0, 0), finishTryArgs));
if (ast->finallyExpression && ast->finallyExpression->statement)
statement(ast->finallyExpression->statement);
_scopeAndFinally = _scopeAndFinally->parent;
--_function->insideWithOrCatch;
} else {
- _block->EXP(_block->CALL(_block->NAME(IR::Name::builtin_delete_exception_handler, 0, 0), _scopeAndFinally->deleteExceptionArgs));
+ _block->EXP(_block->CALL(_block->NAME(IR::Name::builtin_finish_try, 0, 0), _scopeAndFinally->finishTryArgs));
ScopeAndFinally *tc = _scopeAndFinally;
_scopeAndFinally = tc->parent;
if (tc->finally && tc->finally->statement)
struct ScopeAndFinally {
ScopeAndFinally *parent;
AST::Finally *finally;
- IR::ExprList *deleteExceptionArgs;
+ IR::ExprList *finishTryArgs;
bool popScope;
- ScopeAndFinally(ScopeAndFinally *parent) : parent(parent), finally(0), deleteExceptionArgs(0), popScope(true) {}
- ScopeAndFinally(ScopeAndFinally *parent, AST::Finally *finally, IR::ExprList *deleteExceptionArgs)
- : parent(parent), finally(finally), deleteExceptionArgs(deleteExceptionArgs), popScope(false)
+ ScopeAndFinally(ScopeAndFinally *parent) : parent(parent), finally(0), finishTryArgs(0), popScope(true) {}
+ ScopeAndFinally(ScopeAndFinally *parent, AST::Finally *finally, IR::ExprList *finishTryArgs)
+ : parent(parent), finally(finally), finishTryArgs(finishTryArgs), popScope(false)
{}
};
return "builtin_throw";
case Name::builtin_create_exception_handler:
return "builtin_create_exception_handler";
- case Name::builtin_delete_exception_handler:
- return "builtin_delete_exception_handler";
+ case Name::builtin_finish_try:
+ return "builtin_finish_try";
case Name::builtin_get_exception:
return "builtin_get_exception";
case IR::Name::builtin_foreach_iterator_object:
builtin_postdecrement,
builtin_throw,
builtin_create_exception_handler,
- builtin_delete_exception_handler,
+ builtin_finish_try,
builtin_get_exception,
builtin_foreach_iterator_object,
builtin_foreach_next_property_name,
Q_UNREACHABLE();
}
-void InstructionSelection::callBuiltinDeleteExceptionHandler()
+void InstructionSelection::callBuiltinFinishTry()
{
// TODO
assert(!"TODO!");
_llvmValue = CreateLoad(result);
return;
- case IR::Name::builtin_delete_exception_handler:
- CreateCall(getRuntimeFunction("__qmljs_llvm_delete_exception_handler"),
- _llvmFunction->arg_begin());
+ case IR::Name::builtin_finish_try:
+ // ### FIXME.
return;
case IR::Name::builtin_get_exception:
virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result);
virtual void callBuiltinThrow(IR::Temp *arg);
virtual void callBuiltinCreateExceptionHandler(IR::Temp *result);
- virtual void callBuiltinDeleteExceptionHandler();
+ virtual void callBuiltinFinishTry();
virtual void callBuiltinGetException(IR::Temp *result);
virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result);
virtual void callBuiltinForeachNextPropertyname(IR::Temp *arg, IR::Temp *result);
_as->store32(Assembler::TrustedImm32(Value::Boolean_Type), addr);
}
-void InstructionSelection::callBuiltinDeleteExceptionHandler()
+void InstructionSelection::callBuiltinFinishTry()
{
// This assumes that we're in code that was called by tryWrapper, so we return to try wrapper
// with the address that we'd like to continue at, which is right after the ret below.
virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result);
virtual void callBuiltinThrow(IR::Temp *arg);
virtual void callBuiltinCreateExceptionHandler(IR::Temp *result);
- virtual void callBuiltinDeleteExceptionHandler();
+ virtual void callBuiltinFinishTry();
virtual void callBuiltinGetException(IR::Temp *result);
virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result);
virtual void callBuiltinForeachNextPropertyname(IR::Temp *arg, IR::Temp *result);
return;
}
- case IR::Name::builtin_delete_exception_handler:
- callBuiltinDeleteExceptionHandler();
+ case IR::Name::builtin_finish_try:
+ callBuiltinFinishTry();
return;
case IR::Name::builtin_get_exception:
virtual void callBuiltinPostIncrementValue(IR::Temp *value, IR::Temp *result) = 0;
virtual void callBuiltinThrow(IR::Temp *arg) = 0;
virtual void callBuiltinCreateExceptionHandler(IR::Temp *result) = 0;
- virtual void callBuiltinDeleteExceptionHandler() = 0;
+ virtual void callBuiltinFinishTry() = 0;
virtual void callBuiltinGetException(IR::Temp *result) = 0;
virtual void callBuiltinForeachIteratorObject(IR::Temp *arg, IR::Temp *result) = 0;
virtual void callBuiltinForeachNextPropertyname(IR::Temp *arg, IR::Temp *result) = 0;