#include "qmljs_runtime.h"
#include <stdio.h>
+#include <setjmp.h>
using namespace QQmlJS::VM;
__qmljs_throw(*value, context);
}
+void __qmljs_llvm_create_exception_handler(Context *context, Value *result)
+{
+ void *buf = __qmljs_create_exception_handler(context);
+ *result = Value::fromInt32(setjmp(* static_cast<jmp_buf *>(buf)));
+}
+
+void __qmljs_llvm_delete_exception_handler(Context *context)
+{
+ __qmljs_delete_exception_handler(context);
+}
+
+void __qmljs_llvm_get_exception(Context *context, Value *result)
+{
+ *result = __qmljs_get_exception(context);
+}
+
+void __qmljs_llvm_foreach_iterator_object(Context *context, Value *result, Value *in)
+{
+ *result = __qmljs_foreach_iterator_object(*in, context);
+}
+
+void __qmljs_llvm_foreach_next_property_name(Value *result, Value *it)
+{
+ *result = __qmljs_foreach_next_property_name(*it);
+}
+
void __qmljs_llvm_get_this_object(Context *ctx, Value *result)
{
*result = __qmljs_get_thisObject(ctx);
qSwap(_llvmValue, llvmValue);
}
if (! llvmValue) {
+ expr->dump(qerr);qerr<<endl;
Q_UNIMPLEMENTED();
llvmValue = llvm::Constant::getNullValue(_valueTy);
}
break;
case IR::Name::builtin_typeof:
- // inline void __qmljs_typeof(Context *ctx, Value *result, const Value *value)
CreateCall3(_llvmModule->getFunction("__qmljs_llvm_typeof"),
_llvmFunction->arg_begin(), result, getLLVMTempReference(e->args->expr));
_llvmValue = CreateLoad(result);
return;
+ case IR::Name::builtin_throw:
+ CreateCall2(_llvmModule->getFunction("__qmljs_llvm_throw"),
+ _llvmFunction->arg_begin(), getLLVMTempReference(e->args->expr));
+ _llvmValue = llvm::UndefValue::get(_valueTy);
+ return;
+
+ case IR::Name::builtin_create_exception_handler:
+ CreateCall2(_llvmModule->getFunction("__qmljs_llvm_create_exception_handler"),
+ _llvmFunction->arg_begin(), result);
+ _llvmValue = CreateLoad(result);
+ return;
+
+ case IR::Name::builtin_delete_exception_handler:
+ CreateCall(_llvmModule->getFunction("__qmljs_llvm_delete_exception_handler"),
+ _llvmFunction->arg_begin());
+ return;
+
+ case IR::Name::builtin_get_exception:
+ CreateCall2(_llvmModule->getFunction("__qmljs_llvm_get_exception"),
+ _llvmFunction->arg_begin(), result);
+ _llvmValue = CreateLoad(result);
+ return;
+
+ case IR::Name::builtin_foreach_iterator_object:
+ CreateCall3(_llvmModule->getFunction("__qmljs_llvm_foreach_iterator_object"),
+ _llvmFunction->arg_begin(), result, getLLVMTempReference(e->args->expr));
+ _llvmValue = CreateLoad(result);
+ return;
+
+ case IR::Name::builtin_foreach_next_property_name:
+ CreateCall2(_llvmModule->getFunction("__qmljs_llvm_foreach_next_property_name"),
+ result, getLLVMTempReference(e->args->expr));
+ _llvmValue = CreateLoad(result);
+ return;
+
case IR::Name::builtin_delete: {
if (IR::Subscript *subscript = e->args->expr->asSubscript()) {
CreateCall4(_llvmModule->getFunction("__qmljs_llvm_delete_subscript"),
_llvmValue = CreateLoad(result);
return;
}
- } break;
-
- case IR::Name::builtin_throw:
- CreateCall2(_llvmModule->getFunction("__qmljs_llvm_throw"),
- _llvmFunction->arg_begin(), getLLVMTempReference(e->args->expr));
- _llvmValue = llvm::UndefValue::get(_valueTy);
- return;
+ } break;
default:
Q_UNREACHABLE();