Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 8 additions & 45 deletions polymod/hscript/_internal/PolymodAbstractScriptClass.hx
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import haxe.ds.ObjectMap;
@:access(polymod.hscript._internal.PolymodScriptClass)
abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
{
static final fieldsCache:ObjectMap<Dynamic, Array<String>> = new ObjectMap();

private function resolveField(name:String):Dynamic
{
switch (name)
Expand Down Expand Up @@ -107,14 +105,13 @@ abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
}
} else {
// Class object
try {
return getClassObjectField(this.superClass, name);
}
catch (e:String)
{
@:privateAccess this._interp.error(EInvalidAccess(name));
//throw "field '" + name + "' does not exist in script class '" + this.fullyQualifiedName + "' or super class '" + Type.getClassName(Type.getClass(this.superClass)) + "'";
if (this.superHasField(name) || this.superHasField('get_$name')) {
return Reflect.getProperty(this.superClass, name);
}

@:privateAccess this._interp.error(EInvalidAccess(name));
//throw "field '" + name + "' does not exist in script class '" + this.fullyQualifiedName + "' or super class '" + Type.getClassName(Type.getClass(this.superClass)) + "'";

}
}

Expand Down Expand Up @@ -179,7 +176,8 @@ abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
}
else {
// Class object
if (setClassObjectField(this.superClass, name, value)) {
if (this.superHasField(name) || this.superHasField('set_$name')) {
Reflect.setProperty(this.superClass, name, value);
return value;
}

Expand All @@ -199,39 +197,4 @@ abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
// throw "field '" + name + "' does not exist in script class '" + this.fullyQualifiedName + "' or super class '" + Type.getClassName(Type.getClass(this.superClass)) + "'";
}
}

private static function retrieveClassObjectFields(o:Dynamic):Array<String>
{
final superClassCls = Type.getClass(o);
if (superClassCls == null) throw "Provided object isn't a class";

var fields = fieldsCache.get(superClassCls);
if (fields == null)
{
fields = Type.getInstanceFields(superClassCls);
fieldsCache.set(superClassCls, fields);
}

return fields;
}

private static function getClassObjectField(o:Dynamic, field:String):Null<Dynamic>
{
var fields = retrieveClassObjectFields(o);
if (fields.contains(field) || fields.contains('get_$field'))
return Reflect.getProperty(o, field);

throw 'No such field $field';
}

private static function setClassObjectField(o:Dynamic, field:String, value:Dynamic):Bool
{
var fields = retrieveClassObjectFields(o);
if (fields.contains(field) || fields.contains('set_$field'))
{
Reflect.setProperty(o, field, value);
return true;
}
return false;
}
}