[build] Move FunctionTemplateInfo methods out of objects.cc
This moves all of the FunctionTemplateInfo code into templates.cc and removes the inline keyword from BreakAtEntry which is moved out of templates-inl.h. As a result templates-inl.h no longer depends on shared-function-info-inl.h. This in turn uncovered lots of other missing includes which are now in place. Change-Id: I9bc152d5e3db0e793db135a8cfcf97f6d8bcbb8a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2953295 Reviewed-by: Maya Lekova <mslekova@chromium.org> Commit-Queue: Dan Elphick <delphick@chromium.org> Cr-Commit-Position: refs/heads/master@{#75120}
This commit is contained in:
parent
5f8a28f00b
commit
9444600b5b
1
BUILD.gn
1
BUILD.gn
@ -3955,6 +3955,7 @@ v8_source_set("v8_base_without_compiler") {
|
|||||||
"src/objects/synthetic-module.cc",
|
"src/objects/synthetic-module.cc",
|
||||||
"src/objects/tagged-impl.cc",
|
"src/objects/tagged-impl.cc",
|
||||||
"src/objects/template-objects.cc",
|
"src/objects/template-objects.cc",
|
||||||
|
"src/objects/templates.cc",
|
||||||
"src/objects/transitions.cc",
|
"src/objects/transitions.cc",
|
||||||
"src/objects/type-hints.cc",
|
"src/objects/type-hints.cc",
|
||||||
"src/objects/value-serializer.cc",
|
"src/objects/value-serializer.cc",
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#include "src/objects/map-inl.h"
|
#include "src/objects/map-inl.h"
|
||||||
#include "src/objects/maybe-object-inl.h"
|
#include "src/objects/maybe-object-inl.h"
|
||||||
#include "src/objects/oddball.h"
|
#include "src/objects/oddball.h"
|
||||||
#include "src/objects/shared-function-info.h"
|
#include "src/objects/shared-function-info-inl.h"
|
||||||
#include "src/objects/smi-inl.h"
|
#include "src/objects/smi-inl.h"
|
||||||
#include "src/utils/utils.h"
|
#include "src/utils/utils.h"
|
||||||
|
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
#ifndef V8_OBJECTS_FEEDBACK_CELL_INL_H_
|
#ifndef V8_OBJECTS_FEEDBACK_CELL_INL_H_
|
||||||
#define V8_OBJECTS_FEEDBACK_CELL_INL_H_
|
#define V8_OBJECTS_FEEDBACK_CELL_INL_H_
|
||||||
|
|
||||||
#include "src/objects/feedback-cell.h"
|
|
||||||
|
|
||||||
#include "src/heap/heap-write-barrier-inl.h"
|
#include "src/heap/heap-write-barrier-inl.h"
|
||||||
|
#include "src/objects/feedback-cell.h"
|
||||||
|
#include "src/objects/feedback-vector-inl.h"
|
||||||
#include "src/objects/objects-inl.h"
|
#include "src/objects/objects-inl.h"
|
||||||
#include "src/objects/struct-inl.h"
|
#include "src/objects/struct-inl.h"
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include "src/objects/objects-inl.h"
|
#include "src/objects/objects-inl.h"
|
||||||
#include "src/objects/property.h"
|
#include "src/objects/property.h"
|
||||||
#include "src/objects/prototype-info-inl.h"
|
#include "src/objects/prototype-info-inl.h"
|
||||||
#include "src/objects/shared-function-info.h"
|
#include "src/objects/shared-function-info-inl.h"
|
||||||
#include "src/objects/templates-inl.h"
|
#include "src/objects/templates-inl.h"
|
||||||
#include "src/objects/transitions-inl.h"
|
#include "src/objects/transitions-inl.h"
|
||||||
#include "src/objects/transitions.h"
|
#include "src/objects/transitions.h"
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "src/objects/objects-inl.h" // Needed for write barriers
|
#include "src/objects/objects-inl.h" // Needed for write barriers
|
||||||
#include "src/objects/scope-info.h"
|
#include "src/objects/scope-info.h"
|
||||||
#include "src/objects/source-text-module.h"
|
#include "src/objects/source-text-module.h"
|
||||||
|
#include "src/objects/string-inl.h"
|
||||||
#include "src/objects/synthetic-module.h"
|
#include "src/objects/synthetic-module.h"
|
||||||
|
|
||||||
// Has to be the last include (doesn't have include guards):
|
// Has to be the last include (doesn't have include guards):
|
||||||
|
@ -1287,100 +1287,6 @@ bool Object::ToInt32(int32_t* value) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<SharedFunctionInfo> FunctionTemplateInfo::GetOrCreateSharedFunctionInfo(
|
|
||||||
Isolate* isolate, Handle<FunctionTemplateInfo> info,
|
|
||||||
MaybeHandle<Name> maybe_name) {
|
|
||||||
Object current_info = info->shared_function_info();
|
|
||||||
if (current_info.IsSharedFunctionInfo()) {
|
|
||||||
return handle(SharedFunctionInfo::cast(current_info), isolate);
|
|
||||||
}
|
|
||||||
Handle<Name> name;
|
|
||||||
Handle<String> name_string;
|
|
||||||
if (maybe_name.ToHandle(&name) && name->IsString()) {
|
|
||||||
name_string = Handle<String>::cast(name);
|
|
||||||
} else if (info->class_name().IsString()) {
|
|
||||||
name_string = handle(String::cast(info->class_name()), isolate);
|
|
||||||
} else {
|
|
||||||
name_string = isolate->factory()->empty_string();
|
|
||||||
}
|
|
||||||
FunctionKind function_kind;
|
|
||||||
if (info->remove_prototype()) {
|
|
||||||
function_kind = kConciseMethod;
|
|
||||||
} else {
|
|
||||||
function_kind = kNormalFunction;
|
|
||||||
}
|
|
||||||
Handle<SharedFunctionInfo> result =
|
|
||||||
isolate->factory()->NewSharedFunctionInfoForApiFunction(name_string, info,
|
|
||||||
function_kind);
|
|
||||||
|
|
||||||
result->set_length(info->length());
|
|
||||||
result->DontAdaptArguments();
|
|
||||||
DCHECK(result->IsApiFunction());
|
|
||||||
|
|
||||||
info->set_shared_function_info(*result);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FunctionTemplateInfo::IsTemplateFor(Map map) const {
|
|
||||||
RCS_SCOPE(
|
|
||||||
LocalHeap::Current() == nullptr
|
|
||||||
? GetIsolate()->counters()->runtime_call_stats()
|
|
||||||
: LocalIsolate::FromHeap(LocalHeap::Current())->runtime_call_stats(),
|
|
||||||
RuntimeCallCounterId::kIsTemplateFor);
|
|
||||||
|
|
||||||
// There is a constraint on the object; check.
|
|
||||||
if (!map.IsJSObjectMap()) return false;
|
|
||||||
// Fetch the constructor function of the object.
|
|
||||||
Object cons_obj = map.GetConstructor();
|
|
||||||
Object type;
|
|
||||||
if (cons_obj.IsJSFunction()) {
|
|
||||||
JSFunction fun = JSFunction::cast(cons_obj);
|
|
||||||
type = fun.shared().function_data(kAcquireLoad);
|
|
||||||
} else if (cons_obj.IsFunctionTemplateInfo()) {
|
|
||||||
type = FunctionTemplateInfo::cast(cons_obj);
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Iterate through the chain of inheriting function templates to
|
|
||||||
// see if the required one occurs.
|
|
||||||
while (type.IsFunctionTemplateInfo()) {
|
|
||||||
if (type == *this) return true;
|
|
||||||
type = FunctionTemplateInfo::cast(type).GetParentTemplate();
|
|
||||||
}
|
|
||||||
// Didn't find the required type in the inheritance chain.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FunctionTemplateInfo::IsLeafTemplateForApiObject(Object object) const {
|
|
||||||
i::DisallowGarbageCollection no_gc;
|
|
||||||
|
|
||||||
if (!object.IsJSApiObject()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool result = false;
|
|
||||||
Map map = HeapObject::cast(object).map();
|
|
||||||
Object constructor_obj = map.GetConstructor();
|
|
||||||
if (constructor_obj.IsJSFunction()) {
|
|
||||||
JSFunction fun = JSFunction::cast(constructor_obj);
|
|
||||||
result = (*this == fun.shared().function_data(kAcquireLoad));
|
|
||||||
} else if (constructor_obj.IsFunctionTemplateInfo()) {
|
|
||||||
result = (*this == constructor_obj);
|
|
||||||
}
|
|
||||||
DCHECK_IMPLIES(result, IsTemplateFor(map));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
FunctionTemplateRareData FunctionTemplateInfo::AllocateFunctionTemplateRareData(
|
|
||||||
Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info) {
|
|
||||||
DCHECK(function_template_info->rare_data(kAcquireLoad).IsUndefined(isolate));
|
|
||||||
Handle<FunctionTemplateRareData> rare_data =
|
|
||||||
isolate->factory()->NewFunctionTemplateRareData();
|
|
||||||
function_template_info->set_rare_data(*rare_data, kReleaseStore);
|
|
||||||
return *rare_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
Handle<TemplateList> TemplateList::New(Isolate* isolate, int size) {
|
Handle<TemplateList> TemplateList::New(Isolate* isolate, int size) {
|
||||||
Handle<FixedArray> list =
|
Handle<FixedArray> list =
|
||||||
@ -6693,35 +6599,6 @@ AccessCheckInfo AccessCheckInfo::Get(Isolate* isolate,
|
|||||||
return AccessCheckInfo::cast(data_obj);
|
return AccessCheckInfo::cast(data_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
base::Optional<Name> FunctionTemplateInfo::TryGetCachedPropertyName(
|
|
||||||
Isolate* isolate, Object getter) {
|
|
||||||
DisallowGarbageCollection no_gc;
|
|
||||||
if (!getter.IsFunctionTemplateInfo()) return {};
|
|
||||||
// Check if the accessor uses a cached property.
|
|
||||||
Object maybe_name = FunctionTemplateInfo::cast(getter).cached_property_name();
|
|
||||||
if (maybe_name.IsTheHole(isolate)) return {};
|
|
||||||
return Name::cast(maybe_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
int FunctionTemplateInfo::GetCFunctionsCount() const {
|
|
||||||
i::DisallowHeapAllocation no_gc;
|
|
||||||
return FixedArray::cast(GetCFunctionOverloads()).length() /
|
|
||||||
kFunctionOverloadEntrySize;
|
|
||||||
}
|
|
||||||
|
|
||||||
Address FunctionTemplateInfo::GetCFunction(int index) const {
|
|
||||||
i::DisallowHeapAllocation no_gc;
|
|
||||||
return v8::ToCData<Address>(FixedArray::cast(GetCFunctionOverloads())
|
|
||||||
.get(index * kFunctionOverloadEntrySize));
|
|
||||||
}
|
|
||||||
|
|
||||||
const CFunctionInfo* FunctionTemplateInfo::GetCSignature(int index) const {
|
|
||||||
i::DisallowHeapAllocation no_gc;
|
|
||||||
return v8::ToCData<CFunctionInfo*>(
|
|
||||||
FixedArray::cast(GetCFunctionOverloads())
|
|
||||||
.get(index * kFunctionOverloadEntrySize + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
Address Smi::LexicographicCompare(Isolate* isolate, Smi x, Smi y) {
|
Address Smi::LexicographicCompare(Isolate* isolate, Smi x, Smi y) {
|
||||||
DisallowGarbageCollection no_gc;
|
DisallowGarbageCollection no_gc;
|
||||||
DisallowJavascriptExecution no_js(isolate);
|
DisallowJavascriptExecution no_js(isolate);
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
#include "src/objects/scope-info-inl.h"
|
#include "src/objects/scope-info-inl.h"
|
||||||
#include "src/objects/script-inl.h"
|
#include "src/objects/script-inl.h"
|
||||||
#include "src/objects/shared-function-info.h"
|
#include "src/objects/shared-function-info.h"
|
||||||
#include "src/objects/templates.h"
|
#include "src/objects/templates-inl.h"
|
||||||
|
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
#include "src/wasm/wasm-module.h"
|
#include "src/wasm/wasm-module.h"
|
||||||
|
@ -5,11 +5,11 @@
|
|||||||
#ifndef V8_OBJECTS_TEMPLATES_INL_H_
|
#ifndef V8_OBJECTS_TEMPLATES_INL_H_
|
||||||
#define V8_OBJECTS_TEMPLATES_INL_H_
|
#define V8_OBJECTS_TEMPLATES_INL_H_
|
||||||
|
|
||||||
#include "src/objects/templates.h"
|
|
||||||
|
|
||||||
#include "src/heap/heap-write-barrier-inl.h"
|
#include "src/heap/heap-write-barrier-inl.h"
|
||||||
|
#include "src/objects/objects-inl.h"
|
||||||
#include "src/objects/oddball.h"
|
#include "src/objects/oddball.h"
|
||||||
#include "src/objects/shared-function-info-inl.h"
|
#include "src/objects/shared-function-info.h"
|
||||||
|
#include "src/objects/templates.h"
|
||||||
|
|
||||||
// Has to be the last include (doesn't have include guards):
|
// Has to be the last include (doesn't have include guards):
|
||||||
#include "src/objects/object-macros.h"
|
#include "src/objects/object-macros.h"
|
||||||
@ -89,7 +89,7 @@ bool FunctionTemplateInfo::instantiated() {
|
|||||||
return shared_function_info().IsSharedFunctionInfo();
|
return shared_function_info().IsSharedFunctionInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FunctionTemplateInfo::BreakAtEntry() {
|
inline bool FunctionTemplateInfo::BreakAtEntry() {
|
||||||
Object maybe_shared = shared_function_info();
|
Object maybe_shared = shared_function_info();
|
||||||
if (maybe_shared.IsSharedFunctionInfo()) {
|
if (maybe_shared.IsSharedFunctionInfo()) {
|
||||||
SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
|
SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared);
|
||||||
|
145
src/objects/templates.cc
Normal file
145
src/objects/templates.cc
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
// Copyright 2021 the V8 project authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "src/objects/templates.h"
|
||||||
|
|
||||||
|
#include "src/api/api-inl.h"
|
||||||
|
#include "src/execution/isolate.h"
|
||||||
|
#include "src/heap/factory.h"
|
||||||
|
#include "src/objects/function-kind.h"
|
||||||
|
#include "src/objects/instance-type-inl.h"
|
||||||
|
#include "src/objects/js-function-inl.h"
|
||||||
|
#include "src/objects/map-inl.h"
|
||||||
|
#include "src/objects/name-inl.h"
|
||||||
|
#include "src/objects/shared-function-info-inl.h"
|
||||||
|
#include "src/objects/string-inl.h"
|
||||||
|
|
||||||
|
namespace v8 {
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
Handle<SharedFunctionInfo> FunctionTemplateInfo::GetOrCreateSharedFunctionInfo(
|
||||||
|
Isolate* isolate, Handle<FunctionTemplateInfo> info,
|
||||||
|
MaybeHandle<Name> maybe_name) {
|
||||||
|
Object current_info = info->shared_function_info();
|
||||||
|
if (current_info.IsSharedFunctionInfo()) {
|
||||||
|
return handle(SharedFunctionInfo::cast(current_info), isolate);
|
||||||
|
}
|
||||||
|
Handle<Name> name;
|
||||||
|
Handle<String> name_string;
|
||||||
|
if (maybe_name.ToHandle(&name) && name->IsString()) {
|
||||||
|
name_string = Handle<String>::cast(name);
|
||||||
|
} else if (info->class_name().IsString()) {
|
||||||
|
name_string = handle(String::cast(info->class_name()), isolate);
|
||||||
|
} else {
|
||||||
|
name_string = isolate->factory()->empty_string();
|
||||||
|
}
|
||||||
|
FunctionKind function_kind;
|
||||||
|
if (info->remove_prototype()) {
|
||||||
|
function_kind = kConciseMethod;
|
||||||
|
} else {
|
||||||
|
function_kind = kNormalFunction;
|
||||||
|
}
|
||||||
|
Handle<SharedFunctionInfo> result =
|
||||||
|
isolate->factory()->NewSharedFunctionInfoForApiFunction(name_string, info,
|
||||||
|
function_kind);
|
||||||
|
|
||||||
|
result->set_length(info->length());
|
||||||
|
result->DontAdaptArguments();
|
||||||
|
DCHECK(result->IsApiFunction());
|
||||||
|
|
||||||
|
info->set_shared_function_info(*result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FunctionTemplateInfo::IsTemplateFor(Map map) const {
|
||||||
|
RCS_SCOPE(
|
||||||
|
LocalHeap::Current() == nullptr
|
||||||
|
? GetIsolate()->counters()->runtime_call_stats()
|
||||||
|
: LocalIsolate::FromHeap(LocalHeap::Current())->runtime_call_stats(),
|
||||||
|
RuntimeCallCounterId::kIsTemplateFor);
|
||||||
|
|
||||||
|
// There is a constraint on the object; check.
|
||||||
|
if (!map.IsJSObjectMap()) return false;
|
||||||
|
// Fetch the constructor function of the object.
|
||||||
|
Object cons_obj = map.GetConstructor();
|
||||||
|
Object type;
|
||||||
|
if (cons_obj.IsJSFunction()) {
|
||||||
|
JSFunction fun = JSFunction::cast(cons_obj);
|
||||||
|
type = fun.shared().function_data(kAcquireLoad);
|
||||||
|
} else if (cons_obj.IsFunctionTemplateInfo()) {
|
||||||
|
type = FunctionTemplateInfo::cast(cons_obj);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Iterate through the chain of inheriting function templates to
|
||||||
|
// see if the required one occurs.
|
||||||
|
while (type.IsFunctionTemplateInfo()) {
|
||||||
|
if (type == *this) return true;
|
||||||
|
type = FunctionTemplateInfo::cast(type).GetParentTemplate();
|
||||||
|
}
|
||||||
|
// Didn't find the required type in the inheritance chain.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FunctionTemplateInfo::IsLeafTemplateForApiObject(Object object) const {
|
||||||
|
i::DisallowGarbageCollection no_gc;
|
||||||
|
|
||||||
|
if (!object.IsJSApiObject()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool result = false;
|
||||||
|
Map map = HeapObject::cast(object).map();
|
||||||
|
Object constructor_obj = map.GetConstructor();
|
||||||
|
if (constructor_obj.IsJSFunction()) {
|
||||||
|
JSFunction fun = JSFunction::cast(constructor_obj);
|
||||||
|
result = (*this == fun.shared().function_data(kAcquireLoad));
|
||||||
|
} else if (constructor_obj.IsFunctionTemplateInfo()) {
|
||||||
|
result = (*this == constructor_obj);
|
||||||
|
}
|
||||||
|
DCHECK_IMPLIES(result, IsTemplateFor(map));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
FunctionTemplateRareData FunctionTemplateInfo::AllocateFunctionTemplateRareData(
|
||||||
|
Isolate* isolate, Handle<FunctionTemplateInfo> function_template_info) {
|
||||||
|
DCHECK(function_template_info->rare_data(kAcquireLoad).IsUndefined(isolate));
|
||||||
|
Handle<FunctionTemplateRareData> rare_data =
|
||||||
|
isolate->factory()->NewFunctionTemplateRareData();
|
||||||
|
function_template_info->set_rare_data(*rare_data, kReleaseStore);
|
||||||
|
return *rare_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
base::Optional<Name> FunctionTemplateInfo::TryGetCachedPropertyName(
|
||||||
|
Isolate* isolate, Object getter) {
|
||||||
|
DisallowGarbageCollection no_gc;
|
||||||
|
if (!getter.IsFunctionTemplateInfo()) return {};
|
||||||
|
// Check if the accessor uses a cached property.
|
||||||
|
Object maybe_name = FunctionTemplateInfo::cast(getter).cached_property_name();
|
||||||
|
if (maybe_name.IsTheHole(isolate)) return {};
|
||||||
|
return Name::cast(maybe_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
int FunctionTemplateInfo::GetCFunctionsCount() const {
|
||||||
|
i::DisallowHeapAllocation no_gc;
|
||||||
|
return FixedArray::cast(GetCFunctionOverloads()).length() /
|
||||||
|
kFunctionOverloadEntrySize;
|
||||||
|
}
|
||||||
|
|
||||||
|
Address FunctionTemplateInfo::GetCFunction(int index) const {
|
||||||
|
i::DisallowHeapAllocation no_gc;
|
||||||
|
return v8::ToCData<Address>(FixedArray::cast(GetCFunctionOverloads())
|
||||||
|
.get(index * kFunctionOverloadEntrySize));
|
||||||
|
}
|
||||||
|
|
||||||
|
const CFunctionInfo* FunctionTemplateInfo::GetCSignature(int index) const {
|
||||||
|
i::DisallowHeapAllocation no_gc;
|
||||||
|
return v8::ToCData<CFunctionInfo*>(
|
||||||
|
FixedArray::cast(GetCFunctionOverloads())
|
||||||
|
.get(index * kFunctionOverloadEntrySize + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
} // namespace v8
|
@ -150,7 +150,7 @@ class FunctionTemplateInfo
|
|||||||
bool IsLeafTemplateForApiObject(Object object) const;
|
bool IsLeafTemplateForApiObject(Object object) const;
|
||||||
inline bool instantiated();
|
inline bool instantiated();
|
||||||
|
|
||||||
inline bool BreakAtEntry();
|
bool BreakAtEntry();
|
||||||
|
|
||||||
// Helper function for cached accessors.
|
// Helper function for cached accessors.
|
||||||
static base::Optional<Name> TryGetCachedPropertyName(Isolate* isolate,
|
static base::Optional<Name> TryGetCachedPropertyName(Isolate* isolate,
|
||||||
|
Loading…
Reference in New Issue
Block a user