diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2012-06-07 14:28:42 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2012-06-07 14:28:42 +0200 |
commit | 5c869a3c812e443fe2d6598ddbeafa42634d11ed (patch) | |
tree | 2b8e1144f3c36bcb4ea6d145ab1cab255466521c /qv4isel_llvm.cpp | |
parent | 60006079bbf5715a753b4bd3bceb1f27249e1736 (diff) |
Delete properties
Diffstat (limited to 'qv4isel_llvm.cpp')
-rw-r--r-- | qv4isel_llvm.cpp | 34 |
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)); |