mirror of
				https://github.com/LadybirdBrowser/ladybird.git
				synced 2025-10-30 21:01:00 +00:00 
			
		
		
		
	 da177c6517
			
		
	
	
		da177c6517
		
	
	
	
	
		
			
			The previous handling of the name and message properties specifically was breaking websites that created their own error types and relied on the error prototype working correctly - not assuming an JS::Error this object, that is. The way it works now, and it is supposed to work, is: - Error.prototype.name and Error.prototype.message just have initial string values and are no longer getters/setters - When constructing an error with a message, we create a regular property on the newly created object, so a lookup of the message property will either get it from the object directly or go though the prototype chain - Internal m_name/m_message properties are no longer needed and removed This makes printing errors slightly more complicated, as we can no longer rely on the (safe) internal properties, and cannot trust a property lookup either - get_without_side_effects() is used to solve this, it's not perfect but something we can revisit later. I did some refactoring along the way, there was some really old stuff in there - accessing vm.call_frame().arguments[0] is not something we (have to) do anymore :^) Fixes #6245.
		
			
				
	
	
		
			21 lines
		
	
	
	
		
			603 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			21 lines
		
	
	
	
		
			603 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| test("infinite recursion", () => {
 | |
|     function infiniteRecursion() {
 | |
|         infiniteRecursion();
 | |
|     }
 | |
| 
 | |
|     try {
 | |
|         infiniteRecursion();
 | |
|     } catch (e) {
 | |
|         expect(e).toBeInstanceOf(Error);
 | |
|         expect(e.name).toBe("Error");
 | |
|         expect(e.message).toBe("Call stack size limit exceeded");
 | |
|     }
 | |
| 
 | |
|     expect(() => {
 | |
|         JSON.stringify({}, () => ({ foo: "bar" }));
 | |
|     }).toThrowWithMessage(Error, "Call stack size limit exceeded");
 | |
| 
 | |
|     expect(() => {
 | |
|         new Proxy({}, { get: (_, __, p) => p.foo }).foo;
 | |
|     }).toThrowWithMessage(Error, "Call stack size limit exceeded");
 | |
| });
 |