OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM | 7 #if V8_TARGET_ARCH_ARM |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 | 344 |
345 } else { | 345 } else { |
346 PrepareForBailoutForId(BailoutId::FunctionEntry(), NO_REGISTERS); | 346 PrepareForBailoutForId(BailoutId::FunctionEntry(), NO_REGISTERS); |
347 { Comment cmnt(masm_, "[ Declarations"); | 347 { Comment cmnt(masm_, "[ Declarations"); |
348 // For named function expressions, declare the function name as a | 348 // For named function expressions, declare the function name as a |
349 // constant. | 349 // constant. |
350 if (scope()->is_function_scope() && scope()->function() != NULL) { | 350 if (scope()->is_function_scope() && scope()->function() != NULL) { |
351 VariableDeclaration* function = scope()->function(); | 351 VariableDeclaration* function = scope()->function(); |
352 DCHECK(function->proxy()->var()->mode() == CONST || | 352 DCHECK(function->proxy()->var()->mode() == CONST || |
353 function->proxy()->var()->mode() == CONST_LEGACY); | 353 function->proxy()->var()->mode() == CONST_LEGACY); |
354 DCHECK(function->proxy()->var()->location() != Variable::UNALLOCATED); | 354 DCHECK(!function->proxy()->var()->IsUnallocatedOrGlobalSlot()); |
355 VisitVariableDeclaration(function); | 355 VisitVariableDeclaration(function); |
356 } | 356 } |
357 VisitDeclarations(scope()->declarations()); | 357 VisitDeclarations(scope()->declarations()); |
358 } | 358 } |
359 | 359 |
360 { Comment cmnt(masm_, "[ Stack check"); | 360 { Comment cmnt(masm_, "[ Stack check"); |
361 PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS); | 361 PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS); |
362 Label ok; | 362 Label ok; |
363 __ LoadRoot(ip, Heap::kStackLimitRootIndex); | 363 __ LoadRoot(ip, Heap::kStackLimitRootIndex); |
364 __ cmp(sp, Operand(ip)); | 364 __ cmp(sp, Operand(ip)); |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 void FullCodeGenerator::VisitVariableDeclaration( | 868 void FullCodeGenerator::VisitVariableDeclaration( |
869 VariableDeclaration* declaration) { | 869 VariableDeclaration* declaration) { |
870 // If it was not possible to allocate the variable at compile time, we | 870 // If it was not possible to allocate the variable at compile time, we |
871 // need to "declare" it at runtime to make sure it actually exists in the | 871 // need to "declare" it at runtime to make sure it actually exists in the |
872 // local context. | 872 // local context. |
873 VariableProxy* proxy = declaration->proxy(); | 873 VariableProxy* proxy = declaration->proxy(); |
874 VariableMode mode = declaration->mode(); | 874 VariableMode mode = declaration->mode(); |
875 Variable* variable = proxy->var(); | 875 Variable* variable = proxy->var(); |
876 bool hole_init = mode == LET || mode == CONST || mode == CONST_LEGACY; | 876 bool hole_init = mode == LET || mode == CONST || mode == CONST_LEGACY; |
877 switch (variable->location()) { | 877 switch (variable->location()) { |
878 case Variable::UNALLOCATED: | 878 case VariableLocation::GLOBAL: |
| 879 case VariableLocation::UNALLOCATED: |
879 globals_->Add(variable->name(), zone()); | 880 globals_->Add(variable->name(), zone()); |
880 globals_->Add(variable->binding_needs_init() | 881 globals_->Add(variable->binding_needs_init() |
881 ? isolate()->factory()->the_hole_value() | 882 ? isolate()->factory()->the_hole_value() |
882 : isolate()->factory()->undefined_value(), | 883 : isolate()->factory()->undefined_value(), |
883 zone()); | 884 zone()); |
884 break; | 885 break; |
885 | 886 |
886 case Variable::PARAMETER: | 887 case VariableLocation::PARAMETER: |
887 case Variable::LOCAL: | 888 case VariableLocation::LOCAL: |
888 if (hole_init) { | 889 if (hole_init) { |
889 Comment cmnt(masm_, "[ VariableDeclaration"); | 890 Comment cmnt(masm_, "[ VariableDeclaration"); |
890 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 891 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
891 __ str(ip, StackOperand(variable)); | 892 __ str(ip, StackOperand(variable)); |
892 } | 893 } |
893 break; | 894 break; |
894 | 895 |
895 case Variable::CONTEXT: | 896 case VariableLocation::CONTEXT: |
896 if (hole_init) { | 897 if (hole_init) { |
897 Comment cmnt(masm_, "[ VariableDeclaration"); | 898 Comment cmnt(masm_, "[ VariableDeclaration"); |
898 EmitDebugCheckDeclarationContext(variable); | 899 EmitDebugCheckDeclarationContext(variable); |
899 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 900 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
900 __ str(ip, ContextOperand(cp, variable->index())); | 901 __ str(ip, ContextOperand(cp, variable->index())); |
901 // No write barrier since the_hole_value is in old space. | 902 // No write barrier since the_hole_value is in old space. |
902 PrepareForBailoutForId(proxy->id(), NO_REGISTERS); | 903 PrepareForBailoutForId(proxy->id(), NO_REGISTERS); |
903 } | 904 } |
904 break; | 905 break; |
905 | 906 |
906 case Variable::LOOKUP: { | 907 case VariableLocation::LOOKUP: { |
907 Comment cmnt(masm_, "[ VariableDeclaration"); | 908 Comment cmnt(masm_, "[ VariableDeclaration"); |
908 __ mov(r2, Operand(variable->name())); | 909 __ mov(r2, Operand(variable->name())); |
909 // Declaration nodes are always introduced in one of four modes. | 910 // Declaration nodes are always introduced in one of four modes. |
910 DCHECK(IsDeclaredVariableMode(mode)); | 911 DCHECK(IsDeclaredVariableMode(mode)); |
911 PropertyAttributes attr = | 912 PropertyAttributes attr = |
912 IsImmutableVariableMode(mode) ? READ_ONLY : NONE; | 913 IsImmutableVariableMode(mode) ? READ_ONLY : NONE; |
913 __ mov(r1, Operand(Smi::FromInt(attr))); | 914 __ mov(r1, Operand(Smi::FromInt(attr))); |
914 // Push initial value, if any. | 915 // Push initial value, if any. |
915 // Note: For variables we must not push an initial value (such as | 916 // Note: For variables we must not push an initial value (such as |
916 // 'undefined') because we may have a (legal) redeclaration and we | 917 // 'undefined') because we may have a (legal) redeclaration and we |
(...skipping 10 matching lines...) Expand all Loading... |
927 } | 928 } |
928 } | 929 } |
929 } | 930 } |
930 | 931 |
931 | 932 |
932 void FullCodeGenerator::VisitFunctionDeclaration( | 933 void FullCodeGenerator::VisitFunctionDeclaration( |
933 FunctionDeclaration* declaration) { | 934 FunctionDeclaration* declaration) { |
934 VariableProxy* proxy = declaration->proxy(); | 935 VariableProxy* proxy = declaration->proxy(); |
935 Variable* variable = proxy->var(); | 936 Variable* variable = proxy->var(); |
936 switch (variable->location()) { | 937 switch (variable->location()) { |
937 case Variable::UNALLOCATED: { | 938 case VariableLocation::GLOBAL: |
| 939 case VariableLocation::UNALLOCATED: { |
938 globals_->Add(variable->name(), zone()); | 940 globals_->Add(variable->name(), zone()); |
939 Handle<SharedFunctionInfo> function = | 941 Handle<SharedFunctionInfo> function = |
940 Compiler::GetSharedFunctionInfo(declaration->fun(), script(), info_); | 942 Compiler::GetSharedFunctionInfo(declaration->fun(), script(), info_); |
941 // Check for stack-overflow exception. | 943 // Check for stack-overflow exception. |
942 if (function.is_null()) return SetStackOverflow(); | 944 if (function.is_null()) return SetStackOverflow(); |
943 globals_->Add(function, zone()); | 945 globals_->Add(function, zone()); |
944 break; | 946 break; |
945 } | 947 } |
946 | 948 |
947 case Variable::PARAMETER: | 949 case VariableLocation::PARAMETER: |
948 case Variable::LOCAL: { | 950 case VariableLocation::LOCAL: { |
949 Comment cmnt(masm_, "[ FunctionDeclaration"); | 951 Comment cmnt(masm_, "[ FunctionDeclaration"); |
950 VisitForAccumulatorValue(declaration->fun()); | 952 VisitForAccumulatorValue(declaration->fun()); |
951 __ str(result_register(), StackOperand(variable)); | 953 __ str(result_register(), StackOperand(variable)); |
952 break; | 954 break; |
953 } | 955 } |
954 | 956 |
955 case Variable::CONTEXT: { | 957 case VariableLocation::CONTEXT: { |
956 Comment cmnt(masm_, "[ FunctionDeclaration"); | 958 Comment cmnt(masm_, "[ FunctionDeclaration"); |
957 EmitDebugCheckDeclarationContext(variable); | 959 EmitDebugCheckDeclarationContext(variable); |
958 VisitForAccumulatorValue(declaration->fun()); | 960 VisitForAccumulatorValue(declaration->fun()); |
959 __ str(result_register(), ContextOperand(cp, variable->index())); | 961 __ str(result_register(), ContextOperand(cp, variable->index())); |
960 int offset = Context::SlotOffset(variable->index()); | 962 int offset = Context::SlotOffset(variable->index()); |
961 // We know that we have written a function, which is not a smi. | 963 // We know that we have written a function, which is not a smi. |
962 __ RecordWriteContextSlot(cp, | 964 __ RecordWriteContextSlot(cp, |
963 offset, | 965 offset, |
964 result_register(), | 966 result_register(), |
965 r2, | 967 r2, |
966 kLRHasBeenSaved, | 968 kLRHasBeenSaved, |
967 kDontSaveFPRegs, | 969 kDontSaveFPRegs, |
968 EMIT_REMEMBERED_SET, | 970 EMIT_REMEMBERED_SET, |
969 OMIT_SMI_CHECK); | 971 OMIT_SMI_CHECK); |
970 PrepareForBailoutForId(proxy->id(), NO_REGISTERS); | 972 PrepareForBailoutForId(proxy->id(), NO_REGISTERS); |
971 break; | 973 break; |
972 } | 974 } |
973 | 975 |
974 case Variable::LOOKUP: { | 976 case VariableLocation::LOOKUP: { |
975 Comment cmnt(masm_, "[ FunctionDeclaration"); | 977 Comment cmnt(masm_, "[ FunctionDeclaration"); |
976 __ mov(r2, Operand(variable->name())); | 978 __ mov(r2, Operand(variable->name())); |
977 __ mov(r1, Operand(Smi::FromInt(NONE))); | 979 __ mov(r1, Operand(Smi::FromInt(NONE))); |
978 __ Push(cp, r2, r1); | 980 __ Push(cp, r2, r1); |
979 // Push initial value for function declaration. | 981 // Push initial value for function declaration. |
980 VisitForStackValue(declaration->fun()); | 982 VisitForStackValue(declaration->fun()); |
981 __ CallRuntime(Runtime::kDeclareLookupSlot, 4); | 983 __ CallRuntime(Runtime::kDeclareLookupSlot, 4); |
982 break; | 984 break; |
983 } | 985 } |
984 } | 986 } |
985 } | 987 } |
986 | 988 |
987 | 989 |
988 void FullCodeGenerator::VisitImportDeclaration(ImportDeclaration* declaration) { | 990 void FullCodeGenerator::VisitImportDeclaration(ImportDeclaration* declaration) { |
989 VariableProxy* proxy = declaration->proxy(); | 991 VariableProxy* proxy = declaration->proxy(); |
990 Variable* variable = proxy->var(); | 992 Variable* variable = proxy->var(); |
991 switch (variable->location()) { | 993 switch (variable->location()) { |
992 case Variable::UNALLOCATED: | 994 case VariableLocation::GLOBAL: |
| 995 case VariableLocation::UNALLOCATED: |
993 // TODO(rossberg) | 996 // TODO(rossberg) |
994 break; | 997 break; |
995 | 998 |
996 case Variable::CONTEXT: { | 999 case VariableLocation::CONTEXT: { |
997 Comment cmnt(masm_, "[ ImportDeclaration"); | 1000 Comment cmnt(masm_, "[ ImportDeclaration"); |
998 EmitDebugCheckDeclarationContext(variable); | 1001 EmitDebugCheckDeclarationContext(variable); |
999 // TODO(rossberg) | 1002 // TODO(rossberg) |
1000 break; | 1003 break; |
1001 } | 1004 } |
1002 | 1005 |
1003 case Variable::PARAMETER: | 1006 case VariableLocation::PARAMETER: |
1004 case Variable::LOCAL: | 1007 case VariableLocation::LOCAL: |
1005 case Variable::LOOKUP: | 1008 case VariableLocation::LOOKUP: |
1006 UNREACHABLE(); | 1009 UNREACHABLE(); |
1007 } | 1010 } |
1008 } | 1011 } |
1009 | 1012 |
1010 | 1013 |
1011 void FullCodeGenerator::VisitExportDeclaration(ExportDeclaration* declaration) { | 1014 void FullCodeGenerator::VisitExportDeclaration(ExportDeclaration* declaration) { |
1012 // TODO(rossberg) | 1015 // TODO(rossberg) |
1013 } | 1016 } |
1014 | 1017 |
1015 | 1018 |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 | 1495 |
1493 void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) { | 1496 void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) { |
1494 // Record position before possible IC call. | 1497 // Record position before possible IC call. |
1495 SetExpressionPosition(proxy); | 1498 SetExpressionPosition(proxy); |
1496 PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS); | 1499 PrepareForBailoutForId(proxy->BeforeId(), NO_REGISTERS); |
1497 Variable* var = proxy->var(); | 1500 Variable* var = proxy->var(); |
1498 | 1501 |
1499 // Three cases: global variables, lookup variables, and all other types of | 1502 // Three cases: global variables, lookup variables, and all other types of |
1500 // variables. | 1503 // variables. |
1501 switch (var->location()) { | 1504 switch (var->location()) { |
1502 case Variable::UNALLOCATED: { | 1505 case VariableLocation::GLOBAL: |
| 1506 case VariableLocation::UNALLOCATED: { |
1503 Comment cmnt(masm_, "[ Global variable"); | 1507 Comment cmnt(masm_, "[ Global variable"); |
1504 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); | 1508 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
1505 __ mov(LoadDescriptor::NameRegister(), Operand(var->name())); | 1509 __ mov(LoadDescriptor::NameRegister(), Operand(var->name())); |
1506 __ mov(LoadDescriptor::SlotRegister(), | 1510 __ mov(LoadDescriptor::SlotRegister(), |
1507 Operand(SmiFromSlot(proxy->VariableFeedbackSlot()))); | 1511 Operand(SmiFromSlot(proxy->VariableFeedbackSlot()))); |
1508 CallGlobalLoadIC(var->name()); | 1512 CallGlobalLoadIC(var->name()); |
1509 context()->Plug(r0); | 1513 context()->Plug(r0); |
1510 break; | 1514 break; |
1511 } | 1515 } |
1512 | 1516 |
1513 case Variable::PARAMETER: | 1517 case VariableLocation::PARAMETER: |
1514 case Variable::LOCAL: | 1518 case VariableLocation::LOCAL: |
1515 case Variable::CONTEXT: { | 1519 case VariableLocation::CONTEXT: { |
1516 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" | 1520 Comment cmnt(masm_, var->IsContextSlot() ? "[ Context variable" |
1517 : "[ Stack variable"); | 1521 : "[ Stack variable"); |
1518 if (var->binding_needs_init()) { | 1522 if (var->binding_needs_init()) { |
1519 // var->scope() may be NULL when the proxy is located in eval code and | 1523 // var->scope() may be NULL when the proxy is located in eval code and |
1520 // refers to a potential outside binding. Currently those bindings are | 1524 // refers to a potential outside binding. Currently those bindings are |
1521 // always looked up dynamically, i.e. in that case | 1525 // always looked up dynamically, i.e. in that case |
1522 // var->location() == LOOKUP. | 1526 // var->location() == LOOKUP. |
1523 // always holds. | 1527 // always holds. |
1524 DCHECK(var->scope() != NULL); | 1528 DCHECK(var->scope() != NULL); |
1525 | 1529 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1574 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex, eq); | 1578 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex, eq); |
1575 } | 1579 } |
1576 context()->Plug(r0); | 1580 context()->Plug(r0); |
1577 break; | 1581 break; |
1578 } | 1582 } |
1579 } | 1583 } |
1580 context()->Plug(var); | 1584 context()->Plug(var); |
1581 break; | 1585 break; |
1582 } | 1586 } |
1583 | 1587 |
1584 case Variable::LOOKUP: { | 1588 case VariableLocation::LOOKUP: { |
1585 Comment cmnt(masm_, "[ Lookup variable"); | 1589 Comment cmnt(masm_, "[ Lookup variable"); |
1586 Label done, slow; | 1590 Label done, slow; |
1587 // Generate code for loading from variables potentially shadowed | 1591 // Generate code for loading from variables potentially shadowed |
1588 // by eval-introduced variables. | 1592 // by eval-introduced variables. |
1589 EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done); | 1593 EmitDynamicLookupFastCase(proxy, NOT_INSIDE_TYPEOF, &slow, &done); |
1590 __ bind(&slow); | 1594 __ bind(&slow); |
1591 __ mov(r1, Operand(var->name())); | 1595 __ mov(r1, Operand(var->name())); |
1592 __ Push(cp, r1); // Context and name. | 1596 __ Push(cp, r1); // Context and name. |
1593 __ CallRuntime(Runtime::kLoadLookupSlot, 2); | 1597 __ CallRuntime(Runtime::kLoadLookupSlot, 2); |
1594 __ bind(&done); | 1598 __ bind(&done); |
(...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2730 __ mov(r3, result_register()); | 2734 __ mov(r3, result_register()); |
2731 int offset = Context::SlotOffset(var->index()); | 2735 int offset = Context::SlotOffset(var->index()); |
2732 __ RecordWriteContextSlot( | 2736 __ RecordWriteContextSlot( |
2733 r1, offset, r3, r2, kLRHasBeenSaved, kDontSaveFPRegs); | 2737 r1, offset, r3, r2, kLRHasBeenSaved, kDontSaveFPRegs); |
2734 } | 2738 } |
2735 } | 2739 } |
2736 | 2740 |
2737 | 2741 |
2738 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, | 2742 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op, |
2739 FeedbackVectorICSlot slot) { | 2743 FeedbackVectorICSlot slot) { |
2740 if (var->IsUnallocated()) { | 2744 if (var->IsUnallocatedOrGlobalSlot()) { |
2741 // Global var, const, or let. | 2745 // Global var, const, or let. |
2742 __ mov(StoreDescriptor::NameRegister(), Operand(var->name())); | 2746 __ mov(StoreDescriptor::NameRegister(), Operand(var->name())); |
2743 __ ldr(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); | 2747 __ ldr(StoreDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
2744 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); | 2748 if (FLAG_vector_stores) EmitLoadStoreICSlot(slot); |
2745 CallStoreIC(); | 2749 CallStoreIC(); |
2746 | 2750 |
2747 } else if (var->mode() == LET && op != Token::INIT_LET) { | 2751 } else if (var->mode() == LET && op != Token::INIT_LET) { |
2748 // Non-initializing assignment to let variable needs a write barrier. | 2752 // Non-initializing assignment to let variable needs a write barrier. |
2749 DCHECK(!var->IsLookupSlot()); | 2753 DCHECK(!var->IsLookupSlot()); |
2750 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); | 2754 DCHECK(var->IsStackAllocated() || var->IsContextSlot()); |
(...skipping 2039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4790 __ mov(r1, Operand(Smi::FromInt(language_mode()))); | 4794 __ mov(r1, Operand(Smi::FromInt(language_mode()))); |
4791 __ push(r1); | 4795 __ push(r1); |
4792 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); | 4796 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); |
4793 context()->Plug(r0); | 4797 context()->Plug(r0); |
4794 } else if (proxy != NULL) { | 4798 } else if (proxy != NULL) { |
4795 Variable* var = proxy->var(); | 4799 Variable* var = proxy->var(); |
4796 // Delete of an unqualified identifier is disallowed in strict mode but | 4800 // Delete of an unqualified identifier is disallowed in strict mode but |
4797 // "delete this" is allowed. | 4801 // "delete this" is allowed. |
4798 bool is_this = var->HasThisName(isolate()); | 4802 bool is_this = var->HasThisName(isolate()); |
4799 DCHECK(is_sloppy(language_mode()) || is_this); | 4803 DCHECK(is_sloppy(language_mode()) || is_this); |
4800 if (var->IsUnallocated()) { | 4804 if (var->IsUnallocatedOrGlobalSlot()) { |
4801 __ ldr(r2, GlobalObjectOperand()); | 4805 __ ldr(r2, GlobalObjectOperand()); |
4802 __ mov(r1, Operand(var->name())); | 4806 __ mov(r1, Operand(var->name())); |
4803 __ mov(r0, Operand(Smi::FromInt(SLOPPY))); | 4807 __ mov(r0, Operand(Smi::FromInt(SLOPPY))); |
4804 __ Push(r2, r1, r0); | 4808 __ Push(r2, r1, r0); |
4805 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); | 4809 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); |
4806 context()->Plug(r0); | 4810 context()->Plug(r0); |
4807 } else if (var->IsStackAllocated() || var->IsContextSlot()) { | 4811 } else if (var->IsStackAllocated() || var->IsContextSlot()) { |
4808 // Result of deleting non-global, non-dynamic variables is false. | 4812 // Result of deleting non-global, non-dynamic variables is false. |
4809 // The subexpression does not have side effects. | 4813 // The subexpression does not have side effects. |
4810 context()->Plug(is_this); | 4814 context()->Plug(is_this); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5147 break; | 5151 break; |
5148 } | 5152 } |
5149 } | 5153 } |
5150 } | 5154 } |
5151 | 5155 |
5152 | 5156 |
5153 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { | 5157 void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { |
5154 DCHECK(!context()->IsEffect()); | 5158 DCHECK(!context()->IsEffect()); |
5155 DCHECK(!context()->IsTest()); | 5159 DCHECK(!context()->IsTest()); |
5156 VariableProxy* proxy = expr->AsVariableProxy(); | 5160 VariableProxy* proxy = expr->AsVariableProxy(); |
5157 if (proxy != NULL && proxy->var()->IsUnallocated()) { | 5161 if (proxy != NULL && proxy->var()->IsUnallocatedOrGlobalSlot()) { |
5158 Comment cmnt(masm_, "[ Global variable"); | 5162 Comment cmnt(masm_, "[ Global variable"); |
5159 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); | 5163 __ ldr(LoadDescriptor::ReceiverRegister(), GlobalObjectOperand()); |
5160 __ mov(LoadDescriptor::NameRegister(), Operand(proxy->name())); | 5164 __ mov(LoadDescriptor::NameRegister(), Operand(proxy->name())); |
5161 __ mov(LoadDescriptor::SlotRegister(), | 5165 __ mov(LoadDescriptor::SlotRegister(), |
5162 Operand(SmiFromSlot(proxy->VariableFeedbackSlot()))); | 5166 Operand(SmiFromSlot(proxy->VariableFeedbackSlot()))); |
5163 // Use a regular load, not a contextual load, to avoid a reference | 5167 // Use a regular load, not a contextual load, to avoid a reference |
5164 // error. | 5168 // error. |
5165 CallLoadIC(NOT_CONTEXTUAL); | 5169 CallLoadIC(NOT_CONTEXTUAL); |
5166 PrepareForBailout(expr, TOS_REG); | 5170 PrepareForBailout(expr, TOS_REG); |
5167 context()->Plug(r0); | 5171 context()->Plug(r0); |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5614 DCHECK(interrupt_address == | 5618 DCHECK(interrupt_address == |
5615 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5619 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5616 return OSR_AFTER_STACK_CHECK; | 5620 return OSR_AFTER_STACK_CHECK; |
5617 } | 5621 } |
5618 | 5622 |
5619 | 5623 |
5620 } // namespace internal | 5624 } // namespace internal |
5621 } // namespace v8 | 5625 } // namespace v8 |
5622 | 5626 |
5623 #endif // V8_TARGET_ARCH_ARM | 5627 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |