[runtime] Creates a global/read-only ScopeInfo for NativeContext

The native context used an empty function scope info. This is inconsistent with the fact the native context has an extension slot, since the empty function scope info doesn't have the extension slot flag set.

This CL creates a scope info dedicated for the native context with the flag set.

Bug: v8:9744
Change-Id: I00459e9a0ca75dd7a0e2add5e9e61747d0635f39
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1876821
Commit-Queue: Victor Gomes <victorgomes@chromium.org>
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Auto-Submit: Victor Gomes <victorgomes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#64550}
This commit is contained in:
Victor Gomes 2019-10-24 17:00:48 +02:00 committed by Commit Bot
parent 9d8f4ded7a
commit dbd2ec3a3b
6 changed files with 101 additions and 83 deletions

View File

@ -811,6 +811,10 @@ void Heap::CreateInitialObjects() {
ScopeInfo::CreateForEmptyFunction(isolate());
set_empty_function_scope_info(*empty_function);
Handle<ScopeInfo> native_scope_info =
ScopeInfo::CreateForNativeContext(isolate());
set_native_scope_info(*native_scope_info);
// Allocate the empty script.
Handle<Script> script = factory->NewScript(factory->empty_string());
script->set_type(Script::TYPE_NATIVE);

View File

@ -1413,8 +1413,9 @@ void InstallMakeError(Isolate* isolate, int builtin_id, int context_index) {
void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
Handle<JSFunction> empty_function) {
// --- N a t i v e C o n t e x t ---
// Use the empty scope info.
native_context()->set_scope_info(empty_function->shared().scope_info());
// Use the native scope info.
native_context()->set_scope_info(
ReadOnlyRoots(isolate()).native_scope_info());
native_context()->set_previous(Context());
// Set extension and global object.
native_context()->set_extension(*global_object);

View File

@ -422,23 +422,29 @@ Handle<ScopeInfo> ScopeInfo::CreateForWithScope(
// static
Handle<ScopeInfo> ScopeInfo::CreateGlobalThisBinding(Isolate* isolate) {
return CreateForBootstrapping(isolate, SCRIPT_SCOPE);
return CreateForBootstrapping(isolate, BootstrappingType::kScript);
}
// static
Handle<ScopeInfo> ScopeInfo::CreateForEmptyFunction(Isolate* isolate) {
return CreateForBootstrapping(isolate, FUNCTION_SCOPE);
return CreateForBootstrapping(isolate, BootstrappingType::kFunction);
}
// static
Handle<ScopeInfo> ScopeInfo::CreateForNativeContext(Isolate* isolate) {
return CreateForBootstrapping(isolate, BootstrappingType::kNative);
}
// static
Handle<ScopeInfo> ScopeInfo::CreateForBootstrapping(Isolate* isolate,
ScopeType type) {
DCHECK(type == SCRIPT_SCOPE || type == FUNCTION_SCOPE);
BootstrappingType type) {
const int parameter_count = 0;
const bool is_empty_function = type == FUNCTION_SCOPE;
const int context_local_count = is_empty_function ? 0 : 1;
const bool has_receiver = !is_empty_function;
const bool is_empty_function = type == BootstrappingType::kFunction;
const bool is_native_context = type == BootstrappingType::kNative;
const bool is_script = type == BootstrappingType::kScript;
const int context_local_count =
is_empty_function || is_native_context ? 0 : 1;
const bool has_receiver = is_script;
const bool has_inferred_function_name = is_empty_function;
const bool has_position_info = true;
const int length = kVariablePartIndex + 2 * context_local_count +
@ -452,25 +458,26 @@ Handle<ScopeInfo> ScopeInfo::CreateForBootstrapping(Isolate* isolate,
factory->NewScopeInfo(length, AllocationType::kReadOnly);
// Encode the flags.
int flags =
ScopeTypeField::encode(type) |
SloppyEvalCanExtendVarsField::encode(false) |
LanguageModeField::encode(LanguageMode::kSloppy) |
DeclarationScopeField::encode(true) |
ReceiverVariableField::encode(is_empty_function ? UNUSED : CONTEXT) |
HasClassBrandField::encode(false) |
HasSavedClassVariableIndexField::encode(false) |
HasNewTargetField::encode(false) |
FunctionVariableField::encode(is_empty_function ? UNUSED : NONE) |
HasInferredFunctionNameField::encode(has_inferred_function_name) |
IsAsmModuleField::encode(false) | HasSimpleParametersField::encode(true) |
FunctionKindField::encode(FunctionKind::kNormalFunction) |
HasOuterScopeInfoField::encode(false) |
IsDebugEvaluateScopeField::encode(false) |
ForceContextAllocationField::encode(false) |
PrivateNameLookupSkipsOuterClassField::encode(false) |
CanElideThisHoleChecksField::encode(false) |
HasContextExtensionField::encode(false);
int flags = ScopeTypeField::encode(is_empty_function ? FUNCTION_SCOPE
: SCRIPT_SCOPE) |
SloppyEvalCanExtendVarsField::encode(false) |
LanguageModeField::encode(LanguageMode::kSloppy) |
DeclarationScopeField::encode(true) |
ReceiverVariableField::encode(is_script ? CONTEXT : UNUSED) |
HasClassBrandField::encode(false) |
HasSavedClassVariableIndexField::encode(false) |
HasNewTargetField::encode(false) |
FunctionVariableField::encode(is_empty_function ? UNUSED : NONE) |
HasInferredFunctionNameField::encode(has_inferred_function_name) |
IsAsmModuleField::encode(false) |
HasSimpleParametersField::encode(true) |
FunctionKindField::encode(FunctionKind::kNormalFunction) |
HasOuterScopeInfoField::encode(false) |
IsDebugEvaluateScopeField::encode(false) |
ForceContextAllocationField::encode(false) |
PrivateNameLookupSkipsOuterClassField::encode(false) |
CanElideThisHoleChecksField::encode(false) |
HasContextExtensionField::encode(is_native_context);
scope_info->SetFlags(flags);
scope_info->SetParameterCount(parameter_count);
scope_info->SetContextLocalCount(context_local_count);
@ -483,7 +490,7 @@ Handle<ScopeInfo> ScopeInfo::CreateForBootstrapping(Isolate* isolate,
scope_info->set(index++, ReadOnlyRoots(isolate).this_string());
}
DCHECK_EQ(index, scope_info->ContextLocalInfosIndex());
if (context_local_count) {
if (context_local_count > 0) {
const uint32_t value =
VariableModeField::encode(VariableMode::kConst) |
InitFlagField::encode(kCreatedInitialized) |
@ -495,8 +502,8 @@ Handle<ScopeInfo> ScopeInfo::CreateForBootstrapping(Isolate* isolate,
// And here we record that this scopeinfo binds a receiver.
DCHECK_EQ(index, scope_info->ReceiverInfoIndex());
const int receiver_index = scope_info->ContextHeaderLength();
if (!is_empty_function) {
if (has_receiver) {
const int receiver_index = scope_info->ContextHeaderLength();
scope_info->set(index++, Smi::FromInt(receiver_index));
}
@ -516,7 +523,7 @@ Handle<ScopeInfo> ScopeInfo::CreateForBootstrapping(Isolate* isolate,
DCHECK_EQ(index, scope_info->OuterScopeInfoIndex());
DCHECK_EQ(index, scope_info->length());
DCHECK_EQ(scope_info->ParameterCount(), parameter_count);
if (type == FUNCTION_SCOPE) {
if (is_empty_function || is_native_context) {
DCHECK_EQ(scope_info->ContextLength(), 0);
} else {
DCHECK_EQ(scope_info->ContextLength(),
@ -685,6 +692,7 @@ Object ScopeInfo::InferredFunctionName() const {
}
String ScopeInfo::FunctionDebugName() const {
if (!HasFunctionName()) return GetReadOnlyRoots().empty_string();
Object name = FunctionName();
if (name.IsString() && String::cast(name).length() > 0) {
return String::cast(name);

View File

@ -209,6 +209,7 @@ class ScopeInfo : public FixedArray {
Isolate* isolate, MaybeHandle<ScopeInfo> outer_scope);
V8_EXPORT_PRIVATE static Handle<ScopeInfo> CreateForEmptyFunction(
Isolate* isolate);
static Handle<ScopeInfo> CreateForNativeContext(Isolate* isolate);
static Handle<ScopeInfo> CreateGlobalThisBinding(Isolate* isolate);
// Serializes empty scope info.
@ -323,8 +324,10 @@ class ScopeInfo : public FixedArray {
int ModuleVariablesIndex() const;
static bool NeedsPositionInfo(ScopeType type);
enum class BootstrappingType { kScript, kFunction, kNative };
static Handle<ScopeInfo> CreateForBootstrapping(Isolate* isolate,
ScopeType type);
BootstrappingType type);
int Lookup(Handle<String> name, int start, int end, VariableMode* mode,
VariableLocation* location, InitializationFlag* init_flag,

View File

@ -189,6 +189,7 @@ class Symbol;
/* Canonical scope infos */ \
V(ScopeInfo, global_this_binding_scope_info, GlobalThisBindingScopeInfo) \
V(ScopeInfo, empty_function_scope_info, EmptyFunctionScopeInfo) \
V(ScopeInfo, native_scope_info, NativeScopeInfo) \
/* Hash seed */ \
V(ByteArray, hash_seed, HashSeed)

View File

@ -280,54 +280,54 @@ KNOWN_MAPS = {
("read_only_space", 0x02031): (94, "EnumCacheMap"),
("read_only_space", 0x020d1): (88, "ArrayBoilerplateDescriptionMap"),
("read_only_space", 0x022c1): (97, "InterceptorInfoMap"),
("read_only_space", 0x04c01): (71, "PromiseFulfillReactionJobTaskMap"),
("read_only_space", 0x04c51): (72, "PromiseRejectReactionJobTaskMap"),
("read_only_space", 0x04ca1): (73, "CallableTaskMap"),
("read_only_space", 0x04cf1): (74, "CallbackTaskMap"),
("read_only_space", 0x04d41): (75, "PromiseResolveThenableJobTaskMap"),
("read_only_space", 0x04d91): (78, "FunctionTemplateInfoMap"),
("read_only_space", 0x04de1): (79, "ObjectTemplateInfoMap"),
("read_only_space", 0x04e31): (80, "Tuple2Map"),
("read_only_space", 0x04e81): (81, "Tuple3Map"),
("read_only_space", 0x04ed1): (82, "AccessCheckInfoMap"),
("read_only_space", 0x04f21): (83, "AccessorInfoMap"),
("read_only_space", 0x04f71): (84, "AccessorPairMap"),
("read_only_space", 0x04fc1): (85, "AliasedArgumentsEntryMap"),
("read_only_space", 0x05011): (86, "AllocationMementoMap"),
("read_only_space", 0x05061): (89, "AsmWasmDataMap"),
("read_only_space", 0x050b1): (90, "AsyncGeneratorRequestMap"),
("read_only_space", 0x05101): (92, "ClassPositionsMap"),
("read_only_space", 0x05151): (93, "DebugInfoMap"),
("read_only_space", 0x051a1): (96, "FunctionTemplateRareDataMap"),
("read_only_space", 0x051f1): (99, "InterpreterDataMap"),
("read_only_space", 0x05241): (100, "PromiseCapabilityMap"),
("read_only_space", 0x05291): (101, "PromiseReactionMap"),
("read_only_space", 0x052e1): (102, "PrototypeInfoMap"),
("read_only_space", 0x05331): (103, "ScriptMap"),
("read_only_space", 0x05381): (107, "SourcePositionTableWithFrameCacheMap"),
("read_only_space", 0x053d1): (108, "SourceTextModuleInfoEntryMap"),
("read_only_space", 0x05421): (109, "StackFrameInfoMap"),
("read_only_space", 0x05471): (110, "StackTraceFrameMap"),
("read_only_space", 0x054c1): (111, "TemplateObjectDescriptionMap"),
("read_only_space", 0x05511): (112, "WasmCapiFunctionDataMap"),
("read_only_space", 0x05561): (113, "WasmDebugInfoMap"),
("read_only_space", 0x055b1): (114, "WasmExceptionTagMap"),
("read_only_space", 0x05601): (115, "WasmExportedFunctionDataMap"),
("read_only_space", 0x05651): (116, "WasmIndirectFunctionTableMap"),
("read_only_space", 0x056a1): (117, "WasmJSFunctionDataMap"),
("read_only_space", 0x056f1): (98, "InternalClassMap"),
("read_only_space", 0x05741): (105, "SmiPairMap"),
("read_only_space", 0x05791): (104, "SmiBoxMap"),
("read_only_space", 0x057e1): (106, "SortStateMap"),
("read_only_space", 0x05831): (87, "AllocationSiteWithWeakNextMap"),
("read_only_space", 0x05881): (87, "AllocationSiteWithoutWeakNextMap"),
("read_only_space", 0x058d1): (76, "LoadHandler1Map"),
("read_only_space", 0x05921): (76, "LoadHandler2Map"),
("read_only_space", 0x05971): (76, "LoadHandler3Map"),
("read_only_space", 0x059c1): (77, "StoreHandler0Map"),
("read_only_space", 0x05a11): (77, "StoreHandler1Map"),
("read_only_space", 0x05a61): (77, "StoreHandler2Map"),
("read_only_space", 0x05ab1): (77, "StoreHandler3Map"),
("read_only_space", 0x04c39): (71, "PromiseFulfillReactionJobTaskMap"),
("read_only_space", 0x04c89): (72, "PromiseRejectReactionJobTaskMap"),
("read_only_space", 0x04cd9): (73, "CallableTaskMap"),
("read_only_space", 0x04d29): (74, "CallbackTaskMap"),
("read_only_space", 0x04d79): (75, "PromiseResolveThenableJobTaskMap"),
("read_only_space", 0x04dc9): (78, "FunctionTemplateInfoMap"),
("read_only_space", 0x04e19): (79, "ObjectTemplateInfoMap"),
("read_only_space", 0x04e69): (80, "Tuple2Map"),
("read_only_space", 0x04eb9): (81, "Tuple3Map"),
("read_only_space", 0x04f09): (82, "AccessCheckInfoMap"),
("read_only_space", 0x04f59): (83, "AccessorInfoMap"),
("read_only_space", 0x04fa9): (84, "AccessorPairMap"),
("read_only_space", 0x04ff9): (85, "AliasedArgumentsEntryMap"),
("read_only_space", 0x05049): (86, "AllocationMementoMap"),
("read_only_space", 0x05099): (89, "AsmWasmDataMap"),
("read_only_space", 0x050e9): (90, "AsyncGeneratorRequestMap"),
("read_only_space", 0x05139): (92, "ClassPositionsMap"),
("read_only_space", 0x05189): (93, "DebugInfoMap"),
("read_only_space", 0x051d9): (96, "FunctionTemplateRareDataMap"),
("read_only_space", 0x05229): (99, "InterpreterDataMap"),
("read_only_space", 0x05279): (100, "PromiseCapabilityMap"),
("read_only_space", 0x052c9): (101, "PromiseReactionMap"),
("read_only_space", 0x05319): (102, "PrototypeInfoMap"),
("read_only_space", 0x05369): (103, "ScriptMap"),
("read_only_space", 0x053b9): (107, "SourcePositionTableWithFrameCacheMap"),
("read_only_space", 0x05409): (108, "SourceTextModuleInfoEntryMap"),
("read_only_space", 0x05459): (109, "StackFrameInfoMap"),
("read_only_space", 0x054a9): (110, "StackTraceFrameMap"),
("read_only_space", 0x054f9): (111, "TemplateObjectDescriptionMap"),
("read_only_space", 0x05549): (112, "WasmCapiFunctionDataMap"),
("read_only_space", 0x05599): (113, "WasmDebugInfoMap"),
("read_only_space", 0x055e9): (114, "WasmExceptionTagMap"),
("read_only_space", 0x05639): (115, "WasmExportedFunctionDataMap"),
("read_only_space", 0x05689): (116, "WasmIndirectFunctionTableMap"),
("read_only_space", 0x056d9): (117, "WasmJSFunctionDataMap"),
("read_only_space", 0x05729): (98, "InternalClassMap"),
("read_only_space", 0x05779): (105, "SmiPairMap"),
("read_only_space", 0x057c9): (104, "SmiBoxMap"),
("read_only_space", 0x05819): (106, "SortStateMap"),
("read_only_space", 0x05869): (87, "AllocationSiteWithWeakNextMap"),
("read_only_space", 0x058b9): (87, "AllocationSiteWithoutWeakNextMap"),
("read_only_space", 0x05909): (76, "LoadHandler1Map"),
("read_only_space", 0x05959): (76, "LoadHandler2Map"),
("read_only_space", 0x059a9): (76, "LoadHandler3Map"),
("read_only_space", 0x059f9): (77, "StoreHandler0Map"),
("read_only_space", 0x05a49): (77, "StoreHandler1Map"),
("read_only_space", 0x05a99): (77, "StoreHandler2Map"),
("read_only_space", 0x05ae9): (77, "StoreHandler3Map"),
("map_space", 0x00119): (1057, "ExternalMap"),
("map_space", 0x00169): (1072, "JSMessageObjectMap"),
}
@ -376,7 +376,8 @@ KNOWN_OBJECTS = {
("read_only_space", 0x023e1): "TrampolinePromiseRejectionCodeDataContainer",
("read_only_space", 0x023f9): "GlobalThisBindingScopeInfo",
("read_only_space", 0x02461): "EmptyFunctionScopeInfo",
("read_only_space", 0x024b1): "HashSeed",
("read_only_space", 0x024b1): "NativeScopeInfo",
("read_only_space", 0x024e9): "HashSeed",
("old_space", 0x00119): "ArgumentsIteratorAccessor",
("old_space", 0x00189): "ArrayLengthAccessor",
("old_space", 0x001f9): "BoundFunctionLengthAccessor",