From 7209aa8880bc29cc73182cfc0eb3fd56aa8895b2 Mon Sep 17 00:00:00 2001 From: Nicolas Cannasse Date: Fri, 18 Aug 2017 16:44:04 +0200 Subject: [PATCH] fixed @async in @sync, added scriptCall special API --- hscript/Async.hx | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/hscript/Async.hx b/hscript/Async.hx index fe3ad24..4f04e66 100644 --- a/hscript/Async.hx +++ b/hscript/Async.hx @@ -80,6 +80,8 @@ class Async { var e = EBlock([for(e in el) buildSync(e)]); restoreVars(v); return e; + case EMeta("async", _, e): + return toCps(e, ignore(), ignore()); default: return hscript.Tools.map(e, buildSync); } @@ -128,6 +130,8 @@ class Async { case EReturn(_): // require specific handling to pass it to exit expr syncFlag = false; + case EMeta("sync" | "async", _, _): + // isolated from the sync part default: Tools.iter(e, checkSync); } @@ -143,7 +147,7 @@ class Async { public function toCps( e : hscript.Expr, rest : hscript.Expr, exit : hscript.Expr ) { if( isSync(e) ) - return ECall(rest, [e]); + return ECall(rest, [buildSync(e)]); switch( e ) { case EBlock(el): var el = el.copy(); @@ -177,7 +181,7 @@ class Async { case EParent(e): return EParent(toCps(e, rest, exit)); case EMeta("sync", _, e): - return buildSync(e); + return ECall(rest,[buildSync(e)]); case EMeta("async", _, e): var nothing = ignore(); return EBlock([toCps(e,nothing,nothing),retNull(rest)]); @@ -423,6 +427,20 @@ class AsyncInterp extends hscript.Interp { onEnd(call(o, m, args)); return null; } + // fallback on generic script + m = Reflect.field(o, "scriptCall"); + if( m != null ) { + call(o, m, [args.shift(), f.substr(2), args]); + return null; + } + } else { + // fallback on generic script + m = Reflect.field(o, "scriptCall"); + if( m != null ) { + var result : Dynamic = null; + call(o, m, [function(r) result = r, f, args]); + return result; + } } throw o + " has no method " + f; }