Browse Source

-Resolved bug that made yield() not work in some situations, fixes #884

Juan Linietsky 10 years ago
parent
commit
bd03562076
3 changed files with 22 additions and 2 deletions
  1. 20 0
      bin/tests/test_gdscript.cpp
  2. 1 1
      modules/gdscript/gd_compiler.cpp
  3. 1 1
      modules/gdscript/gd_script.cpp

+ 20 - 0
bin/tests/test_gdscript.cpp

@@ -738,6 +738,26 @@ static void _disassemble_class(const Ref<GDScript>& p_class,const Vector<String>
 					incr=4+argc;
 					incr=4+argc;
 
 
 				} break;
 				} break;
+				case GDFunction::OPCODE_YIELD: {
+
+					txt+=" yield ";
+					incr=1;
+
+				} break;
+				case GDFunction::OPCODE_YIELD_SIGNAL: {
+
+					txt+=" yield_signal ";
+					txt+=DADDR(1);
+					txt+=",";
+					txt+=DADDR(2);
+					incr=3;
+				} break;
+				case GDFunction::OPCODE_YIELD_RESUME: {
+
+					txt+=" yield resume: ";
+					txt+=DADDR(1);
+					incr=2;
+				} break;
 				case GDFunction::OPCODE_JUMP: {
 				case GDFunction::OPCODE_JUMP: {
 
 
 					txt+=" jump ";
 					txt+=" jump ";

+ 1 - 1
modules/gdscript/gd_compiler.cpp

@@ -528,7 +528,7 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
 						int ret = _parse_expression(codegen,on->arguments[i],slevel);
 						int ret = _parse_expression(codegen,on->arguments[i],slevel);
 						if (ret<0)
 						if (ret<0)
 							return ret;
 							return ret;
-						if (ret&GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS) {
+						if (ret&(GDFunction::ADDR_TYPE_STACK<<GDFunction::ADDR_BITS)) {
 							slevel++;
 							slevel++;
 							codegen.alloc_stack(slevel);
 							codegen.alloc_stack(slevel);
 						}
 						}

+ 1 - 1
modules/gdscript/gd_script.cpp

@@ -820,7 +820,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
 				gdfs->state.stack.resize(alloca_size);
 				gdfs->state.stack.resize(alloca_size);
 				//copy variant stack
 				//copy variant stack
 				for(int i=0;i<_stack_size;i++) {
 				for(int i=0;i<_stack_size;i++) {
-					memnew_placement(&stack[sizeof(Variant)*i],Variant(stack[i]));
+					memnew_placement(&gdfs->state.stack[sizeof(Variant)*i],Variant(stack[i]));
 				}
 				}
 				gdfs->state.stack_size=_stack_size;
 				gdfs->state.stack_size=_stack_size;
 				gdfs->state.self=self;
 				gdfs->state.self=self;