mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-26 16:22:07 +00:00 
			
		
		
		
	 d1cc67bbe1
			
		
	
	
		d1cc67bbe1
		
	
	
	
	
		
			
			When performing GetValue on a primitive type we do not need to perform the ToObject conversion as it will resolve to a property on the prototype object. To avoid this we skip the initial ToObject conversion on the base value as it only serves to get the primitive's boxed prototype. We further specialize on PrimitiveString in order to get efficient behaviour behaviour for the direct properties. Depending on the tests anywhere from 20 to 60%, with significant loop overhead.
		
			
				
	
	
		
			35 lines
		
	
	
	
		
			877 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
	
		
			877 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
 | |
|  * Copyright (c) 2020-2021, Linus Groh <linusg@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <LibJS/Runtime/PrimitiveString.h>
 | |
| #include <LibJS/Runtime/Value.h>
 | |
| 
 | |
| namespace JS {
 | |
| struct ValueTraits : public Traits<Value> {
 | |
|     static unsigned hash(Value value)
 | |
|     {
 | |
|         VERIFY(!value.is_empty());
 | |
|         if (value.is_string())
 | |
|             return value.as_string().string().hash();
 | |
| 
 | |
|         if (value.is_bigint())
 | |
|             return value.as_bigint().big_integer().hash();
 | |
| 
 | |
|         if (value.is_negative_zero())
 | |
|             value = Value(0);
 | |
| 
 | |
|         return u64_hash(value.encoded()); // FIXME: Is this the best way to hash pointers, doubles & ints?
 | |
|     }
 | |
|     static bool equals(const Value a, const Value b)
 | |
|     {
 | |
|         return same_value_zero(a, b);
 | |
|     }
 | |
| };
 | |
| 
 | |
| }
 |