From 33583e751f32a95d065e06a6c4cf5ffdb2c2c815 Mon Sep 17 00:00:00 2001 From: Jaime Humberto Macias Bustamante Date: Mon, 5 May 2025 14:28:44 -0700 Subject: [PATCH] Small optimizations --- hscript/Interp.hx | 2 +- hscript/customclass/CustomClass.hx | 33 ++++++++++++++++-------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/hscript/Interp.hx b/hscript/Interp.hx index ede4a57..3a4e97b 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -1847,7 +1847,7 @@ class Interp { _nextCallObject = null; return r; } catch (e) { - error(ECustom('Script threw an exception: \n${f}')); + error(ECustom('${_proxy.className} threw an exception: \n${e.details()}')); _nextCallObject = null; return null; } diff --git a/hscript/customclass/CustomClass.hx b/hscript/customclass/CustomClass.hx index 12d9940..f5c5d6e 100644 --- a/hscript/customclass/CustomClass.hx +++ b/hscript/customclass/CustomClass.hx @@ -137,9 +137,8 @@ class CustomClass implements IHScriptCustomAccessBehaviour { if (args == null) args = []; - // TODO: disallow copy for super Custom Class if(__class.superClassDecl is CustomClassDecl) - superClass = new CustomClass(__class.superClassDecl, args, __cachedFieldDecls, this.interp); + superClass = new CustomClass(__class.superClassDecl, args, __cachedSuperFields, this.interp); else { if (__cachedSuperFields != null) { Reflect.setField(__class.superClassDecl, "__cachedFields", __cachedSuperFields); // Static field @@ -215,7 +214,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour { } } - public function callFunction(name:String, args:Array = null):Dynamic { + public function callFunction(name:String, ?args:Array):Dynamic { var r:Dynamic = null; if (hasField(name)) { @@ -224,7 +223,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour { if (fn == null) interp.error(ECustom('${name} is not a function')); - r = UnsafeReflect.callMethodUnsafe(null, fn, args); + r = UnsafeReflect.callMethodUnsafe(null, fn, args == null ? [] : args); } catch (e:hscript.Expr.Error) { // A script error occurred while executing the custom class function. // Purge the function from the cache so it is not called again. @@ -236,7 +235,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour { for (a in args) { if ((a is CustomClass)) { var customClass:CustomClass = cast(a, CustomClass).superClass; - fixedArgs.push(customClass.superClass != null ? customClass.superClass : customClass); + fixedArgs.push(customClass.superClass != null ? customClass.getSuperclass() : customClass); } else { fixedArgs.push(a); } @@ -295,7 +294,8 @@ class CustomClass implements IHScriptCustomAccessBehaviour { // Reflect.hasField(this, name) is REALLY expensive so we use a cache. if (__superClassFieldList == null) { - __superClassFieldList = Reflect.fields(superClass).concat(Type.getInstanceFields(Type.getClass(superClass))); + var realFields = Reflect.fields(superClass).concat(Type.getInstanceFields(Type.getClass(superClass))); + __superClassFieldList.concat(realFields); } return __superClassFieldList.indexOf(name) != -1; @@ -327,24 +327,27 @@ class CustomClass implements IHScriptCustomAccessBehaviour { this.interp.variables.set(name, val); } else if (this.superClass != null) { + if (this.superClass is CustomClass) { + var superCustomClass:CustomClass = cast(this.superClass, CustomClass); + try { + superCustomClass.__allowSetGet = this.__allowSetGet; + return superCustomClass.hset(name, val); + } catch (e:Dynamic) {} + } if (Type.getClass(this.superClass) == null) { // Anonymous structure if (Reflect.hasField(this.superClass, name)) { Reflect.setField(this.superClass, name, val); } return val; - } else if (this.superClass is CustomClass) { - var superCustomClass:CustomClass = cast(this.superClass, CustomClass); - try { - superCustomClass.__allowSetGet = this.__allowSetGet; - return superCustomClass.hset(name, val); - } catch (e:Dynamic) {} - } else if (superHasField(name)) { + } + else if (superHasField(name)) { if (__allowSetGet) Reflect.setProperty(this.superClass, name, val); else Reflect.setField(this.superClass, name, val); - } else { + } + else { throw "field '" + name + "' does not exist in custom class '" + this.className + "' or super class '" + Type.getClassName(Type.getClass(this.superClass)) + "'"; } @@ -423,7 +426,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour { try { superCustomClass.__allowSetGet = this.__allowSetGet; return superCustomClass.hget(name); - } catch (e:Dynamic) {} + } catch (e) {} } var fields = Type.getInstanceFields(Type.getClass(this.superClass));