diff --git a/hscript/Interp.hx b/hscript/Interp.hx index d6ef0cb..9e75636 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -308,20 +308,34 @@ class Interp { var v = expr(e2); _proxy.__class.hset(id, v); return v; - } else if (_proxy.superClass != null && _proxy.superHasField(id)) { + } + /* + else if (_proxy.superClass != null && _proxy.superHasField(id)) { var v = expr(e2); - Reflect.setProperty(_proxy.superClass, id, v); + //Reflect.setProperty(_proxy.superClass, id, v); + _proxy.hset(id, v); return v; - } else if (_proxy.hasVar(id)) { + } + else if (_proxy.hasVar(id)) { var v = expr(e2); _proxy.hset(id, v); return v; - } else if (_proxy.superClass == null && _proxy.__class.classDecl.extend != null) { + } + */ + else if (_proxy.superClass == null && _proxy.__class.classDecl.extend != null) { // Caches the declaration to set it once superClass is created var v = expr(e2); _proxy.cacheSuperField(id, v); return v; } + else { + try { + var v = expr(e2); + _proxy.hset(id, v); // superClass check already handled in Custom Class + return v; + } + catch(e) {} + } } var l = locals.get(id); if (l == null) { @@ -375,6 +389,7 @@ class Interp { switch (Tools.expr(e)) { case EIdent(id0): if (id0 == "this") { + /* if (_proxy.hasField(f)) { var v = expr(e2); _proxy.hset(f, v); @@ -387,17 +402,27 @@ class Interp { return v; } } - else if(_proxy.superClass == null && _proxy.__class.classDecl.extend != null){ + */ + if(_proxy.superClass == null && _proxy.__class.classDecl.extend != null){ // Caches the declaration to set it once superClass is created var v = expr(e2); _proxy.cacheSuperField(f, v); return v; } + else { + try { + var v = expr(e2); + _proxy.hset(f, v); + return v; + } + catch(e){} + } } default: // Do nothing } } + // Fallback, which calls set() var obj = expr(e); if(s && obj == null) return null; v = set(obj, f, v); @@ -433,6 +458,7 @@ class Interp { _proxy.__class.hset(id, v); return v; } + /* else if (_proxy.superClass != null && _proxy.superHasField(id)) { Reflect.setProperty(_proxy.superClass, id, v); return v; @@ -441,10 +467,18 @@ class Interp { _proxy.hset(id, v); return v; } + */ else if ((_proxy.superClass == null && _proxy.__class.classDecl.extend != null)) { _proxy.cacheSuperField(id, v); return v; } + else { + try { + _proxy.hset(id, v); // superClass check already handled in Custom Class + return v; + } + catch(e) {} + } } var l = locals.get(id); if (l == null) { @@ -502,6 +536,7 @@ class Interp { switch(Tools.expr(e)) { case EIdent(_id): if (_id == 'this') { + /* if (_proxy.hasField(f)) { v = fop(get(obj, f), expr(e2)); _proxy.hset(f, v); @@ -514,12 +549,21 @@ class Interp { return v; } } - else if(_proxy.superClass == null && _proxy.__class.classDecl.extend != null){ + */ + if(_proxy.superClass == null && _proxy.__class.classDecl.extend != null){ // Caches the declaration to set it once superClass is created v = fop(get(obj, f), expr(e2)); _proxy.cacheSuperField(f, v); return v; } + else { + try { + v = fop(get(obj, f), expr(e2)); + _proxy.hset(f, v); // superClass check already handled in Custom Class + return v; + } + catch(e) {} + } } default: } @@ -719,10 +763,6 @@ class Interp { return publicVariables.get(id); if(staticVariables.exists(id)) return staticVariables.get(id); - /* - if(customClasses.exists(id)) - return customClasses.get(id); - */ if(customClassExist(id)) return getCustomClass(id); @@ -763,16 +803,7 @@ class Interp { if (_scriptObjectType == SObject && instanceHasField) { return UnsafeReflect.field(scriptObject, id); - }/* else if(_scriptObjectType == SCustomClass && instanceHasField) { - var obj:IHScriptCustomClassBehaviour = cast scriptObject; - if(isBypassAccessor) { - obj.__allowSetGet = false; - var res = obj.hget(id); - obj.__allowSetGet = true; - return res; - } - return obj.hget(id); - }*/ + } else if(_scriptObjectType == SAccessBehaviourObject) { var obj:IHScriptCustomAccessBehaviour = cast scriptObject; if(isBypassAccessor) { diff --git a/hscript/customclass/CustomClass.hx b/hscript/customclass/CustomClass.hx index df8660c..13e35bc 100644 --- a/hscript/customclass/CustomClass.hx +++ b/hscript/customclass/CustomClass.hx @@ -272,7 +272,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour { } var __superClassFieldList:Array = null; - + // ONLY FOR REAL CLASSES. CUSTOM CLASSES CHECKS FOR THEIR FIELDS ON `hget/hset` public function superHasField(name:String):Bool { if (superClass == null) return false; @@ -281,8 +281,6 @@ class CustomClass implements IHScriptCustomAccessBehaviour { if (__superClassFieldList == null) { var realFields = Reflect.fields(superClass).concat(Type.getInstanceFields(Type.getClass(superClass))); __superClassFieldList = realFields; - - // TODO: macro-based superclass iteration for Custom Class as superclass } return __superClassFieldList.indexOf(name) != -1; @@ -359,6 +357,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour { return r; } + // TODO: move this to "hget" directly private function resolveField(name:String):Dynamic { switch (name) { case "superClass": @@ -415,7 +414,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour { return superCustomClass.hget(name); } catch (e) {} } - + // Real Class var fields = Type.getInstanceFields(Type.getClass(this.superClass)); if (fields.contains(name)) { return __allowSetGet ? Reflect.getProperty(this.superClass, name) : Reflect.field(this.superClass, name);