Simplified Custom Class assignment

This commit is contained in:
Jaime Humberto Macias Bustamante
2025-05-08 16:25:16 -07:00
parent c7160d05fd
commit 3f1f0e7234
2 changed files with 54 additions and 24 deletions
+51 -20
View File
@@ -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) {
+3 -4
View File
@@ -272,7 +272,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour {
}
var __superClassFieldList:Array<String> = 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);