diff options
author | Lars Knoll <lars.knoll@digia.com> | 2012-12-07 20:31:19 -0800 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-12-08 05:33:51 +0100 |
commit | 806b5fb4c14b9da712d57525c35b6333665cf26d (patch) | |
tree | ea29875d2dbd9ed0b04a51dda8e1a32e119c931c /qv4isel_masm.cpp | |
parent | 852cc7f443f2321b0c53077f3fc0cee577903199 (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.cpp | 20 |
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 |