OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 __ cmp(r0, null_value); | 908 __ cmp(r0, null_value); |
909 __ b(eq, &exit); | 909 __ b(eq, &exit); |
910 | 910 |
911 // Convert the object to a JS object. | 911 // Convert the object to a JS object. |
912 Label convert, done_convert; | 912 Label convert, done_convert; |
913 __ JumpIfSmi(r0, &convert); | 913 __ JumpIfSmi(r0, &convert); |
914 __ CompareObjectType(r0, r1, r1, FIRST_JS_OBJECT_TYPE); | 914 __ CompareObjectType(r0, r1, r1, FIRST_JS_OBJECT_TYPE); |
915 __ b(hs, &done_convert); | 915 __ b(hs, &done_convert); |
916 __ bind(&convert); | 916 __ bind(&convert); |
917 __ push(r0); | 917 __ push(r0); |
918 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_JS); | 918 __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); |
919 __ bind(&done_convert); | 919 __ bind(&done_convert); |
920 __ push(r0); | 920 __ push(r0); |
921 | 921 |
922 // Check cache validity in generated code. This is a fast case for | 922 // Check cache validity in generated code. This is a fast case for |
923 // the JSObject::IsSimpleEnum cache validity checks. If we cannot | 923 // the JSObject::IsSimpleEnum cache validity checks. If we cannot |
924 // guarantee cache validity, call the runtime system to check cache | 924 // guarantee cache validity, call the runtime system to check cache |
925 // validity or get the property names in a fixed array. | 925 // validity or get the property names in a fixed array. |
926 Label next, call_runtime; | 926 Label next, call_runtime; |
927 // Preload a couple of values used in the loop. | 927 // Preload a couple of values used in the loop. |
928 Register empty_fixed_array_value = r6; | 928 Register empty_fixed_array_value = r6; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 __ ldr(r1, MemOperand(sp, 4 * kPointerSize)); | 1032 __ ldr(r1, MemOperand(sp, 4 * kPointerSize)); |
1033 __ ldr(r4, FieldMemOperand(r1, HeapObject::kMapOffset)); | 1033 __ ldr(r4, FieldMemOperand(r1, HeapObject::kMapOffset)); |
1034 __ cmp(r4, Operand(r2)); | 1034 __ cmp(r4, Operand(r2)); |
1035 __ b(eq, &update_each); | 1035 __ b(eq, &update_each); |
1036 | 1036 |
1037 // Convert the entry to a string or (smi) 0 if it isn't a property | 1037 // Convert the entry to a string or (smi) 0 if it isn't a property |
1038 // any more. If the property has been removed while iterating, we | 1038 // any more. If the property has been removed while iterating, we |
1039 // just skip it. | 1039 // just skip it. |
1040 __ push(r1); // Enumerable. | 1040 __ push(r1); // Enumerable. |
1041 __ push(r3); // Current entry. | 1041 __ push(r3); // Current entry. |
1042 __ InvokeBuiltin(Builtins::FILTER_KEY, CALL_JS); | 1042 __ InvokeBuiltin(Builtins::FILTER_KEY, CALL_FUNCTION); |
1043 __ mov(r3, Operand(r0), SetCC); | 1043 __ mov(r3, Operand(r0), SetCC); |
1044 __ b(eq, loop_statement.continue_target()); | 1044 __ b(eq, loop_statement.continue_target()); |
1045 | 1045 |
1046 // Update the 'each' property or variable from the possibly filtered | 1046 // Update the 'each' property or variable from the possibly filtered |
1047 // entry in register r3. | 1047 // entry in register r3. |
1048 __ bind(&update_each); | 1048 __ bind(&update_each); |
1049 __ mov(result_register(), r3); | 1049 __ mov(result_register(), r3); |
1050 // Perform the assignment as if via '='. | 1050 // Perform the assignment as if via '='. |
1051 { EffectContext context(this); | 1051 { EffectContext context(this); |
1052 EmitAssignment(stmt->each(), stmt->AssignmentId()); | 1052 EmitAssignment(stmt->each(), stmt->AssignmentId()); |
(...skipping 2640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3693 if (prop != NULL) { | 3693 if (prop != NULL) { |
3694 if (prop->is_synthetic()) { | 3694 if (prop->is_synthetic()) { |
3695 // Result of deleting parameters is false, even when they rewrite | 3695 // Result of deleting parameters is false, even when they rewrite |
3696 // to accesses on the arguments object. | 3696 // to accesses on the arguments object. |
3697 context()->Plug(false); | 3697 context()->Plug(false); |
3698 } else { | 3698 } else { |
3699 VisitForStackValue(prop->obj()); | 3699 VisitForStackValue(prop->obj()); |
3700 VisitForStackValue(prop->key()); | 3700 VisitForStackValue(prop->key()); |
3701 __ mov(r1, Operand(Smi::FromInt(strict_mode_flag()))); | 3701 __ mov(r1, Operand(Smi::FromInt(strict_mode_flag()))); |
3702 __ push(r1); | 3702 __ push(r1); |
3703 __ InvokeBuiltin(Builtins::DELETE, CALL_JS); | 3703 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); |
3704 context()->Plug(r0); | 3704 context()->Plug(r0); |
3705 } | 3705 } |
3706 } else if (var != NULL) { | 3706 } else if (var != NULL) { |
3707 // Delete of an unqualified identifier is disallowed in strict mode | 3707 // Delete of an unqualified identifier is disallowed in strict mode |
3708 // but "delete this" is. | 3708 // but "delete this" is. |
3709 ASSERT(strict_mode_flag() == kNonStrictMode || var->is_this()); | 3709 ASSERT(strict_mode_flag() == kNonStrictMode || var->is_this()); |
3710 if (var->is_global()) { | 3710 if (var->is_global()) { |
3711 __ ldr(r2, GlobalObjectOperand()); | 3711 __ ldr(r2, GlobalObjectOperand()); |
3712 __ mov(r1, Operand(var->name())); | 3712 __ mov(r1, Operand(var->name())); |
3713 __ mov(r0, Operand(Smi::FromInt(kNonStrictMode))); | 3713 __ mov(r0, Operand(Smi::FromInt(kNonStrictMode))); |
3714 __ Push(r2, r1, r0); | 3714 __ Push(r2, r1, r0); |
3715 __ InvokeBuiltin(Builtins::DELETE, CALL_JS); | 3715 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); |
3716 context()->Plug(r0); | 3716 context()->Plug(r0); |
3717 } else if (var->AsSlot() != NULL && | 3717 } else if (var->AsSlot() != NULL && |
3718 var->AsSlot()->type() != Slot::LOOKUP) { | 3718 var->AsSlot()->type() != Slot::LOOKUP) { |
3719 // Result of deleting non-global, non-dynamic variables is false. | 3719 // Result of deleting non-global, non-dynamic variables is false. |
3720 // The subexpression does not have side effects. | 3720 // The subexpression does not have side effects. |
3721 context()->Plug(false); | 3721 context()->Plug(false); |
3722 } else { | 3722 } else { |
3723 // Non-global variable. Call the runtime to try to delete from the | 3723 // Non-global variable. Call the runtime to try to delete from the |
3724 // context where the variable was introduced. | 3724 // context where the variable was introduced. |
3725 __ push(context_register()); | 3725 __ push(context_register()); |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4133 Expression* right = expr->right(); | 4133 Expression* right = expr->right(); |
4134 if (TryLiteralCompare(op, left, right, if_true, if_false, fall_through)) { | 4134 if (TryLiteralCompare(op, left, right, if_true, if_false, fall_through)) { |
4135 context()->Plug(if_true, if_false); | 4135 context()->Plug(if_true, if_false); |
4136 return; | 4136 return; |
4137 } | 4137 } |
4138 | 4138 |
4139 VisitForStackValue(expr->left()); | 4139 VisitForStackValue(expr->left()); |
4140 switch (op) { | 4140 switch (op) { |
4141 case Token::IN: | 4141 case Token::IN: |
4142 VisitForStackValue(expr->right()); | 4142 VisitForStackValue(expr->right()); |
4143 __ InvokeBuiltin(Builtins::IN, CALL_JS); | 4143 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION); |
4144 PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL); | 4144 PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL); |
4145 __ LoadRoot(ip, Heap::kTrueValueRootIndex); | 4145 __ LoadRoot(ip, Heap::kTrueValueRootIndex); |
4146 __ cmp(r0, ip); | 4146 __ cmp(r0, ip); |
4147 Split(eq, if_true, if_false, fall_through); | 4147 Split(eq, if_true, if_false, fall_through); |
4148 break; | 4148 break; |
4149 | 4149 |
4150 case Token::INSTANCEOF: { | 4150 case Token::INSTANCEOF: { |
4151 VisitForStackValue(expr->right()); | 4151 VisitForStackValue(expr->right()); |
4152 InstanceofStub stub(InstanceofStub::kNoFlags); | 4152 InstanceofStub stub(InstanceofStub::kNoFlags); |
4153 __ CallStub(&stub); | 4153 __ CallStub(&stub); |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4374 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. | 4374 __ mov(r1, Operand(r1, ASR, 1)); // Un-smi-tag value. |
4375 __ add(pc, r1, Operand(masm_->CodeObject())); | 4375 __ add(pc, r1, Operand(masm_->CodeObject())); |
4376 } | 4376 } |
4377 | 4377 |
4378 | 4378 |
4379 #undef __ | 4379 #undef __ |
4380 | 4380 |
4381 } } // namespace v8::internal | 4381 } } // namespace v8::internal |
4382 | 4382 |
4383 #endif // V8_TARGET_ARCH_ARM | 4383 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |