mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:07:46 +00:00
LibJS: Convert to_double() to ThrowCompletionOr
This commit is contained in:
parent
51c33b3b35
commit
1639ed7e0a
10 changed files with 23 additions and 40 deletions
|
@ -1057,9 +1057,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
|
||||||
} else if (parameter.type->name == "double") {
|
} else if (parameter.type->name == "double") {
|
||||||
if (!optional) {
|
if (!optional) {
|
||||||
scoped_generator.append(R"~~~(
|
scoped_generator.append(R"~~~(
|
||||||
double @cpp_name@ = @js_name@@js_suffix@.to_double(global_object);
|
double @cpp_name@ = TRY_OR_DISCARD(@js_name@@js_suffix@.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
@return_statement@
|
|
||||||
)~~~");
|
)~~~");
|
||||||
} else {
|
} else {
|
||||||
if (optional_default_value.has_value()) {
|
if (optional_default_value.has_value()) {
|
||||||
|
@ -1072,11 +1070,8 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
|
||||||
)~~~");
|
)~~~");
|
||||||
}
|
}
|
||||||
scoped_generator.append(R"~~~(
|
scoped_generator.append(R"~~~(
|
||||||
if (!@js_name@@js_suffix@.is_undefined()) {
|
if (!@js_name@@js_suffix@.is_undefined())
|
||||||
@cpp_name@ = @js_name@@js_suffix@.to_double(global_object);
|
@cpp_name@ = TRY_OR_DISCARD(@js_name@@js_suffix@.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
@return_statement@
|
|
||||||
}
|
|
||||||
)~~~");
|
)~~~");
|
||||||
if (optional_default_value.has_value()) {
|
if (optional_default_value.has_value()) {
|
||||||
scoped_generator.append(R"~~~(
|
scoped_generator.append(R"~~~(
|
||||||
|
|
|
@ -195,9 +195,7 @@ JS_DEFINE_NATIVE_FUNCTION(WebAssemblyModule::get_export)
|
||||||
|
|
||||||
JS_DEFINE_NATIVE_FUNCTION(WebAssemblyModule::wasm_invoke)
|
JS_DEFINE_NATIVE_FUNCTION(WebAssemblyModule::wasm_invoke)
|
||||||
{
|
{
|
||||||
auto address = static_cast<unsigned long>(vm.argument(0).to_double(global_object));
|
auto address = static_cast<unsigned long>(TRY_OR_DISCARD(vm.argument(0).to_double(global_object)));
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
Wasm::FunctionAddress function_address { address };
|
Wasm::FunctionAddress function_address { address };
|
||||||
auto function_instance = WebAssemblyModule::machine().store().get(function_address);
|
auto function_instance = WebAssemblyModule::machine().store().get(function_address);
|
||||||
if (!function_instance) {
|
if (!function_instance) {
|
||||||
|
@ -222,7 +220,7 @@ JS_DEFINE_NATIVE_FUNCTION(WebAssemblyModule::wasm_invoke)
|
||||||
auto argument = vm.argument(index++);
|
auto argument = vm.argument(index++);
|
||||||
double double_value = 0;
|
double double_value = 0;
|
||||||
if (!argument.is_bigint())
|
if (!argument.is_bigint())
|
||||||
double_value = argument.to_double(global_object);
|
double_value = TRY_OR_DISCARD(argument.to_double(global_object));
|
||||||
switch (param.kind()) {
|
switch (param.kind()) {
|
||||||
case Wasm::ValueType::Kind::I32:
|
case Wasm::ValueType::Kind::I32:
|
||||||
arguments.append(Wasm::Value(param, static_cast<u64>(double_value)));
|
arguments.append(Wasm::Value(param, static_cast<u64>(double_value)));
|
||||||
|
|
|
@ -41,7 +41,7 @@ String DateCell::display(Cell& cell, const CellTypeMetadata& metadata) const
|
||||||
JS::Value DateCell::js_value(Cell& cell, const CellTypeMetadata&) const
|
JS::Value DateCell::js_value(Cell& cell, const CellTypeMetadata&) const
|
||||||
{
|
{
|
||||||
auto js_data = cell.js_data();
|
auto js_data = cell.js_data();
|
||||||
auto value = js_data.to_double(cell.sheet().global_object());
|
auto value = TRY_OR_DISCARD(js_data.to_double(cell.sheet().global_object()));
|
||||||
return JS::Value(value / 1000); // Turn it to seconds
|
return JS::Value(value / 1000); // Turn it to seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ String NumericCell::display(Cell& cell, const CellTypeMetadata& metadata) const
|
||||||
if (metadata.format.is_empty())
|
if (metadata.format.is_empty())
|
||||||
string = value.to_string_without_side_effects();
|
string = value.to_string_without_side_effects();
|
||||||
else
|
else
|
||||||
string = format_double(metadata.format.characters(), value.to_double(cell.sheet().global_object()));
|
string = format_double(metadata.format.characters(), TRY_OR_DISCARD(value.to_double(cell.sheet().global_object())));
|
||||||
|
|
||||||
if (metadata.length >= 0)
|
if (metadata.length >= 0)
|
||||||
return string.substring(0, metadata.length);
|
return string.substring(0, metadata.length);
|
||||||
|
|
|
@ -141,13 +141,13 @@ static ByteBuffer numeric_to_raw_bytes(GlobalObject& global_object, Value value,
|
||||||
swap(raw_bytes[i], raw_bytes[sizeof(UnderlyingBufferDataType) - 1 - i]);
|
swap(raw_bytes[i], raw_bytes[sizeof(UnderlyingBufferDataType) - 1 - i]);
|
||||||
};
|
};
|
||||||
if constexpr (IsSame<UnderlyingBufferDataType, float>) {
|
if constexpr (IsSame<UnderlyingBufferDataType, float>) {
|
||||||
float raw_value = value.to_double(global_object);
|
float raw_value = MUST(value.to_double(global_object));
|
||||||
ReadonlyBytes { &raw_value, sizeof(float) }.copy_to(raw_bytes);
|
ReadonlyBytes { &raw_value, sizeof(float) }.copy_to(raw_bytes);
|
||||||
flip_if_needed();
|
flip_if_needed();
|
||||||
return raw_bytes;
|
return raw_bytes;
|
||||||
}
|
}
|
||||||
if constexpr (IsSame<UnderlyingBufferDataType, double>) {
|
if constexpr (IsSame<UnderlyingBufferDataType, double>) {
|
||||||
double raw_value = value.to_double(global_object);
|
double raw_value = MUST(value.to_double(global_object));
|
||||||
ReadonlyBytes { &raw_value, sizeof(double) }.copy_to(raw_bytes);
|
ReadonlyBytes { &raw_value, sizeof(double) }.copy_to(raw_bytes);
|
||||||
flip_if_needed();
|
flip_if_needed();
|
||||||
return raw_bytes;
|
return raw_bytes;
|
||||||
|
|
|
@ -59,8 +59,10 @@ Value GeneratorObject::next_impl(VM& vm, GlobalObject& global_object, Optional<V
|
||||||
};
|
};
|
||||||
|
|
||||||
auto generated_continuation = [&](Value value) -> Bytecode::BasicBlock const* {
|
auto generated_continuation = [&](Value value) -> Bytecode::BasicBlock const* {
|
||||||
if (value.is_object())
|
if (value.is_object()) {
|
||||||
return reinterpret_cast<Bytecode::BasicBlock const*>(static_cast<u64>(TRY_OR_DISCARD(value.as_object().get("continuation")).to_double(global_object)));
|
auto number_value = TRY_OR_DISCARD(value.as_object().get("continuation"));
|
||||||
|
return reinterpret_cast<Bytecode::BasicBlock const*>(static_cast<u64>(TRY_OR_DISCARD(number_value.to_double(global_object))));
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -559,11 +559,11 @@ ThrowCompletionOr<u64> Value::to_bigint_uint64(GlobalObject& global_object) cons
|
||||||
return bigint->big_integer().to_u64();
|
return bigint->big_integer().to_u64();
|
||||||
}
|
}
|
||||||
|
|
||||||
double Value::to_double(GlobalObject& global_object) const
|
ThrowCompletionOr<double> Value::to_double(GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
auto number = to_number(global_object);
|
auto number = to_number(global_object);
|
||||||
if (global_object.vm().exception())
|
if (auto* exception = global_object.vm().exception())
|
||||||
return {};
|
return throw_completion(exception->value());
|
||||||
return number.as_double();
|
return number.as_double();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -313,7 +313,7 @@ public:
|
||||||
ThrowCompletionOr<BigInt*> to_bigint(GlobalObject&) const;
|
ThrowCompletionOr<BigInt*> to_bigint(GlobalObject&) const;
|
||||||
ThrowCompletionOr<i64> to_bigint_int64(GlobalObject&) const;
|
ThrowCompletionOr<i64> to_bigint_int64(GlobalObject&) const;
|
||||||
ThrowCompletionOr<u64> to_bigint_uint64(GlobalObject&) const;
|
ThrowCompletionOr<u64> to_bigint_uint64(GlobalObject&) const;
|
||||||
double to_double(GlobalObject&) const;
|
ThrowCompletionOr<double> to_double(GlobalObject&) const;
|
||||||
StringOrSymbol to_property_key(GlobalObject&) const;
|
StringOrSymbol to_property_key(GlobalObject&) const;
|
||||||
i32 to_i32(GlobalObject& global_object) const
|
i32 to_i32(GlobalObject& global_object) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -641,14 +641,10 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::scroll)
|
||||||
|
|
||||||
ScrollBehavior behavior = (behavior_string == "smooth") ? ScrollBehavior::Smooth : ScrollBehavior::Auto;
|
ScrollBehavior behavior = (behavior_string == "smooth") ? ScrollBehavior::Smooth : ScrollBehavior::Auto;
|
||||||
|
|
||||||
double x = x_value.to_double(global_object);
|
double x = TRY_OR_DISCARD(x_value.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
x = JS::Value(x).is_finite_number() ? x : 0.0;
|
x = JS::Value(x).is_finite_number() ? x : 0.0;
|
||||||
|
|
||||||
double y = y_value.to_double(global_object);
|
double y = TRY_OR_DISCARD(y_value.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
y = JS::Value(y).is_finite_number() ? y : 0.0;
|
y = JS::Value(y).is_finite_number() ? y : 0.0;
|
||||||
|
|
||||||
// FIXME: Are we calculating the viewport in the way this function expects?
|
// FIXME: Are we calculating the viewport in the way this function expects?
|
||||||
|
@ -683,14 +679,10 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::scroll_by)
|
||||||
}
|
}
|
||||||
|
|
||||||
auto left_value = TRY_OR_DISCARD(options->get("left"));
|
auto left_value = TRY_OR_DISCARD(options->get("left"));
|
||||||
auto left = left_value.to_double(global_object);
|
auto left = TRY_OR_DISCARD(left_value.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
|
|
||||||
auto top_value = TRY_OR_DISCARD(options->get("top"));
|
auto top_value = TRY_OR_DISCARD(options->get("top"));
|
||||||
auto top = top_value.to_double(global_object);
|
auto top = TRY_OR_DISCARD(top_value.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
|
|
||||||
left = JS::Value(left).is_finite_number() ? left : 0.0;
|
left = JS::Value(left).is_finite_number() ? left : 0.0;
|
||||||
top = JS::Value(top).is_finite_number() ? top : 0.0;
|
top = JS::Value(top).is_finite_number() ? top : 0.0;
|
||||||
|
|
|
@ -403,15 +403,11 @@ Optional<Wasm::Value> to_webassembly_value(JS::Value value, const Wasm::ValueTyp
|
||||||
return Wasm::Value { static_cast<i32>(_i32) };
|
return Wasm::Value { static_cast<i32>(_i32) };
|
||||||
}
|
}
|
||||||
case Wasm::ValueType::F64: {
|
case Wasm::ValueType::F64: {
|
||||||
auto number = value.to_double(global_object);
|
auto number = TRY_OR_DISCARD(value.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
return Wasm::Value { static_cast<double>(number) };
|
return Wasm::Value { static_cast<double>(number) };
|
||||||
}
|
}
|
||||||
case Wasm::ValueType::F32: {
|
case Wasm::ValueType::F32: {
|
||||||
auto number = value.to_double(global_object);
|
auto number = TRY_OR_DISCARD(value.to_double(global_object));
|
||||||
if (vm.exception())
|
|
||||||
return {};
|
|
||||||
return Wasm::Value { static_cast<float>(number) };
|
return Wasm::Value { static_cast<float>(number) };
|
||||||
}
|
}
|
||||||
case Wasm::ValueType::FunctionReference:
|
case Wasm::ValueType::FunctionReference:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue