mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:32:45 +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
	
	 Idan Horowitz
						Idan Horowitz