OLD | NEW |
---|---|
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
688 // <global>.<variable> and perform a (regular non-contextual) property | 688 // <global>.<variable> and perform a (regular non-contextual) property |
689 // load to make sure we do not get reference errors. | 689 // load to make sure we do not get reference errors. |
690 Slot global(variable, Slot::CONTEXT, Context::GLOBAL_INDEX); | 690 Slot global(variable, Slot::CONTEXT, Context::GLOBAL_INDEX); |
691 Literal key(variable->name()); | 691 Literal key(variable->name()); |
692 Property property(&global, &key, RelocInfo::kNoPosition); | 692 Property property(&global, &key, RelocInfo::kNoPosition); |
693 Reference ref(this, &property); | 693 Reference ref(this, &property); |
694 ref.GetValue(); | 694 ref.GetValue(); |
695 } else if (variable != NULL && variable->slot() != NULL) { | 695 } else if (variable != NULL && variable->slot() != NULL) { |
696 // For a variable that rewrites to a slot, we signal it is the immediate | 696 // For a variable that rewrites to a slot, we signal it is the immediate |
697 // subexpression of a typeof. | 697 // subexpression of a typeof. |
698 Result result = | 698 LoadFromSlotCheckForArguments(variable->slot(), INSIDE_TYPEOF); |
699 LoadFromSlotCheckForArguments(variable->slot(), INSIDE_TYPEOF); | |
700 frame()->Push(&result); | |
701 } else { | 699 } else { |
702 // Anything else can be handled normally. | 700 // Anything else can be handled normally. |
703 Load(expr); | 701 Load(expr); |
704 } | 702 } |
705 } | 703 } |
706 | 704 |
707 | 705 |
708 ArgumentsAllocationMode CodeGenerator::ArgumentsMode() { | 706 ArgumentsAllocationMode CodeGenerator::ArgumentsMode() { |
709 if (scope()->arguments() == NULL) return NO_ARGUMENTS_ALLOCATION; | 707 if (scope()->arguments() == NULL) return NO_ARGUMENTS_ALLOCATION; |
710 ASSERT(scope()->arguments_shadow() != NULL); | 708 ASSERT(scope()->arguments_shadow() != NULL); |
(...skipping 28 matching lines...) Expand all Loading... | |
739 Variable* arguments = scope()->arguments()->var(); | 737 Variable* arguments = scope()->arguments()->var(); |
740 Variable* shadow = scope()->arguments_shadow()->var(); | 738 Variable* shadow = scope()->arguments_shadow()->var(); |
741 ASSERT(arguments != NULL && arguments->slot() != NULL); | 739 ASSERT(arguments != NULL && arguments->slot() != NULL); |
742 ASSERT(shadow != NULL && shadow->slot() != NULL); | 740 ASSERT(shadow != NULL && shadow->slot() != NULL); |
743 JumpTarget done; | 741 JumpTarget done; |
744 bool skip_arguments = false; | 742 bool skip_arguments = false; |
745 if (mode == LAZY_ARGUMENTS_ALLOCATION && !initial) { | 743 if (mode == LAZY_ARGUMENTS_ALLOCATION && !initial) { |
746 // We have to skip storing into the arguments slot if it has already | 744 // We have to skip storing into the arguments slot if it has already |
747 // been written to. This can happen if the a function has a local | 745 // been written to. This can happen if the a function has a local |
748 // variable named 'arguments'. | 746 // variable named 'arguments'. |
749 Result probe = LoadFromSlot(arguments->slot(), NOT_INSIDE_TYPEOF); | 747 LoadFromSlot(arguments->slot(), NOT_INSIDE_TYPEOF); |
748 Result probe = frame_->Pop(); | |
750 if (probe.is_constant()) { | 749 if (probe.is_constant()) { |
751 // We have to skip updating the arguments object if it has | 750 // We have to skip updating the arguments object if it has |
752 // been assigned a proper value. | 751 // been assigned a proper value. |
753 skip_arguments = !probe.handle()->IsTheHole(); | 752 skip_arguments = !probe.handle()->IsTheHole(); |
754 } else { | 753 } else { |
755 __ cmp(Operand(probe.reg()), Immediate(Factory::the_hole_value())); | 754 __ cmp(Operand(probe.reg()), Immediate(Factory::the_hole_value())); |
756 probe.Unuse(); | 755 probe.Unuse(); |
757 done.Branch(not_equal); | 756 done.Branch(not_equal); |
758 } | 757 } |
759 } | 758 } |
(...skipping 2259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3019 frame()->Dup(); | 3018 frame()->Dup(); |
3020 Handle<String> name = Factory::LookupAsciiSymbol("apply"); | 3019 Handle<String> name = Factory::LookupAsciiSymbol("apply"); |
3021 frame()->Push(name); | 3020 frame()->Push(name); |
3022 Result answer = frame()->CallLoadIC(RelocInfo::CODE_TARGET); | 3021 Result answer = frame()->CallLoadIC(RelocInfo::CODE_TARGET); |
3023 __ nop(); | 3022 __ nop(); |
3024 frame()->Push(&answer); | 3023 frame()->Push(&answer); |
3025 | 3024 |
3026 // Load the receiver and the existing arguments object onto the | 3025 // Load the receiver and the existing arguments object onto the |
3027 // expression stack. Avoid allocating the arguments object here. | 3026 // expression stack. Avoid allocating the arguments object here. |
3028 Load(receiver); | 3027 Load(receiver); |
3029 Result existing_args = | 3028 LoadFromSlot(scope()->arguments()->var()->slot(), NOT_INSIDE_TYPEOF); |
3030 LoadFromSlot(scope()->arguments()->var()->slot(), NOT_INSIDE_TYPEOF); | |
3031 frame()->Push(&existing_args); | |
3032 | 3029 |
3033 // Emit the source position information after having loaded the | 3030 // Emit the source position information after having loaded the |
3034 // receiver and the arguments. | 3031 // receiver and the arguments. |
3035 CodeForSourcePosition(position); | 3032 CodeForSourcePosition(position); |
3036 // Contents of frame at this point: | 3033 // Contents of frame at this point: |
3037 // Frame[0]: arguments object of the current function or the hole. | 3034 // Frame[0]: arguments object of the current function or the hole. |
3038 // Frame[1]: receiver | 3035 // Frame[1]: receiver |
3039 // Frame[2]: applicand.apply | 3036 // Frame[2]: applicand.apply |
3040 // Frame[3]: applicand. | 3037 // Frame[3]: applicand. |
3041 | 3038 |
(...skipping 1670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4712 exit.Jump(); | 4709 exit.Jump(); |
4713 else_.Bind(); | 4710 else_.Bind(); |
4714 Load(node->else_expression()); | 4711 Load(node->else_expression()); |
4715 } | 4712 } |
4716 } | 4713 } |
4717 | 4714 |
4718 exit.Bind(); | 4715 exit.Bind(); |
4719 } | 4716 } |
4720 | 4717 |
4721 | 4718 |
4722 Result CodeGenerator::LoadFromSlot(Slot* slot, TypeofState typeof_state) { | 4719 void CodeGenerator::LoadFromSlot(Slot* slot, TypeofState typeof_state) { |
4723 Result result; | |
4724 if (slot->type() == Slot::LOOKUP) { | 4720 if (slot->type() == Slot::LOOKUP) { |
4725 ASSERT(slot->var()->is_dynamic()); | 4721 ASSERT(slot->var()->is_dynamic()); |
4726 JumpTarget slow; | 4722 JumpTarget slow; |
4727 JumpTarget done; | 4723 JumpTarget done; |
4724 Result value; | |
4728 | 4725 |
4729 // Generate fast case for loading from slots that correspond to | 4726 // Generate fast case for loading from slots that correspond to |
4730 // local/global variables or arguments unless they are shadowed by | 4727 // local/global variables or arguments unless they are shadowed by |
4731 // eval-introduced bindings. | 4728 // eval-introduced bindings. |
4732 EmitDynamicLoadFromSlotFastCase(slot, | 4729 EmitDynamicLoadFromSlotFastCase(slot, |
4733 typeof_state, | 4730 typeof_state, |
4734 &result, | 4731 &value, |
4735 &slow, | 4732 &slow, |
4736 &done); | 4733 &done); |
4737 | 4734 |
4738 slow.Bind(); | 4735 slow.Bind(); |
4739 // A runtime call is inevitable. We eagerly sync frame elements | 4736 // A runtime call is inevitable. We eagerly sync frame elements |
4740 // to memory so that we can push the arguments directly into place | 4737 // to memory so that we can push the arguments directly into place |
4741 // on top of the frame. | 4738 // on top of the frame. |
4742 frame()->SyncRange(0, frame()->element_count() - 1); | 4739 frame()->SyncRange(0, frame()->element_count() - 1); |
4743 frame()->EmitPush(esi); | 4740 frame()->EmitPush(esi); |
4744 frame()->EmitPush(Immediate(slot->var()->name())); | 4741 frame()->EmitPush(Immediate(slot->var()->name())); |
4745 if (typeof_state == INSIDE_TYPEOF) { | 4742 if (typeof_state == INSIDE_TYPEOF) { |
4746 result = | 4743 value = |
4747 frame()->CallRuntime(Runtime::kLoadContextSlotNoReferenceError, 2); | 4744 frame()->CallRuntime(Runtime::kLoadContextSlotNoReferenceError, 2); |
4748 } else { | 4745 } else { |
4749 result = frame()->CallRuntime(Runtime::kLoadContextSlot, 2); | 4746 value = frame()->CallRuntime(Runtime::kLoadContextSlot, 2); |
4750 } | 4747 } |
4751 | 4748 |
4752 done.Bind(&result); | 4749 done.Bind(&value); |
4753 return result; | 4750 frame_->Push(&value); |
4754 | 4751 |
4755 } else if (slot->var()->mode() == Variable::CONST) { | 4752 } else if (slot->var()->mode() == Variable::CONST) { |
4756 // Const slots may contain 'the hole' value (the constant hasn't been | 4753 // Const slots may contain 'the hole' value (the constant hasn't been |
4757 // initialized yet) which needs to be converted into the 'undefined' | 4754 // initialized yet) which needs to be converted into the 'undefined' |
4758 // value. | 4755 // value. |
4759 // | 4756 // |
4760 // We currently spill the virtual frame because constants use the | 4757 // We currently spill the virtual frame because constants use the |
4761 // potentially unsafe direct-frame access of SlotOperand. | 4758 // potentially unsafe direct-frame access of SlotOperand. |
4762 VirtualFrame::SpilledScope spilled_scope; | 4759 VirtualFrame::SpilledScope spilled_scope; |
4763 Comment cmnt(masm_, "[ Load const"); | 4760 Comment cmnt(masm_, "[ Load const"); |
4764 Label exit; | 4761 Label exit; |
4765 __ mov(ecx, SlotOperand(slot, ecx)); | 4762 __ mov(ecx, SlotOperand(slot, ecx)); |
4766 __ cmp(ecx, Factory::the_hole_value()); | 4763 __ cmp(ecx, Factory::the_hole_value()); |
4767 __ j(not_equal, &exit); | 4764 __ j(not_equal, &exit); |
4768 __ mov(ecx, Factory::undefined_value()); | 4765 __ mov(ecx, Factory::undefined_value()); |
4769 __ bind(&exit); | 4766 __ bind(&exit); |
4770 return Result(ecx); | 4767 frame()->EmitPush(ecx); |
4771 | 4768 |
4772 } else if (slot->type() == Slot::PARAMETER) { | 4769 } else if (slot->type() == Slot::PARAMETER) { |
4773 frame()->PushParameterAt(slot->index()); | 4770 frame()->PushParameterAt(slot->index()); |
4774 return frame()->Pop(); | |
4775 | 4771 |
4776 } else if (slot->type() == Slot::LOCAL) { | 4772 } else if (slot->type() == Slot::LOCAL) { |
4777 frame()->PushLocalAt(slot->index()); | 4773 frame()->PushLocalAt(slot->index()); |
4778 return frame()->Pop(); | |
4779 | 4774 |
4780 } else { | 4775 } else { |
4781 // The other remaining slot types (LOOKUP and GLOBAL) cannot reach | 4776 // The other remaining slot types (LOOKUP and GLOBAL) cannot reach |
4782 // here. | 4777 // here. |
4783 // | 4778 // |
4784 // The use of SlotOperand below is safe for an unspilled frame | 4779 // The use of SlotOperand below is safe for an unspilled frame |
4785 // because it will always be a context slot. | 4780 // because it will always be a context slot. |
4786 ASSERT(slot->type() == Slot::CONTEXT); | 4781 ASSERT(slot->type() == Slot::CONTEXT); |
4787 result = allocator()->Allocate(); | 4782 Result temp = allocator()->Allocate(); |
4788 ASSERT(result.is_valid()); | 4783 ASSERT(temp.is_valid()); |
4789 __ mov(result.reg(), SlotOperand(slot, result.reg())); | 4784 __ mov(temp.reg(), SlotOperand(slot, temp.reg())); |
4790 return result; | 4785 frame()->Push(&temp); |
4791 } | 4786 } |
4792 } | 4787 } |
4793 | 4788 |
4794 | 4789 |
4795 Result CodeGenerator::LoadFromSlotCheckForArguments(Slot* slot, | 4790 void CodeGenerator::LoadFromSlotCheckForArguments(Slot* slot, |
4796 TypeofState state) { | 4791 TypeofState state) { |
William Hesse
2010/05/21 11:49:57
Will fix indentation here.
| |
4797 Result result = LoadFromSlot(slot, state); | 4792 LoadFromSlot(slot, state); |
4798 | 4793 |
4799 // Bail out quickly if we're not using lazy arguments allocation. | 4794 // Bail out quickly if we're not using lazy arguments allocation. |
4800 if (ArgumentsMode() != LAZY_ARGUMENTS_ALLOCATION) return result; | 4795 if (ArgumentsMode() != LAZY_ARGUMENTS_ALLOCATION) return; |
4801 | 4796 |
4802 // ... or if the slot isn't a non-parameter arguments slot. | 4797 // ... or if the slot isn't a non-parameter arguments slot. |
4803 if (slot->type() == Slot::PARAMETER || !slot->is_arguments()) return result; | 4798 if (slot->type() == Slot::PARAMETER || !slot->is_arguments()) return; |
4804 | 4799 |
4805 // If the loaded value is a constant, we know if the arguments | 4800 // If the loaded value is a constant, we know if the arguments |
4806 // object has been lazily loaded yet. | 4801 // object has been lazily loaded yet. |
4802 Result result = frame()->Pop(); | |
4807 if (result.is_constant()) { | 4803 if (result.is_constant()) { |
4808 if (result.handle()->IsTheHole()) { | 4804 if (result.handle()->IsTheHole()) { |
4809 result.Unuse(); | 4805 result = StoreArgumentsObject(false); |
4810 return StoreArgumentsObject(false); | |
4811 } else { | |
4812 return result; | |
4813 } | 4806 } |
4807 frame()->Push(&result); | |
4808 return; | |
4814 } | 4809 } |
4815 | 4810 ASSERT(result.is_register()); |
4816 // The loaded value is in a register. If it is the sentinel that | 4811 // The loaded value is in a register. If it is the sentinel that |
4817 // indicates that we haven't loaded the arguments object yet, we | 4812 // indicates that we haven't loaded the arguments object yet, we |
4818 // need to do it now. | 4813 // need to do it now. |
4819 JumpTarget exit; | 4814 JumpTarget exit; |
4820 __ cmp(Operand(result.reg()), Immediate(Factory::the_hole_value())); | 4815 __ cmp(Operand(result.reg()), Immediate(Factory::the_hole_value())); |
4821 exit.Branch(not_equal, &result); | 4816 frame()->Push(&result); |
4817 exit.Branch(not_equal); | |
4822 | 4818 |
4819 result = StoreArgumentsObject(false); | |
4820 frame()->SetElementAt(0, &result); | |
4823 result.Unuse(); | 4821 result.Unuse(); |
4824 result = StoreArgumentsObject(false); | 4822 exit.Bind(); |
4825 exit.Bind(&result); | 4823 return; |
4826 return result; | |
4827 } | 4824 } |
4828 | 4825 |
4829 | 4826 |
4830 Result CodeGenerator::LoadFromGlobalSlotCheckExtensions( | 4827 Result CodeGenerator::LoadFromGlobalSlotCheckExtensions( |
4831 Slot* slot, | 4828 Slot* slot, |
4832 TypeofState typeof_state, | 4829 TypeofState typeof_state, |
4833 JumpTarget* slow) { | 4830 JumpTarget* slow) { |
4834 ASSERT(!in_safe_int32_mode()); | 4831 ASSERT(!in_safe_int32_mode()); |
4835 // Check that no extension objects have been created by calls to | 4832 // Check that no extension objects have been created by calls to |
4836 // eval from the current scope to the global scope. | 4833 // eval from the current scope to the global scope. |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5066 Comment cmnt(masm_, "[ Slot"); | 5063 Comment cmnt(masm_, "[ Slot"); |
5067 if (in_safe_int32_mode()) { | 5064 if (in_safe_int32_mode()) { |
5068 if ((slot->type() == Slot::LOCAL && !slot->is_arguments())) { | 5065 if ((slot->type() == Slot::LOCAL && !slot->is_arguments())) { |
5069 frame()->UntaggedPushLocalAt(slot->index()); | 5066 frame()->UntaggedPushLocalAt(slot->index()); |
5070 } else if (slot->type() == Slot::PARAMETER) { | 5067 } else if (slot->type() == Slot::PARAMETER) { |
5071 frame()->UntaggedPushParameterAt(slot->index()); | 5068 frame()->UntaggedPushParameterAt(slot->index()); |
5072 } else { | 5069 } else { |
5073 UNREACHABLE(); | 5070 UNREACHABLE(); |
5074 } | 5071 } |
5075 } else { | 5072 } else { |
5076 Result result = LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); | 5073 LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); |
5077 frame()->Push(&result); | |
5078 } | 5074 } |
5079 } | 5075 } |
5080 | 5076 |
5081 | 5077 |
5082 void CodeGenerator::VisitVariableProxy(VariableProxy* node) { | 5078 void CodeGenerator::VisitVariableProxy(VariableProxy* node) { |
5083 Comment cmnt(masm_, "[ VariableProxy"); | 5079 Comment cmnt(masm_, "[ VariableProxy"); |
5084 Variable* var = node->var(); | 5080 Variable* var = node->var(); |
5085 Expression* expr = var->rewrite(); | 5081 Expression* expr = var->rewrite(); |
5086 if (expr != NULL) { | 5082 if (expr != NULL) { |
5087 Visit(expr); | 5083 Visit(expr); |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5388 Comment cmnt(masm(), "[ Variable Assignment"); | 5384 Comment cmnt(masm(), "[ Variable Assignment"); |
5389 Variable* var = node->target()->AsVariableProxy()->AsVariable(); | 5385 Variable* var = node->target()->AsVariableProxy()->AsVariable(); |
5390 ASSERT(var != NULL); | 5386 ASSERT(var != NULL); |
5391 Slot* slot = var->slot(); | 5387 Slot* slot = var->slot(); |
5392 ASSERT(slot != NULL); | 5388 ASSERT(slot != NULL); |
5393 | 5389 |
5394 // Evaluate the right-hand side. | 5390 // Evaluate the right-hand side. |
5395 if (node->is_compound()) { | 5391 if (node->is_compound()) { |
5396 // For a compound assignment the right-hand side is a binary operation | 5392 // For a compound assignment the right-hand side is a binary operation |
5397 // between the current property value and the actual right-hand side. | 5393 // between the current property value and the actual right-hand side. |
5398 Result result = LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); | 5394 LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); |
5399 frame()->Push(&result); | |
5400 Load(node->value()); | 5395 Load(node->value()); |
5401 | 5396 |
5402 // Perform the binary operation. | 5397 // Perform the binary operation. |
5403 bool overwrite_value = | 5398 bool overwrite_value = |
5404 (node->value()->AsBinaryOperation() != NULL && | 5399 (node->value()->AsBinaryOperation() != NULL && |
5405 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); | 5400 node->value()->AsBinaryOperation()->ResultOverwriteAllowed()); |
5406 // Construct the implicit binary operation. | 5401 // Construct the implicit binary operation. |
5407 BinaryOperation expr(node, node->binary_op(), node->target(), | 5402 BinaryOperation expr(node, node->binary_op(), node->target(), |
5408 node->value()); | 5403 node->value()); |
5409 GenericBinaryOperation(&expr, | 5404 GenericBinaryOperation(&expr, |
(...skipping 3440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8850 Property* property = expression_->AsProperty(); | 8845 Property* property = expression_->AsProperty(); |
8851 if (property != NULL) { | 8846 if (property != NULL) { |
8852 cgen_->CodeForSourcePosition(property->position()); | 8847 cgen_->CodeForSourcePosition(property->position()); |
8853 } | 8848 } |
8854 | 8849 |
8855 switch (type_) { | 8850 switch (type_) { |
8856 case SLOT: { | 8851 case SLOT: { |
8857 Comment cmnt(masm, "[ Load from Slot"); | 8852 Comment cmnt(masm, "[ Load from Slot"); |
8858 Slot* slot = expression_->AsVariableProxy()->AsVariable()->slot(); | 8853 Slot* slot = expression_->AsVariableProxy()->AsVariable()->slot(); |
8859 ASSERT(slot != NULL); | 8854 ASSERT(slot != NULL); |
8860 Result result = | 8855 cgen_->LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); |
8861 cgen_->LoadFromSlotCheckForArguments(slot, NOT_INSIDE_TYPEOF); | |
8862 if (!persist_after_get_) set_unloaded(); | 8856 if (!persist_after_get_) set_unloaded(); |
8863 cgen_->frame()->Push(&result); | |
8864 break; | 8857 break; |
8865 } | 8858 } |
8866 | 8859 |
8867 case NAMED: { | 8860 case NAMED: { |
8868 Variable* var = expression_->AsVariableProxy()->AsVariable(); | 8861 Variable* var = expression_->AsVariableProxy()->AsVariable(); |
8869 bool is_global = var != NULL; | 8862 bool is_global = var != NULL; |
8870 ASSERT(!is_global || var->is_global()); | 8863 ASSERT(!is_global || var->is_global()); |
8871 if (persist_after_get_) cgen_->frame()->Dup(); | 8864 if (persist_after_get_) cgen_->frame()->Dup(); |
8872 Result result = cgen_->EmitNamedLoad(GetName(), is_global); | 8865 Result result = cgen_->EmitNamedLoad(GetName(), is_global); |
8873 if (!persist_after_get_) set_unloaded(); | 8866 if (!persist_after_get_) set_unloaded(); |
(...skipping 4418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13292 // tagged as a small integer. | 13285 // tagged as a small integer. |
13293 __ bind(&runtime); | 13286 __ bind(&runtime); |
13294 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 13287 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
13295 } | 13288 } |
13296 | 13289 |
13297 #undef __ | 13290 #undef __ |
13298 | 13291 |
13299 } } // namespace v8::internal | 13292 } } // namespace v8::internal |
13300 | 13293 |
13301 #endif // V8_TARGET_ARCH_IA32 | 13294 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |