Commit 1dd791fc authored by Victor Gomes's avatar Victor Gomes Committed by Commit Bot

[Heap]: Remove dynamic allocation flag on NewNumber functions.

Uses templates to dispath the allocation flag statically.

Bug: v8:9714
Change-Id: I1998ae47be2f7d872d34b3bc2390d01cbfad6afa
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1801848
Auto-Submit: Victor Gomes <victorgomes@google.com>
Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/master@{#63783}
parent 47545c69
......@@ -890,7 +890,7 @@ Handle<Object> Literal::BuildValue(Isolate* isolate) const {
case kSmi:
return handle(Smi::FromInt(smi_), isolate);
case kHeapNumber:
return isolate->factory()->NewNumber(number_, AllocationType::kOld);
return isolate->factory()->NewNumber<AllocationType::kOld>(number_);
case kString:
return string_->string();
case kSymbol:
......
......@@ -452,8 +452,8 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Handle<HeapObject> object;
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber:
object = isolate->factory()->NewHeapNumber(request.heap_number(),
AllocationType::kOld);
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
break;
case HeapObjectRequest::kStringConstant: {
const StringConstantBase* str = request.string();
......
......@@ -369,8 +369,9 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Address pc = reinterpret_cast<Address>(buffer_start_) + request.offset();
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber: {
Handle<HeapObject> object = isolate->factory()->NewHeapNumber(
request.heap_number(), AllocationType::kOld);
Handle<HeapObject> object =
isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
EmbeddedObjectIndex index = AddEmbeddedObject(object);
set_embedded_object_index_referenced_from(pc, index);
break;
......
......@@ -272,8 +272,8 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Handle<HeapObject> object;
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber:
object = isolate->factory()->NewHeapNumber(request.heap_number(),
AllocationType::kOld);
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
break;
case HeapObjectRequest::kStringConstant: {
const StringConstantBase* str = request.string();
......
......@@ -231,8 +231,8 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Handle<HeapObject> object;
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber:
object = isolate->factory()->NewHeapNumber(request.heap_number(),
AllocationType::kOld);
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
break;
case HeapObjectRequest::kStringConstant:
const StringConstantBase* str = request.string();
......
......@@ -207,8 +207,8 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Handle<HeapObject> object;
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber:
object = isolate->factory()->NewHeapNumber(request.heap_number(),
AllocationType::kOld);
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
break;
case HeapObjectRequest::kStringConstant:
const StringConstantBase* str = request.string();
......
......@@ -200,8 +200,8 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Handle<HeapObject> object;
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber: {
object = isolate->factory()->NewHeapNumber(request.heap_number(),
AllocationType::kOld);
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
break;
}
case HeapObjectRequest::kStringConstant: {
......
......@@ -329,8 +329,8 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Address pc = reinterpret_cast<Address>(buffer_start_) + request.offset();
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber: {
object = isolate->factory()->NewHeapNumber(request.heap_number(),
AllocationType::kOld);
object = isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
set_target_address_at(pc, kNullAddress, object.address(),
SKIP_ICACHE_FLUSH);
break;
......
......@@ -327,8 +327,9 @@ void Assembler::AllocateAndInstallRequestedHeapObjects(Isolate* isolate) {
Address pc = reinterpret_cast<Address>(buffer_start_) + request.offset();
switch (request.kind()) {
case HeapObjectRequest::kHeapNumber: {
Handle<HeapNumber> object = isolate->factory()->NewHeapNumber(
request.heap_number(), AllocationType::kOld);
Handle<HeapNumber> object =
isolate->factory()->NewHeapNumber<AllocationType::kOld>(
request.heap_number());
WriteUnalignedValue(pc, object);
break;
}
......
......@@ -62,16 +62,16 @@ Handle<Object> Factory::NewNumberFromInt64(int64_t value) {
return NewNumber(static_cast<double>(value));
}
Handle<HeapNumber> Factory::NewHeapNumber(double value,
AllocationType allocation) {
Handle<HeapNumber> heap_number = NewHeapNumber(allocation);
template <AllocationType allocation>
Handle<HeapNumber> Factory::NewHeapNumber(double value) {
Handle<HeapNumber> heap_number = NewHeapNumber<allocation>();
heap_number->set_value(value);
return heap_number;
}
Handle<HeapNumber> Factory::NewHeapNumberFromBits(uint64_t bits,
AllocationType allocation) {
Handle<HeapNumber> heap_number = NewHeapNumber(allocation);
template <AllocationType allocation>
Handle<HeapNumber> Factory::NewHeapNumberFromBits(uint64_t bits) {
Handle<HeapNumber> heap_number = NewHeapNumber<allocation>();
heap_number->set_value_as_bits(bits);
return heap_number;
}
......
......@@ -2179,32 +2179,39 @@ Handle<FixedDoubleArray> Factory::CopyFixedDoubleArray(
return result;
}
Handle<Object> Factory::NewNumber(double value, AllocationType allocation) {
template <AllocationType allocation>
Handle<Object> Factory::NewNumber(double value) {
// Materialize as a SMI if possible.
int32_t int_value;
if (DoubleToSmiInteger(value, &int_value)) {
return handle(Smi::FromInt(int_value), isolate());
}
return NewHeapNumber(value, allocation);
return NewHeapNumber<allocation>(value);
}
Handle<Object> Factory::NewNumberFromInt(int32_t value,
AllocationType allocation) {
template Handle<Object> V8_EXPORT_PRIVATE
Factory::NewNumber<AllocationType::kYoung>(double);
template Handle<Object> V8_EXPORT_PRIVATE
Factory::NewNumber<AllocationType::kOld>(double);
template Handle<Object> V8_EXPORT_PRIVATE
Factory::NewNumber<AllocationType::kReadOnly>(double);
Handle<Object> Factory::NewNumberFromInt(int32_t value) {
if (Smi::IsValid(value)) return handle(Smi::FromInt(value), isolate());
// Bypass NewNumber to avoid various redundant checks.
return NewHeapNumber(FastI2D(value), allocation);
return NewHeapNumber(FastI2D(value));
}
Handle<Object> Factory::NewNumberFromUint(uint32_t value,
AllocationType allocation) {
Handle<Object> Factory::NewNumberFromUint(uint32_t value) {
int32_t int32v = static_cast<int32_t>(value);
if (int32v >= 0 && Smi::IsValid(int32v)) {
return handle(Smi::FromInt(int32v), isolate());
}
return NewHeapNumber(FastUI2D(value), allocation);
return NewHeapNumber(FastUI2D(value));
}
Handle<HeapNumber> Factory::NewHeapNumber(AllocationType allocation) {
template <AllocationType allocation>
Handle<HeapNumber> Factory::NewHeapNumber() {
STATIC_ASSERT(HeapNumber::kSize <= kMaxRegularHeapObjectSize);
Map map = *heap_number_map();
HeapObject result = AllocateRawWithImmortalMap(HeapNumber::kSize, allocation,
......@@ -2212,10 +2219,17 @@ Handle<HeapNumber> Factory::NewHeapNumber(AllocationType allocation) {
return handle(HeapNumber::cast(result), isolate());
}
template Handle<HeapNumber> V8_EXPORT_PRIVATE
Factory::NewHeapNumber<AllocationType::kYoung>();
template Handle<HeapNumber> V8_EXPORT_PRIVATE
Factory::NewHeapNumber<AllocationType::kOld>();
template Handle<HeapNumber> V8_EXPORT_PRIVATE
Factory::NewHeapNumber<AllocationType::kReadOnly>();
Handle<HeapNumber> Factory::NewHeapNumberForCodeAssembler(double value) {
return NewHeapNumber(value, isolate()->heap()->CanAllocateInReadOnlySpace()
? AllocationType::kReadOnly
: AllocationType::kOld);
return isolate()->heap()->CanAllocateInReadOnlySpace()
? NewHeapNumber<AllocationType::kReadOnly>(value)
: NewHeapNumber<AllocationType::kOld>(value);
}
Handle<FreshlyAllocatedBigInt> Factory::NewBigInt(int length,
......
......@@ -546,23 +546,22 @@ class V8_EXPORT_PRIVATE Factory {
// Numbers (e.g. literals) are pretenured by the parser.
// The return value may be a smi or a heap number.
Handle<Object> NewNumber(double value,
AllocationType allocation = AllocationType::kYoung);
Handle<Object> NewNumberFromInt(
int32_t value, AllocationType allocation = AllocationType::kYoung);
Handle<Object> NewNumberFromUint(
uint32_t value, AllocationType allocation = AllocationType::kYoung);
template <AllocationType allocation = AllocationType::kYoung>
EXPORT_TEMPLATE_DECLARE(V8_EXPORT_PRIVATE)
Handle<Object> NewNumber(double value);
Handle<Object> NewNumberFromInt(int32_t value);
Handle<Object> NewNumberFromUint(uint32_t value);
inline Handle<Object> NewNumberFromSize(size_t value);
inline Handle<Object> NewNumberFromInt64(int64_t value);
inline Handle<HeapNumber> NewHeapNumber(
double value, AllocationType allocation = AllocationType::kYoung);
inline Handle<HeapNumber> NewHeapNumberFromBits(
uint64_t bits, AllocationType allocation = AllocationType::kYoung);
template <AllocationType allocation = AllocationType::kYoung>
inline Handle<HeapNumber> NewHeapNumber(double value);
template <AllocationType allocation = AllocationType::kYoung>
inline Handle<HeapNumber> NewHeapNumberFromBits(uint64_t bits);
// Creates heap number object with not yet set value field.
Handle<HeapNumber> NewHeapNumber(
AllocationType allocation = AllocationType::kYoung);
template <AllocationType allocation = AllocationType::kYoung>
EXPORT_TEMPLATE_DECLARE(V8_EXPORT_PRIVATE)
Handle<HeapNumber> NewHeapNumber();
// Creates a new HeapNumber in read-only space if possible otherwise old
// space.
......
......@@ -616,17 +616,17 @@ void Heap::CreateInitialObjects() {
// The -0 value must be set before NewNumber works.
set_minus_zero_value(
*factory->NewHeapNumber(-0.0, AllocationType::kReadOnly));
*factory->NewHeapNumber<AllocationType::kReadOnly>(-0.0));
DCHECK(std::signbit(roots.minus_zero_value().Number()));
set_nan_value(*factory->NewHeapNumber(
std::numeric_limits<double>::quiet_NaN(), AllocationType::kReadOnly));
set_hole_nan_value(*factory->NewHeapNumberFromBits(
kHoleNanInt64, AllocationType::kReadOnly));
set_nan_value(*factory->NewHeapNumber<AllocationType::kReadOnly>(
std::numeric_limits<double>::quiet_NaN()));
set_hole_nan_value(*factory->NewHeapNumberFromBits<AllocationType::kReadOnly>(
kHoleNanInt64));
set_infinity_value(
*factory->NewHeapNumber(V8_INFINITY, AllocationType::kReadOnly));
*factory->NewHeapNumber<AllocationType::kReadOnly>(V8_INFINITY));
set_minus_infinity_value(
*factory->NewHeapNumber(-V8_INFINITY, AllocationType::kReadOnly));
*factory->NewHeapNumber<AllocationType::kReadOnly>(-V8_INFINITY));
set_hash_seed(*factory->NewByteArray(kInt64Size, AllocationType::kReadOnly));
InitializeHashSeed();
......
......@@ -378,7 +378,7 @@ Handle<Object> ConstantArrayBuilder::Entry::ToHandle(Isolate* isolate) const {
case Tag::kRawString:
return raw_string_->string();
case Tag::kHeapNumber:
return isolate->factory()->NewNumber(heap_number_, AllocationType::kOld);
return isolate->factory()->NewNumber<AllocationType::kOld>(heap_number_);
case Tag::kBigInt:
// This should never fail: the parser will never create a BigInt
// literal that cannot be allocated.
......
......@@ -1791,7 +1791,7 @@ TEST(HeapNumberAlignment) {
AlignOldSpace(required_alignment, offset);
Handle<Object> number_old =
factory->NewNumber(1.000321, AllocationType::kOld);
factory->NewNumber<AllocationType::kOld>(1.000321);
CHECK(number_old->IsHeapNumber());
CHECK(heap->InOldSpace(*number_old));
CHECK_EQ(0, Heap::GetFillToAlign(HeapObject::cast(*number_old).address(),
......
......@@ -81,7 +81,7 @@ HEAP_TEST(StoreBuffer_CreateFromOldToYoung) {
}
// Add refs from old to old.
for (int i = n / 2; i < n; i++) {
Handle<Object> number = factory->NewHeapNumber(i, AllocationType::kOld);
Handle<Object> number = factory->NewHeapNumber<AllocationType::kOld>(i);
old->set(i, *number);
}
// All old to new refs should have been captured and only them.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment