#include "src/objects/option-utils.h"
#include "src/numbers/conversions.h"
#include "src/objects/objects-inl.h"
namespace v8 {
namespace internal {
MaybeDirectHandle<JSReceiver> GetOptionsObject(Isolate* isolate,
DirectHandle<Object> options,
const char* method_name) {
if (IsUndefined(*options, isolate)) {
return isolate->factory()->NewJSObjectWithNullProto();
}
if (IsJSReceiver(*options)) {
return Cast<JSReceiver>(options);
}
THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kInvalidArgument));
}
MaybeDirectHandle<JSReceiver> CoerceOptionsToObject(
Isolate* isolate, DirectHandle<Object> options, const char* method_name) {
if (IsUndefined(*options, isolate)) {
return isolate->factory()->NewJSObjectWithNullProto();
}
ASSIGN_RETURN_ON_EXCEPTION(isolate, options,
Object::ToObject(isolate, options, method_name));
return Cast<JSReceiver>(options);
}
Maybe<bool> GetStringOption(Isolate* isolate, DirectHandle<JSReceiver> options,
DirectHandle<String> property,
const char* method_name,
DirectHandle<String>* result) {
DirectHandle<Object> value;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, value, Object::GetPropertyOrElement(isolate, options, property));
if (IsUndefined(*value, isolate)) {
return Just(false);
}
DirectHandle<String> value_str;
ASSIGN_RETURN_ON_EXCEPTION(isolate, value_str,
Object::ToString(isolate, value));
*result = value_str;
return Just(true);
}
V8_WARN_UNUSED_RESULT Maybe<bool> GetBoolOption(
Isolate* isolate, DirectHandle<JSReceiver> options,
DirectHandle<String> property, const char* method_name, bool* result) {
DirectHandle<Object> value;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, value, Object::GetPropertyOrElement(isolate, options, property));
if (!IsUndefined(*value, isolate)) {
*result = Object::BooleanValue(*value, isolate);
return Just(true);
}
return Just(false);
}
Maybe<int> DefaultNumberOption(Isolate* isolate, DirectHandle<Object> value,
int min, int max, int fallback,
DirectHandle<String> property) {
if (IsUndefined(*value)) return Just(fallback);
DirectHandle<Number> value_num;
ASSIGN_RETURN_ON_EXCEPTION(isolate, value_num,
Object::ToNumber(isolate, value));
DCHECK(IsNumber(*value_num));
if (IsNaN(*value_num) || Object::NumberValue(*value_num) < min ||
Object::NumberValue(*value_num) > max) {
THROW_NEW_ERROR(
isolate,
NewRangeError(MessageTemplate::kPropertyValueOutOfRange, property));
}
return Just(FastD2I(floor(Object::NumberValue(*value_num))));
}
Maybe<int> GetNumberOption(Isolate* isolate, DirectHandle<JSReceiver> options,
DirectHandle<String> property, int min, int max,
int fallback) {
DirectHandle<Object> value;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, value, JSReceiver::GetProperty(isolate, options, property));
return DefaultNumberOption(isolate, value, min, max, fallback, property);
}
Maybe<double> GetNumberOptionAsDouble(Isolate* isolate,
DirectHandle<JSReceiver> options,
DirectHandle<String> property,
double default_value) {
DirectHandle<Object> value;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, value, JSReceiver::GetProperty(isolate, options, property));
if (IsUndefined(*value)) {
return Just(default_value);
}
DirectHandle<Number> value_num;
ASSIGN_RETURN_ON_EXCEPTION(isolate, value_num,
Object::ToNumber(isolate, value));
if (IsNaN(*value_num)) {
THROW_NEW_ERROR(
isolate,
NewRangeError(MessageTemplate::kPropertyValueOutOfRange, property));
}
return Just(Object::NumberValue(*value_num));
}
}
}