correctly handle local function definitions : should be locals and not globals
This commit is contained in:
+19
-6
@@ -43,6 +43,7 @@ class Interp {
|
||||
var binops : Hash< Expr -> Expr -> Dynamic >;
|
||||
#end
|
||||
|
||||
var depth : Int;
|
||||
var declared : Array<{ n : String, old : { r : Dynamic } }>;
|
||||
|
||||
#if hscriptPos
|
||||
@@ -51,13 +52,10 @@ class Interp {
|
||||
|
||||
public function new() {
|
||||
#if haxe3
|
||||
locals = new Map();
|
||||
variables = new Map<String,Dynamic>();
|
||||
#else
|
||||
locals = new Hash();
|
||||
variables = new Hash();
|
||||
#end
|
||||
declared = new Array();
|
||||
variables.set("null",null);
|
||||
variables.set("true",true);
|
||||
variables.set("false",false);
|
||||
@@ -195,11 +193,13 @@ class Interp {
|
||||
}
|
||||
|
||||
public function execute( expr : Expr ) : Dynamic {
|
||||
depth = 0;
|
||||
#if haxe3
|
||||
locals = new Map();
|
||||
#else
|
||||
locals = new Hash();
|
||||
#end
|
||||
declared = new Array();
|
||||
return exprReturn(expr);
|
||||
}
|
||||
|
||||
@@ -373,7 +373,8 @@ class Interp {
|
||||
args2.push(args[pos++]);
|
||||
args = args2;
|
||||
}
|
||||
var old = me.locals;
|
||||
var old = me.locals, depth = me.depth;
|
||||
me.depth++;
|
||||
me.locals = me.duplicate(capturedLocals);
|
||||
for( i in 0...params.length )
|
||||
me.locals.set(params[i].name,{ r : args[i] });
|
||||
@@ -382,6 +383,7 @@ class Interp {
|
||||
r = me.exprReturn(fexpr);
|
||||
} catch( e : Dynamic ) {
|
||||
me.locals = old;
|
||||
me.depth = depth;
|
||||
#if neko
|
||||
neko.Lib.rethrow(e);
|
||||
#else
|
||||
@@ -389,11 +391,22 @@ class Interp {
|
||||
#end
|
||||
}
|
||||
me.locals = old;
|
||||
me.depth = depth;
|
||||
return r;
|
||||
};
|
||||
var f = Reflect.makeVarArgs(f);
|
||||
if( name != null )
|
||||
variables.set(name,f);
|
||||
if( name != null ) {
|
||||
if( depth == 0 ) {
|
||||
// global function
|
||||
variables.set(name, f);
|
||||
} else {
|
||||
// function-in-function is a local function
|
||||
declared.push( { n : name, old : locals.get(name) } );
|
||||
var ref = { r : f };
|
||||
locals.set(name, ref);
|
||||
capturedLocals.set(name, ref); // allow self-recursion
|
||||
}
|
||||
}
|
||||
return f;
|
||||
case EArrayDecl(arr):
|
||||
var a = new Array();
|
||||
|
||||
Reference in New Issue
Block a user