Simplified Custom Class assignment
This commit is contained in:
+51
-20
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user