aboutsummaryrefslogtreecommitdiffstats
path: root/qv4isel_masm.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2012-12-07 20:31:19 -0800
committerSimon Hausmann <simon.hausmann@digia.com>2012-12-08 05:33:51 +0100
commit806b5fb4c14b9da712d57525c35b6333665cf26d (patch)
treeea29875d2dbd9ed0b04a51dda8e1a32e119c931c /qv4isel_masm.cpp
parent852cc7f443f2321b0c53077f3fc0cee577903199 (diff)
Fix typeof to work with undefined references
Change-Id: I90cd2b34a25476dfee1ec01315275b6c179d11dc Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'qv4isel_masm.cpp')
-rw-r--r--qv4isel_masm.cpp20
1 files changed, 16 insertions, 4 deletions
diff --git a/qv4isel_masm.cpp b/qv4isel_masm.cpp
index 2fa506d022..a754bee666 100644
--- a/qv4isel_masm.cpp
+++ b/qv4isel_masm.cpp
@@ -259,9 +259,21 @@ void InstructionSelection::callActivationProperty(IR::Call *call, IR::Temp *resu
callRuntimeMethod(result, __qmljs_call_activation_property, call->base, call->args);
break;
case IR::Name::builtin_typeof: {
- IR::Temp *arg = call->args->expr->asTemp();
- assert(arg != 0);
- generateFunctionCall(result, __qmljs_builtin_typeof, arg, ContextRegister);
+ if (IR::Member *m = call->args->expr->asMember()) {
+ generateFunctionCall(result, __qmljs_builtin_typeof_member, m->base->asTemp(), identifier(*m->name), ContextRegister);
+ return;
+ } else if (IR::Subscript *ss = call->args->expr->asSubscript()) {
+ generateFunctionCall(result, __qmljs_builtin_typeof_element, ss->base->asTemp(), ss->index->asTemp(), ContextRegister);
+ return;
+ } else if (IR::Name *n = call->args->expr->asName()) {
+ generateFunctionCall(result, __qmljs_builtin_typeof_name, identifier(*n->id), ContextRegister);
+ return;
+ } else if (IR::Temp *arg = call->args->expr->asTemp()){
+ assert(arg != 0);
+ generateFunctionCall(result, __qmljs_builtin_typeof, arg, ContextRegister);
+ } else {
+ assert(false);
+ }
}
break;
case IR::Name::builtin_delete: {
@@ -272,7 +284,7 @@ void InstructionSelection::callActivationProperty(IR::Call *call, IR::Temp *resu
generateFunctionCall(result, __qmljs_delete_subscript, ContextRegister, ss->base->asTemp(), ss->index->asTemp());
return;
} else if (IR::Name *n = call->args->expr->asName()) {
- generateFunctionCall(result, __qmljs_delete_name, ContextRegister, n);
+ generateFunctionCall(result, __qmljs_delete_name, ContextRegister, identifier(*n->id));
return;
} else if (call->args->expr->asTemp()){
// ### should throw in strict mode