|  |  | @ -838,8 +838,8 @@ static VALUE rb_dfmemory_bitarray_set(VALUE self, VALUE addr, VALUE idx, VALUE v | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | /* call an arbitrary object virtual method */ |  |  |  | /* call an arbitrary object virtual method */ | 
			
		
	
		
		
			
				
					
					|  |  |  | #ifdef WIN32 |  |  |  | #ifdef WIN32 | 
			
		
	
		
		
			
				
					
					|  |  |  | __declspec(naked) static int raw_vcall(char **that, unsigned long voff, unsigned long a0, |  |  |  | __declspec(naked) static int raw_vcall(void *that, void *fptr, unsigned long a0, | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         unsigned long a1, unsigned long a2, unsigned long a3) |  |  |  |         unsigned long a1, unsigned long a2, unsigned long a3, unsigned long a4, unsigned long a5) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     // __thiscall requires that the callee cleans up the stack
 |  |  |  |     // __thiscall requires that the callee cleans up the stack
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // here we dont know how many arguments it will take, so
 |  |  |  |     // here we dont know how many arguments it will take, so
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -848,6 +848,8 @@ __declspec(naked) static int raw_vcall(char **that, unsigned long voff, unsigned | 
			
		
	
		
		
			
				
					
					|  |  |  |         push ebp |  |  |  |         push ebp | 
			
		
	
		
		
			
				
					
					|  |  |  |         mov ebp, esp |  |  |  |         mov ebp, esp | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         push a5 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         push a4 | 
			
		
	
		
		
			
				
					
					|  |  |  |         push a3 |  |  |  |         push a3 | 
			
		
	
		
		
			
				
					
					|  |  |  |         push a2 |  |  |  |         push a2 | 
			
		
	
		
		
			
				
					
					|  |  |  |         push a1 |  |  |  |         push a1 | 
			
		
	
	
		
		
			
				
					|  |  | @ -855,9 +857,7 @@ __declspec(naked) static int raw_vcall(char **that, unsigned long voff, unsigned | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         mov ecx, that |  |  |  |         mov ecx, that | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         mov eax, [ecx] |  |  |  |         call fptr | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         add eax, voff |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         call [eax] |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         mov esp, ebp |  |  |  |         mov esp, ebp | 
			
		
	
		
		
			
				
					
					|  |  |  |         pop ebp |  |  |  |         pop ebp | 
			
		
	
	
		
		
			
				
					|  |  | @ -865,25 +865,25 @@ __declspec(naked) static int raw_vcall(char **that, unsigned long voff, unsigned | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | #else |  |  |  | #else | 
			
		
	
		
		
			
				
					
					|  |  |  | static int raw_vcall(char **that, unsigned long voff, unsigned long a0, |  |  |  | static int raw_vcall(void *that, void *fptr, unsigned long a0, | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         unsigned long a1, unsigned long a2, unsigned long a3) |  |  |  |         unsigned long a1, unsigned long a2, unsigned long a3, unsigned long a4, unsigned long a5) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     int (*fptr)(char **me, int, int, int, int); |  |  |  |     int (*t_fptr)(void *me, int, int, int, int, int, int); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     fptr = (decltype(fptr))*(void**)(*that + voff); |  |  |  |     t_fptr = (decltype(t_fptr))fptr; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     return fptr(that, a0, a1, a2, a3); |  |  |  |     return t_fptr(that, a0, a1, a2, a3, a4, a5); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | #endif |  |  |  | #endif | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | // call an arbitrary vmethod, convert args/ret to native values for raw_vcall
 |  |  |  | // call an arbitrary vmethod, convert args/ret to native values for raw_vcall
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static VALUE rb_dfvcall(VALUE self, VALUE cppobj, VALUE cppvoff, VALUE a0, VALUE a1, VALUE a2, VALUE a3) |  |  |  | static VALUE rb_dfvcall(VALUE self, VALUE cppobj, VALUE fptr, VALUE a0, VALUE a1, VALUE a2, VALUE a3, VALUE a4, VALUE a5) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     return rb_int2inum(raw_vcall((char**)rb_num2ulong(cppobj), rb_num2ulong(cppvoff), |  |  |  |     return rb_int2inum(raw_vcall((void*)rb_num2ulong(cppobj), (void*)rb_num2ulong(fptr), | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 rb_num2ulong(a0), rb_num2ulong(a1), |  |  |  |                 rb_num2ulong(a0), rb_num2ulong(a1), | 
			
		
	
		
		
			
				
					
					|  |  |  |                 rb_num2ulong(a2), rb_num2ulong(a3))); |  |  |  |                 rb_num2ulong(a2), rb_num2ulong(a3), | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 rb_num2ulong(a4), rb_num2ulong(a5))); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | // define module DFHack and its methods
 |  |  |  | // define module DFHack and its methods
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static void ruby_bind_dfhack(void) { |  |  |  | static void ruby_bind_dfhack(void) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     rb_cDFHack = rb_define_module("DFHack"); |  |  |  |     rb_cDFHack = rb_define_module("DFHack"); | 
			
		
	
	
		
		
			
				
					|  |  | @ -902,7 +902,7 @@ static void ruby_bind_dfhack(void) { | 
			
		
	
		
		
			
				
					
					|  |  |  |     rb_define_singleton_method(rb_cDFHack, "print_err", RUBY_METHOD_FUNC(rb_dfprint_err), 1); |  |  |  |     rb_define_singleton_method(rb_cDFHack, "print_err", RUBY_METHOD_FUNC(rb_dfprint_err), 1); | 
			
		
	
		
		
			
				
					
					|  |  |  |     rb_define_singleton_method(rb_cDFHack, "malloc", RUBY_METHOD_FUNC(rb_dfmalloc), 1); |  |  |  |     rb_define_singleton_method(rb_cDFHack, "malloc", RUBY_METHOD_FUNC(rb_dfmalloc), 1); | 
			
		
	
		
		
			
				
					
					|  |  |  |     rb_define_singleton_method(rb_cDFHack, "free", RUBY_METHOD_FUNC(rb_dffree), 1); |  |  |  |     rb_define_singleton_method(rb_cDFHack, "free", RUBY_METHOD_FUNC(rb_dffree), 1); | 
			
		
	
		
		
			
				
					
					|  |  |  |     rb_define_singleton_method(rb_cDFHack, "vmethod_do_call", RUBY_METHOD_FUNC(rb_dfvcall), 6); |  |  |  |     rb_define_singleton_method(rb_cDFHack, "vmethod_do_call", RUBY_METHOD_FUNC(rb_dfvcall), 8); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     rb_define_singleton_method(rb_cDFHack, "memory_read", RUBY_METHOD_FUNC(rb_dfmemory_read), 2); |  |  |  |     rb_define_singleton_method(rb_cDFHack, "memory_read", RUBY_METHOD_FUNC(rb_dfmemory_read), 2); | 
			
		
	
		
		
			
				
					
					|  |  |  |     rb_define_singleton_method(rb_cDFHack, "memory_read_int8",  RUBY_METHOD_FUNC(rb_dfmemory_read_int8),  1); |  |  |  |     rb_define_singleton_method(rb_cDFHack, "memory_read_int8",  RUBY_METHOD_FUNC(rb_dfmemory_read_int8),  1); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |