Skip to content

Commit b4ea23a

Browse files
committed
Use existing superHasField function for the field cache
1 parent d88daa6 commit b4ea23a

File tree

2 files changed

+9
-46
lines changed

2 files changed

+9
-46
lines changed

polymod/hscript/_internal/PolymodAbstractScriptClass.hx

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import haxe.ds.ObjectMap;
66
@:access(polymod.hscript._internal.PolymodScriptClass)
77
abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
88
{
9-
static final fieldsCache:ObjectMap<Dynamic, Array<String>> = new ObjectMap();
10-
119
private function resolveField(name:String):Dynamic
1210
{
1311
switch (name)
@@ -107,14 +105,13 @@ abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
107105
}
108106
} else {
109107
// Class object
110-
try {
111-
return getClassObjectField(this.superClass, name);
112-
}
113-
catch (e:String)
114-
{
115-
@:privateAccess this._interp.error(EInvalidAccess(name));
116-
//throw "field '" + name + "' does not exist in script class '" + this.fullyQualifiedName + "' or super class '" + Type.getClassName(Type.getClass(this.superClass)) + "'";
108+
if (this.superHasField(name)) {
109+
return Reflect.getProperty(this.superClass, name);
117110
}
111+
112+
@:privateAccess this._interp.error(EInvalidAccess(name));
113+
//throw "field '" + name + "' does not exist in script class '" + this.fullyQualifiedName + "' or super class '" + Type.getClassName(Type.getClass(this.superClass)) + "'";
114+
118115
}
119116
}
120117

@@ -179,7 +176,8 @@ abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
179176
}
180177
else {
181178
// Class object
182-
if (setClassObjectField(this.superClass, name, value)) {
179+
if (this.superHasField(name)) {
180+
Reflect.setProperty(this.superClass, name, value);
183181
return value;
184182
}
185183

@@ -199,39 +197,4 @@ abstract PolymodAbstractScriptClass(PolymodScriptClass) from PolymodScriptClass
199197
// throw "field '" + name + "' does not exist in script class '" + this.fullyQualifiedName + "' or super class '" + Type.getClassName(Type.getClass(this.superClass)) + "'";
200198
}
201199
}
202-
203-
private static function retrieveClassObjectFields(o:Dynamic):Array<String>
204-
{
205-
final superClassCls = Type.getClass(o);
206-
if (superClassCls == null) throw "Provided object isn't a class";
207-
208-
var fields = fieldsCache.get(superClassCls);
209-
if (fields == null)
210-
{
211-
fields = Type.getInstanceFields(superClassCls);
212-
fieldsCache.set(superClassCls, fields);
213-
}
214-
215-
return fields;
216-
}
217-
218-
private static function getClassObjectField(o:Dynamic, field:String):Null<Dynamic>
219-
{
220-
var fields = retrieveClassObjectFields(o);
221-
if (fields.contains(field) || fields.contains('get_$field'))
222-
return Reflect.getProperty(o, field);
223-
224-
throw 'No such field $field';
225-
}
226-
227-
private static function setClassObjectField(o:Dynamic, field:String, value:Dynamic):Bool
228-
{
229-
var fields = retrieveClassObjectFields(o);
230-
if (fields.contains(field) || fields.contains('set_$field'))
231-
{
232-
Reflect.setProperty(o, field, value);
233-
return true;
234-
}
235-
return false;
236-
}
237200
}

polymod/hscript/_internal/PolymodScriptClass.hx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ class PolymodScriptClass
420420
// Reflect.hasField(this, name) is REALLY expensive so we use a cache.
421421
if (__superClassFieldList == null)
422422
{
423-
__superClassFieldList = Reflect.fields(superClass).concat(Type.getInstanceFields(Type.getClass(superClass)));
423+
__superClassFieldList = Type.getInstanceFields(Type.getClass(superClass));
424424
}
425425
return __superClassFieldList.indexOf(name) != -1;
426426
}

0 commit comments

Comments
 (0)