OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 Split(equal, if_true, if_false, NULL); | 747 Split(equal, if_true, if_false, NULL); |
748 __ bind(&skip); | 748 __ bind(&skip); |
749 } | 749 } |
750 } | 750 } |
751 | 751 |
752 | 752 |
753 void FullCodeGenerator::EmitDebugCheckDeclarationContext(Variable* variable) { | 753 void FullCodeGenerator::EmitDebugCheckDeclarationContext(Variable* variable) { |
754 // The variable in the declaration always resides in the current function | 754 // The variable in the declaration always resides in the current function |
755 // context. | 755 // context. |
756 ASSERT_EQ(0, scope()->ContextChainLength(variable->scope())); | 756 ASSERT_EQ(0, scope()->ContextChainLength(variable->scope())); |
757 if (FLAG_debug_code) { | 757 if (generate_debug_code_) { |
758 // Check that we're not inside a with or catch context. | 758 // Check that we're not inside a with or catch context. |
759 __ mov(ebx, FieldOperand(esi, HeapObject::kMapOffset)); | 759 __ mov(ebx, FieldOperand(esi, HeapObject::kMapOffset)); |
760 __ cmp(ebx, isolate()->factory()->with_context_map()); | 760 __ cmp(ebx, isolate()->factory()->with_context_map()); |
761 __ Check(not_equal, "Declaration in with context."); | 761 __ Check(not_equal, "Declaration in with context."); |
762 __ cmp(ebx, isolate()->factory()->catch_context_map()); | 762 __ cmp(ebx, isolate()->factory()->catch_context_map()); |
763 __ Check(not_equal, "Declaration in catch context."); | 763 __ Check(not_equal, "Declaration in catch context."); |
764 } | 764 } |
765 } | 765 } |
766 | 766 |
767 | 767 |
(...skipping 1316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2084 int offset = Context::SlotOffset(var->index()); | 2084 int offset = Context::SlotOffset(var->index()); |
2085 __ RecordWriteContextSlot(ecx, offset, edx, ebx, kDontSaveFPRegs); | 2085 __ RecordWriteContextSlot(ecx, offset, edx, ebx, kDontSaveFPRegs); |
2086 } | 2086 } |
2087 } | 2087 } |
2088 | 2088 |
2089 } else if (!var->is_const_mode() || op == Token::INIT_CONST_HARMONY) { | 2089 } else if (!var->is_const_mode() || op == Token::INIT_CONST_HARMONY) { |
2090 // Assignment to var or initializing assignment to let/const | 2090 // Assignment to var or initializing assignment to let/const |
2091 // in harmony mode. | 2091 // in harmony mode. |
2092 if (var->IsStackAllocated() || var->IsContextSlot()) { | 2092 if (var->IsStackAllocated() || var->IsContextSlot()) { |
2093 MemOperand location = VarOperand(var, ecx); | 2093 MemOperand location = VarOperand(var, ecx); |
2094 if (FLAG_debug_code && op == Token::INIT_LET) { | 2094 if (generate_debug_code_ && op == Token::INIT_LET) { |
2095 // Check for an uninitialized let binding. | 2095 // Check for an uninitialized let binding. |
2096 __ mov(edx, location); | 2096 __ mov(edx, location); |
2097 __ cmp(edx, isolate()->factory()->the_hole_value()); | 2097 __ cmp(edx, isolate()->factory()->the_hole_value()); |
2098 __ Check(equal, "Let binding re-initialization."); | 2098 __ Check(equal, "Let binding re-initialization."); |
2099 } | 2099 } |
2100 // Perform the assignment. | 2100 // Perform the assignment. |
2101 __ mov(location, eax); | 2101 __ mov(location, eax); |
2102 if (var->IsContextSlot()) { | 2102 if (var->IsContextSlot()) { |
2103 __ mov(edx, eax); | 2103 __ mov(edx, eax); |
2104 int offset = Context::SlotOffset(var->index()); | 2104 int offset = Context::SlotOffset(var->index()); |
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2633 | 2633 |
2634 VisitForAccumulatorValue(args->at(0)); | 2634 VisitForAccumulatorValue(args->at(0)); |
2635 | 2635 |
2636 Label materialize_true, materialize_false; | 2636 Label materialize_true, materialize_false; |
2637 Label* if_true = NULL; | 2637 Label* if_true = NULL; |
2638 Label* if_false = NULL; | 2638 Label* if_false = NULL; |
2639 Label* fall_through = NULL; | 2639 Label* fall_through = NULL; |
2640 context()->PrepareTest(&materialize_true, &materialize_false, | 2640 context()->PrepareTest(&materialize_true, &materialize_false, |
2641 &if_true, &if_false, &fall_through); | 2641 &if_true, &if_false, &fall_through); |
2642 | 2642 |
2643 if (FLAG_debug_code) __ AbortIfSmi(eax); | 2643 if (generate_debug_code_) __ AbortIfSmi(eax); |
2644 | 2644 |
2645 // Check whether this map has already been checked to be safe for default | 2645 // Check whether this map has already been checked to be safe for default |
2646 // valueOf. | 2646 // valueOf. |
2647 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); | 2647 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
2648 __ test_b(FieldOperand(ebx, Map::kBitField2Offset), | 2648 __ test_b(FieldOperand(ebx, Map::kBitField2Offset), |
2649 1 << Map::kStringWrapperSafeForDefaultValueOf); | 2649 1 << Map::kStringWrapperSafeForDefaultValueOf); |
2650 __ j(not_zero, if_true); | 2650 __ j(not_zero, if_true); |
2651 | 2651 |
2652 // Check for fast case object. Return false for slow case objects. | 2652 // Check for fast case object. Return false for slow case objects. |
2653 __ mov(ecx, FieldOperand(eax, JSObject::kPropertiesOffset)); | 2653 __ mov(ecx, FieldOperand(eax, JSObject::kPropertiesOffset)); |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2858 __ mov(ebx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); | 2858 __ mov(ebx, Operand(ebp, StandardFrameConstants::kCallerFPOffset)); |
2859 __ cmp(Operand(ebx, StandardFrameConstants::kContextOffset), | 2859 __ cmp(Operand(ebx, StandardFrameConstants::kContextOffset), |
2860 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | 2860 Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
2861 __ j(not_equal, &exit); | 2861 __ j(not_equal, &exit); |
2862 | 2862 |
2863 // Arguments adaptor case: Read the arguments length from the | 2863 // Arguments adaptor case: Read the arguments length from the |
2864 // adaptor frame. | 2864 // adaptor frame. |
2865 __ mov(eax, Operand(ebx, ArgumentsAdaptorFrameConstants::kLengthOffset)); | 2865 __ mov(eax, Operand(ebx, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
2866 | 2866 |
2867 __ bind(&exit); | 2867 __ bind(&exit); |
2868 if (FLAG_debug_code) __ AbortIfNotSmi(eax); | 2868 if (generate_debug_code_) __ AbortIfNotSmi(eax); |
2869 context()->Plug(eax); | 2869 context()->Plug(eax); |
2870 } | 2870 } |
2871 | 2871 |
2872 | 2872 |
2873 void FullCodeGenerator::EmitClassOf(CallRuntime* expr) { | 2873 void FullCodeGenerator::EmitClassOf(CallRuntime* expr) { |
2874 ZoneList<Expression*>* args = expr->arguments(); | 2874 ZoneList<Expression*>* args = expr->arguments(); |
2875 ASSERT(args->length() == 1); | 2875 ASSERT(args->length() == 1); |
2876 Label done, null, function, non_function_constructor; | 2876 Label done, null, function, non_function_constructor; |
2877 | 2877 |
2878 VisitForAccumulatorValue(args->at(0)); | 2878 VisitForAccumulatorValue(args->at(0)); |
(...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3478 context()->Plug(eax); | 3478 context()->Plug(eax); |
3479 } | 3479 } |
3480 | 3480 |
3481 | 3481 |
3482 void FullCodeGenerator::EmitHasCachedArrayIndex(CallRuntime* expr) { | 3482 void FullCodeGenerator::EmitHasCachedArrayIndex(CallRuntime* expr) { |
3483 ZoneList<Expression*>* args = expr->arguments(); | 3483 ZoneList<Expression*>* args = expr->arguments(); |
3484 ASSERT(args->length() == 1); | 3484 ASSERT(args->length() == 1); |
3485 | 3485 |
3486 VisitForAccumulatorValue(args->at(0)); | 3486 VisitForAccumulatorValue(args->at(0)); |
3487 | 3487 |
3488 if (FLAG_debug_code) { | 3488 if (generate_debug_code_) { |
3489 __ AbortIfNotString(eax); | 3489 __ AbortIfNotString(eax); |
3490 } | 3490 } |
3491 | 3491 |
3492 Label materialize_true, materialize_false; | 3492 Label materialize_true, materialize_false; |
3493 Label* if_true = NULL; | 3493 Label* if_true = NULL; |
3494 Label* if_false = NULL; | 3494 Label* if_false = NULL; |
3495 Label* fall_through = NULL; | 3495 Label* fall_through = NULL; |
3496 context()->PrepareTest(&materialize_true, &materialize_false, | 3496 context()->PrepareTest(&materialize_true, &materialize_false, |
3497 &if_true, &if_false, &fall_through); | 3497 &if_true, &if_false, &fall_through); |
3498 | 3498 |
3499 __ test(FieldOperand(eax, String::kHashFieldOffset), | 3499 __ test(FieldOperand(eax, String::kHashFieldOffset), |
3500 Immediate(String::kContainsCachedArrayIndexMask)); | 3500 Immediate(String::kContainsCachedArrayIndexMask)); |
3501 PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); | 3501 PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); |
3502 Split(zero, if_true, if_false, fall_through); | 3502 Split(zero, if_true, if_false, fall_through); |
3503 | 3503 |
3504 context()->Plug(if_true, if_false); | 3504 context()->Plug(if_true, if_false); |
3505 } | 3505 } |
3506 | 3506 |
3507 | 3507 |
3508 void FullCodeGenerator::EmitGetCachedArrayIndex(CallRuntime* expr) { | 3508 void FullCodeGenerator::EmitGetCachedArrayIndex(CallRuntime* expr) { |
3509 ZoneList<Expression*>* args = expr->arguments(); | 3509 ZoneList<Expression*>* args = expr->arguments(); |
3510 ASSERT(args->length() == 1); | 3510 ASSERT(args->length() == 1); |
3511 VisitForAccumulatorValue(args->at(0)); | 3511 VisitForAccumulatorValue(args->at(0)); |
3512 | 3512 |
3513 if (FLAG_debug_code) { | 3513 if (generate_debug_code_) { |
3514 __ AbortIfNotString(eax); | 3514 __ AbortIfNotString(eax); |
3515 } | 3515 } |
3516 | 3516 |
3517 __ mov(eax, FieldOperand(eax, String::kHashFieldOffset)); | 3517 __ mov(eax, FieldOperand(eax, String::kHashFieldOffset)); |
3518 __ IndexFromHash(eax, eax); | 3518 __ IndexFromHash(eax, eax); |
3519 | 3519 |
3520 context()->Plug(eax); | 3520 context()->Plug(eax); |
3521 } | 3521 } |
3522 | 3522 |
3523 | 3523 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3579 array = no_reg; | 3579 array = no_reg; |
3580 | 3580 |
3581 | 3581 |
3582 // Check that all array elements are sequential ASCII strings, and | 3582 // Check that all array elements are sequential ASCII strings, and |
3583 // accumulate the sum of their lengths, as a smi-encoded value. | 3583 // accumulate the sum of their lengths, as a smi-encoded value. |
3584 __ Set(index, Immediate(0)); | 3584 __ Set(index, Immediate(0)); |
3585 __ Set(string_length, Immediate(0)); | 3585 __ Set(string_length, Immediate(0)); |
3586 // Loop condition: while (index < length). | 3586 // Loop condition: while (index < length). |
3587 // Live loop registers: index, array_length, string, | 3587 // Live loop registers: index, array_length, string, |
3588 // scratch, string_length, elements. | 3588 // scratch, string_length, elements. |
3589 if (FLAG_debug_code) { | 3589 if (generate_debug_code_) { |
3590 __ cmp(index, array_length); | 3590 __ cmp(index, array_length); |
3591 __ Assert(less, "No empty arrays here in EmitFastAsciiArrayJoin"); | 3591 __ Assert(less, "No empty arrays here in EmitFastAsciiArrayJoin"); |
3592 } | 3592 } |
3593 __ bind(&loop); | 3593 __ bind(&loop); |
3594 __ mov(string, FieldOperand(elements, | 3594 __ mov(string, FieldOperand(elements, |
3595 index, | 3595 index, |
3596 times_pointer_size, | 3596 times_pointer_size, |
3597 FixedArray::kHeaderSize)); | 3597 FixedArray::kHeaderSize)); |
3598 __ JumpIfSmi(string, &bailout); | 3598 __ JumpIfSmi(string, &bailout); |
3599 __ mov(scratch, FieldOperand(string, HeapObject::kMapOffset)); | 3599 __ mov(scratch, FieldOperand(string, HeapObject::kMapOffset)); |
(...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4541 *stack_depth = 0; | 4541 *stack_depth = 0; |
4542 *context_length = 0; | 4542 *context_length = 0; |
4543 return previous_; | 4543 return previous_; |
4544 } | 4544 } |
4545 | 4545 |
4546 #undef __ | 4546 #undef __ |
4547 | 4547 |
4548 } } // namespace v8::internal | 4548 } } // namespace v8::internal |
4549 | 4549 |
4550 #endif // V8_TARGET_ARCH_IA32 | 4550 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |