From c79882b75e224d14a70759d136ad2432b40a49a5 Mon Sep 17 00:00:00 2001 From: Jaime Humberto Macias Bustamante Date: Wed, 18 Jun 2025 10:08:59 -0700 Subject: [PATCH] Implemented Override untested, still in progress tho --- hscript/CustomClass.hx | 40 +++++++++++++++++++++++++++++++++++++--- hscript/Interp.hx | 2 +- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/hscript/CustomClass.hx b/hscript/CustomClass.hx index e21ce15..edf890f 100644 --- a/hscript/CustomClass.hx +++ b/hscript/CustomClass.hx @@ -32,6 +32,8 @@ class CustomClass implements IHScriptCustomClassBehaviour { var __superClass:IHScriptCustomClassBehaviour; var __constructor:Function; + var __overrideFields:Array = []; + public function new(__class:CustomClassHandler, ?args:Array) { this.__class = __class; @@ -46,7 +48,9 @@ class CustomClass implements IHScriptCustomClassBehaviour { for (f in __class.fields) { switch (Tools.expr(f)) { case EVar(n): __class__fields.push(n); - case EFunction(_, _, n): __class__fields.push(n); + case EFunction(_, _, n, _, _, _, isOverride): + if(isOverride) __overrideFields.push(n); + __class__fields.push(n); default: continue; } @:privateAccess __interp.exprReturn(f); @@ -84,7 +88,14 @@ class CustomClass implements IHScriptCustomClassBehaviour { } if (__class.cl is CustomClassHandler) { - __superClass = new CustomClass(__class.cl, args); + var customClass = new CustomClass(__class.cl, args); + if(__overrideFields.length > 0) { + for (field in __overrideFields) { + var func = __interp.variables.get(field); + customClass.overrideField(field, func); + } + } + __superClass = customClass; @:privateAccess __interp.__instanceFields.concat(__superClass.__class__fields); } else { @@ -96,8 +107,10 @@ class CustomClass implements IHScriptCustomClassBehaviour { } } - public function call(name:String, ?args:Array):Dynamic { + public function call(name:String, ?args:Array, ?toSuper:Bool = false):Dynamic { var fn = __interp.variables.get(name); + if(toSuper && fn == null) fn = __interp.variables.get('_HX_SUPER__$name'); + if (fn != null && Reflect.isFunction(fn)) return UnsafeReflect.callMethodUnsafe(null, fn, (args == null) ? [] : args); else @@ -138,6 +151,27 @@ class CustomClass implements IHScriptCustomClassBehaviour { return val; } + /** + * Overrides (replaces) the declared function. + * @param name + * @param func + */ + function overrideField(name:String, func:Function) { + var f = getField(name, false); + if(f != null && Reflect.isFunction(f)) { + __interp.variables.set(name, func); + __interp.variables.set('_HX_SUPER__$name', f); + } + else if(__superClass != null && __superClass is CustomClass) { + cast(__superClass, CustomClass).overrideField(name, func); + } + /* + else { + __interp.error(ECustom('Field $name is declared \'override\' but doesn\'t override any field')); + } + */ + } + function superHasField(name:String) { if (__superClass == null) return false; diff --git a/hscript/Interp.hx b/hscript/Interp.hx index fe59f28..f2279ca 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -1355,7 +1355,7 @@ class Interp { if(inCustomClass) { if (o == scriptObject.__superClass) { if (scriptObject.__superClass is CustomClass) - return cast(scriptObject.__superClass, CustomClass).call(f, args); + return cast(scriptObject.__superClass, CustomClass).call(f, args, true); else return return UnsafeReflect.callMethodUnsafe(scriptObject.__superClass, UnsafeReflect.field(scriptObject.__superClass, '_HX_SUPER__$f'), args); }