From 5263c7e7f0227297a531fb27add3b66ea878d6b9 Mon Sep 17 00:00:00 2001 From: coppro Date: Sun, 2 Aug 2009 01:43:52 +0000 Subject: [PATCH] Added I_TAILCALL to dependency analysis. git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@1418 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/script/dependency.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/script/dependency.cpp b/src/script/dependency.cpp index 852a01a8..4e100c70 100644 --- a/src/script/dependency.cpp +++ b/src/script/dependency.cpp @@ -173,6 +173,8 @@ ScriptValueP Context::dependencies(const Dependency& dep, const Script& script) // Analyze the current instruction Instruction i = *instr++; + // If a scope is created, destroy it at end of block. + scoped_ptr scope; switch (i.instr) { case I_NOP: break; // Push a constant (as normal) @@ -261,9 +263,8 @@ ScriptValueP Context::dependencies(const Dependency& dep, const Script& script) } // Function call (as normal) - case I_CALL: { - // new scope - size_t scope = openScope(); + case I_CALL: scope.reset(new LocalScope(*this)); //new scope + case I_TAILCALL: { // prepare arguments for (unsigned int j = 0 ; j < i.data ; ++j) { setVariable((Variable)instr[i.data - j - 1].data, stack.back()); @@ -272,8 +273,6 @@ ScriptValueP Context::dependencies(const Dependency& dep, const Script& script) instr += i.data; // skip arguments, there had better not be any jumps into the argument list // get function and call stack.back() = stack.back()->dependencies(*this, dep); - // restore scope - closeScope(scope); break; }