From fdde0899089b7d6de444c03b118987bfc02f54c5 Mon Sep 17 00:00:00 2001 From: NeeEoo Date: Tue, 23 Apr 2024 15:18:42 +0200 Subject: [PATCH] Optimized more code --- hscript/Interp.hx | 85 ++++++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/hscript/Interp.hx b/hscript/Interp.hx index bd3fa52..e8bdc05 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -50,6 +50,19 @@ enum abstract ScriptObjectType(Int) { var SNull; } +@:structInit +class DeclaredVar { + public var r:Dynamic; + public var depth:Int; +} + +@:structInit +class RedeclaredVar { + public var n:String; + public var old:DeclaredVar; + public var depth:Int; +} + class Interp { public var scriptObject(default, set):Dynamic; private var _hasScriptObject(default, null):Bool = false; @@ -78,13 +91,13 @@ class Interp { } public var errorHandler:Error->Void; public var importFailedCallback:Array->Bool; - #if haxe3 + #if haxe3 // Also Applies to 4.0.0 and above public var customClasses:Map; public var variables:Map; public var publicVariables:Map; public var staticVariables:Map; - public var locals:Map; + public var locals:Map; var binops:MapExpr->Dynamic>; #else public var customClasses:Hash; @@ -92,13 +105,13 @@ class Interp { public var publicVariables:Hash; public var staticVariables:Hash; - public var locals:Hash<{r:Dynamic, depth:Int}>; + public var locals:Hash; var binops:HashExpr->Dynamic>; #end var depth:Int = 0; var inTry:Bool; - var declared:Array<{n:String, old:{r:Dynamic, depth:Int}, depth:Int}>; + var declared:Array; var returnValue:Dynamic; var isBypassAccessor:Bool = false; @@ -691,7 +704,7 @@ class Interp { throw SReturn; case EFunction(params, fexpr, name, _, isPublic, isStatic, isOverride): var __capturedLocals = duplicate(locals); - var capturedLocals:Map = []; + var capturedLocals:Map = []; for(k=>e in __capturedLocals) if (e != null && e.depth > 0) capturedLocals.set(k, e); @@ -762,20 +775,18 @@ class Interp { } else { // function-in-function is a local function declared.push({n: name, old: locals.get(name), depth: depth}); - var ref = {r: f, depth: depth}; + var ref:DeclaredVar = {r: f, depth: depth}; locals.set(name, ref); capturedLocals.set(name, ref); // allow self-recursion } } return f; case EArrayDecl(arr, wantedType): - var isMap = false; - var isTypeMap = false; - if(!isMap && wantedType != null) { - isMap = wantedType.match(CTPath(["Map"], [_, _])); - isTypeMap = true; + var isTypeMap = wantedType != null; + var isMap = if(isTypeMap) { + wantedType.match(CTPath(["Map"], [_, _])); } else { - isMap = arr.length > 0 && Tools.expr(arr[0]).match(EBinop("=>", _)); + arr.length > 0 && Tools.expr(arr[0]).match(EBinop("=>", _)); } if (isMap) { var isAllString:Bool = true; @@ -789,10 +800,14 @@ class Interp { case EBinop("=>", eKey, eValue): { var key:Dynamic = expr(eKey); var value:Dynamic = expr(eValue); - isAllString = isAllString && (key is String); - isAllInt = isAllInt && (key is Int); - isAllObject = isAllObject && Reflect.isObject(key); - isAllEnum = isAllEnum && Reflect.isEnumValue(key); + if(isAllString) + isAllString = (key is String); + if(isAllInt) + isAllInt = (key is Int); + if(isAllObject) + isAllObject = Reflect.isObject(key); + if(isAllEnum) + isAllEnum = Reflect.isEnumValue(key); keys.push(key); values.push(value); } @@ -801,21 +816,19 @@ class Interp { } if(isTypeMap) { - if(wantedType != null) { - isAllString = wantedType.match(CTPath(["Map"], [CTPath(["String"], _), _])); - isAllInt = wantedType.match(CTPath(["Map"], [CTPath(["Int"], _), _])); - if(isAllString || isAllInt) { - isAllObject = false; - isAllEnum = false; - } else { - if(!isAllObject && !isAllEnum) { - throw("Unknown Type Key"); - } + isAllString = wantedType.match(CTPath(["Map"], [CTPath(["String"], _), _])); + isAllInt = wantedType.match(CTPath(["Map"], [CTPath(["Int"], _), _])); + if(isAllString || isAllInt) { + isAllObject = false; + isAllEnum = false; + } else { + if(!isAllObject && !isAllEnum) { + throw("Unknown Type Key"); } } } - var map:Dynamic = { + var map:IMap = { if (isAllInt) new haxe.ds.IntMap(); else if (isAllString) @@ -828,15 +841,17 @@ class Interp { throw 'Inconsistent key types'; } for (n in 0...keys.length) { - setMapValue(map, keys[n], values[n]); + map.set(keys[n], values[n]); + //setMapValue(map, keys[n], values[n]); } return map; } else { - var a = new Array(); - for (e in arr) { - a.push(expr(e)); - } - return a; + //var a = new Array(); + //for (e in arr) { + // a.push(expr(e)); + //} + //return a; + return [for (e in arr) expr(e)]; } case EArray(e, index): var arr:Dynamic = expr(e); @@ -1005,11 +1020,11 @@ class Interp { } inline function getMapValue(map:Dynamic, key:Dynamic):Dynamic { - return cast(map, haxe.Constraints.IMap).get(key); + return cast(map, IMap).get(key); } inline function setMapValue(map:Dynamic, key:Dynamic, value:Dynamic):Void { - cast(map, haxe.Constraints.IMap).set(key, value); + cast(map, IMap).set(key, value); } public static var getRedirects:MapString->Dynamic> = [];