Commit 7a58e6e8 authored by Dan Elphick's avatar Dan Elphick Committed by Commit Bot

[explicit isolates] Convert builtins/ to ReadOnlyRoots

In future the RO_SPACE root accessors in Heap will become private, so
instead convert them all to use ReadOnlyRoots.

Bug: v8:7786
Cq-Include-Trybots: luci.v8.try:v8_linux_noi18n_rel_ng
Change-Id: I2cc63ffc5b6df537fa7772356acd9e8b3cf59352
Reviewed-on: https://chromium-review.googlesource.com/1124322
Commit-Queue: Dan Elphick <delphick@chromium.org>
Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54181}
parent f77aa8d0
...@@ -223,7 +223,8 @@ MaybeHandle<Object> Builtins::InvokeApiFunction(Isolate* isolate, ...@@ -223,7 +223,8 @@ MaybeHandle<Object> Builtins::InvokeApiFunction(Isolate* isolate,
argv[cursor--] = *args[i]; argv[cursor--] = *args[i];
} }
DCHECK_EQ(cursor, BuiltinArguments::kPaddingOffset); DCHECK_EQ(cursor, BuiltinArguments::kPaddingOffset);
argv[BuiltinArguments::kPaddingOffset] = isolate->heap()->the_hole_value(); argv[BuiltinArguments::kPaddingOffset] =
ReadOnlyRoots(isolate).the_hole_value();
argv[BuiltinArguments::kArgcOffset] = Smi::FromInt(frame_argc); argv[BuiltinArguments::kArgcOffset] = Smi::FromInt(frame_argc);
argv[BuiltinArguments::kTargetOffset] = *function; argv[BuiltinArguments::kTargetOffset] = *function;
argv[BuiltinArguments::kNewTargetOffset] = *new_target; argv[BuiltinArguments::kNewTargetOffset] = *new_target;
...@@ -261,7 +262,7 @@ V8_WARN_UNUSED_RESULT static Object* HandleApiCallAsFunctionOrConstructor( ...@@ -261,7 +262,7 @@ V8_WARN_UNUSED_RESULT static Object* HandleApiCallAsFunctionOrConstructor(
// right answer. // right answer.
new_target = obj; new_target = obj;
} else { } else {
new_target = isolate->heap()->undefined_value(); new_target = ReadOnlyRoots(isolate).undefined_value();
} }
// Get the invocation callback from the function descriptor that was // Get the invocation callback from the function descriptor that was
...@@ -285,7 +286,7 @@ V8_WARN_UNUSED_RESULT static Object* HandleApiCallAsFunctionOrConstructor( ...@@ -285,7 +286,7 @@ V8_WARN_UNUSED_RESULT static Object* HandleApiCallAsFunctionOrConstructor(
args.length() - 1); args.length() - 1);
Handle<Object> result_handle = custom.Call(call_data); Handle<Object> result_handle = custom.Call(call_data);
if (result_handle.is_null()) { if (result_handle.is_null()) {
result = isolate->heap()->undefined_value(); result = ReadOnlyRoots(isolate).undefined_value();
} else { } else {
result = *result_handle; result = *result_handle;
} }
......
...@@ -177,7 +177,7 @@ BUILTIN(ArrayPop) { ...@@ -177,7 +177,7 @@ BUILTIN(ArrayPop) {
Handle<JSArray> array = Handle<JSArray>::cast(receiver); Handle<JSArray> array = Handle<JSArray>::cast(receiver);
uint32_t len = static_cast<uint32_t>(Smi::ToInt(array->length())); uint32_t len = static_cast<uint32_t>(Smi::ToInt(array->length()));
if (len == 0) return isolate->heap()->undefined_value(); if (len == 0) return ReadOnlyRoots(isolate).undefined_value();
if (JSArray::HasReadOnlyLength(array)) { if (JSArray::HasReadOnlyLength(array)) {
return CallJsIntrinsic(isolate, isolate->array_pop(), args); return CallJsIntrinsic(isolate, isolate->array_pop(), args);
...@@ -208,7 +208,7 @@ BUILTIN(ArrayShift) { ...@@ -208,7 +208,7 @@ BUILTIN(ArrayShift) {
Handle<JSArray> array = Handle<JSArray>::cast(receiver); Handle<JSArray> array = Handle<JSArray>::cast(receiver);
int len = Smi::ToInt(array->length()); int len = Smi::ToInt(array->length());
if (len == 0) return heap->undefined_value(); if (len == 0) return ReadOnlyRoots(heap).undefined_value();
if (JSArray::HasReadOnlyLength(array)) { if (JSArray::HasReadOnlyLength(array)) {
return CallJsIntrinsic(isolate, isolate->array_shift(), args); return CallJsIntrinsic(isolate, isolate->array_shift(), args);
...@@ -962,7 +962,7 @@ Object* Slow_ArrayConcat(BuiltinArguments* args, Handle<Object> species, ...@@ -962,7 +962,7 @@ Object* Slow_ArrayConcat(BuiltinArguments* args, Handle<Object> species,
} }
case HOLEY_SMI_ELEMENTS: case HOLEY_SMI_ELEMENTS:
case PACKED_SMI_ELEMENTS: { case PACKED_SMI_ELEMENTS: {
Object* the_hole = isolate->heap()->the_hole_value(); Object* the_hole = ReadOnlyRoots(isolate).the_hole_value();
FixedArray* elements(FixedArray::cast(array->elements())); FixedArray* elements(FixedArray::cast(array->elements()));
for (uint32_t i = 0; i < length; i++) { for (uint32_t i = 0; i < length; i++) {
Object* element = elements->get(i); Object* element = elements->get(i);
...@@ -1018,14 +1018,14 @@ Object* Slow_ArrayConcat(BuiltinArguments* args, Handle<Object> species, ...@@ -1018,14 +1018,14 @@ Object* Slow_ArrayConcat(BuiltinArguments* args, Handle<Object> species,
for (int i = 0; i < argument_count; i++) { for (int i = 0; i < argument_count; i++) {
Handle<Object> obj((*args)[i], isolate); Handle<Object> obj((*args)[i], isolate);
Maybe<bool> spreadable = IsConcatSpreadable(isolate, obj); Maybe<bool> spreadable = IsConcatSpreadable(isolate, obj);
MAYBE_RETURN(spreadable, isolate->heap()->exception()); MAYBE_RETURN(spreadable, ReadOnlyRoots(isolate).exception());
if (spreadable.FromJust()) { if (spreadable.FromJust()) {
Handle<JSReceiver> object = Handle<JSReceiver>::cast(obj); Handle<JSReceiver> object = Handle<JSReceiver>::cast(obj);
if (!IterateElements(isolate, object, &visitor)) { if (!IterateElements(isolate, object, &visitor)) {
return isolate->heap()->exception(); return ReadOnlyRoots(isolate).exception();
} }
} else { } else {
if (!visitor.visit(0, obj)) return isolate->heap()->exception(); if (!visitor.visit(0, obj)) return ReadOnlyRoots(isolate).exception();
visitor.increase_index_offset(1); visitor.increase_index_offset(1);
} }
} }
...@@ -1125,7 +1125,8 @@ BUILTIN(ArrayConcat) { ...@@ -1125,7 +1125,8 @@ BUILTIN(ArrayConcat) {
if (Fast_ArrayConcat(isolate, &args).ToHandle(&result_array)) { if (Fast_ArrayConcat(isolate, &args).ToHandle(&result_array)) {
return *result_array; return *result_array;
} }
if (isolate->has_pending_exception()) return isolate->heap()->exception(); if (isolate->has_pending_exception())
return ReadOnlyRoots(isolate).exception();
} }
// Reading @@species happens before anything else with a side effect, so // Reading @@species happens before anything else with a side effect, so
// we can do it here to determine whether to take the fast path. // we can do it here to determine whether to take the fast path.
...@@ -1136,7 +1137,8 @@ BUILTIN(ArrayConcat) { ...@@ -1136,7 +1137,8 @@ BUILTIN(ArrayConcat) {
if (Fast_ArrayConcat(isolate, &args).ToHandle(&result_array)) { if (Fast_ArrayConcat(isolate, &args).ToHandle(&result_array)) {
return *result_array; return *result_array;
} }
if (isolate->has_pending_exception()) return isolate->heap()->exception(); if (isolate->has_pending_exception())
return ReadOnlyRoots(isolate).exception();
} }
return Slow_ArrayConcat(&args, species, isolate); return Slow_ArrayConcat(&args, species, isolate);
} }
......
...@@ -28,7 +28,7 @@ namespace { ...@@ -28,7 +28,7 @@ namespace {
Object* PositiveNumberOrNull(int value, Isolate* isolate) { Object* PositiveNumberOrNull(int value, Isolate* isolate) {
if (value >= 0) return *isolate->factory()->NewNumberFromInt(value); if (value >= 0) return *isolate->factory()->NewNumberFromInt(value);
return isolate->heap()->null_value(); return ReadOnlyRoots(isolate).null_value();
} }
Handle<FrameArray> GetFrameArray(Isolate* isolate, Handle<JSObject> object) { Handle<FrameArray> GetFrameArray(Isolate* isolate, Handle<JSObject> object) {
...@@ -76,7 +76,7 @@ BUILTIN(CallSitePrototypeGetFunction) { ...@@ -76,7 +76,7 @@ BUILTIN(CallSitePrototypeGetFunction) {
GetFrameIndex(isolate, recv)); GetFrameIndex(isolate, recv));
StackFrameBase* frame = it.Frame(); StackFrameBase* frame = it.Frame();
if (frame->IsStrict()) return isolate->heap()->undefined_value(); if (frame->IsStrict()) return ReadOnlyRoots(isolate).undefined_value();
return *frame->GetFunction(); return *frame->GetFunction();
} }
...@@ -127,7 +127,7 @@ BUILTIN(CallSitePrototypeGetThis) { ...@@ -127,7 +127,7 @@ BUILTIN(CallSitePrototypeGetThis) {
GetFrameIndex(isolate, recv)); GetFrameIndex(isolate, recv));
StackFrameBase* frame = it.Frame(); StackFrameBase* frame = it.Frame();
if (frame->IsStrict()) return isolate->heap()->undefined_value(); if (frame->IsStrict()) return ReadOnlyRoots(isolate).undefined_value();
return *frame->GetReceiver(); return *frame->GetReceiver();
} }
......
...@@ -15,7 +15,7 @@ BUILTIN(MapPrototypeClear) { ...@@ -15,7 +15,7 @@ BUILTIN(MapPrototypeClear) {
const char* const kMethodName = "Map.prototype.clear"; const char* const kMethodName = "Map.prototype.clear";
CHECK_RECEIVER(JSMap, map, kMethodName); CHECK_RECEIVER(JSMap, map, kMethodName);
JSMap::Clear(isolate, map); JSMap::Clear(isolate, map);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
BUILTIN(SetPrototypeClear) { BUILTIN(SetPrototypeClear) {
...@@ -23,7 +23,7 @@ BUILTIN(SetPrototypeClear) { ...@@ -23,7 +23,7 @@ BUILTIN(SetPrototypeClear) {
const char* const kMethodName = "Set.prototype.clear"; const char* const kMethodName = "Set.prototype.clear";
CHECK_RECEIVER(JSSet, set, kMethodName); CHECK_RECEIVER(JSSet, set, kMethodName);
JSSet::Clear(isolate, set); JSSet::Clear(isolate, set);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
} // namespace internal } // namespace internal
......
...@@ -78,7 +78,7 @@ void LogTimerEvent(Isolate* isolate, BuiltinArguments args, ...@@ -78,7 +78,7 @@ void LogTimerEvent(Isolate* isolate, BuiltinArguments args,
BUILTIN(Console##call) { \ BUILTIN(Console##call) { \
ConsoleCall(isolate, args, &debug::ConsoleDelegate::call); \ ConsoleCall(isolate, args, &debug::ConsoleDelegate::call); \
RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); \ RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); \
return isolate->heap()->undefined_value(); \ return ReadOnlyRoots(isolate).undefined_value(); \
} }
CONSOLE_METHOD_LIST(CONSOLE_BUILTIN_IMPLEMENTATION) CONSOLE_METHOD_LIST(CONSOLE_BUILTIN_IMPLEMENTATION)
#undef CONSOLE_BUILTIN_IMPLEMENTATION #undef CONSOLE_BUILTIN_IMPLEMENTATION
...@@ -87,21 +87,21 @@ BUILTIN(ConsoleTime) { ...@@ -87,21 +87,21 @@ BUILTIN(ConsoleTime) {
LogTimerEvent(isolate, args, Logger::START); LogTimerEvent(isolate, args, Logger::START);
ConsoleCall(isolate, args, &debug::ConsoleDelegate::Time); ConsoleCall(isolate, args, &debug::ConsoleDelegate::Time);
RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
BUILTIN(ConsoleTimeEnd) { BUILTIN(ConsoleTimeEnd) {
LogTimerEvent(isolate, args, Logger::END); LogTimerEvent(isolate, args, Logger::END);
ConsoleCall(isolate, args, &debug::ConsoleDelegate::TimeEnd); ConsoleCall(isolate, args, &debug::ConsoleDelegate::TimeEnd);
RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
BUILTIN(ConsoleTimeStamp) { BUILTIN(ConsoleTimeStamp) {
LogTimerEvent(isolate, args, Logger::STAMP); LogTimerEvent(isolate, args, Logger::STAMP);
ConsoleCall(isolate, args, &debug::ConsoleDelegate::TimeStamp); ConsoleCall(isolate, args, &debug::ConsoleDelegate::TimeStamp);
RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
namespace { namespace {
......
...@@ -872,7 +872,7 @@ BUILTIN(DatePrototypeToJson) { ...@@ -872,7 +872,7 @@ BUILTIN(DatePrototypeToJson) {
isolate, primitive, isolate, primitive,
Object::ToPrimitive(receiver_obj, ToPrimitiveHint::kNumber)); Object::ToPrimitive(receiver_obj, ToPrimitiveHint::kNumber));
if (primitive->IsNumber() && !std::isfinite(primitive->Number())) { if (primitive->IsNumber() && !std::isfinite(primitive->Number())) {
return isolate->heap()->null_value(); return ReadOnlyRoots(isolate).null_value();
} else { } else {
Handle<String> name = Handle<String> name =
isolate->factory()->NewStringFromAsciiChecked("toISOString"); isolate->factory()->NewStringFromAsciiChecked("toISOString");
......
...@@ -75,7 +75,7 @@ BUILTIN(ErrorCaptureStackTrace) { ...@@ -75,7 +75,7 @@ BUILTIN(ErrorCaptureStackTrace) {
RETURN_FAILURE_ON_EXCEPTION( RETURN_FAILURE_ON_EXCEPTION(
isolate, JSObject::SetAccessor(object, name, error_stack, DONT_ENUM)); isolate, JSObject::SetAccessor(object, name, error_stack, DONT_ENUM));
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
// ES6 section 19.5.3.4 Error.prototype.toString ( ) // ES6 section 19.5.3.4 Error.prototype.toString ( )
......
...@@ -237,7 +237,7 @@ Object* DoFunctionBind(Isolate* isolate, BuiltinArguments args) { ...@@ -237,7 +237,7 @@ Object* DoFunctionBind(Isolate* isolate, BuiltinArguments args) {
Handle<Object> length(Smi::kZero, isolate); Handle<Object> length(Smi::kZero, isolate);
Maybe<PropertyAttributes> attributes = Maybe<PropertyAttributes> attributes =
JSReceiver::GetPropertyAttributes(&length_lookup); JSReceiver::GetPropertyAttributes(&length_lookup);
if (attributes.IsNothing()) return isolate->heap()->exception(); if (attributes.IsNothing()) return ReadOnlyRoots(isolate).exception();
if (attributes.FromJust() != ABSENT) { if (attributes.FromJust() != ABSENT) {
Handle<Object> target_length; Handle<Object> target_length;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, target_length, ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, target_length,
...@@ -305,7 +305,7 @@ BUILTIN(FunctionPrototypeToString) { ...@@ -305,7 +305,7 @@ BUILTIN(FunctionPrototypeToString) {
// receivers for this method. // receivers for this method.
if (FLAG_harmony_function_tostring && receiver->IsJSReceiver() && if (FLAG_harmony_function_tostring && receiver->IsJSReceiver() &&
JSReceiver::cast(*receiver)->map()->is_callable()) { JSReceiver::cast(*receiver)->map()->is_callable()) {
return isolate->heap()->function_native_code_string(); return ReadOnlyRoots(isolate).function_native_code_string();
} }
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
isolate, NewTypeError(MessageTemplate::kNotGeneric, isolate, NewTypeError(MessageTemplate::kNotGeneric,
......
...@@ -89,7 +89,7 @@ BUILTIN(GlobalEval) { ...@@ -89,7 +89,7 @@ BUILTIN(GlobalEval) {
if (!x->IsString()) return *x; if (!x->IsString()) return *x;
if (!Builtins::AllowDynamicFunction(isolate, target, target_global_proxy)) { if (!Builtins::AllowDynamicFunction(isolate, target, target_global_proxy)) {
isolate->CountUsage(v8::Isolate::kFunctionConstructorReturnedUndefined); isolate->CountUsage(v8::Isolate::kFunctionConstructorReturnedUndefined);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
Handle<JSFunction> function; Handle<JSFunction> function;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
......
...@@ -15,7 +15,7 @@ BUILTIN(Illegal) { ...@@ -15,7 +15,7 @@ BUILTIN(Illegal) {
UNREACHABLE(); UNREACHABLE();
} }
BUILTIN(EmptyFunction) { return isolate->heap()->undefined_value(); } BUILTIN(EmptyFunction) { return ReadOnlyRoots(isolate).undefined_value(); }
BUILTIN(UnsupportedThrower) { BUILTIN(UnsupportedThrower) {
HandleScope scope(isolate); HandleScope scope(isolate);
......
...@@ -105,7 +105,7 @@ BUILTIN(StringPrototypeNormalizeIntl) { ...@@ -105,7 +105,7 @@ BUILTIN(StringPrototypeNormalizeIntl) {
} }
if (U_FAILURE(status)) { if (U_FAILURE(status)) {
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
RETURN_RESULT_OR_FAILURE( RETURN_RESULT_OR_FAILURE(
...@@ -259,7 +259,7 @@ Object* FormatNumberToParts(Isolate* isolate, icu::NumberFormat* fmt, ...@@ -259,7 +259,7 @@ Object* FormatNumberToParts(Isolate* isolate, icu::NumberFormat* fmt,
icu::FieldPositionIterator fp_iter; icu::FieldPositionIterator fp_iter;
UErrorCode status = U_ZERO_ERROR; UErrorCode status = U_ZERO_ERROR;
fmt->format(number, formatted, &fp_iter, status); fmt->format(number, formatted, &fp_iter, status);
if (U_FAILURE(status)) return isolate->heap()->undefined_value(); if (U_FAILURE(status)) return ReadOnlyRoots(isolate).undefined_value();
Handle<JSArray> result = factory->NewJSArray(0); Handle<JSArray> result = factory->NewJSArray(0);
int32_t length = formatted.length(); int32_t length = formatted.length();
...@@ -291,7 +291,7 @@ Object* FormatNumberToParts(Isolate* isolate, icu::NumberFormat* fmt, ...@@ -291,7 +291,7 @@ Object* FormatNumberToParts(Isolate* isolate, icu::NumberFormat* fmt,
: IcuNumberFieldIdToNumberType(part.field_id, number, isolate); : IcuNumberFieldIdToNumberType(part.field_id, number, isolate);
if (!AddElement(result, index, field_type_string, formatted, part.begin_pos, if (!AddElement(result, index, field_type_string, formatted, part.begin_pos,
part.end_pos, isolate)) { part.end_pos, isolate)) {
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
++index; ++index;
} }
...@@ -309,7 +309,7 @@ Object* FormatDateToParts(Isolate* isolate, icu::DateFormat* format, ...@@ -309,7 +309,7 @@ Object* FormatDateToParts(Isolate* isolate, icu::DateFormat* format,
icu::FieldPosition fp; icu::FieldPosition fp;
UErrorCode status = U_ZERO_ERROR; UErrorCode status = U_ZERO_ERROR;
format->format(date_value, formatted, &fp_iter, status); format->format(date_value, formatted, &fp_iter, status);
if (U_FAILURE(status)) return isolate->heap()->undefined_value(); if (U_FAILURE(status)) return ReadOnlyRoots(isolate).undefined_value();
Handle<JSArray> result = factory->NewJSArray(0); Handle<JSArray> result = factory->NewJSArray(0);
int32_t length = formatted.length(); int32_t length = formatted.length();
...@@ -324,14 +324,14 @@ Object* FormatDateToParts(Isolate* isolate, icu::DateFormat* format, ...@@ -324,14 +324,14 @@ Object* FormatDateToParts(Isolate* isolate, icu::DateFormat* format,
if (previous_end_pos < begin_pos) { if (previous_end_pos < begin_pos) {
if (!AddElement(result, index, IcuDateFieldIdToDateType(-1, isolate), if (!AddElement(result, index, IcuDateFieldIdToDateType(-1, isolate),
formatted, previous_end_pos, begin_pos, isolate)) { formatted, previous_end_pos, begin_pos, isolate)) {
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
++index; ++index;
} }
if (!AddElement(result, index, if (!AddElement(result, index,
IcuDateFieldIdToDateType(fp.getField(), isolate), formatted, IcuDateFieldIdToDateType(fp.getField(), isolate), formatted,
begin_pos, end_pos, isolate)) { begin_pos, end_pos, isolate)) {
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
previous_end_pos = end_pos; previous_end_pos = end_pos;
++index; ++index;
...@@ -339,7 +339,7 @@ Object* FormatDateToParts(Isolate* isolate, icu::DateFormat* format, ...@@ -339,7 +339,7 @@ Object* FormatDateToParts(Isolate* isolate, icu::DateFormat* format,
if (previous_end_pos < length) { if (previous_end_pos < length) {
if (!AddElement(result, index, IcuDateFieldIdToDateType(-1, isolate), if (!AddElement(result, index, IcuDateFieldIdToDateType(-1, isolate),
formatted, previous_end_pos, length, isolate)) { formatted, previous_end_pos, length, isolate)) {
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
} }
JSObject::ValidateElements(*result); JSObject::ValidateElements(*result);
......
...@@ -43,7 +43,7 @@ BUILTIN(MathHypot) { ...@@ -43,7 +43,7 @@ BUILTIN(MathHypot) {
} }
if (one_arg_is_nan) { if (one_arg_is_nan) {
return isolate->heap()->nan_value(); return ReadOnlyRoots(isolate).nan_value();
} }
if (max == 0) { if (max == 0) {
......
...@@ -39,10 +39,10 @@ BUILTIN(NumberPrototypeToExponential) { ...@@ -39,10 +39,10 @@ BUILTIN(NumberPrototypeToExponential) {
isolate, fraction_digits, Object::ToInteger(isolate, fraction_digits)); isolate, fraction_digits, Object::ToInteger(isolate, fraction_digits));
double const fraction_digits_number = fraction_digits->Number(); double const fraction_digits_number = fraction_digits->Number();
if (std::isnan(value_number)) return isolate->heap()->NaN_string(); if (std::isnan(value_number)) return ReadOnlyRoots(isolate).NaN_string();
if (std::isinf(value_number)) { if (std::isinf(value_number)) {
return (value_number < 0.0) ? isolate->heap()->minus_Infinity_string() return (value_number < 0.0) ? ReadOnlyRoots(isolate).minus_Infinity_string()
: isolate->heap()->Infinity_string(); : ReadOnlyRoots(isolate).Infinity_string();
} }
if (fraction_digits_number < 0.0 || if (fraction_digits_number < 0.0 ||
fraction_digits_number > kMaxFractionDigits) { fraction_digits_number > kMaxFractionDigits) {
...@@ -93,10 +93,10 @@ BUILTIN(NumberPrototypeToFixed) { ...@@ -93,10 +93,10 @@ BUILTIN(NumberPrototypeToFixed) {
"toFixed() digits"))); "toFixed() digits")));
} }
if (std::isnan(value_number)) return isolate->heap()->NaN_string(); if (std::isnan(value_number)) return ReadOnlyRoots(isolate).NaN_string();
if (std::isinf(value_number)) { if (std::isinf(value_number)) {
return (value_number < 0.0) ? isolate->heap()->minus_Infinity_string() return (value_number < 0.0) ? ReadOnlyRoots(isolate).minus_Infinity_string()
: isolate->heap()->Infinity_string(); : ReadOnlyRoots(isolate).Infinity_string();
} }
char* const str = DoubleToFixedCString( char* const str = DoubleToFixedCString(
value_number, static_cast<int>(fraction_digits_number)); value_number, static_cast<int>(fraction_digits_number));
...@@ -155,10 +155,10 @@ BUILTIN(NumberPrototypeToPrecision) { ...@@ -155,10 +155,10 @@ BUILTIN(NumberPrototypeToPrecision) {
Object::ToInteger(isolate, precision)); Object::ToInteger(isolate, precision));
double const precision_number = precision->Number(); double const precision_number = precision->Number();
if (std::isnan(value_number)) return isolate->heap()->NaN_string(); if (std::isnan(value_number)) return ReadOnlyRoots(isolate).NaN_string();
if (std::isinf(value_number)) { if (std::isinf(value_number)) {
return (value_number < 0.0) ? isolate->heap()->minus_Infinity_string() return (value_number < 0.0) ? ReadOnlyRoots(isolate).minus_Infinity_string()
: isolate->heap()->Infinity_string(); : ReadOnlyRoots(isolate).Infinity_string();
} }
if (precision_number < 1.0 || precision_number > kMaxFractionDigits) { if (precision_number < 1.0 || precision_number > kMaxFractionDigits) {
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
...@@ -219,10 +219,10 @@ BUILTIN(NumberPrototypeToString) { ...@@ -219,10 +219,10 @@ BUILTIN(NumberPrototypeToString) {
} }
// Slow case. // Slow case.
if (std::isnan(value_number)) return isolate->heap()->NaN_string(); if (std::isnan(value_number)) return ReadOnlyRoots(isolate).NaN_string();
if (std::isinf(value_number)) { if (std::isinf(value_number)) {
return (value_number < 0.0) ? isolate->heap()->minus_Infinity_string() return (value_number < 0.0) ? ReadOnlyRoots(isolate).minus_Infinity_string()
: isolate->heap()->Infinity_string(); : ReadOnlyRoots(isolate).Infinity_string();
} }
char* const str = char* const str =
DoubleToRadixCString(value_number, static_cast<int>(radix_number)); DoubleToRadixCString(value_number, static_cast<int>(radix_number));
......
...@@ -29,8 +29,8 @@ BUILTIN(ObjectPrototypePropertyIsEnumerable) { ...@@ -29,8 +29,8 @@ BUILTIN(ObjectPrototypePropertyIsEnumerable) {
isolate, object, JSReceiver::ToObject(isolate, args.receiver())); isolate, object, JSReceiver::ToObject(isolate, args.receiver()));
Maybe<PropertyAttributes> maybe = Maybe<PropertyAttributes> maybe =
JSReceiver::GetOwnPropertyAttributes(object, name); JSReceiver::GetOwnPropertyAttributes(object, name);
if (maybe.IsNothing()) return isolate->heap()->exception(); if (maybe.IsNothing()) return ReadOnlyRoots(isolate).exception();
if (maybe.FromJust() == ABSENT) return isolate->heap()->false_value(); if (maybe.FromJust() == ABSENT) return ReadOnlyRoots(isolate).false_value();
return isolate->heap()->ToBoolean((maybe.FromJust() & DONT_ENUM) == 0); return isolate->heap()->ToBoolean((maybe.FromJust() & DONT_ENUM) == 0);
} }
...@@ -92,12 +92,12 @@ Object* ObjectDefineAccessor(Isolate* isolate, Handle<Object> object, ...@@ -92,12 +92,12 @@ Object* ObjectDefineAccessor(Isolate* isolate, Handle<Object> object,
// throwing an exception. // throwing an exception.
Maybe<bool> success = JSReceiver::DefineOwnProperty(isolate, receiver, name, Maybe<bool> success = JSReceiver::DefineOwnProperty(isolate, receiver, name,
&desc, kThrowOnError); &desc, kThrowOnError);
MAYBE_RETURN(success, isolate->heap()->exception()); MAYBE_RETURN(success, ReadOnlyRoots(isolate).exception());
if (!success.FromJust()) { if (!success.FromJust()) {
isolate->CountUsage(v8::Isolate::kDefineGetterOrSetterWouldThrow); isolate->CountUsage(v8::Isolate::kDefineGetterOrSetterWouldThrow);
} }
// 6. Return undefined. // 6. Return undefined.
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object, Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
...@@ -123,13 +123,13 @@ Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object, ...@@ -123,13 +123,13 @@ Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
if (it.HasAccess()) continue; if (it.HasAccess()) continue;
isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>());
RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
case LookupIterator::JSPROXY: { case LookupIterator::JSPROXY: {
PropertyDescriptor desc; PropertyDescriptor desc;
Maybe<bool> found = JSProxy::GetOwnPropertyDescriptor( Maybe<bool> found = JSProxy::GetOwnPropertyDescriptor(
isolate, it.GetHolder<JSProxy>(), it.GetName(), &desc); isolate, it.GetHolder<JSProxy>(), it.GetName(), &desc);
MAYBE_RETURN(found, isolate->heap()->exception()); MAYBE_RETURN(found, ReadOnlyRoots(isolate).exception());
if (found.FromJust()) { if (found.FromJust()) {
if (component == ACCESSOR_GETTER && desc.has_get()) { if (component == ACCESSOR_GETTER && desc.has_get()) {
return *desc.get(); return *desc.get();
...@@ -137,20 +137,20 @@ Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object, ...@@ -137,20 +137,20 @@ Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
if (component == ACCESSOR_SETTER && desc.has_set()) { if (component == ACCESSOR_SETTER && desc.has_set()) {
return *desc.set(); return *desc.set();
} }
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
Handle<Object> prototype; Handle<Object> prototype;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, prototype, JSProxy::GetPrototype(it.GetHolder<JSProxy>())); isolate, prototype, JSProxy::GetPrototype(it.GetHolder<JSProxy>()));
if (prototype->IsNull(isolate)) { if (prototype->IsNull(isolate)) {
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
return ObjectLookupAccessor(isolate, prototype, key, component); return ObjectLookupAccessor(isolate, prototype, key, component);
} }
case LookupIterator::INTEGER_INDEXED_EXOTIC: case LookupIterator::INTEGER_INDEXED_EXOTIC:
case LookupIterator::DATA: case LookupIterator::DATA:
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
case LookupIterator::ACCESSOR: { case LookupIterator::ACCESSOR: {
Handle<Object> maybe_pair = it.GetAccessors(); Handle<Object> maybe_pair = it.GetAccessors();
...@@ -162,7 +162,7 @@ Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object, ...@@ -162,7 +162,7 @@ Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
} }
} }
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
} // namespace } // namespace
...@@ -212,7 +212,7 @@ BUILTIN(ObjectFreeze) { ...@@ -212,7 +212,7 @@ BUILTIN(ObjectFreeze) {
if (object->IsJSReceiver()) { if (object->IsJSReceiver()) {
MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object),
FROZEN, kThrowOnError), FROZEN, kThrowOnError),
isolate->heap()->exception()); ReadOnlyRoots(isolate).exception());
} }
return *object; return *object;
} }
...@@ -257,7 +257,7 @@ BUILTIN(ObjectSetPrototypeOf) { ...@@ -257,7 +257,7 @@ BUILTIN(ObjectSetPrototypeOf) {
// 4. Let status be ? O.[[SetPrototypeOf]](proto). // 4. Let status be ? O.[[SetPrototypeOf]](proto).
// 5. If status is false, throw a TypeError exception. // 5. If status is false, throw a TypeError exception.
MAYBE_RETURN(JSReceiver::SetPrototype(receiver, proto, true, kThrowOnError), MAYBE_RETURN(JSReceiver::SetPrototype(receiver, proto, true, kThrowOnError),
isolate->heap()->exception()); ReadOnlyRoots(isolate).exception());
// 6. Return O. // 6. Return O.
return *receiver; return *receiver;
...@@ -291,20 +291,20 @@ BUILTIN(ObjectPrototypeSetProto) { ...@@ -291,20 +291,20 @@ BUILTIN(ObjectPrototypeSetProto) {
// 2. If Type(proto) is neither Object nor Null, return undefined. // 2. If Type(proto) is neither Object nor Null, return undefined.
Handle<Object> proto = args.at(1); Handle<Object> proto = args.at(1);
if (!proto->IsNull(isolate) && !proto->IsJSReceiver()) { if (!proto->IsNull(isolate) && !proto->IsJSReceiver()) {
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
// 3. If Type(O) is not Object, return undefined. // 3. If Type(O) is not Object, return undefined.
if (!object->IsJSReceiver()) return isolate->heap()->undefined_value(); if (!object->IsJSReceiver()) return ReadOnlyRoots(isolate).undefined_value();
Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
// 4. Let status be ? O.[[SetPrototypeOf]](proto). // 4. Let status be ? O.[[SetPrototypeOf]](proto).
// 5. If status is false, throw a TypeError exception. // 5. If status is false, throw a TypeError exception.
MAYBE_RETURN(JSReceiver::SetPrototype(receiver, proto, true, kThrowOnError), MAYBE_RETURN(JSReceiver::SetPrototype(receiver, proto, true, kThrowOnError),
isolate->heap()->exception()); ReadOnlyRoots(isolate).exception());
// Return undefined. // Return undefined.
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
namespace { namespace {
...@@ -339,7 +339,7 @@ BUILTIN(ObjectIsExtensible) { ...@@ -339,7 +339,7 @@ BUILTIN(ObjectIsExtensible) {
object->IsJSReceiver() object->IsJSReceiver()
? JSReceiver::IsExtensible(Handle<JSReceiver>::cast(object)) ? JSReceiver::IsExtensible(Handle<JSReceiver>::cast(object))
: Just(false); : Just(false);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return isolate->heap()->ToBoolean(result.FromJust()); return isolate->heap()->ToBoolean(result.FromJust());
} }
...@@ -351,7 +351,7 @@ BUILTIN(ObjectIsFrozen) { ...@@ -351,7 +351,7 @@ BUILTIN(ObjectIsFrozen) {
? JSReceiver::TestIntegrityLevel( ? JSReceiver::TestIntegrityLevel(
Handle<JSReceiver>::cast(object), FROZEN) Handle<JSReceiver>::cast(object), FROZEN)
: Just(true); : Just(true);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return isolate->heap()->ToBoolean(result.FromJust()); return isolate->heap()->ToBoolean(result.FromJust());
} }
...@@ -363,7 +363,7 @@ BUILTIN(ObjectIsSealed) { ...@@ -363,7 +363,7 @@ BUILTIN(ObjectIsSealed) {
? JSReceiver::TestIntegrityLevel( ? JSReceiver::TestIntegrityLevel(
Handle<JSReceiver>::cast(object), SEALED) Handle<JSReceiver>::cast(object), SEALED)
: Just(true); : Just(true);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return isolate->heap()->ToBoolean(result.FromJust()); return isolate->heap()->ToBoolean(result.FromJust());
} }
...@@ -389,7 +389,7 @@ BUILTIN(ObjectGetOwnPropertyDescriptors) { ...@@ -389,7 +389,7 @@ BUILTIN(ObjectGetOwnPropertyDescriptors) {
PropertyDescriptor descriptor; PropertyDescriptor descriptor;
Maybe<bool> did_get_descriptor = JSReceiver::GetOwnPropertyDescriptor( Maybe<bool> did_get_descriptor = JSReceiver::GetOwnPropertyDescriptor(
isolate, receiver, key, &descriptor); isolate, receiver, key, &descriptor);
MAYBE_RETURN(did_get_descriptor, isolate->heap()->exception()); MAYBE_RETURN(did_get_descriptor, ReadOnlyRoots(isolate).exception());
if (!did_get_descriptor.FromJust()) continue; if (!did_get_descriptor.FromJust()) continue;
Handle<Object> from_descriptor = descriptor.ToObject(isolate); Handle<Object> from_descriptor = descriptor.ToObject(isolate);
...@@ -411,7 +411,7 @@ BUILTIN(ObjectPreventExtensions) { ...@@ -411,7 +411,7 @@ BUILTIN(ObjectPreventExtensions) {
if (object->IsJSReceiver()) { if (object->IsJSReceiver()) {
MAYBE_RETURN(JSReceiver::PreventExtensions(Handle<JSReceiver>::cast(object), MAYBE_RETURN(JSReceiver::PreventExtensions(Handle<JSReceiver>::cast(object),
kThrowOnError), kThrowOnError),
isolate->heap()->exception()); ReadOnlyRoots(isolate).exception());
} }
return *object; return *object;
} }
...@@ -423,7 +423,7 @@ BUILTIN(ObjectSeal) { ...@@ -423,7 +423,7 @@ BUILTIN(ObjectSeal) {
if (object->IsJSReceiver()) { if (object->IsJSReceiver()) {
MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object),
SEALED, kThrowOnError), SEALED, kThrowOnError),
isolate->heap()->exception()); ReadOnlyRoots(isolate).exception());
} }
return *object; return *object;
} }
......
...@@ -38,12 +38,12 @@ BUILTIN(ReflectDefineProperty) { ...@@ -38,12 +38,12 @@ BUILTIN(ReflectDefineProperty) {
PropertyDescriptor desc; PropertyDescriptor desc;
if (!PropertyDescriptor::ToPropertyDescriptor(isolate, attributes, &desc)) { if (!PropertyDescriptor::ToPropertyDescriptor(isolate, attributes, &desc)) {
return isolate->heap()->exception(); return ReadOnlyRoots(isolate).exception();
} }
Maybe<bool> result = JSReceiver::DefineOwnProperty( Maybe<bool> result = JSReceiver::DefineOwnProperty(
isolate, Handle<JSReceiver>::cast(target), name, &desc, kDontThrow); isolate, Handle<JSReceiver>::cast(target), name, &desc, kDontThrow);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->ToBoolean(result.FromJust()); return *isolate->factory()->ToBoolean(result.FromJust());
} }
...@@ -67,7 +67,7 @@ BUILTIN(ReflectDeleteProperty) { ...@@ -67,7 +67,7 @@ BUILTIN(ReflectDeleteProperty) {
Maybe<bool> result = JSReceiver::DeletePropertyOrElement( Maybe<bool> result = JSReceiver::DeletePropertyOrElement(
Handle<JSReceiver>::cast(target), name, LanguageMode::kSloppy); Handle<JSReceiver>::cast(target), name, LanguageMode::kSloppy);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->ToBoolean(result.FromJust()); return *isolate->factory()->ToBoolean(result.FromJust());
} }
...@@ -115,8 +115,8 @@ BUILTIN(ReflectGetOwnPropertyDescriptor) { ...@@ -115,8 +115,8 @@ BUILTIN(ReflectGetOwnPropertyDescriptor) {
PropertyDescriptor desc; PropertyDescriptor desc;
Maybe<bool> found = JSReceiver::GetOwnPropertyDescriptor( Maybe<bool> found = JSReceiver::GetOwnPropertyDescriptor(
isolate, Handle<JSReceiver>::cast(target), name, &desc); isolate, Handle<JSReceiver>::cast(target), name, &desc);
MAYBE_RETURN(found, isolate->heap()->exception()); MAYBE_RETURN(found, ReadOnlyRoots(isolate).exception());
if (!found.FromJust()) return isolate->heap()->undefined_value(); if (!found.FromJust()) return ReadOnlyRoots(isolate).undefined_value();
return *desc.ToObject(isolate); return *desc.ToObject(isolate);
} }
...@@ -152,7 +152,7 @@ BUILTIN(ReflectIsExtensible) { ...@@ -152,7 +152,7 @@ BUILTIN(ReflectIsExtensible) {
Maybe<bool> result = Maybe<bool> result =
JSReceiver::IsExtensible(Handle<JSReceiver>::cast(target)); JSReceiver::IsExtensible(Handle<JSReceiver>::cast(target));
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->ToBoolean(result.FromJust()); return *isolate->factory()->ToBoolean(result.FromJust());
} }
...@@ -193,7 +193,7 @@ BUILTIN(ReflectPreventExtensions) { ...@@ -193,7 +193,7 @@ BUILTIN(ReflectPreventExtensions) {
Maybe<bool> result = JSReceiver::PreventExtensions( Maybe<bool> result = JSReceiver::PreventExtensions(
Handle<JSReceiver>::cast(target), kDontThrow); Handle<JSReceiver>::cast(target), kDontThrow);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->ToBoolean(result.FromJust()); return *isolate->factory()->ToBoolean(result.FromJust());
} }
...@@ -220,7 +220,7 @@ BUILTIN(ReflectSet) { ...@@ -220,7 +220,7 @@ BUILTIN(ReflectSet) {
isolate, receiver, name, Handle<JSReceiver>::cast(target)); isolate, receiver, name, Handle<JSReceiver>::cast(target));
Maybe<bool> result = Object::SetSuperProperty( Maybe<bool> result = Object::SetSuperProperty(
&it, value, LanguageMode::kSloppy, Object::MAY_BE_STORE_FROM_KEYED); &it, value, LanguageMode::kSloppy, Object::MAY_BE_STORE_FROM_KEYED);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->ToBoolean(result.FromJust()); return *isolate->factory()->ToBoolean(result.FromJust());
} }
...@@ -245,7 +245,7 @@ BUILTIN(ReflectSetPrototypeOf) { ...@@ -245,7 +245,7 @@ BUILTIN(ReflectSetPrototypeOf) {
Maybe<bool> result = JSReceiver::SetPrototype( Maybe<bool> result = JSReceiver::SetPrototype(
Handle<JSReceiver>::cast(target), proto, true, kDontThrow); Handle<JSReceiver>::cast(target), proto, true, kDontThrow);
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->ToBoolean(result.FromJust()); return *isolate->factory()->ToBoolean(result.FromJust());
} }
......
...@@ -82,7 +82,7 @@ DEFINE_CAPTURE_GETTER(9) ...@@ -82,7 +82,7 @@ DEFINE_CAPTURE_GETTER(9)
BUILTIN(RegExpInputGetter) { BUILTIN(RegExpInputGetter) {
HandleScope scope(isolate); HandleScope scope(isolate);
Handle<Object> obj(isolate->regexp_last_match_info()->LastInput(), isolate); Handle<Object> obj(isolate->regexp_last_match_info()->LastInput(), isolate);
return obj->IsUndefined(isolate) ? isolate->heap()->empty_string() return obj->IsUndefined(isolate) ? ReadOnlyRoots(isolate).empty_string()
: String::cast(*obj); : String::cast(*obj);
} }
...@@ -93,7 +93,7 @@ BUILTIN(RegExpInputSetter) { ...@@ -93,7 +93,7 @@ BUILTIN(RegExpInputSetter) {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, str, ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, str,
Object::ToString(isolate, value)); Object::ToString(isolate, value));
isolate->regexp_last_match_info()->SetLastInput(*str); isolate->regexp_last_match_info()->SetLastInput(*str);
return isolate->heap()->undefined_value(); return ReadOnlyRoots(isolate).undefined_value();
} }
// Getters for the static properties lastMatch, lastParen, leftContext, and // Getters for the static properties lastMatch, lastParen, leftContext, and
...@@ -110,7 +110,9 @@ BUILTIN(RegExpLastParenGetter) { ...@@ -110,7 +110,9 @@ BUILTIN(RegExpLastParenGetter) {
HandleScope scope(isolate); HandleScope scope(isolate);
Handle<RegExpMatchInfo> match_info = isolate->regexp_last_match_info(); Handle<RegExpMatchInfo> match_info = isolate->regexp_last_match_info();
const int length = match_info->NumberOfCaptureRegisters(); const int length = match_info->NumberOfCaptureRegisters();
if (length <= 2) return isolate->heap()->empty_string(); // No captures. if (length <= 2) {
return ReadOnlyRoots(isolate).empty_string(); // No captures.
}
DCHECK_EQ(0, length % 2); DCHECK_EQ(0, length % 2);
const int last_capture = (length / 2) - 1; const int last_capture = (length / 2) - 1;
......
...@@ -93,7 +93,7 @@ BUILTIN(AtomicsWake) { ...@@ -93,7 +93,7 @@ BUILTIN(AtomicsWake) {
isolate, sta, ValidateSharedIntegerTypedArray(isolate, array, true)); isolate, sta, ValidateSharedIntegerTypedArray(isolate, array, true));
Maybe<size_t> maybe_index = ValidateAtomicAccess(isolate, sta, index); Maybe<size_t> maybe_index = ValidateAtomicAccess(isolate, sta, index);
if (maybe_index.IsNothing()) return isolate->heap()->exception(); if (maybe_index.IsNothing()) return ReadOnlyRoots(isolate).exception();
size_t i = maybe_index.FromJust(); size_t i = maybe_index.FromJust();
uint32_t c; uint32_t c;
...@@ -130,7 +130,7 @@ BUILTIN(AtomicsWait) { ...@@ -130,7 +130,7 @@ BUILTIN(AtomicsWait) {
isolate, sta, ValidateSharedIntegerTypedArray(isolate, array, true)); isolate, sta, ValidateSharedIntegerTypedArray(isolate, array, true));
Maybe<size_t> maybe_index = ValidateAtomicAccess(isolate, sta, index); Maybe<size_t> maybe_index = ValidateAtomicAccess(isolate, sta, index);
if (maybe_index.IsNothing()) return isolate->heap()->exception(); if (maybe_index.IsNothing()) return ReadOnlyRoots(isolate).exception();
size_t i = maybe_index.FromJust(); size_t i = maybe_index.FromJust();
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value,
...@@ -139,13 +139,13 @@ BUILTIN(AtomicsWait) { ...@@ -139,13 +139,13 @@ BUILTIN(AtomicsWait) {
double timeout_number; double timeout_number;
if (timeout->IsUndefined(isolate)) { if (timeout->IsUndefined(isolate)) {
timeout_number = isolate->heap()->infinity_value()->Number(); timeout_number = ReadOnlyRoots(isolate).infinity_value()->Number();
} else { } else {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, timeout, ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, timeout,
Object::ToNumber(timeout)); Object::ToNumber(timeout));
timeout_number = timeout->Number(); timeout_number = timeout->Number();
if (std::isnan(timeout_number)) if (std::isnan(timeout_number))
timeout_number = isolate->heap()->infinity_value()->Number(); timeout_number = ReadOnlyRoots(isolate).infinity_value()->Number();
else if (timeout_number < 0) else if (timeout_number < 0)
timeout_number = 0; timeout_number = 0;
} }
......
...@@ -52,7 +52,7 @@ uc32 NextCodePoint(Isolate* isolate, BuiltinArguments args, int index) { ...@@ -52,7 +52,7 @@ uc32 NextCodePoint(Isolate* isolate, BuiltinArguments args, int index) {
BUILTIN(StringFromCodePoint) { BUILTIN(StringFromCodePoint) {
HandleScope scope(isolate); HandleScope scope(isolate);
int const length = args.length() - 1; int const length = args.length() - 1;
if (length == 0) return isolate->heap()->empty_string(); if (length == 0) return ReadOnlyRoots(isolate).empty_string();
DCHECK_LT(0, length); DCHECK_LT(0, length);
// Optimistically assume that the resulting String contains only one byte // Optimistically assume that the resulting String contains only one byte
...@@ -64,7 +64,7 @@ BUILTIN(StringFromCodePoint) { ...@@ -64,7 +64,7 @@ BUILTIN(StringFromCodePoint) {
for (index = 0; index < length; index++) { for (index = 0; index < length; index++) {
code = NextCodePoint(isolate, args, index); code = NextCodePoint(isolate, args, index);
if (code < 0) { if (code < 0) {
return isolate->heap()->exception(); return ReadOnlyRoots(isolate).exception();
} }
if (code > String::kMaxOneByteCharCode) { if (code > String::kMaxOneByteCharCode) {
break; break;
...@@ -94,7 +94,7 @@ BUILTIN(StringFromCodePoint) { ...@@ -94,7 +94,7 @@ BUILTIN(StringFromCodePoint) {
} }
code = NextCodePoint(isolate, args, index); code = NextCodePoint(isolate, args, index);
if (code < 0) { if (code < 0) {
return isolate->heap()->exception(); return ReadOnlyRoots(isolate).exception();
} }
} }
...@@ -122,7 +122,7 @@ BUILTIN(StringPrototypeEndsWith) { ...@@ -122,7 +122,7 @@ BUILTIN(StringPrototypeEndsWith) {
Maybe<bool> is_reg_exp = RegExpUtils::IsRegExp(isolate, search); Maybe<bool> is_reg_exp = RegExpUtils::IsRegExp(isolate, search);
if (is_reg_exp.IsNothing()) { if (is_reg_exp.IsNothing()) {
DCHECK(isolate->has_pending_exception()); DCHECK(isolate->has_pending_exception());
return isolate->heap()->exception(); return ReadOnlyRoots(isolate).exception();
} }
if (is_reg_exp.FromJust()) { if (is_reg_exp.FromJust()) {
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
...@@ -146,7 +146,7 @@ BUILTIN(StringPrototypeEndsWith) { ...@@ -146,7 +146,7 @@ BUILTIN(StringPrototypeEndsWith) {
} }
int start = end - search_string->length(); int start = end - search_string->length();
if (start < 0) return isolate->heap()->false_value(); if (start < 0) return ReadOnlyRoots(isolate).false_value();
str = String::Flatten(isolate, str); str = String::Flatten(isolate, str);
search_string = String::Flatten(isolate, search_string); search_string = String::Flatten(isolate, search_string);
...@@ -169,10 +169,10 @@ BUILTIN(StringPrototypeEndsWith) { ...@@ -169,10 +169,10 @@ BUILTIN(StringPrototypeEndsWith) {
for (int i = 0; i < search_string->length(); i++) { for (int i = 0; i < search_string->length(); i++) {
if (str_reader.Get(start + i) != search_reader.Get(i)) { if (str_reader.Get(start + i) != search_reader.Get(i)) {
return isolate->heap()->false_value(); return ReadOnlyRoots(isolate).false_value();
} }
} }
return isolate->heap()->true_value(); return ReadOnlyRoots(isolate).true_value();
} }
// ES6 section 21.1.3.9 // ES6 section 21.1.3.9
...@@ -280,7 +280,7 @@ BUILTIN(StringPrototypeStartsWith) { ...@@ -280,7 +280,7 @@ BUILTIN(StringPrototypeStartsWith) {
Maybe<bool> is_reg_exp = RegExpUtils::IsRegExp(isolate, search); Maybe<bool> is_reg_exp = RegExpUtils::IsRegExp(isolate, search);
if (is_reg_exp.IsNothing()) { if (is_reg_exp.IsNothing()) {
DCHECK(isolate->has_pending_exception()); DCHECK(isolate->has_pending_exception());
return isolate->heap()->exception(); return ReadOnlyRoots(isolate).exception();
} }
if (is_reg_exp.FromJust()) { if (is_reg_exp.FromJust()) {
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
...@@ -304,7 +304,7 @@ BUILTIN(StringPrototypeStartsWith) { ...@@ -304,7 +304,7 @@ BUILTIN(StringPrototypeStartsWith) {
} }
if (start + search_string->length() > str->length()) { if (start + search_string->length() > str->length()) {
return isolate->heap()->false_value(); return ReadOnlyRoots(isolate).false_value();
} }
FlatStringReader str_reader(isolate, String::Flatten(isolate, str)); FlatStringReader str_reader(isolate, String::Flatten(isolate, str));
...@@ -313,10 +313,10 @@ BUILTIN(StringPrototypeStartsWith) { ...@@ -313,10 +313,10 @@ BUILTIN(StringPrototypeStartsWith) {
for (int i = 0; i < search_string->length(); i++) { for (int i = 0; i < search_string->length(); i++) {
if (str_reader.Get(start + i) != search_reader.Get(i)) { if (str_reader.Get(start + i) != search_reader.Get(i)) {
return isolate->heap()->false_value(); return ReadOnlyRoots(isolate).false_value();
} }
} }
return isolate->heap()->true_value(); return ReadOnlyRoots(isolate).true_value();
} }
#ifndef V8_INTL_SUPPORT #ifndef V8_INTL_SUPPORT
......
...@@ -57,7 +57,7 @@ BUILTIN(SymbolKeyFor) { ...@@ -57,7 +57,7 @@ BUILTIN(SymbolKeyFor) {
result = symbol->name(); result = symbol->name();
DCHECK(result->IsString()); DCHECK(result->IsString());
} else { } else {
result = isolate->heap()->undefined_value(); result = ReadOnlyRoots(isolate).undefined_value();
} }
DCHECK_EQ(isolate->heap()->public_symbol_table()->SlowReverseLookup(*symbol), DCHECK_EQ(isolate->heap()->public_symbol_table()->SlowReverseLookup(*symbol),
result); result);
......
...@@ -170,10 +170,10 @@ BUILTIN(TypedArrayPrototypeIncludes) { ...@@ -170,10 +170,10 @@ BUILTIN(TypedArrayPrototypeIncludes) {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, array, JSTypedArray::Validate(isolate, args.receiver(), method)); isolate, array, JSTypedArray::Validate(isolate, args.receiver(), method));
if (args.length() < 2) return isolate->heap()->false_value(); if (args.length() < 2) return ReadOnlyRoots(isolate).false_value();
int64_t len = array->length_value(); int64_t len = array->length_value();
if (len == 0) return isolate->heap()->false_value(); if (len == 0) return ReadOnlyRoots(isolate).false_value();
int64_t index = 0; int64_t index = 0;
if (args.length() > 2) { if (args.length() > 2) {
...@@ -184,14 +184,15 @@ BUILTIN(TypedArrayPrototypeIncludes) { ...@@ -184,14 +184,15 @@ BUILTIN(TypedArrayPrototypeIncludes) {
} }
// TODO(cwhan.tunz): throw. See the above comment in CopyWithin. // TODO(cwhan.tunz): throw. See the above comment in CopyWithin.
if (V8_UNLIKELY(array->WasNeutered())) return isolate->heap()->false_value(); if (V8_UNLIKELY(array->WasNeutered()))
return ReadOnlyRoots(isolate).false_value();
Handle<Object> search_element = args.atOrUndefined(isolate, 1); Handle<Object> search_element = args.atOrUndefined(isolate, 1);
ElementsAccessor* elements = array->GetElementsAccessor(); ElementsAccessor* elements = array->GetElementsAccessor();
Maybe<bool> result = elements->IncludesValue(isolate, array, search_element, Maybe<bool> result = elements->IncludesValue(isolate, array, search_element,
static_cast<uint32_t>(index), static_cast<uint32_t>(index),
static_cast<uint32_t>(len)); static_cast<uint32_t>(len));
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->ToBoolean(result.FromJust()); return *isolate->factory()->ToBoolean(result.FromJust());
} }
...@@ -222,7 +223,7 @@ BUILTIN(TypedArrayPrototypeIndexOf) { ...@@ -222,7 +223,7 @@ BUILTIN(TypedArrayPrototypeIndexOf) {
Maybe<int64_t> result = elements->IndexOfValue(isolate, array, search_element, Maybe<int64_t> result = elements->IndexOfValue(isolate, array, search_element,
static_cast<uint32_t>(index), static_cast<uint32_t>(index),
static_cast<uint32_t>(len)); static_cast<uint32_t>(len));
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->NewNumberFromInt64(result.FromJust()); return *isolate->factory()->NewNumberFromInt64(result.FromJust());
} }
...@@ -256,7 +257,7 @@ BUILTIN(TypedArrayPrototypeLastIndexOf) { ...@@ -256,7 +257,7 @@ BUILTIN(TypedArrayPrototypeLastIndexOf) {
ElementsAccessor* elements = array->GetElementsAccessor(); ElementsAccessor* elements = array->GetElementsAccessor();
Maybe<int64_t> result = elements->LastIndexOfValue( Maybe<int64_t> result = elements->LastIndexOfValue(
isolate, array, search_element, static_cast<uint32_t>(index)); isolate, array, search_element, static_cast<uint32_t>(index));
MAYBE_RETURN(result, isolate->heap()->exception()); MAYBE_RETURN(result, ReadOnlyRoots(isolate).exception());
return *isolate->factory()->NewNumberFromInt64(result.FromJust()); return *isolate->factory()->NewNumberFromInt64(result.FromJust());
} }
......
...@@ -12,7 +12,7 @@ namespace internal { ...@@ -12,7 +12,7 @@ namespace internal {
BuiltinsConstantsTableBuilder::BuiltinsConstantsTableBuilder(Isolate* isolate) BuiltinsConstantsTableBuilder::BuiltinsConstantsTableBuilder(Isolate* isolate)
: isolate_(isolate), map_(isolate->heap()) { : isolate_(isolate), map_(isolate->heap()) {
// Ensure this is only called once per Isolate. // Ensure this is only called once per Isolate.
DCHECK_EQ(isolate_->heap()->empty_fixed_array(), DCHECK_EQ(ReadOnlyRoots(isolate_).empty_fixed_array(),
isolate_->heap()->builtins_constants_table()); isolate_->heap()->builtins_constants_table());
// And that the initial value of the builtins constants table can be treated // And that the initial value of the builtins constants table can be treated
...@@ -30,7 +30,7 @@ uint32_t BuiltinsConstantsTableBuilder::AddObject(Handle<Object> object) { ...@@ -30,7 +30,7 @@ uint32_t BuiltinsConstantsTableBuilder::AddObject(Handle<Object> object) {
DCHECK(!isolate_->heap()->IsRootHandle(object, &root_list_index)); DCHECK(!isolate_->heap()->IsRootHandle(object, &root_list_index));
// Not yet finalized. // Not yet finalized.
DCHECK_EQ(isolate_->heap()->empty_fixed_array(), DCHECK_EQ(ReadOnlyRoots(isolate_).empty_fixed_array(),
isolate_->heap()->builtins_constants_table()); isolate_->heap()->builtins_constants_table());
// Must be on the main thread. // Must be on the main thread.
...@@ -60,7 +60,7 @@ void BuiltinsConstantsTableBuilder::PatchSelfReference( ...@@ -60,7 +60,7 @@ void BuiltinsConstantsTableBuilder::PatchSelfReference(
DCHECK(!isolate_->heap()->IsRootHandle(code_object, &root_list_index)); DCHECK(!isolate_->heap()->IsRootHandle(code_object, &root_list_index));
// Not yet finalized. // Not yet finalized.
DCHECK_EQ(isolate_->heap()->empty_fixed_array(), DCHECK_EQ(ReadOnlyRoots(isolate_).empty_fixed_array(),
isolate_->heap()->builtins_constants_table()); isolate_->heap()->builtins_constants_table());
DCHECK(isolate_->serializer_enabled()); DCHECK(isolate_->serializer_enabled());
...@@ -72,7 +72,7 @@ void BuiltinsConstantsTableBuilder::PatchSelfReference( ...@@ -72,7 +72,7 @@ void BuiltinsConstantsTableBuilder::PatchSelfReference(
// During indirection generation, we always create a distinct marker for each // During indirection generation, we always create a distinct marker for each
// macro assembler. The canonical marker is only used when not generating a // macro assembler. The canonical marker is only used when not generating a
// snapshot. // snapshot.
DCHECK(*self_reference != isolate_->heap()->self_reference_marker()); DCHECK(*self_reference != ReadOnlyRoots(isolate_).self_reference_marker());
#endif #endif
uint32_t key; uint32_t key;
...@@ -85,7 +85,7 @@ void BuiltinsConstantsTableBuilder::PatchSelfReference( ...@@ -85,7 +85,7 @@ void BuiltinsConstantsTableBuilder::PatchSelfReference(
void BuiltinsConstantsTableBuilder::Finalize() { void BuiltinsConstantsTableBuilder::Finalize() {
HandleScope handle_scope(isolate_); HandleScope handle_scope(isolate_);
DCHECK_EQ(isolate_->heap()->empty_fixed_array(), DCHECK_EQ(ReadOnlyRoots(isolate_).empty_fixed_array(),
isolate_->heap()->builtins_constants_table()); isolate_->heap()->builtins_constants_table());
DCHECK(isolate_->serializer_enabled()); DCHECK(isolate_->serializer_enabled());
...@@ -112,8 +112,8 @@ void BuiltinsConstantsTableBuilder::Finalize() { ...@@ -112,8 +112,8 @@ void BuiltinsConstantsTableBuilder::Finalize() {
#ifdef DEBUG #ifdef DEBUG
for (int i = 0; i < map_.size(); i++) { for (int i = 0; i < map_.size(); i++) {
DCHECK(table->get(i)->IsHeapObject()); DCHECK(table->get(i)->IsHeapObject());
DCHECK_NE(isolate_->heap()->undefined_value(), table->get(i)); DCHECK_NE(ReadOnlyRoots(isolate_).undefined_value(), table->get(i));
DCHECK_NE(isolate_->heap()->self_reference_marker(), table->get(i)); DCHECK_NE(ReadOnlyRoots(isolate_).self_reference_marker(), table->get(i));
} }
#endif #endif
......
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