mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 14:12:44 +00:00 
			
		
		
		
	LibWasm: Once more fix structured instruction label indices
This finally works correctly. ™️
			
			
This commit is contained in:
		
							parent
							
								
									d05e5dbdcf
								
							
						
					
					
						commit
						c31a4e9013
					
				
					 2 changed files with 7 additions and 5 deletions
				
			
		|  | @ -22,7 +22,7 @@ public: | ||||||
|     { |     { | ||||||
|         m_current_frame = frame.ptr(); |         m_current_frame = frame.ptr(); | ||||||
|         m_stack.push(move(frame)); |         m_stack.push(move(frame)); | ||||||
|         m_stack.push(make<Label>(m_current_frame->arity(), m_current_frame->expression().instructions().size() - 1)); |         m_stack.push(make<Label>(m_current_frame->arity(), m_current_frame->expression().instructions().size())); | ||||||
|     } |     } | ||||||
|     auto& frame() const { return m_current_frame; } |     auto& frame() const { return m_current_frame; } | ||||||
|     auto& frame() { return m_current_frame; } |     auto& frame() { return m_current_frame; } | ||||||
|  |  | ||||||
|  | @ -376,7 +376,7 @@ void Interpreter::interpret(Configuration& configuration, InstructionPointer& ip | ||||||
|         auto& args = instruction.arguments().get<Instruction::StructuredInstructionArgs>(); |         auto& args = instruction.arguments().get<Instruction::StructuredInstructionArgs>(); | ||||||
|         if (args.block_type.kind() != BlockType::Empty) |         if (args.block_type.kind() != BlockType::Empty) | ||||||
|             arity = 1; |             arity = 1; | ||||||
|         configuration.stack().push(make<Label>(arity, ip.value())); |         configuration.stack().push(make<Label>(arity, ip.value() + 1)); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     case Instructions::if_.value(): { |     case Instructions::if_.value(): { | ||||||
|  | @ -388,14 +388,16 @@ void Interpreter::interpret(Configuration& configuration, InstructionPointer& ip | ||||||
|         auto entry = configuration.stack().pop(); |         auto entry = configuration.stack().pop(); | ||||||
|         auto value = entry.get<NonnullOwnPtr<Value>>()->to<i32>(); |         auto value = entry.get<NonnullOwnPtr<Value>>()->to<i32>(); | ||||||
|         TRAP_IF_NOT(value.has_value()); |         TRAP_IF_NOT(value.has_value()); | ||||||
|         configuration.stack().push(make<Label>(arity, args.end_ip)); |         auto end_label = make<Label>(arity, args.end_ip.value()); | ||||||
|         if (value.value() == 0) { |         if (value.value() == 0) { | ||||||
|             if (args.else_ip.has_value()) { |             if (args.else_ip.has_value()) { | ||||||
|                 configuration.ip() = args.else_ip.value(); |                 configuration.ip() = args.else_ip.value(); | ||||||
|  |                 configuration.stack().push(move(end_label)); | ||||||
|             } else { |             } else { | ||||||
|                 configuration.ip() = args.end_ip; |                 configuration.ip() = args.end_ip.value() + 1; | ||||||
|                 configuration.stack().pop(); |  | ||||||
|             } |             } | ||||||
|  |         } else { | ||||||
|  |             configuration.stack().push(move(end_label)); | ||||||
|         } |         } | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ali Mohammad Pur
						Ali Mohammad Pur