static property accessor call

This commit is contained in:
Jaime Humberto Macias Bustamante
2025-08-14 03:07:44 -07:00
parent e4861a606a
commit 0b4675b4ad
2 changed files with 21 additions and 6 deletions
+1
View File
@@ -908,6 +908,7 @@ class Interp {
getter: getter,
setter: setter,
isVar: isVar,
isStatic: isStatic,
interp: this,
}
}
+20 -6
View File
@@ -28,31 +28,41 @@ import hscript.Expr.FieldPropertyAccess;
@:access(hscript.Interp)
@:structInit
class Property {
private static inline var GET = 'get_';
private static inline var SET = 'set_';
public var r:Dynamic;
public var getter:FieldPropertyAccess;
public var setter:FieldPropertyAccess;
public var isStatic(get, never):Bool;
function get_isStatic() {
return __isStatic && interp.allowStaticVariables;
}
var isVar:Bool;
var interp:Interp;
public function new(r:Dynamic, getter:FieldPropertyAccess, setter:FieldPropertyAccess, isVar:Bool, interp:Interp) {
public function new(r:Dynamic, getter:FieldPropertyAccess, setter:FieldPropertyAccess, isVar:Bool, isStatic:Bool, interp:Interp) {
this.r = r;
this.getter = getter;
this.setter = setter;
this.isVar = isVar;
this.__isStatic = isStatic;
this.interp = interp;
}
var __allowReadAccess:Bool = false;
var __allowWriteAccess:Bool = false;
var __allowSetGet:Null<Bool> = null;
final __isStatic:Bool = false;
public function callGetter(name:String) {
switch (getter) {
case AGet | ADynamic:
var fName:String = 'get_$name';
var fName:String = '$GET$name';
if (!__allowReadAccess && (__allowSetGet != null && __allowSetGet || !interp.isBypassAccessor)) {
if (interp.varExists(fName)) {
if (varExists(fName)) {
return callAccessor(fName);
} else
interp.error(ECustom('Method $fName required by property $name is missing'));
@@ -73,9 +83,9 @@ class Property {
public function callSetter(name:String, val:Dynamic) {
switch (setter) {
case ASet | ADynamic:
var fName:String = 'set_$name';
var fName:String = '$SET$name';
if (!__allowWriteAccess && (__allowSetGet != null && __allowSetGet || !interp.isBypassAccessor)) {
if (interp.varExists(fName))
if (varExists(fName))
return callAccessor(fName, [val], true);
else
interp.error(ECustom('Method $fName required by property $name is missing'));
@@ -94,7 +104,7 @@ class Property {
}
private function callAccessor(f:String, ?args:Array<Dynamic>, isWrite:Bool = false):Dynamic {
var fn = interp.variables.get(f);
var fn = isStatic ? interp.staticVariables.get(f) : interp.variables.get(f);
var rt:Dynamic = null;
if (fn != null && Reflect.isFunction(fn)) {
if (isWrite) __allowWriteAccess = true;
@@ -111,4 +121,8 @@ class Property {
return rt;
}
private function varExists(n:String) {
return isStatic ? interp.staticVariables.exists(n) : interp.variables.exists(n);
}
}