diff --git a/hscript/Expr.hx b/hscript/Expr.hx index f949fb9..42536d3 100644 --- a/hscript/Expr.hx +++ b/hscript/Expr.hx @@ -40,6 +40,7 @@ typedef Expr = { } enum ExprDef { #else +typedef ExprDef = Expr; enum Expr { #end EConst( c : Const ); diff --git a/hscript/Interp.hx b/hscript/Interp.hx index b8a81c4..4468257 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -122,7 +122,7 @@ class Interp { function assign( e1 : Expr, e2 : Expr ) : Dynamic { var v = expr(e2); - switch( edef(e1) ) { + switch( Tools.expr(e1) ) { case EIdent(id): var l = locals.get(id); if( l == null ) @@ -154,7 +154,7 @@ class Interp { function evalAssignOp(op,fop,e1,e2) : Dynamic { var v; - switch( edef(e1) ) { + switch( Tools.expr(e1) ) { case EIdent(id): var l = locals.get(id); v = fop(expr(e1),expr(e2)); @@ -280,14 +280,6 @@ class Interp { } } - inline function edef( e : Expr ) { - #if hscriptPos - return e.e; - #else - return e; - #end - } - inline function error(e : #if hscriptPos ErrorDef #else Error #end, rethrow=false ) : Dynamic { #if hscriptPos var e = new Error(e, curExpr.pmin, curExpr.pmax, curExpr.origin, curExpr.line); #end if( rethrow ) this.rethrow(e) else throw e; @@ -372,7 +364,7 @@ class Interp { for( p in params ) args.push(expr(p)); - switch( edef(e) ) { + switch( Tools.expr(e) ) { case EField(e,f): var obj = expr(e); if( obj == null ) error(EInvalidAccess(f)); @@ -468,7 +460,7 @@ class Interp { } return f; case EArrayDecl(arr): - if (arr.length > 0 && edef(arr[0]).match(EBinop("=>", _))) { + if (arr.length > 0 && Tools.expr(arr[0]).match(EBinop("=>", _))) { var isAllString:Bool = true; var isAllInt:Bool = true; var isAllObject:Bool = true; @@ -476,7 +468,7 @@ class Interp { var keys:Array = []; var values:Array = []; for (e in arr) { - switch(edef(e)) { + switch(Tools.expr(e)) { case EBinop("=>", eKey, eValue): { var key:Dynamic = expr(eKey); var value:Dynamic = expr(eValue); diff --git a/hscript/Tools.hx b/hscript/Tools.hx index c1b554a..77a8699 100644 --- a/hscript/Tools.hx +++ b/hscript/Tools.hx @@ -25,7 +25,7 @@ import hscript.Expr; class Tools { public static function iter( e : Expr, f : Expr -> Void ) { - switch( #if hscriptPos e.e #else e #end ) { + switch( expr(e) ) { case EConst(_), EIdent(_): case EVar(_, _, e): if( e != null ) f(e); case EParent(e): f(e); @@ -61,12 +61,8 @@ class Tools { } public static function map( e : Expr, f : Expr -> Expr ) { - #if hscriptPos var edef = switch( e.e ) { - #else - return switch( e ) { - #end - case EConst(_), EIdent(_), EBreak, EContinue: #if hscriptPos e.e #else e #end; + case EConst(_), EIdent(_), EBreak, EContinue: expr(e); case EVar(n, t, e): EVar(n, t, if( e != null ) f(e) else null); case EParent(e): EParent(f(e)); case EBlock(el): EBlock([for( e in el ) f(e)]); @@ -91,8 +87,22 @@ class Tools { case EMeta(name, args, e): EMeta(name, args == null ? null : [for( a in args ) f(a)], f(e)); case ECheckType(e,t): ECheckType(f(e), t); } + return mk(edef, e); + } + + public static inline function expr( e : Expr ) : ExprDef { #if hscriptPos - return { e : edef, pmin : e.pmin, pmax : e.pmax, origin : e.origin, line : e.line }; + return e.e; + #else + return e; + #end + } + + public static inline function mk( e : ExprDef, p : Expr ) { + #if hscriptPos + return { e : e, pmin : p.pmin, pmax : p.pmax, origin : p.origin, line : p.line }; + #else + return e; #end }