[compiler] Make relaxed tag explicit for int32 accessors
Bug: v8:7790 Change-Id: I4e25140a83a0ce851195e274a489ac13cacdf676 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3086477 Reviewed-by: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Commit-Queue: Santiago Aboy Solanes <solanes@chromium.org> Cr-Commit-Position: refs/heads/master@{#76253}
This commit is contained in:
parent
19996d6de5
commit
d861a2b02b
@ -1658,7 +1658,7 @@ void Code::CodePrint(std::ostream& os) {
|
|||||||
|
|
||||||
void CodeDataContainer::CodeDataContainerPrint(std::ostream& os) {
|
void CodeDataContainer::CodeDataContainerPrint(std::ostream& os) {
|
||||||
PrintHeader(os, "CodeDataContainer");
|
PrintHeader(os, "CodeDataContainer");
|
||||||
os << "\n - kind_specific_flags: " << kind_specific_flags();
|
os << "\n - kind_specific_flags: " << kind_specific_flags(kRelaxedLoad);
|
||||||
if (V8_EXTERNAL_CODE_SPACE_BOOL) {
|
if (V8_EXTERNAL_CODE_SPACE_BOOL) {
|
||||||
os << "\n - code: " << Brief(code());
|
os << "\n - code: " << Brief(code());
|
||||||
os << "\n - code_entry_point: "
|
os << "\n - code_entry_point: "
|
||||||
|
@ -100,14 +100,15 @@ MaybeHandle<Code> Factory::CodeBuilder::BuildInternal(
|
|||||||
kind_specific_flags_ == 0
|
kind_specific_flags_ == 0
|
||||||
? roots.trampoline_trivial_code_data_container_handle()
|
? roots.trampoline_trivial_code_data_container_handle()
|
||||||
: roots.trampoline_promise_rejection_code_data_container_handle());
|
: roots.trampoline_promise_rejection_code_data_container_handle());
|
||||||
DCHECK_EQ(canonical_code_data_container->kind_specific_flags(),
|
DCHECK_EQ(canonical_code_data_container->kind_specific_flags(kRelaxedLoad),
|
||||||
kind_specific_flags_);
|
kind_specific_flags_);
|
||||||
data_container = canonical_code_data_container;
|
data_container = canonical_code_data_container;
|
||||||
} else {
|
} else {
|
||||||
data_container = factory->NewCodeDataContainer(
|
data_container = factory->NewCodeDataContainer(
|
||||||
0, read_only_data_container_ ? AllocationType::kReadOnly
|
0, read_only_data_container_ ? AllocationType::kReadOnly
|
||||||
: AllocationType::kOld);
|
: AllocationType::kOld);
|
||||||
data_container->set_kind_specific_flags(kind_specific_flags_);
|
data_container->set_kind_specific_flags(kind_specific_flags_,
|
||||||
|
kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Basic block profiling data for builtins is stored in the JS heap rather
|
// Basic block profiling data for builtins is stored in the JS heap rather
|
||||||
@ -2178,7 +2179,7 @@ Handle<CodeDataContainer> Factory::NewCodeDataContainer(
|
|||||||
CodeDataContainer::cast(New(code_data_container_map(), allocation));
|
CodeDataContainer::cast(New(code_data_container_map(), allocation));
|
||||||
DisallowGarbageCollection no_gc;
|
DisallowGarbageCollection no_gc;
|
||||||
data_container.set_next_code_link(*undefined_value(), SKIP_WRITE_BARRIER);
|
data_container.set_next_code_link(*undefined_value(), SKIP_WRITE_BARRIER);
|
||||||
data_container.set_kind_specific_flags(flags);
|
data_container.set_kind_specific_flags(flags, kRelaxedStore);
|
||||||
if (V8_EXTERNAL_CODE_SPACE_BOOL) {
|
if (V8_EXTERNAL_CODE_SPACE_BOOL) {
|
||||||
data_container.AllocateExternalPointerEntries(isolate());
|
data_container.AllocateExternalPointerEntries(isolate());
|
||||||
data_container.set_raw_code(Smi::zero(), SKIP_WRITE_BARRIER);
|
data_container.set_raw_code(Smi::zero(), SKIP_WRITE_BARRIER);
|
||||||
@ -2198,7 +2199,7 @@ Handle<Code> Factory::NewOffHeapTrampolineFor(Handle<Code> code,
|
|||||||
Builtins::CodeObjectIsExecutable(code->builtin_id());
|
Builtins::CodeObjectIsExecutable(code->builtin_id());
|
||||||
Handle<Code> result = Builtins::GenerateOffHeapTrampolineFor(
|
Handle<Code> result = Builtins::GenerateOffHeapTrampolineFor(
|
||||||
isolate(), off_heap_entry,
|
isolate(), off_heap_entry,
|
||||||
code->code_data_container(kAcquireLoad).kind_specific_flags(),
|
code->code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad),
|
||||||
generate_jump_to_instruction_stream);
|
generate_jump_to_instruction_stream);
|
||||||
|
|
||||||
// Trampolines may not contain any metadata since all metadata offsets,
|
// Trampolines may not contain any metadata since all metadata offsets,
|
||||||
@ -2256,7 +2257,7 @@ Handle<Code> Factory::NewOffHeapTrampolineFor(Handle<Code> code,
|
|||||||
|
|
||||||
Handle<Code> Factory::CopyCode(Handle<Code> code) {
|
Handle<Code> Factory::CopyCode(Handle<Code> code) {
|
||||||
Handle<CodeDataContainer> data_container = NewCodeDataContainer(
|
Handle<CodeDataContainer> data_container = NewCodeDataContainer(
|
||||||
code->code_data_container(kAcquireLoad).kind_specific_flags(),
|
code->code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad),
|
||||||
AllocationType::kOld);
|
AllocationType::kOld);
|
||||||
|
|
||||||
Heap* heap = isolate()->heap();
|
Heap* heap = isolate()->heap();
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
#ifndef V8_OBJECTS_ALLOCATION_SITE_INL_H_
|
#ifndef V8_OBJECTS_ALLOCATION_SITE_INL_H_
|
||||||
#define V8_OBJECTS_ALLOCATION_SITE_INL_H_
|
#define V8_OBJECTS_ALLOCATION_SITE_INL_H_
|
||||||
|
|
||||||
#include "src/objects/allocation-site.h"
|
#include "src/common/globals.h"
|
||||||
|
|
||||||
#include "src/heap/heap-write-barrier-inl.h"
|
#include "src/heap/heap-write-barrier-inl.h"
|
||||||
|
#include "src/objects/allocation-site.h"
|
||||||
#include "src/objects/js-objects-inl.h"
|
#include "src/objects/js-objects-inl.h"
|
||||||
|
|
||||||
// Has to be the last include (doesn't have include guards):
|
// Has to be the last include (doesn't have include guards):
|
||||||
@ -30,8 +30,7 @@ ACCESSORS(AllocationSite, transition_info_or_boilerplate, Object,
|
|||||||
RELEASE_ACQUIRE_ACCESSORS(AllocationSite, transition_info_or_boilerplate,
|
RELEASE_ACQUIRE_ACCESSORS(AllocationSite, transition_info_or_boilerplate,
|
||||||
Object, kTransitionInfoOrBoilerplateOffset)
|
Object, kTransitionInfoOrBoilerplateOffset)
|
||||||
ACCESSORS(AllocationSite, nested_site, Object, kNestedSiteOffset)
|
ACCESSORS(AllocationSite, nested_site, Object, kNestedSiteOffset)
|
||||||
IMPLICIT_TAG_RELAXED_INT32_ACCESSORS(AllocationSite, pretenure_data,
|
RELAXED_INT32_ACCESSORS(AllocationSite, pretenure_data, kPretenureDataOffset)
|
||||||
kPretenureDataOffset)
|
|
||||||
INT32_ACCESSORS(AllocationSite, pretenure_create_count,
|
INT32_ACCESSORS(AllocationSite, pretenure_create_count,
|
||||||
kPretenureCreateCountOffset)
|
kPretenureCreateCountOffset)
|
||||||
ACCESSORS(AllocationSite, dependent_code, DependentCode, kDependentCodeOffset)
|
ACCESSORS(AllocationSite, dependent_code, DependentCode, kDependentCodeOffset)
|
||||||
@ -73,7 +72,7 @@ void AllocationSite::Initialize() {
|
|||||||
set_transition_info_or_boilerplate(Smi::zero());
|
set_transition_info_or_boilerplate(Smi::zero());
|
||||||
SetElementsKind(GetInitialFastElementsKind());
|
SetElementsKind(GetInitialFastElementsKind());
|
||||||
set_nested_site(Smi::zero());
|
set_nested_site(Smi::zero());
|
||||||
set_pretenure_data(0);
|
set_pretenure_data(0, kRelaxedStore);
|
||||||
set_pretenure_create_count(0);
|
set_pretenure_create_count(0);
|
||||||
set_dependent_code(
|
set_dependent_code(
|
||||||
DependentCode::cast(GetReadOnlyRoots().empty_weak_fixed_array()),
|
DependentCode::cast(GetReadOnlyRoots().empty_weak_fixed_array()),
|
||||||
@ -139,36 +138,39 @@ inline bool AllocationSite::CanTrack(InstanceType type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AllocationSite::PretenureDecision AllocationSite::pretenure_decision() const {
|
AllocationSite::PretenureDecision AllocationSite::pretenure_decision() const {
|
||||||
return PretenureDecisionBits::decode(pretenure_data());
|
return PretenureDecisionBits::decode(pretenure_data(kRelaxedLoad));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AllocationSite::set_pretenure_decision(PretenureDecision decision) {
|
void AllocationSite::set_pretenure_decision(PretenureDecision decision) {
|
||||||
int32_t value = pretenure_data();
|
int32_t value = pretenure_data(kRelaxedLoad);
|
||||||
set_pretenure_data(PretenureDecisionBits::update(value, decision));
|
set_pretenure_data(PretenureDecisionBits::update(value, decision),
|
||||||
|
kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AllocationSite::deopt_dependent_code() const {
|
bool AllocationSite::deopt_dependent_code() const {
|
||||||
return DeoptDependentCodeBit::decode(pretenure_data());
|
return DeoptDependentCodeBit::decode(pretenure_data(kRelaxedLoad));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AllocationSite::set_deopt_dependent_code(bool deopt) {
|
void AllocationSite::set_deopt_dependent_code(bool deopt) {
|
||||||
int32_t value = pretenure_data();
|
int32_t value = pretenure_data(kRelaxedLoad);
|
||||||
set_pretenure_data(DeoptDependentCodeBit::update(value, deopt));
|
set_pretenure_data(DeoptDependentCodeBit::update(value, deopt),
|
||||||
|
kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
int AllocationSite::memento_found_count() const {
|
int AllocationSite::memento_found_count() const {
|
||||||
return MementoFoundCountBits::decode(pretenure_data());
|
return MementoFoundCountBits::decode(pretenure_data(kRelaxedLoad));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void AllocationSite::set_memento_found_count(int count) {
|
inline void AllocationSite::set_memento_found_count(int count) {
|
||||||
int32_t value = pretenure_data();
|
int32_t value = pretenure_data(kRelaxedLoad);
|
||||||
// Verify that we can count more mementos than we can possibly find in one
|
// Verify that we can count more mementos than we can possibly find in one
|
||||||
// new space collection.
|
// new space collection.
|
||||||
DCHECK((GetHeap()->MaxSemiSpaceSize() /
|
DCHECK((GetHeap()->MaxSemiSpaceSize() /
|
||||||
(Heap::kMinObjectSizeInTaggedWords * kTaggedSize +
|
(Heap::kMinObjectSizeInTaggedWords * kTaggedSize +
|
||||||
AllocationMemento::kSize)) < MementoFoundCountBits::kMax);
|
AllocationMemento::kSize)) < MementoFoundCountBits::kMax);
|
||||||
DCHECK_LT(count, MementoFoundCountBits::kMax);
|
DCHECK_LT(count, MementoFoundCountBits::kMax);
|
||||||
set_pretenure_data(MementoFoundCountBits::update(value, count));
|
set_pretenure_data(MementoFoundCountBits::update(value, count),
|
||||||
|
kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
int AllocationSite::memento_create_count() const {
|
int AllocationSite::memento_create_count() const {
|
||||||
|
@ -51,7 +51,7 @@ class AllocationSite : public Struct {
|
|||||||
DECL_ACCESSORS(nested_site, Object)
|
DECL_ACCESSORS(nested_site, Object)
|
||||||
|
|
||||||
// Bitfield containing pretenuring information.
|
// Bitfield containing pretenuring information.
|
||||||
DECL_INT32_ACCESSORS(pretenure_data)
|
DECL_RELAXED_INT32_ACCESSORS(pretenure_data)
|
||||||
|
|
||||||
DECL_INT32_ACCESSORS(pretenure_create_count)
|
DECL_INT32_ACCESSORS(pretenure_create_count)
|
||||||
DECL_ACCESSORS(dependent_code, DependentCode)
|
DECL_ACCESSORS(dependent_code, DependentCode)
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "src/baseline/bytecode-offset-iterator.h"
|
#include "src/baseline/bytecode-offset-iterator.h"
|
||||||
#include "src/codegen/code-desc.h"
|
#include "src/codegen/code-desc.h"
|
||||||
#include "src/common/assert-scope.h"
|
#include "src/common/assert-scope.h"
|
||||||
|
#include "src/common/globals.h"
|
||||||
#include "src/execution/isolate.h"
|
#include "src/execution/isolate.h"
|
||||||
#include "src/heap/heap-inl.h"
|
#include "src/heap/heap-inl.h"
|
||||||
#include "src/heap/heap-write-barrier-inl.h"
|
#include "src/heap/heap-write-barrier-inl.h"
|
||||||
@ -553,44 +554,47 @@ inline bool Code::is_turbofanned() const {
|
|||||||
|
|
||||||
inline bool Code::can_have_weak_objects() const {
|
inline bool Code::can_have_weak_objects() const {
|
||||||
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
||||||
int32_t flags = code_data_container(kAcquireLoad).kind_specific_flags();
|
int32_t flags =
|
||||||
|
code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad);
|
||||||
return CanHaveWeakObjectsField::decode(flags);
|
return CanHaveWeakObjectsField::decode(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Code::set_can_have_weak_objects(bool value) {
|
inline void Code::set_can_have_weak_objects(bool value) {
|
||||||
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
||||||
CodeDataContainer container = code_data_container(kAcquireLoad);
|
CodeDataContainer container = code_data_container(kAcquireLoad);
|
||||||
int32_t previous = container.kind_specific_flags();
|
int32_t previous = container.kind_specific_flags(kRelaxedLoad);
|
||||||
int32_t updated = CanHaveWeakObjectsField::update(previous, value);
|
int32_t updated = CanHaveWeakObjectsField::update(previous, value);
|
||||||
container.set_kind_specific_flags(updated);
|
container.set_kind_specific_flags(updated, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Code::is_promise_rejection() const {
|
inline bool Code::is_promise_rejection() const {
|
||||||
DCHECK(kind() == CodeKind::BUILTIN);
|
DCHECK(kind() == CodeKind::BUILTIN);
|
||||||
int32_t flags = code_data_container(kAcquireLoad).kind_specific_flags();
|
int32_t flags =
|
||||||
|
code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad);
|
||||||
return IsPromiseRejectionField::decode(flags);
|
return IsPromiseRejectionField::decode(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Code::set_is_promise_rejection(bool value) {
|
inline void Code::set_is_promise_rejection(bool value) {
|
||||||
DCHECK(kind() == CodeKind::BUILTIN);
|
DCHECK(kind() == CodeKind::BUILTIN);
|
||||||
CodeDataContainer container = code_data_container(kAcquireLoad);
|
CodeDataContainer container = code_data_container(kAcquireLoad);
|
||||||
int32_t previous = container.kind_specific_flags();
|
int32_t previous = container.kind_specific_flags(kRelaxedLoad);
|
||||||
int32_t updated = IsPromiseRejectionField::update(previous, value);
|
int32_t updated = IsPromiseRejectionField::update(previous, value);
|
||||||
container.set_kind_specific_flags(updated);
|
container.set_kind_specific_flags(updated, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Code::is_exception_caught() const {
|
inline bool Code::is_exception_caught() const {
|
||||||
DCHECK(kind() == CodeKind::BUILTIN);
|
DCHECK(kind() == CodeKind::BUILTIN);
|
||||||
int32_t flags = code_data_container(kAcquireLoad).kind_specific_flags();
|
int32_t flags =
|
||||||
|
code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad);
|
||||||
return IsExceptionCaughtField::decode(flags);
|
return IsExceptionCaughtField::decode(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Code::set_is_exception_caught(bool value) {
|
inline void Code::set_is_exception_caught(bool value) {
|
||||||
DCHECK(kind() == CodeKind::BUILTIN);
|
DCHECK(kind() == CodeKind::BUILTIN);
|
||||||
CodeDataContainer container = code_data_container(kAcquireLoad);
|
CodeDataContainer container = code_data_container(kAcquireLoad);
|
||||||
int32_t previous = container.kind_specific_flags();
|
int32_t previous = container.kind_specific_flags(kRelaxedLoad);
|
||||||
int32_t updated = IsExceptionCaughtField::update(previous, value);
|
int32_t updated = IsExceptionCaughtField::update(previous, value);
|
||||||
container.set_kind_specific_flags(updated);
|
container.set_kind_specific_flags(updated, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Code::is_off_heap_trampoline() const {
|
inline bool Code::is_off_heap_trampoline() const {
|
||||||
@ -642,7 +646,8 @@ int Code::stack_slots() const {
|
|||||||
|
|
||||||
bool Code::marked_for_deoptimization() const {
|
bool Code::marked_for_deoptimization() const {
|
||||||
DCHECK(CodeKindCanDeoptimize(kind()));
|
DCHECK(CodeKindCanDeoptimize(kind()));
|
||||||
int32_t flags = code_data_container(kAcquireLoad).kind_specific_flags();
|
int32_t flags =
|
||||||
|
code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad);
|
||||||
return MarkedForDeoptimizationField::decode(flags);
|
return MarkedForDeoptimizationField::decode(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -650,14 +655,15 @@ void Code::set_marked_for_deoptimization(bool flag) {
|
|||||||
DCHECK(CodeKindCanDeoptimize(kind()));
|
DCHECK(CodeKindCanDeoptimize(kind()));
|
||||||
DCHECK_IMPLIES(flag, AllowDeoptimization::IsAllowed(GetIsolate()));
|
DCHECK_IMPLIES(flag, AllowDeoptimization::IsAllowed(GetIsolate()));
|
||||||
CodeDataContainer container = code_data_container(kAcquireLoad);
|
CodeDataContainer container = code_data_container(kAcquireLoad);
|
||||||
int32_t previous = container.kind_specific_flags();
|
int32_t previous = container.kind_specific_flags(kRelaxedLoad);
|
||||||
int32_t updated = MarkedForDeoptimizationField::update(previous, flag);
|
int32_t updated = MarkedForDeoptimizationField::update(previous, flag);
|
||||||
container.set_kind_specific_flags(updated);
|
container.set_kind_specific_flags(updated, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Code::deoptimization_count() const {
|
int Code::deoptimization_count() const {
|
||||||
DCHECK(CodeKindCanDeoptimize(kind()));
|
DCHECK(CodeKindCanDeoptimize(kind()));
|
||||||
int32_t flags = code_data_container(kAcquireLoad).kind_specific_flags();
|
int32_t flags =
|
||||||
|
code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad);
|
||||||
int count = DeoptCountField::decode(flags);
|
int count = DeoptCountField::decode(flags);
|
||||||
DCHECK_GE(count, 0);
|
DCHECK_GE(count, 0);
|
||||||
return count;
|
return count;
|
||||||
@ -666,17 +672,18 @@ int Code::deoptimization_count() const {
|
|||||||
void Code::increment_deoptimization_count() {
|
void Code::increment_deoptimization_count() {
|
||||||
DCHECK(CodeKindCanDeoptimize(kind()));
|
DCHECK(CodeKindCanDeoptimize(kind()));
|
||||||
CodeDataContainer container = code_data_container(kAcquireLoad);
|
CodeDataContainer container = code_data_container(kAcquireLoad);
|
||||||
int32_t flags = container.kind_specific_flags();
|
int32_t flags = container.kind_specific_flags(kRelaxedLoad);
|
||||||
int32_t count = DeoptCountField::decode(flags);
|
int32_t count = DeoptCountField::decode(flags);
|
||||||
DCHECK_GE(count, 0);
|
DCHECK_GE(count, 0);
|
||||||
CHECK_LE(count + 1, DeoptCountField::kMax);
|
CHECK_LE(count + 1, DeoptCountField::kMax);
|
||||||
int32_t updated = DeoptCountField::update(flags, count + 1);
|
int32_t updated = DeoptCountField::update(flags, count + 1);
|
||||||
container.set_kind_specific_flags(updated);
|
container.set_kind_specific_flags(updated, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Code::embedded_objects_cleared() const {
|
bool Code::embedded_objects_cleared() const {
|
||||||
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
||||||
int32_t flags = code_data_container(kAcquireLoad).kind_specific_flags();
|
int32_t flags =
|
||||||
|
code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad);
|
||||||
return EmbeddedObjectsClearedField::decode(flags);
|
return EmbeddedObjectsClearedField::decode(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -684,14 +691,15 @@ void Code::set_embedded_objects_cleared(bool flag) {
|
|||||||
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
DCHECK(CodeKindIsOptimizedJSFunction(kind()));
|
||||||
DCHECK_IMPLIES(flag, marked_for_deoptimization());
|
DCHECK_IMPLIES(flag, marked_for_deoptimization());
|
||||||
CodeDataContainer container = code_data_container(kAcquireLoad);
|
CodeDataContainer container = code_data_container(kAcquireLoad);
|
||||||
int32_t previous = container.kind_specific_flags();
|
int32_t previous = container.kind_specific_flags(kRelaxedLoad);
|
||||||
int32_t updated = EmbeddedObjectsClearedField::update(previous, flag);
|
int32_t updated = EmbeddedObjectsClearedField::update(previous, flag);
|
||||||
container.set_kind_specific_flags(updated);
|
container.set_kind_specific_flags(updated, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Code::deopt_already_counted() const {
|
bool Code::deopt_already_counted() const {
|
||||||
DCHECK(CodeKindCanDeoptimize(kind()));
|
DCHECK(CodeKindCanDeoptimize(kind()));
|
||||||
int32_t flags = code_data_container(kAcquireLoad).kind_specific_flags();
|
int32_t flags =
|
||||||
|
code_data_container(kAcquireLoad).kind_specific_flags(kRelaxedLoad);
|
||||||
return DeoptAlreadyCountedField::decode(flags);
|
return DeoptAlreadyCountedField::decode(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -699,9 +707,9 @@ void Code::set_deopt_already_counted(bool flag) {
|
|||||||
DCHECK(CodeKindCanDeoptimize(kind()));
|
DCHECK(CodeKindCanDeoptimize(kind()));
|
||||||
DCHECK_IMPLIES(flag, AllowDeoptimization::IsAllowed(GetIsolate()));
|
DCHECK_IMPLIES(flag, AllowDeoptimization::IsAllowed(GetIsolate()));
|
||||||
CodeDataContainer container = code_data_container(kAcquireLoad);
|
CodeDataContainer container = code_data_container(kAcquireLoad);
|
||||||
int32_t previous = container.kind_specific_flags();
|
int32_t previous = container.kind_specific_flags(kRelaxedLoad);
|
||||||
int32_t updated = DeoptAlreadyCountedField::update(previous, flag);
|
int32_t updated = DeoptAlreadyCountedField::update(previous, flag);
|
||||||
container.set_kind_specific_flags(updated);
|
container.set_kind_specific_flags(updated, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Code::is_optimized_code() const {
|
bool Code::is_optimized_code() const {
|
||||||
@ -800,8 +808,8 @@ bool Code::IsExecutable() {
|
|||||||
// concurrent marker.
|
// concurrent marker.
|
||||||
STATIC_ASSERT(FIELD_SIZE(CodeDataContainer::kKindSpecificFlagsOffset) ==
|
STATIC_ASSERT(FIELD_SIZE(CodeDataContainer::kKindSpecificFlagsOffset) ==
|
||||||
kInt32Size);
|
kInt32Size);
|
||||||
IMPLICIT_TAG_RELAXED_INT32_ACCESSORS(CodeDataContainer, kind_specific_flags,
|
RELAXED_INT32_ACCESSORS(CodeDataContainer, kind_specific_flags,
|
||||||
kKindSpecificFlagsOffset)
|
kKindSpecificFlagsOffset)
|
||||||
ACCESSORS_CHECKED(CodeDataContainer, raw_code, Object, kCodeOffset,
|
ACCESSORS_CHECKED(CodeDataContainer, raw_code, Object, kCodeOffset,
|
||||||
V8_EXTERNAL_CODE_SPACE_BOOL)
|
V8_EXTERNAL_CODE_SPACE_BOOL)
|
||||||
RELAXED_ACCESSORS_CHECKED(CodeDataContainer, raw_code, Object, kCodeOffset,
|
RELAXED_ACCESSORS_CHECKED(CodeDataContainer, raw_code, Object, kCodeOffset,
|
||||||
|
@ -43,7 +43,7 @@ class CodeDataContainer : public HeapObject {
|
|||||||
public:
|
public:
|
||||||
NEVER_READ_ONLY_SPACE
|
NEVER_READ_ONLY_SPACE
|
||||||
DECL_ACCESSORS(next_code_link, Object)
|
DECL_ACCESSORS(next_code_link, Object)
|
||||||
DECL_INT_ACCESSORS(kind_specific_flags)
|
DECL_RELAXED_INT32_ACCESSORS(kind_specific_flags)
|
||||||
|
|
||||||
// Clear uninitialized padding space. This ensures that the snapshot content
|
// Clear uninitialized padding space. This ensures that the snapshot content
|
||||||
// is deterministic.
|
// is deterministic.
|
||||||
|
@ -40,7 +40,6 @@
|
|||||||
#undef CAST_ACCESSOR
|
#undef CAST_ACCESSOR
|
||||||
#undef INT_ACCESSORS
|
#undef INT_ACCESSORS
|
||||||
#undef INT32_ACCESSORS
|
#undef INT32_ACCESSORS
|
||||||
#undef IMPLICIT_TAG_RELAXED_INT32_ACCESSORS
|
|
||||||
#undef RELAXED_INT32_ACCESSORS
|
#undef RELAXED_INT32_ACCESSORS
|
||||||
#undef UINT16_ACCESSORS
|
#undef UINT16_ACCESSORS
|
||||||
#undef UINT8_ACCESSORS
|
#undef UINT8_ACCESSORS
|
||||||
|
@ -163,15 +163,6 @@
|
|||||||
int32_t holder::name() const { return ReadField<int32_t>(offset); } \
|
int32_t holder::name() const { return ReadField<int32_t>(offset); } \
|
||||||
void holder::set_##name(int32_t value) { WriteField<int32_t>(offset, value); }
|
void holder::set_##name(int32_t value) { WriteField<int32_t>(offset, value); }
|
||||||
|
|
||||||
// TODO(solanes): Use the non-implicit one, and change the uses to use the tag.
|
|
||||||
#define IMPLICIT_TAG_RELAXED_INT32_ACCESSORS(holder, name, offset) \
|
|
||||||
int32_t holder::name() const { \
|
|
||||||
return RELAXED_READ_INT32_FIELD(*this, offset); \
|
|
||||||
} \
|
|
||||||
void holder::set_##name(int32_t value) { \
|
|
||||||
RELAXED_WRITE_INT32_FIELD(*this, offset, value); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RELAXED_INT32_ACCESSORS(holder, name, offset) \
|
#define RELAXED_INT32_ACCESSORS(holder, name, offset) \
|
||||||
int32_t holder::name(RelaxedLoadTag) const { \
|
int32_t holder::name(RelaxedLoadTag) const { \
|
||||||
return RELAXED_READ_INT32_FIELD(*this, offset); \
|
return RELAXED_READ_INT32_FIELD(*this, offset); \
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "src/base/macros.h"
|
#include "src/base/macros.h"
|
||||||
#include "src/base/platform/mutex.h"
|
#include "src/base/platform/mutex.h"
|
||||||
|
#include "src/common/globals.h"
|
||||||
#include "src/handles/handles-inl.h"
|
#include "src/handles/handles-inl.h"
|
||||||
#include "src/heap/heap-write-barrier-inl.h"
|
#include "src/heap/heap-write-barrier-inl.h"
|
||||||
#include "src/objects/debug-objects-inl.h"
|
#include "src/objects/debug-objects-inl.h"
|
||||||
@ -128,7 +129,14 @@ RENAME_UINT16_TORQUE_ACCESSORS(SharedFunctionInfo,
|
|||||||
RENAME_UINT16_TORQUE_ACCESSORS(SharedFunctionInfo, raw_function_token_offset,
|
RENAME_UINT16_TORQUE_ACCESSORS(SharedFunctionInfo, raw_function_token_offset,
|
||||||
function_token_offset)
|
function_token_offset)
|
||||||
|
|
||||||
IMPLICIT_TAG_RELAXED_INT32_ACCESSORS(SharedFunctionInfo, flags, kFlagsOffset)
|
RELAXED_INT32_ACCESSORS(SharedFunctionInfo, flags, kFlagsOffset)
|
||||||
|
int32_t SharedFunctionInfo::relaxed_flags() const {
|
||||||
|
return flags(kRelaxedLoad);
|
||||||
|
}
|
||||||
|
void SharedFunctionInfo::set_relaxed_flags(int32_t flags) {
|
||||||
|
return set_flags(flags, kRelaxedStore);
|
||||||
|
}
|
||||||
|
|
||||||
UINT8_ACCESSORS(SharedFunctionInfo, flags2, kFlags2Offset)
|
UINT8_ACCESSORS(SharedFunctionInfo, flags2, kFlags2Offset)
|
||||||
|
|
||||||
bool SharedFunctionInfo::HasSharedName() const {
|
bool SharedFunctionInfo::HasSharedName() const {
|
||||||
@ -245,34 +253,36 @@ BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags2,
|
|||||||
has_static_private_methods_or_accessors,
|
has_static_private_methods_or_accessors,
|
||||||
SharedFunctionInfo::HasStaticPrivateMethodsOrAccessorsBit)
|
SharedFunctionInfo::HasStaticPrivateMethodsOrAccessorsBit)
|
||||||
|
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, syntax_kind,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags, syntax_kind,
|
||||||
SharedFunctionInfo::FunctionSyntaxKindBits)
|
SharedFunctionInfo::FunctionSyntaxKindBits)
|
||||||
|
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, allows_lazy_compilation,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags, allows_lazy_compilation,
|
||||||
SharedFunctionInfo::AllowLazyCompilationBit)
|
SharedFunctionInfo::AllowLazyCompilationBit)
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, has_duplicate_parameters,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags, has_duplicate_parameters,
|
||||||
SharedFunctionInfo::HasDuplicateParametersBit)
|
SharedFunctionInfo::HasDuplicateParametersBit)
|
||||||
|
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, native,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags, native,
|
||||||
SharedFunctionInfo::IsNativeBit)
|
SharedFunctionInfo::IsNativeBit)
|
||||||
#if V8_ENABLE_WEBASSEMBLY
|
#if V8_ENABLE_WEBASSEMBLY
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, is_asm_wasm_broken,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags, is_asm_wasm_broken,
|
||||||
SharedFunctionInfo::IsAsmWasmBrokenBit)
|
SharedFunctionInfo::IsAsmWasmBrokenBit)
|
||||||
#endif // V8_ENABLE_WEBASSEMBLY
|
#endif // V8_ENABLE_WEBASSEMBLY
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags,
|
||||||
requires_instance_members_initializer,
|
requires_instance_members_initializer,
|
||||||
SharedFunctionInfo::RequiresInstanceMembersInitializerBit)
|
SharedFunctionInfo::RequiresInstanceMembersInitializerBit)
|
||||||
|
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, name_should_print_as_anonymous,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags,
|
||||||
|
name_should_print_as_anonymous,
|
||||||
SharedFunctionInfo::NameShouldPrintAsAnonymousBit)
|
SharedFunctionInfo::NameShouldPrintAsAnonymousBit)
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, has_reported_binary_coverage,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags,
|
||||||
|
has_reported_binary_coverage,
|
||||||
SharedFunctionInfo::HasReportedBinaryCoverageBit)
|
SharedFunctionInfo::HasReportedBinaryCoverageBit)
|
||||||
|
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, is_toplevel,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags, is_toplevel,
|
||||||
SharedFunctionInfo::IsTopLevelBit)
|
SharedFunctionInfo::IsTopLevelBit)
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags, properties_are_final,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags, properties_are_final,
|
||||||
SharedFunctionInfo::PropertiesAreFinalBit)
|
SharedFunctionInfo::PropertiesAreFinalBit)
|
||||||
BIT_FIELD_ACCESSORS(SharedFunctionInfo, flags,
|
BIT_FIELD_ACCESSORS(SharedFunctionInfo, relaxed_flags,
|
||||||
private_name_lookup_skips_outer_class,
|
private_name_lookup_skips_outer_class,
|
||||||
SharedFunctionInfo::PrivateNameLookupSkipsOuterClassBit)
|
SharedFunctionInfo::PrivateNameLookupSkipsOuterClassBit)
|
||||||
|
|
||||||
@ -281,12 +291,12 @@ bool SharedFunctionInfo::optimization_disabled() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BailoutReason SharedFunctionInfo::disable_optimization_reason() const {
|
BailoutReason SharedFunctionInfo::disable_optimization_reason() const {
|
||||||
return DisabledOptimizationReasonBits::decode(flags());
|
return DisabledOptimizationReasonBits::decode(flags(kRelaxedLoad));
|
||||||
}
|
}
|
||||||
|
|
||||||
LanguageMode SharedFunctionInfo::language_mode() const {
|
LanguageMode SharedFunctionInfo::language_mode() const {
|
||||||
STATIC_ASSERT(LanguageModeSize == 2);
|
STATIC_ASSERT(LanguageModeSize == 2);
|
||||||
return construct_language_mode(IsStrictBit::decode(flags()));
|
return construct_language_mode(IsStrictBit::decode(flags(kRelaxedLoad)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
|
void SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
|
||||||
@ -294,22 +304,22 @@ void SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
|
|||||||
// We only allow language mode transitions that set the same language mode
|
// We only allow language mode transitions that set the same language mode
|
||||||
// again or go up in the chain:
|
// again or go up in the chain:
|
||||||
DCHECK(is_sloppy(this->language_mode()) || is_strict(language_mode));
|
DCHECK(is_sloppy(this->language_mode()) || is_strict(language_mode));
|
||||||
int hints = flags();
|
int hints = flags(kRelaxedLoad);
|
||||||
hints = IsStrictBit::update(hints, is_strict(language_mode));
|
hints = IsStrictBit::update(hints, is_strict(language_mode));
|
||||||
set_flags(hints);
|
set_flags(hints, kRelaxedStore);
|
||||||
UpdateFunctionMapIndex();
|
UpdateFunctionMapIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
FunctionKind SharedFunctionInfo::kind() const {
|
FunctionKind SharedFunctionInfo::kind() const {
|
||||||
STATIC_ASSERT(FunctionKindBits::kSize == kFunctionKindBitSize);
|
STATIC_ASSERT(FunctionKindBits::kSize == kFunctionKindBitSize);
|
||||||
return FunctionKindBits::decode(flags());
|
return FunctionKindBits::decode(flags(kRelaxedLoad));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SharedFunctionInfo::set_kind(FunctionKind kind) {
|
void SharedFunctionInfo::set_kind(FunctionKind kind) {
|
||||||
int hints = flags();
|
int hints = flags(kRelaxedLoad);
|
||||||
hints = FunctionKindBits::update(hints, kind);
|
hints = FunctionKindBits::update(hints, kind);
|
||||||
hints = IsClassConstructorBit::update(hints, IsClassConstructor(kind));
|
hints = IsClassConstructorBit::update(hints, IsClassConstructor(kind));
|
||||||
set_flags(hints);
|
set_flags(hints, kRelaxedStore);
|
||||||
UpdateFunctionMapIndex();
|
UpdateFunctionMapIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,7 +328,7 @@ bool SharedFunctionInfo::is_wrapped() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SharedFunctionInfo::construct_as_builtin() const {
|
bool SharedFunctionInfo::construct_as_builtin() const {
|
||||||
return ConstructAsBuiltinBit::decode(flags());
|
return ConstructAsBuiltinBit::decode(flags(kRelaxedLoad));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SharedFunctionInfo::CalculateConstructAsBuiltin() {
|
void SharedFunctionInfo::CalculateConstructAsBuiltin() {
|
||||||
@ -332,15 +342,15 @@ void SharedFunctionInfo::CalculateConstructAsBuiltin() {
|
|||||||
uses_builtins_construct_stub = true;
|
uses_builtins_construct_stub = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int f = flags();
|
int f = flags(kRelaxedLoad);
|
||||||
f = ConstructAsBuiltinBit::update(f, uses_builtins_construct_stub);
|
f = ConstructAsBuiltinBit::update(f, uses_builtins_construct_stub);
|
||||||
set_flags(f);
|
set_flags(f, kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SharedFunctionInfo::function_map_index() const {
|
int SharedFunctionInfo::function_map_index() const {
|
||||||
// Note: Must be kept in sync with the FastNewClosure builtin.
|
// Note: Must be kept in sync with the FastNewClosure builtin.
|
||||||
int index =
|
int index = Context::FIRST_FUNCTION_MAP_INDEX +
|
||||||
Context::FIRST_FUNCTION_MAP_INDEX + FunctionMapIndexBits::decode(flags());
|
FunctionMapIndexBits::decode(flags(kRelaxedLoad));
|
||||||
DCHECK_LE(index, Context::LAST_FUNCTION_MAP_INDEX);
|
DCHECK_LE(index, Context::LAST_FUNCTION_MAP_INDEX);
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
@ -351,7 +361,8 @@ void SharedFunctionInfo::set_function_map_index(int index) {
|
|||||||
DCHECK_LE(Context::FIRST_FUNCTION_MAP_INDEX, index);
|
DCHECK_LE(Context::FIRST_FUNCTION_MAP_INDEX, index);
|
||||||
DCHECK_LE(index, Context::LAST_FUNCTION_MAP_INDEX);
|
DCHECK_LE(index, Context::LAST_FUNCTION_MAP_INDEX);
|
||||||
index -= Context::FIRST_FUNCTION_MAP_INDEX;
|
index -= Context::FIRST_FUNCTION_MAP_INDEX;
|
||||||
set_flags(FunctionMapIndexBits::update(flags(), index));
|
set_flags(FunctionMapIndexBits::update(flags(kRelaxedLoad), index),
|
||||||
|
kRelaxedStore);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SharedFunctionInfo::clear_padding() {
|
void SharedFunctionInfo::clear_padding() {
|
||||||
@ -890,7 +901,7 @@ bool SharedFunctionInfo::CanDiscardCompiled() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SharedFunctionInfo::is_class_constructor() const {
|
bool SharedFunctionInfo::is_class_constructor() const {
|
||||||
return IsClassConstructorBit::decode(flags());
|
return IsClassConstructorBit::decode(flags(kRelaxedLoad));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SharedFunctionInfo::set_are_properties_final(bool value) {
|
void SharedFunctionInfo::set_are_properties_final(bool value) {
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "src/ast/scopes.h"
|
#include "src/ast/scopes.h"
|
||||||
#include "src/codegen/compilation-cache.h"
|
#include "src/codegen/compilation-cache.h"
|
||||||
#include "src/codegen/compiler.h"
|
#include "src/codegen/compiler.h"
|
||||||
|
#include "src/common/globals.h"
|
||||||
#include "src/diagnostics/code-tracer.h"
|
#include "src/diagnostics/code-tracer.h"
|
||||||
#include "src/objects/shared-function-info-inl.h"
|
#include "src/objects/shared-function-info-inl.h"
|
||||||
#include "src/strings/string-builder-inl.h"
|
#include "src/strings/string-builder-inl.h"
|
||||||
@ -58,7 +59,7 @@ void SharedFunctionInfo::Init(ReadOnlyRoots ro_roots, int unique_id) {
|
|||||||
|
|
||||||
// All flags default to false or 0, except ConstructAsBuiltinBit just because
|
// All flags default to false or 0, except ConstructAsBuiltinBit just because
|
||||||
// we're using the kIllegal builtin.
|
// we're using the kIllegal builtin.
|
||||||
set_flags(ConstructAsBuiltinBit::encode(true));
|
set_flags(ConstructAsBuiltinBit::encode(true), kRelaxedStore);
|
||||||
set_flags2(0);
|
set_flags2(0);
|
||||||
|
|
||||||
UpdateFunctionMapIndex();
|
UpdateFunctionMapIndex();
|
||||||
@ -435,7 +436,8 @@ std::ostream& operator<<(std::ostream& os, const SourceCodeOf& v) {
|
|||||||
void SharedFunctionInfo::DisableOptimization(BailoutReason reason) {
|
void SharedFunctionInfo::DisableOptimization(BailoutReason reason) {
|
||||||
DCHECK_NE(reason, BailoutReason::kNoReason);
|
DCHECK_NE(reason, BailoutReason::kNoReason);
|
||||||
|
|
||||||
set_flags(DisabledOptimizationReasonBits::update(flags(), reason));
|
set_flags(DisabledOptimizationReasonBits::update(flags(kRelaxedLoad), reason),
|
||||||
|
kRelaxedStore);
|
||||||
// Code should be the lazy compilation stub or else interpreted.
|
// Code should be the lazy compilation stub or else interpreted.
|
||||||
Isolate* isolate = GetIsolate();
|
Isolate* isolate = GetIsolate();
|
||||||
DCHECK(abstract_code(isolate).kind() == CodeKind::INTERPRETED_FUNCTION ||
|
DCHECK(abstract_code(isolate).kind() == CodeKind::INTERPRETED_FUNCTION ||
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "src/base/bit-field.h"
|
#include "src/base/bit-field.h"
|
||||||
#include "src/builtins/builtins.h"
|
#include "src/builtins/builtins.h"
|
||||||
#include "src/codegen/bailout-reason.h"
|
#include "src/codegen/bailout-reason.h"
|
||||||
|
#include "src/common/globals.h"
|
||||||
#include "src/objects/compressed-slots.h"
|
#include "src/objects/compressed-slots.h"
|
||||||
#include "src/objects/function-kind.h"
|
#include "src/objects/function-kind.h"
|
||||||
#include "src/objects/function-syntax-kind.h"
|
#include "src/objects/function-syntax-kind.h"
|
||||||
@ -411,7 +412,7 @@ class SharedFunctionInfo
|
|||||||
inline bool HasSharedName() const;
|
inline bool HasSharedName() const;
|
||||||
|
|
||||||
// [flags] Bit field containing various flags about the function.
|
// [flags] Bit field containing various flags about the function.
|
||||||
DECL_INT32_ACCESSORS(flags)
|
DECL_RELAXED_INT32_ACCESSORS(flags)
|
||||||
DECL_UINT8_ACCESSORS(flags2)
|
DECL_UINT8_ACCESSORS(flags2)
|
||||||
|
|
||||||
// True if the outer class scope contains a private brand for
|
// True if the outer class scope contains a private brand for
|
||||||
@ -670,6 +671,10 @@ class SharedFunctionInfo
|
|||||||
|
|
||||||
inline uint16_t get_property_estimate_from_literal(FunctionLiteral* literal);
|
inline uint16_t get_property_estimate_from_literal(FunctionLiteral* literal);
|
||||||
|
|
||||||
|
// For ease of use of the BITFIELD macro.
|
||||||
|
inline int32_t relaxed_flags() const;
|
||||||
|
inline void set_relaxed_flags(int32_t flags);
|
||||||
|
|
||||||
template <typename Impl>
|
template <typename Impl>
|
||||||
friend class FactoryBase;
|
friend class FactoryBase;
|
||||||
friend class V8HeapExplorer;
|
friend class V8HeapExplorer;
|
||||||
|
Loading…
Reference in New Issue
Block a user