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 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 VariableDeclaration* declaration) { | 799 VariableDeclaration* declaration) { |
800 // If it was not possible to allocate the variable at compile time, we | 800 // If it was not possible to allocate the variable at compile time, we |
801 // need to "declare" it at runtime to make sure it actually exists in the | 801 // need to "declare" it at runtime to make sure it actually exists in the |
802 // local context. | 802 // local context. |
803 VariableProxy* proxy = declaration->proxy(); | 803 VariableProxy* proxy = declaration->proxy(); |
804 VariableMode mode = declaration->mode(); | 804 VariableMode mode = declaration->mode(); |
805 Variable* variable = proxy->var(); | 805 Variable* variable = proxy->var(); |
806 bool hole_init = mode == CONST || mode == CONST_HARMONY || mode == LET; | 806 bool hole_init = mode == CONST || mode == CONST_HARMONY || mode == LET; |
807 switch (variable->location()) { | 807 switch (variable->location()) { |
808 case Variable::UNALLOCATED: | 808 case Variable::UNALLOCATED: |
809 globals_.Add(variable->name()); | 809 globals_->Add(variable->name()); |
810 globals_.Add(variable->binding_needs_init() | 810 globals_->Add(variable->binding_needs_init() |
811 ? isolate()->factory()->the_hole_value() | 811 ? isolate()->factory()->the_hole_value() |
812 : isolate()->factory()->undefined_value()); | 812 : isolate()->factory()->undefined_value()); |
813 break; | 813 break; |
814 | 814 |
815 case Variable::PARAMETER: | 815 case Variable::PARAMETER: |
816 case Variable::LOCAL: | 816 case Variable::LOCAL: |
817 if (hole_init) { | 817 if (hole_init) { |
818 Comment cmnt(masm_, "[ VariableDeclaration"); | 818 Comment cmnt(masm_, "[ VariableDeclaration"); |
819 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); | 819 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); |
820 __ str(ip, StackOperand(variable)); | 820 __ str(ip, StackOperand(variable)); |
821 } | 821 } |
822 break; | 822 break; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 } | 858 } |
859 } | 859 } |
860 | 860 |
861 | 861 |
862 void FullCodeGenerator::VisitFunctionDeclaration( | 862 void FullCodeGenerator::VisitFunctionDeclaration( |
863 FunctionDeclaration* declaration) { | 863 FunctionDeclaration* declaration) { |
864 VariableProxy* proxy = declaration->proxy(); | 864 VariableProxy* proxy = declaration->proxy(); |
865 Variable* variable = proxy->var(); | 865 Variable* variable = proxy->var(); |
866 switch (variable->location()) { | 866 switch (variable->location()) { |
867 case Variable::UNALLOCATED: { | 867 case Variable::UNALLOCATED: { |
868 globals_.Add(variable->name()); | 868 globals_->Add(variable->name()); |
869 Handle<SharedFunctionInfo> function = | 869 Handle<SharedFunctionInfo> function = |
870 Compiler::BuildFunctionInfo(declaration->fun(), script()); | 870 Compiler::BuildFunctionInfo(declaration->fun(), script()); |
871 // Check for stack-overflow exception. | 871 // Check for stack-overflow exception. |
872 if (function.is_null()) return SetStackOverflow(); | 872 if (function.is_null()) return SetStackOverflow(); |
873 globals_.Add(function); | 873 globals_->Add(function); |
874 break; | 874 break; |
875 } | 875 } |
876 | 876 |
877 case Variable::PARAMETER: | 877 case Variable::PARAMETER: |
878 case Variable::LOCAL: { | 878 case Variable::LOCAL: { |
879 Comment cmnt(masm_, "[ FunctionDeclaration"); | 879 Comment cmnt(masm_, "[ FunctionDeclaration"); |
880 VisitForAccumulatorValue(declaration->fun()); | 880 VisitForAccumulatorValue(declaration->fun()); |
881 __ str(result_register(), StackOperand(variable)); | 881 __ str(result_register(), StackOperand(variable)); |
882 break; | 882 break; |
883 } | 883 } |
(...skipping 27 matching lines...) Expand all Loading... |
911 __ CallRuntime(Runtime::kDeclareContextSlot, 4); | 911 __ CallRuntime(Runtime::kDeclareContextSlot, 4); |
912 break; | 912 break; |
913 } | 913 } |
914 } | 914 } |
915 } | 915 } |
916 | 916 |
917 | 917 |
918 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) { | 918 void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) { |
919 VariableProxy* proxy = declaration->proxy(); | 919 VariableProxy* proxy = declaration->proxy(); |
920 Variable* variable = proxy->var(); | 920 Variable* variable = proxy->var(); |
| 921 Handle<JSModule> instance = declaration->module()->interface()->Instance(); |
| 922 ASSERT(!instance.is_null()); |
| 923 |
921 switch (variable->location()) { | 924 switch (variable->location()) { |
922 case Variable::UNALLOCATED: | 925 case Variable::UNALLOCATED: { |
923 // TODO(rossberg): initialize module instance object | 926 Comment cmnt(masm_, "[ ModuleDeclaration"); |
| 927 globals_->Add(variable->name()); |
| 928 globals_->Add(instance); |
| 929 Visit(declaration->module()); |
924 break; | 930 break; |
| 931 } |
925 | 932 |
926 case Variable::CONTEXT: { | 933 case Variable::CONTEXT: { |
927 Comment cmnt(masm_, "[ ModuleDeclaration"); | 934 Comment cmnt(masm_, "[ ModuleDeclaration"); |
928 EmitDebugCheckDeclarationContext(variable); | 935 EmitDebugCheckDeclarationContext(variable); |
929 // TODO(rossberg): initialize module instance object | 936 __ mov(r1, Operand(instance)); |
| 937 __ str(r1, ContextOperand(cp, variable->index())); |
| 938 Visit(declaration->module()); |
930 break; | 939 break; |
931 } | 940 } |
932 | 941 |
933 case Variable::PARAMETER: | 942 case Variable::PARAMETER: |
934 case Variable::LOCAL: | 943 case Variable::LOCAL: |
935 case Variable::LOOKUP: | 944 case Variable::LOOKUP: |
936 UNREACHABLE(); | 945 UNREACHABLE(); |
937 } | 946 } |
938 } | 947 } |
939 | 948 |
(...skipping 3589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4529 } | 4538 } |
4530 | 4539 |
4531 | 4540 |
4532 void FullCodeGenerator::LoadContextField(Register dst, int context_index) { | 4541 void FullCodeGenerator::LoadContextField(Register dst, int context_index) { |
4533 __ ldr(dst, ContextOperand(cp, context_index)); | 4542 __ ldr(dst, ContextOperand(cp, context_index)); |
4534 } | 4543 } |
4535 | 4544 |
4536 | 4545 |
4537 void FullCodeGenerator::PushFunctionArgumentForContextAllocation() { | 4546 void FullCodeGenerator::PushFunctionArgumentForContextAllocation() { |
4538 Scope* declaration_scope = scope()->DeclarationScope(); | 4547 Scope* declaration_scope = scope()->DeclarationScope(); |
4539 if (declaration_scope->is_global_scope()) { | 4548 if (declaration_scope->is_global_scope() || |
| 4549 declaration_scope->is_module_scope()) { |
4540 // Contexts nested in the global context have a canonical empty function | 4550 // Contexts nested in the global context have a canonical empty function |
4541 // as their closure, not the anonymous closure containing the global | 4551 // as their closure, not the anonymous closure containing the global |
4542 // code. Pass a smi sentinel and let the runtime look up the empty | 4552 // code. Pass a smi sentinel and let the runtime look up the empty |
4543 // function. | 4553 // function. |
4544 __ mov(ip, Operand(Smi::FromInt(0))); | 4554 __ mov(ip, Operand(Smi::FromInt(0))); |
4545 } else if (declaration_scope->is_eval_scope()) { | 4555 } else if (declaration_scope->is_eval_scope()) { |
4546 // Contexts created by a call to eval have the same closure as the | 4556 // Contexts created by a call to eval have the same closure as the |
4547 // context calling eval, not the anonymous closure containing the eval | 4557 // context calling eval, not the anonymous closure containing the eval |
4548 // code. Fetch it from the context. | 4558 // code. Fetch it from the context. |
4549 __ ldr(ip, ContextOperand(cp, Context::CLOSURE_INDEX)); | 4559 __ ldr(ip, ContextOperand(cp, Context::CLOSURE_INDEX)); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4609 *context_length = 0; | 4619 *context_length = 0; |
4610 return previous_; | 4620 return previous_; |
4611 } | 4621 } |
4612 | 4622 |
4613 | 4623 |
4614 #undef __ | 4624 #undef __ |
4615 | 4625 |
4616 } } // namespace v8::internal | 4626 } } // namespace v8::internal |
4617 | 4627 |
4618 #endif // V8_TARGET_ARCH_ARM | 4628 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |