mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 04:26:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef INTERPRETER_CONTROLOPCODES_H_INCLUDED
 | |
| #define INTERPRETER_CONTROLOPCODES_H_INCLUDED
 | |
| 
 | |
| #include <stdexcept>
 | |
| 
 | |
| #include "opcodes.hpp"
 | |
| #include "runtime.hpp"
 | |
| 
 | |
| namespace Interpreter
 | |
| {
 | |
|     class OpReturn : public Opcode0
 | |
|     {
 | |
|     public:
 | |
|         void execute(Runtime& runtime) override { runtime.setPC(-1); }
 | |
|     };
 | |
| 
 | |
|     class OpSkipZero : public Opcode0
 | |
|     {
 | |
|     public:
 | |
|         void execute(Runtime& runtime) override
 | |
|         {
 | |
|             Type_Integer data = runtime[0].mInteger;
 | |
|             runtime.pop();
 | |
| 
 | |
|             if (data == 0)
 | |
|                 runtime.setPC(runtime.getPC() + 1);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     class OpSkipNonZero : public Opcode0
 | |
|     {
 | |
|     public:
 | |
|         void execute(Runtime& runtime) override
 | |
|         {
 | |
|             Type_Integer data = runtime[0].mInteger;
 | |
|             runtime.pop();
 | |
| 
 | |
|             if (data != 0)
 | |
|                 runtime.setPC(runtime.getPC() + 1);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     class OpJumpForward : public Opcode1
 | |
|     {
 | |
|     public:
 | |
|         void execute(Runtime& runtime, unsigned int arg0) override
 | |
|         {
 | |
|             if (arg0 == 0)
 | |
|                 throw std::logic_error("infinite loop");
 | |
| 
 | |
|             runtime.setPC(runtime.getPC() + arg0 - 1);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     class OpJumpBackward : public Opcode1
 | |
|     {
 | |
|     public:
 | |
|         void execute(Runtime& runtime, unsigned int arg0) override
 | |
|         {
 | |
|             if (arg0 == 0)
 | |
|                 throw std::logic_error("infinite loop");
 | |
| 
 | |
|             runtime.setPC(runtime.getPC() - arg0 - 1);
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| #endif
 |