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

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

Issue 2465283004: [modules] Maintain array of cells for imports and local exports. (Closed)
Patch Set: Various changes. 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
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 1848 matching lines...) Expand 10 before | Expand all | Expand 10 after
1859 builder()->LoadLookupGlobalSlot(variable->name(), typeof_mode, 1859 builder()->LoadLookupGlobalSlot(variable->name(), typeof_mode,
1860 feedback_index(slot), depth); 1860 feedback_index(slot), depth);
1861 break; 1861 break;
1862 } 1862 }
1863 default: 1863 default:
1864 builder()->LoadLookupSlot(variable->name(), typeof_mode); 1864 builder()->LoadLookupSlot(variable->name(), typeof_mode);
1865 } 1865 }
1866 break; 1866 break;
1867 } 1867 }
1868 case VariableLocation::MODULE: { 1868 case VariableLocation::MODULE: {
1869 ModuleDescriptor* descriptor = scope()->GetModuleScope()->module(); 1869 Register index = register_allocator()->NewRegister();
1870 if (variable->IsExport()) { 1870 builder()
1871 auto it = descriptor->regular_exports().find(variable->raw_name()); 1871 ->LoadLiteral(Smi::FromInt(variable->index()))
1872 DCHECK(it != descriptor->regular_exports().end()); 1872 .StoreAccumulatorInRegister(index)
1873 Register export_name = register_allocator()->NewRegister(); 1873 .CallRuntime(Runtime::kLoadModuleVariable, index);
1874 builder()
1875 ->LoadLiteral(it->second->export_name->string())
1876 .StoreAccumulatorInRegister(export_name)
1877 .CallRuntime(Runtime::kLoadModuleExport, export_name);
1878 } else {
1879 auto it = descriptor->regular_imports().find(variable->raw_name());
1880 DCHECK(it != descriptor->regular_imports().end());
1881 RegisterList args = register_allocator()->NewRegisterList(2);
1882 builder()
1883 ->LoadLiteral(it->second->import_name->string())
1884 .StoreAccumulatorInRegister(args[0])
1885 .LoadLiteral(Smi::FromInt(it->second->module_request))
1886 .StoreAccumulatorInRegister(args[1])
1887 .CallRuntime(Runtime::kLoadModuleImport, args);
1888 }
1889 if (hole_check_mode == HoleCheckMode::kRequired) { 1874 if (hole_check_mode == HoleCheckMode::kRequired) {
1890 BuildThrowIfHole(variable->name()); 1875 BuildThrowIfHole(variable->name());
1891 } 1876 }
1892 break; 1877 break;
1893 } 1878 }
1894 } 1879 }
1895 } 1880 }
1896 1881
1897 void BytecodeGenerator::BuildVariableLoadForAccumulatorValue( 1882 void BytecodeGenerator::BuildVariableLoadForAccumulatorValue(
1898 Variable* variable, FeedbackVectorSlot slot, HoleCheckMode hole_check_mode, 1883 Variable* variable, FeedbackVectorSlot slot, HoleCheckMode hole_check_mode,
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2046 if (mode == CONST && op != Token::INIT) { 2031 if (mode == CONST && op != Token::INIT) {
2047 builder()->CallRuntime(Runtime::kThrowConstAssignError); 2032 builder()->CallRuntime(Runtime::kThrowConstAssignError);
2048 break; 2033 break;
2049 } 2034 }
2050 2035
2051 // If we don't throw above, we know that we're dealing with an 2036 // If we don't throw above, we know that we're dealing with an
2052 // export because imports are const and we do not generate initializing 2037 // export because imports are const and we do not generate initializing
2053 // assignments for them. 2038 // assignments for them.
2054 DCHECK(variable->IsExport()); 2039 DCHECK(variable->IsExport());
2055 2040
2056 ModuleDescriptor* mod = scope()->GetModuleScope()->module();
2057 // There may be several export names for this local name, but it doesn't
2058 // matter which one we pick, as they all map to the same cell.
2059 auto it = mod->regular_exports().find(variable->raw_name());
2060 DCHECK(it != mod->regular_exports().end());
2061
2062 RegisterList args = register_allocator()->NewRegisterList(2); 2041 RegisterList args = register_allocator()->NewRegisterList(2);
2063 builder() 2042 builder()
2064 ->StoreAccumulatorInRegister(args[1]) 2043 ->StoreAccumulatorInRegister(args[1])
2065 .LoadLiteral(it->second->export_name->string()) 2044 .LoadLiteral(Smi::FromInt(variable->index()))
2066 .StoreAccumulatorInRegister(args[0]); 2045 .StoreAccumulatorInRegister(args[0]);
2067 if (hole_check_mode == HoleCheckMode::kRequired) { 2046 if (hole_check_mode == HoleCheckMode::kRequired) {
2068 builder()->CallRuntime(Runtime::kLoadModuleExport, args[0]); 2047 builder()->CallRuntime(Runtime::kLoadModuleVariable, args[0]);
2069 BuildHoleCheckForVariableAssignment(variable, op); 2048 BuildHoleCheckForVariableAssignment(variable, op);
2070 } 2049 }
2071 builder() 2050 builder()
2072 ->CallRuntime(Runtime::kStoreModuleExport, args) 2051 ->CallRuntime(Runtime::kStoreModuleVariable, args)
2073 .LoadAccumulatorWithRegister(args[1]); 2052 .LoadAccumulatorWithRegister(args[1]);
2074 break; 2053 break;
2075 } 2054 }
2076 } 2055 }
2077 } 2056 }
2078 2057
2079 void BytecodeGenerator::VisitAssignment(Assignment* expr) { 2058 void BytecodeGenerator::VisitAssignment(Assignment* expr) {
2080 DCHECK(expr->target()->IsValidReferenceExpressionOrThis()); 2059 DCHECK(expr->target()->IsValidReferenceExpressionOrThis());
2081 Register object, key; 2060 Register object, key;
2082 RegisterList super_property_args; 2061 RegisterList super_property_args;
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after
3217 } 3196 }
3218 3197
3219 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { 3198 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() {
3220 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict 3199 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict
3221 : Runtime::kStoreKeyedToSuper_Sloppy; 3200 : Runtime::kStoreKeyedToSuper_Sloppy;
3222 } 3201 }
3223 3202
3224 } // namespace interpreter 3203 } // namespace interpreter
3225 } // namespace internal 3204 } // namespace internal
3226 } // namespace v8 3205 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698