Skip to content

Commit 9833b7b

Browse files
committed
Use existing superHasField function for the field cache
1 parent 9824bf4 commit 9833b7b

File tree

2 files changed

+11
-46
lines changed

2 files changed

+11
-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) || this.superHasField('get_$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) || this.superHasField('set_$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: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,9 @@ class PolymodScriptClass
434434
// Reflect.hasField(this, name) is REALLY expensive so we use a cache.
435435
if (__superClassFieldList == null)
436436
{
437-
__superClassFieldList = Reflect.fields(superClass).concat(Type.getInstanceFields(Type.getClass(superClass)));
437+
var instanceFields = Type.getInstanceFields(Type.getClass(superClass));
438+
__superClassFieldList = Reflect.fields(superClass);
439+
__superClassFieldList = __superClassFieldList.concat(instanceFields.filter(f -> !__superClassFieldList.contains(f)));
438440
}
439441
return __superClassFieldList.indexOf(name) != -1;
440442
}

0 commit comments

Comments
 (0)