Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(376)

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 2465283004: [modules] Maintain array of cells for imports and local exports. (Closed)
Patch Set: Rename parameter also in header file. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/bytecode-generator.h" 5 #include "src/interpreter/bytecode-generator.h"
6 6
7 #include "src/ast/compile-time-value.h" 7 #include "src/ast/compile-time-value.h"
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/compilation-info.h" 10 #include "src/compilation-info.h"
(...skipping 1847 matching lines...) Expand 10 before | Expand all | Expand 10 after
1858 builder()->LoadLookupGlobalSlot(variable->name(), typeof_mode, 1858 builder()->LoadLookupGlobalSlot(variable->name(), typeof_mode,
1859 feedback_index(slot), depth); 1859 feedback_index(slot), depth);
1860 break; 1860 break;
1861 } 1861 }
1862 default: 1862 default:
1863 builder()->LoadLookupSlot(variable->name(), typeof_mode); 1863 builder()->LoadLookupSlot(variable->name(), typeof_mode);
1864 } 1864 }
1865 break; 1865 break;
1866 } 1866 }
1867 case VariableLocation::MODULE: { 1867 case VariableLocation::MODULE: {
1868 ModuleDescriptor* descriptor = scope()->GetModuleScope()->module(); 1868 Register index = register_allocator()->NewRegister();
1869 if (variable->IsExport()) { 1869 builder()
1870 auto it = descriptor->regular_exports().find(variable->raw_name()); 1870 ->LoadLiteral(Smi::FromInt(variable->index()))
1871 DCHECK(it != descriptor->regular_exports().end()); 1871 .StoreAccumulatorInRegister(index)
1872 Register export_name = register_allocator()->NewRegister(); 1872 .CallRuntime(Runtime::kLoadModuleVariable, index);
1873 builder()
1874 ->LoadLiteral(it->second->export_name->string())
1875 .StoreAccumulatorInRegister(export_name)
1876 .CallRuntime(Runtime::kLoadModuleExport, export_name);
1877 } else {
1878 auto it = descriptor->regular_imports().find(variable->raw_name());
1879 DCHECK(it != descriptor->regular_imports().end());
1880 RegisterList args = register_allocator()->NewRegisterList(2);
1881 builder()
1882 ->LoadLiteral(it->second->import_name->string())
1883 .StoreAccumulatorInRegister(args[0])
1884 .LoadLiteral(Smi::FromInt(it->second->module_request))
1885 .StoreAccumulatorInRegister(args[1])
1886 .CallRuntime(Runtime::kLoadModuleImport, args);
1887 }
1888 if (hole_check_mode == HoleCheckMode::kRequired) { 1873 if (hole_check_mode == HoleCheckMode::kRequired) {
1889 BuildThrowIfHole(variable->name()); 1874 BuildThrowIfHole(variable->name());
1890 } 1875 }
1891 break; 1876 break;
1892 } 1877 }
1893 } 1878 }
1894 } 1879 }
1895 1880
1896 void BytecodeGenerator::BuildVariableLoadForAccumulatorValue( 1881 void BytecodeGenerator::BuildVariableLoadForAccumulatorValue(
1897 Variable* variable, FeedbackVectorSlot slot, HoleCheckMode hole_check_mode, 1882 Variable* variable, FeedbackVectorSlot slot, HoleCheckMode hole_check_mode,
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2045 if (mode == CONST && op != Token::INIT) { 2030 if (mode == CONST && op != Token::INIT) {
2046 builder()->CallRuntime(Runtime::kThrowConstAssignError); 2031 builder()->CallRuntime(Runtime::kThrowConstAssignError);
2047 break; 2032 break;
2048 } 2033 }
2049 2034
2050 // If we don't throw above, we know that we're dealing with an 2035 // If we don't throw above, we know that we're dealing with an
2051 // export because imports are const and we do not generate initializing 2036 // export because imports are const and we do not generate initializing
2052 // assignments for them. 2037 // assignments for them.
2053 DCHECK(variable->IsExport()); 2038 DCHECK(variable->IsExport());
2054 2039
2055 ModuleDescriptor* mod = scope()->GetModuleScope()->module();
2056 // There may be several export names for this local name, but it doesn't
2057 // matter which one we pick, as they all map to the same cell.
2058 auto it = mod->regular_exports().find(variable->raw_name());
2059 DCHECK(it != mod->regular_exports().end());
2060
2061 RegisterList args = register_allocator()->NewRegisterList(2); 2040 RegisterList args = register_allocator()->NewRegisterList(2);
2062 builder() 2041 builder()
2063 ->StoreAccumulatorInRegister(args[1]) 2042 ->StoreAccumulatorInRegister(args[1])
2064 .LoadLiteral(it->second->export_name->string()) 2043 .LoadLiteral(Smi::FromInt(variable->index()))
2065 .StoreAccumulatorInRegister(args[0]); 2044 .StoreAccumulatorInRegister(args[0]);
2066 if (hole_check_mode == HoleCheckMode::kRequired) { 2045 if (hole_check_mode == HoleCheckMode::kRequired) {
2067 builder()->CallRuntime(Runtime::kLoadModuleExport, args[0]); 2046 builder()->CallRuntime(Runtime::kLoadModuleVariable, args[0]);
2068 BuildHoleCheckForVariableAssignment(variable, op); 2047 BuildHoleCheckForVariableAssignment(variable, op);
2069 } 2048 }
2070 builder() 2049 builder()
2071 ->CallRuntime(Runtime::kStoreModuleExport, args) 2050 ->CallRuntime(Runtime::kStoreModuleVariable, args)
2072 .LoadAccumulatorWithRegister(args[1]); 2051 .LoadAccumulatorWithRegister(args[1]);
2073 break; 2052 break;
2074 } 2053 }
2075 } 2054 }
2076 } 2055 }
2077 2056
2078 void BytecodeGenerator::VisitAssignment(Assignment* expr) { 2057 void BytecodeGenerator::VisitAssignment(Assignment* expr) {
2079 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); 2058 DCHECK(expr->target()->IsValidReferenceExpressionOrThis());
2080 Register object, key; 2059 Register object, key;
2081 RegisterList super_property_args; 2060 RegisterList super_property_args;
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after
3216 } 3195 }
3217 3196
3218 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { 3197 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() {
3219 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict 3198 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict
3220 : Runtime::kStoreKeyedToSuper_Sloppy; 3199 : Runtime::kStoreKeyedToSuper_Sloppy;
3221 } 3200 }
3222 3201
3223 } // namespace interpreter 3202 } // namespace interpreter
3224 } // namespace internal 3203 } // namespace internal
3225 } // namespace v8 3204 } // namespace v8
OLDNEW
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698