aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_llvm.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2012-06-07 14:28:42 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2012-06-07 14:28:42 +0200
commit5c869a3c812e443fe2d6598ddbeafa42634d11ed (patch)
tree2b8e1144f3c36bcb4ea6d145ab1cab255466521c /qv4isel_llvm.cpp
parent60006079bbf5715a753b4bd3bceb1f27249e1736 (diff)
Delete properties
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r--qv4isel_llvm.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/qv4isel_llvm.cpp b/qv4isel_llvm.cpp
index 0f882e0a3b..7c666c7fe2 100644
--- a/qv4isel_llvm.cpp
+++ b/qv4isel_llvm.cpp
@@ -595,6 +595,40 @@ void LLVMInstructionSelection::genCallName(IR::Call *e, llvm::Value *result)
_llvmValue = CreateLoad(result);
return;
+ case IR::Name::builtin_delete: {
+ if (IR::Subscript *subscript = e->args->expr->asSubscript()) {
+ CreateCall4(_llvmModule->getFunction("__qmljs_llvm_delete_subscript"),
+ _llvmFunction->arg_begin(),
+ result,
+ getLLVMTempReference(subscript->base),
+ getLLVMTempReference(subscript->index));
+ _llvmValue = CreateLoad(result);
+ return;
+ } else if (IR::Member *member = e->args->expr->asMember()) {
+ CreateCall4(_llvmModule->getFunction("__qmljs_llvm_delete_member"),
+ _llvmFunction->arg_begin(),
+ result,
+ getLLVMTempReference(member->base),
+ getIdentifier(*member->name));
+ _llvmValue = CreateLoad(result);
+ return;
+ } else if (IR::Name *name = e->args->expr->asName()) {
+ CreateCall3(_llvmModule->getFunction("__qmljs_llvm_delete_property"),
+ _llvmFunction->arg_begin(),
+ result,
+ getIdentifier(*name->id));
+ _llvmValue = CreateLoad(result);
+ return;
+ } else {
+ CreateCall3(_llvmModule->getFunction("__qmljs_llvm_delete_value"),
+ _llvmFunction->arg_begin(),
+ result,
+ getLLVMTempReference(e->args->expr));
+ _llvmValue = CreateLoad(result);
+ return;
+ }
+ } break;
+
case IR::Name::builtin_throw:
CreateCall2(_llvmModule->getFunction("__qmljs_llvm_throw"),
_llvmFunction->arg_begin(), getLLVMTempReference(e->args->expr));