mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 00:42:44 +00:00 
			
		
		
		
	LibWeb: Move deserialize_* methods outside scope of Deserializer class
These methods are useful independent of the class Deserializer, so let's move their declarations to the header file and and outside the scope of the Deserializer class.
This commit is contained in:
		
							parent
							
								
									5a1944ce64
								
							
						
					
					
						commit
						985d0dd270
					
				
					 2 changed files with 50 additions and 45 deletions
				
			
		|  | @ -894,53 +894,53 @@ private: | |||
|         m_position += 2; | ||||
|         return value; | ||||
|     } | ||||
| 
 | ||||
|     static WebIDL::ExceptionOr<ByteBuffer> deserialize_bytes(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
|     { | ||||
|         u32 size_bits[2]; | ||||
|         size_bits[0] = vector[position++]; | ||||
|         size_bits[1] = vector[position++]; | ||||
|         u64 const size = *bit_cast<u64*>(&size_bits); | ||||
| 
 | ||||
|         auto bytes = TRY_OR_THROW_OOM(vm, ByteBuffer::create_uninitialized(size)); | ||||
|         u64 byte_position = 0; | ||||
|         while (position < vector.size() && byte_position < size) { | ||||
|             for (u8 i = 0; i < 4; ++i) { | ||||
|                 bytes[byte_position++] = (vector[position] >> (i * 8) & 0xFF); | ||||
|                 if (byte_position == size) | ||||
|                     break; | ||||
|             } | ||||
|             position++; | ||||
|         } | ||||
|         return bytes; | ||||
|     } | ||||
| 
 | ||||
|     static WebIDL::ExceptionOr<String> deserialize_string(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
|     { | ||||
|         auto bytes = TRY(deserialize_bytes(vm, vector, position)); | ||||
|         return TRY_OR_THROW_OOM(vm, String::from_utf8(StringView { bytes })); | ||||
|     } | ||||
| 
 | ||||
|     static WebIDL::ExceptionOr<JS::NonnullGCPtr<JS::PrimitiveString>> deserialize_string_primitive(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
|     { | ||||
|         auto bytes = TRY(deserialize_bytes(vm, vector, position)); | ||||
| 
 | ||||
|         return TRY(Bindings::throw_dom_exception_if_needed(vm, [&vm, &bytes]() { | ||||
|             return JS::PrimitiveString::create(vm, StringView { bytes }); | ||||
|         })); | ||||
|     } | ||||
| 
 | ||||
|     static WebIDL::ExceptionOr<JS::NonnullGCPtr<JS::BigInt>> deserialize_big_int_primitive(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
|     { | ||||
|         auto string = TRY(deserialize_string_primitive(vm, vector, position)); | ||||
|         auto string_view = TRY(Bindings::throw_dom_exception_if_needed(vm, [&string]() { | ||||
|             return string->utf8_string_view(); | ||||
|         })); | ||||
|         auto bigint = MUST(::Crypto::SignedBigInteger::from_base(10, string_view.substring_view(0, string_view.length() - 1))); | ||||
|         return JS::BigInt::create(vm, bigint); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| WebIDL::ExceptionOr<ByteBuffer> deserialize_bytes(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
| { | ||||
|     u32 size_bits[2]; | ||||
|     size_bits[0] = vector[position++]; | ||||
|     size_bits[1] = vector[position++]; | ||||
|     u64 const size = *bit_cast<u64*>(&size_bits); | ||||
| 
 | ||||
|     auto bytes = TRY_OR_THROW_OOM(vm, ByteBuffer::create_uninitialized(size)); | ||||
|     u64 byte_position = 0; | ||||
|     while (position < vector.size() && byte_position < size) { | ||||
|         for (u8 i = 0; i < 4; ++i) { | ||||
|             bytes[byte_position++] = (vector[position] >> (i * 8) & 0xFF); | ||||
|             if (byte_position == size) | ||||
|                 break; | ||||
|         } | ||||
|         position++; | ||||
|     } | ||||
|     return bytes; | ||||
| } | ||||
| 
 | ||||
| WebIDL::ExceptionOr<String> deserialize_string(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
| { | ||||
|     auto bytes = TRY(deserialize_bytes(vm, vector, position)); | ||||
|     return TRY_OR_THROW_OOM(vm, String::from_utf8(StringView { bytes })); | ||||
| } | ||||
| 
 | ||||
| WebIDL::ExceptionOr<JS::NonnullGCPtr<JS::PrimitiveString>> deserialize_string_primitive(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
| { | ||||
|     auto bytes = TRY(deserialize_bytes(vm, vector, position)); | ||||
| 
 | ||||
|     return TRY(Bindings::throw_dom_exception_if_needed(vm, [&vm, &bytes]() { | ||||
|         return JS::PrimitiveString::create(vm, StringView { bytes }); | ||||
|     })); | ||||
| } | ||||
| 
 | ||||
| WebIDL::ExceptionOr<JS::NonnullGCPtr<JS::BigInt>> deserialize_big_int_primitive(JS::VM& vm, ReadonlySpan<u32> vector, size_t& position) | ||||
| { | ||||
|     auto string = TRY(deserialize_string_primitive(vm, vector, position)); | ||||
|     auto string_view = TRY(Bindings::throw_dom_exception_if_needed(vm, [&string]() { | ||||
|         return string->utf8_string_view(); | ||||
|     })); | ||||
|     auto bigint = MUST(::Crypto::SignedBigInteger::from_base(10, string_view.substring_view(0, string_view.length() - 1))); | ||||
|     return JS::BigInt::create(vm, bigint); | ||||
| } | ||||
| 
 | ||||
| // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializewithtransfer
 | ||||
| WebIDL::ExceptionOr<SerializedTransferRecord> structured_serialize_with_transfer(JS::VM& vm, JS::Value value, Vector<JS::Handle<JS::Object>> const& transfer_list) | ||||
| { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Kenneth Myhra
						Kenneth Myhra