Commit c0d6659d authored by Camillo Bruni's avatar Camillo Bruni Committed by Commit Bot

[runtime] Cleanup: Use some more early returns

Change-Id: I5effe97c53ccae3238a452fe2012926db45d2afe
Reviewed-on: https://chromium-review.googlesource.com/1165222
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Reviewed-by: 's avatarSathya Gunasekaran <gsathya@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54978}
parent b6f525ae
...@@ -63,20 +63,20 @@ BUILTIN(ArrayBufferConstructor) { ...@@ -63,20 +63,20 @@ BUILTIN(ArrayBufferConstructor) {
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
isolate, NewTypeError(MessageTemplate::kConstructorNotFunction, isolate, NewTypeError(MessageTemplate::kConstructorNotFunction,
handle(target->shared()->Name(), isolate))); handle(target->shared()->Name(), isolate)));
} else { // [[Construct]] }
Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target()); // [[Construct]]
Handle<Object> length = args.atOrUndefined(isolate, 1); Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target());
Handle<Object> length = args.atOrUndefined(isolate, 1);
Handle<Object> number_length;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_length, Handle<Object> number_length;
Object::ToInteger(isolate, length)); ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, number_length,
if (number_length->Number() < 0.0) { Object::ToInteger(isolate, length));
THROW_NEW_ERROR_RETURN_FAILURE( if (number_length->Number() < 0.0) {
isolate, NewRangeError(MessageTemplate::kInvalidArrayBufferLength)); THROW_NEW_ERROR_RETURN_FAILURE(
isolate, NewRangeError(MessageTemplate::kInvalidArrayBufferLength));
} }
return ConstructBuffer(isolate, target, new_target, number_length, true); return ConstructBuffer(isolate, target, new_target, number_length, true);
}
} }
// This is a helper to construct an ArrayBuffer with uinitialized memory. // This is a helper to construct an ArrayBuffer with uinitialized memory.
......
...@@ -13,26 +13,26 @@ namespace internal { ...@@ -13,26 +13,26 @@ namespace internal {
BUILTIN(BigIntConstructor) { BUILTIN(BigIntConstructor) {
HandleScope scope(isolate); HandleScope scope(isolate);
if (args.new_target()->IsUndefined(isolate)) { // [[Call]] if (!args.new_target()->IsUndefined(isolate)) { // [[Construct]]
Handle<Object> value = args.atOrUndefined(isolate, 1);
if (value->IsJSReceiver()) {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, value,
JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(value),
ToPrimitiveHint::kNumber));
}
if (value->IsNumber()) {
RETURN_RESULT_OR_FAILURE(isolate, BigInt::FromNumber(isolate, value));
} else {
RETURN_RESULT_OR_FAILURE(isolate, BigInt::FromObject(isolate, value));
}
} else { // [[Construct]]
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
isolate, NewTypeError(MessageTemplate::kNotConstructor, isolate, NewTypeError(MessageTemplate::kNotConstructor,
isolate->factory()->BigInt_string())); isolate->factory()->BigInt_string()));
} }
// [[Call]]
Handle<Object> value = args.atOrUndefined(isolate, 1);
if (value->IsJSReceiver()) {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, value,
JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(value),
ToPrimitiveHint::kNumber));
}
if (value->IsNumber()) {
RETURN_RESULT_OR_FAILURE(isolate, BigInt::FromNumber(isolate, value));
} else {
RETURN_RESULT_OR_FAILURE(isolate, BigInt::FromObject(isolate, value));
}
} }
BUILTIN(BigIntAsUintN) { BUILTIN(BigIntAsUintN) {
......
...@@ -19,19 +19,18 @@ BUILTIN(BooleanConstructor) { ...@@ -19,19 +19,18 @@ BUILTIN(BooleanConstructor) {
if (args.new_target()->IsUndefined(isolate)) { // [[Call]] if (args.new_target()->IsUndefined(isolate)) { // [[Call]]
Handle<Object> value = args.atOrUndefined(isolate, 1); Handle<Object> value = args.atOrUndefined(isolate, 1);
return isolate->heap()->ToBoolean(value->BooleanValue(isolate)); return isolate->heap()->ToBoolean(value->BooleanValue(isolate));
} else { // [[Construct]]
HandleScope scope(isolate);
Handle<Object> value = args.atOrUndefined(isolate, 1);
Handle<JSFunction> target = args.target();
Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target());
DCHECK(*target == target->native_context()->boolean_function());
Handle<JSObject> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
JSObject::New(target, new_target));
Handle<JSValue>::cast(result)->set_value(
isolate->heap()->ToBoolean(value->BooleanValue(isolate)));
return *result;
} }
// [[Construct]]
Handle<Object> value = args.atOrUndefined(isolate, 1);
Handle<JSFunction> target = args.target();
Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target());
DCHECK(*target == target->native_context()->boolean_function());
Handle<JSObject> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
JSObject::New(target, new_target));
Handle<JSValue>::cast(result)->set_value(
isolate->heap()->ToBoolean(value->BooleanValue(isolate)));
return *result;
} }
} // namespace internal } // namespace internal
......
...@@ -25,84 +25,84 @@ BUILTIN(DataViewConstructor) { ...@@ -25,84 +25,84 @@ BUILTIN(DataViewConstructor) {
isolate, NewTypeError(MessageTemplate::kConstructorNotFunction, isolate, NewTypeError(MessageTemplate::kConstructorNotFunction,
isolate->factory()->NewStringFromAsciiChecked( isolate->factory()->NewStringFromAsciiChecked(
"DataView"))); "DataView")));
} else { // [[Construct]] }
Handle<JSFunction> target = args.target(); // [[Construct]]
Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target()); Handle<JSFunction> target = args.target();
Handle<Object> buffer = args.atOrUndefined(isolate, 1); Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target());
Handle<Object> byte_offset = args.atOrUndefined(isolate, 2); Handle<Object> buffer = args.atOrUndefined(isolate, 1);
Handle<Object> byte_length = args.atOrUndefined(isolate, 3); Handle<Object> byte_offset = args.atOrUndefined(isolate, 2);
Handle<Object> byte_length = args.atOrUndefined(isolate, 3);
// 2. If Type(buffer) is not Object, throw a TypeError exception.
// 3. If buffer does not have an [[ArrayBufferData]] internal slot, throw a // 2. If Type(buffer) is not Object, throw a TypeError exception.
// TypeError exception. // 3. If buffer does not have an [[ArrayBufferData]] internal slot, throw a
if (!buffer->IsJSArrayBuffer()) { // TypeError exception.
THROW_NEW_ERROR_RETURN_FAILURE( if (!buffer->IsJSArrayBuffer()) {
isolate, NewTypeError(MessageTemplate::kDataViewNotArrayBuffer)); THROW_NEW_ERROR_RETURN_FAILURE(
} isolate, NewTypeError(MessageTemplate::kDataViewNotArrayBuffer));
Handle<JSArrayBuffer> array_buffer = Handle<JSArrayBuffer>::cast(buffer); }
Handle<JSArrayBuffer> array_buffer = Handle<JSArrayBuffer>::cast(buffer);
// 4. Let offset be ? ToIndex(byteOffset). // 4. Let offset be ? ToIndex(byteOffset).
Handle<Object> offset; Handle<Object> offset;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, offset, isolate, offset,
Object::ToIndex(isolate, byte_offset, MessageTemplate::kInvalidOffset)); Object::ToIndex(isolate, byte_offset, MessageTemplate::kInvalidOffset));
// 5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. // 5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
// We currently violate the specification at this point. TODO: Fix that. // We currently violate the specification at this point. TODO: Fix that.
// 6. Let bufferByteLength be the value of buffer's // 6. Let bufferByteLength be the value of buffer's
// [[ArrayBufferByteLength]] internal slot. // [[ArrayBufferByteLength]] internal slot.
double const buffer_byte_length = array_buffer->byte_length()->Number(); double const buffer_byte_length = array_buffer->byte_length()->Number();
// 7. If offset > bufferByteLength, throw a RangeError exception. // 7. If offset > bufferByteLength, throw a RangeError exception.
if (offset->Number() > buffer_byte_length) { if (offset->Number() > buffer_byte_length) {
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
isolate, NewRangeError(MessageTemplate::kInvalidOffset, offset)); isolate, NewRangeError(MessageTemplate::kInvalidOffset, offset));
} }
Handle<Object> view_byte_length; Handle<Object> view_byte_length;
if (byte_length->IsUndefined(isolate)) { if (byte_length->IsUndefined(isolate)) {
// 8. If byteLength is either not present or undefined, then // 8. If byteLength is either not present or undefined, then
// a. Let viewByteLength be bufferByteLength - offset. // a. Let viewByteLength be bufferByteLength - offset.
view_byte_length = view_byte_length =
isolate->factory()->NewNumber(buffer_byte_length - offset->Number()); isolate->factory()->NewNumber(buffer_byte_length - offset->Number());
} else { } else {
// 9. Else, // 9. Else,
// a. Let viewByteLength be ? ToIndex(byteLength). // a. Let viewByteLength be ? ToIndex(byteLength).
// b. If offset+viewByteLength > bufferByteLength, throw a // b. If offset+viewByteLength > bufferByteLength, throw a
// RangeError exception. // RangeError exception.
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, view_byte_length, isolate, view_byte_length,
Object::ToIndex(isolate, byte_length, Object::ToIndex(isolate, byte_length,
MessageTemplate::kInvalidDataViewLength)); MessageTemplate::kInvalidDataViewLength));
if (offset->Number() + view_byte_length->Number() > buffer_byte_length) { if (offset->Number() + view_byte_length->Number() > buffer_byte_length) {
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
isolate, NewRangeError(MessageTemplate::kInvalidDataViewLength)); isolate, NewRangeError(MessageTemplate::kInvalidDataViewLength));
}
} }
}
// 10. Let O be ? OrdinaryCreateFromConstructor(NewTarget, // 10. Let O be ? OrdinaryCreateFromConstructor(NewTarget,
// "%DataViewPrototype%", «[[DataView]], [[ViewedArrayBuffer]], // "%DataViewPrototype%", «[[DataView]], [[ViewedArrayBuffer]],
// [[ByteLength]], [[ByteOffset]]»). // [[ByteLength]], [[ByteOffset]]»).
Handle<JSObject> result; Handle<JSObject> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
JSObject::New(target, new_target)); JSObject::New(target, new_target));
for (int i = 0; i < ArrayBufferView::kEmbedderFieldCount; ++i) { for (int i = 0; i < ArrayBufferView::kEmbedderFieldCount; ++i) {
Handle<JSDataView>::cast(result)->SetEmbedderField(i, Smi::kZero); Handle<JSDataView>::cast(result)->SetEmbedderField(i, Smi::kZero);
} }
// 11. Set O's [[ViewedArrayBuffer]] internal slot to buffer. // 11. Set O's [[ViewedArrayBuffer]] internal slot to buffer.
Handle<JSDataView>::cast(result)->set_buffer(*array_buffer); Handle<JSDataView>::cast(result)->set_buffer(*array_buffer);
// 12. Set O's [[ByteLength]] internal slot to viewByteLength. // 12. Set O's [[ByteLength]] internal slot to viewByteLength.
Handle<JSDataView>::cast(result)->set_byte_length(*view_byte_length); Handle<JSDataView>::cast(result)->set_byte_length(*view_byte_length);
// 13. Set O's [[ByteOffset]] internal slot to offset. // 13. Set O's [[ByteOffset]] internal slot to offset.
Handle<JSDataView>::cast(result)->set_byte_offset(*offset); Handle<JSDataView>::cast(result)->set_byte_offset(*offset);
// 14. Return O. // 14. Return O.
return *result; return *result;
}
} }
} // namespace internal } // namespace internal
......
...@@ -195,86 +195,84 @@ BUILTIN(DateConstructor) { ...@@ -195,86 +195,84 @@ BUILTIN(DateConstructor) {
ToDateString(time_val, ArrayVector(buffer), isolate->date_cache()); ToDateString(time_val, ArrayVector(buffer), isolate->date_cache());
RETURN_RESULT_OR_FAILURE( RETURN_RESULT_OR_FAILURE(
isolate, isolate->factory()->NewStringFromUtf8(CStrVector(buffer))); isolate, isolate->factory()->NewStringFromUtf8(CStrVector(buffer)));
} else { }
int const argc = args.length() - 1; // [Construct]
Handle<JSFunction> target = args.target(); int const argc = args.length() - 1;
Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target()); Handle<JSFunction> target = args.target();
double time_val; Handle<JSReceiver> new_target = Handle<JSReceiver>::cast(args.new_target());
if (argc == 0) { double time_val;
time_val = JSDate::CurrentTimeValue(isolate); if (argc == 0) {
} else if (argc == 1) { time_val = JSDate::CurrentTimeValue(isolate);
Handle<Object> value = args.at(1); } else if (argc == 1) {
if (value->IsJSDate()) { Handle<Object> value = args.at(1);
time_val = Handle<JSDate>::cast(value)->value()->Number(); if (value->IsJSDate()) {
time_val = Handle<JSDate>::cast(value)->value()->Number();
} else {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value,
Object::ToPrimitive(value));
if (value->IsString()) {
time_val = ParseDateTimeString(isolate, Handle<String>::cast(value));
} else { } else {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value,
Object::ToPrimitive(value)); Object::ToNumber(isolate, value));
if (value->IsString()) { time_val = value->Number();
time_val = ParseDateTimeString(isolate, Handle<String>::cast(value));
} else {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value,
Object::ToNumber(isolate, value));
time_val = value->Number();
}
} }
} else { }
Handle<Object> year_object; } else {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, year_object, Handle<Object> year_object;
Object::ToNumber(isolate, args.at(1))); ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, year_object,
Handle<Object> month_object; Object::ToNumber(isolate, args.at(1)));
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, month_object, Handle<Object> month_object;
Object::ToNumber(isolate, args.at(2))); ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, month_object,
double year = year_object->Number(); Object::ToNumber(isolate, args.at(2)));
double month = month_object->Number(); double year = year_object->Number();
double date = 1.0, hours = 0.0, minutes = 0.0, seconds = 0.0, ms = 0.0; double month = month_object->Number();
if (argc >= 3) { double date = 1.0, hours = 0.0, minutes = 0.0, seconds = 0.0, ms = 0.0;
Handle<Object> date_object; if (argc >= 3) {
Handle<Object> date_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, date_object,
Object::ToNumber(isolate, args.at(3)));
date = date_object->Number();
if (argc >= 4) {
Handle<Object> hours_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, date_object, Object::ToNumber(isolate, args.at(3))); isolate, hours_object, Object::ToNumber(isolate, args.at(4)));
date = date_object->Number(); hours = hours_object->Number();
if (argc >= 4) { if (argc >= 5) {
Handle<Object> hours_object; Handle<Object> minutes_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, hours_object, Object::ToNumber(isolate, args.at(4))); isolate, minutes_object, Object::ToNumber(isolate, args.at(5)));
hours = hours_object->Number(); minutes = minutes_object->Number();
if (argc >= 5) { if (argc >= 6) {
Handle<Object> minutes_object; Handle<Object> seconds_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, minutes_object, Object::ToNumber(isolate, args.at(5))); isolate, seconds_object, Object::ToNumber(isolate, args.at(6)));
minutes = minutes_object->Number(); seconds = seconds_object->Number();
if (argc >= 6) { if (argc >= 7) {
Handle<Object> seconds_object; Handle<Object> ms_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, seconds_object, isolate, ms_object, Object::ToNumber(isolate, args.at(7)));
Object::ToNumber(isolate, args.at(6))); ms = ms_object->Number();
seconds = seconds_object->Number();
if (argc >= 7) {
Handle<Object> ms_object;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, ms_object, Object::ToNumber(isolate, args.at(7)));
ms = ms_object->Number();
}
} }
} }
} }
} }
if (!std::isnan(year)) {
double const y = DoubleToInteger(year);
if (0.0 <= y && y <= 99) year = 1900 + y;
}
double const day = MakeDay(year, month, date);
double const time = MakeTime(hours, minutes, seconds, ms);
time_val = MakeDate(day, time);
if (time_val >= -DateCache::kMaxTimeBeforeUTCInMs &&
time_val <= DateCache::kMaxTimeBeforeUTCInMs) {
time_val = isolate->date_cache()->ToUTC(static_cast<int64_t>(time_val));
} else {
time_val = std::numeric_limits<double>::quiet_NaN();
}
} }
RETURN_RESULT_OR_FAILURE(isolate, if (!std::isnan(year)) {
JSDate::New(target, new_target, time_val)); double const y = DoubleToInteger(year);
if (0.0 <= y && y <= 99) year = 1900 + y;
}
double const day = MakeDay(year, month, date);
double const time = MakeTime(hours, minutes, seconds, ms);
time_val = MakeDate(day, time);
if (time_val >= -DateCache::kMaxTimeBeforeUTCInMs &&
time_val <= DateCache::kMaxTimeBeforeUTCInMs) {
time_val = isolate->date_cache()->ToUTC(static_cast<int64_t>(time_val));
} else {
time_val = std::numeric_limits<double>::quiet_NaN();
}
} }
RETURN_RESULT_OR_FAILURE(isolate, JSDate::New(target, new_target, time_val));
} }
// ES6 section 20.3.3.1 Date.now ( ) // ES6 section 20.3.3.1 Date.now ( )
......
...@@ -16,20 +16,20 @@ namespace internal { ...@@ -16,20 +16,20 @@ namespace internal {
// ES #sec-symbol-constructor // ES #sec-symbol-constructor
BUILTIN(SymbolConstructor) { BUILTIN(SymbolConstructor) {
HandleScope scope(isolate); HandleScope scope(isolate);
if (args.new_target()->IsUndefined(isolate)) { // [[Call]] if (!args.new_target()->IsUndefined(isolate)) { // [[Construct]]
Handle<Symbol> result = isolate->factory()->NewSymbol();
Handle<Object> description = args.atOrUndefined(isolate, 1);
if (!description->IsUndefined(isolate)) {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, description, Object::ToString(isolate, description));
result->set_name(*description);
}
return *result;
} else { // [[Construct]]
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
isolate, NewTypeError(MessageTemplate::kNotConstructor, isolate, NewTypeError(MessageTemplate::kNotConstructor,
isolate->factory()->Symbol_string())); isolate->factory()->Symbol_string()));
} }
// [[Call]]
Handle<Symbol> result = isolate->factory()->NewSymbol();
Handle<Object> description = args.atOrUndefined(isolate, 1);
if (!description->IsUndefined(isolate)) {
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, description,
Object::ToString(isolate, description));
result->set_name(*description);
}
return *result;
} }
// ES6 section 19.4.2.1 Symbol.for. // ES6 section 19.4.2.1 Symbol.for.
......
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