This commit is contained in:
Jaime Humberto Macias Bustamante
2025-05-06 11:58:38 -07:00
parent e26385f591
commit 05577f7559
5 changed files with 39 additions and 126 deletions
+7 -5
View File
@@ -76,7 +76,7 @@ class CustomClassHandler implements IHScriptCustomConstructor {
comparisonMap.set(key, value);
}
_class.__custom__variables = interp.variables;
//_class.__custom__variables = interp.variables;
//trace(fields);
for(expr in fields) {
@@ -100,21 +100,21 @@ class CustomClassHandler implements IHScriptCustomConstructor {
// }
//}
_class.__class__fields = [for(key => value in classVariables) key];
//_class.__class__fields = [for(key => value in classVariables) key];
//trace(_class.__class__fields);
//@:privateAccess
//trace(interp.__instanceFields);
_class.__interp = interp;
_class.__allowSetGet = false;
//_class.__interp = interp;
//_class.__allowSetGet = false;
interp.scriptObject = _class;
for(variable => value in interp.variables) {
if(variable == "this" || variable == "super" || variable == "new") continue;
if(variable.startsWith("set_") || variable.startsWith("get_")) {
_class.__allowSetGet = true;
//_class.__allowSetGet = true;
}
}
@@ -139,9 +139,11 @@ class CustomClassHandler implements IHScriptCustomConstructor {
if(!interp.__instanceFields.contains(variable)) {
interp.__instanceFields.push(variable);
}
/*
if(!_class.__class__fields.contains(variable)) {
_class.__class__fields.push(variable);
}
*/
}
}
-11
View File
@@ -1,17 +1,6 @@
package hscript;
interface IHScriptCustomClassBehaviour {
public var __interp:Interp;
public var __customClass:hscript.customclass.CustomClass;
public var __custom__variables:Map<String, Dynamic>;
public var __allowSetGet:Bool;
public var __real_fields:Array<String>;
public var __class__fields:Array<String>;
public function hset(name:String, val:Dynamic):Dynamic;
public function hget(name:String):Dynamic;
public function __callGetter(name:String):Dynamic;
public function __callSetter(name:String, val:Dynamic):Dynamic;
}
+3 -62
View File
@@ -328,17 +328,6 @@ class Interp {
UnsafeReflect.setField(scriptObject, id, v);
return v;
}
/*
else if (_scriptObjectType == SCustomClass && instanceHasField) {
var obj:IHScriptCustomClassBehaviour = cast scriptObject;
if(isBypassAccessor) {
obj.__allowSetGet = false;
var res = obj.hset(id, v);
obj.__allowSetGet = true;
return res;
}
return obj.hset(id, v);
} */
else if(_scriptObjectType == SAccessBehaviourObject) {
var obj:IHScriptCustomAccessBehaviour = cast scriptObject;
if(isBypassAccessor) {
@@ -462,17 +451,6 @@ class Interp {
UnsafeReflect.setField(scriptObject, id, v);
return v;
}
/*
else if (_scriptObjectType == SCustomClass && instanceHasField) {
var obj:IHScriptCustomClassBehaviour = cast scriptObject;
if(isBypassAccessor) {
obj.__allowSetGet = false;
var res = obj.hset(id, v);
obj.__allowSetGet = true;
return res;
}
return obj.hset(id, v);
} */
else if(_scriptObjectType == SAccessBehaviourObject) {
var obj:IHScriptCustomAccessBehaviour = cast scriptObject;
if(isBypassAccessor) {
@@ -857,17 +835,6 @@ class Interp {
final variable:Class<Any> = variables.exists(thing) ? cast variables.get(thing) : null;
return variable == null ? thing : Type.getClassName(variable);
}
/*
if (!newCustomClass) {
if (customClasses.exists(name))
error(EAlreadyExistingClass(name));
trace("WARNING: Old Custom Class system marked for removal.\n'newCustomClass = true' to use the new system (STILL IN DEVELOPMENT)");
customClasses.set(name, new CustomClassHandler(this, name, fields, importVar(extend), [for (i in interfaces) importVar(i)]));
return null;
}
*/
// New Custom Class system
if (localParsedClasses.contains(name))
error(EAlreadyExistingClass(name));
@@ -1354,11 +1321,6 @@ class Interp {
return arr[index];
}
case ENew(cl, params):
/*
var a = [];
for (e in params)
a.push(expr(e));
*/
return cnew(cl, makeArgs(params));
case EThrow(e):
throw expr(e);
@@ -1529,7 +1491,7 @@ class Interp {
}
function makeArgs(params:Array<Expr>):Array<Dynamic> {
var args:Array<Dynamic> = []; // [for (p in params) expr(p)];
var args:Array<Dynamic> = [];
for (p in params) {
switch (Tools.expr(p)) {
case EIdent(id):
@@ -1691,18 +1653,6 @@ class Interp {
cl != null && setRedirects.exists(cl) && (_setRedirect = setRedirects[cl]) != null;
})
return _setRedirect(o, f, v);
/*
if(o is IHScriptCustomClassBehaviour) {
var obj:IHScriptCustomClassBehaviour = cast o;
if(isBypassAccessor) {
obj.__allowSetGet = false;
var res = obj.hset(f, v);
obj.__allowSetGet = true;
return res;
}
return obj.hset(f, v);
}
*/
if (o is IHScriptCustomAccessBehaviour) {
var obj:IHScriptCustomAccessBehaviour = cast o;
if(isBypassAccessor) {
@@ -1854,11 +1804,7 @@ class Interp {
if(staticClass.hasFunction(f))
return staticClass.callFunction(f, args);
}
/*
if(_hasScriptObject && o == CustomClassHandler.staticHandler) {
return UnsafeReflect.callMethodUnsafe(scriptObject, UnsafeReflect.field(scriptObject, "_HX_SUPER__" + f), args);
}
*/
var func = get(o, f);
// Workaround for an HTML5-specific issue.
@@ -1873,11 +1819,6 @@ class Interp {
}
function call(o:Dynamic, f:Dynamic, args:Array<Dynamic>):Dynamic {
/*
if(f == CustomClassHandler.staticHandler) {
return null;
}
*/
if (_inCustomClass) {
if (o == null && _nextCallObject != null) {
o = _nextCallObject;
@@ -1896,7 +1837,7 @@ class Interp {
_nextCallObject = null;
return r;
} catch (e) {
error(ECustom('${_proxy.className} threw an exception: \n${e.details()}'));
error(ECustom('${_proxy.className} threw an exception: \n${e.message}'));
_nextCallObject = null;
return null;
}
+5 -32
View File
@@ -35,9 +35,9 @@ class CustomClass implements IHScriptCustomAccessBehaviour {
private var __class:CustomClassDecl;
private var __cachedSuperFields:Null<Map<String, Dynamic>> = null;
private var __cachedFieldDecls:Map<String, FieldDecl> = null;
private var __cachedFunctionDecls:Map<String, FunctionDecl> = null;
private var __cachedVarDecls:Map<String, VarDecl> = null;
private var __cachedFieldDecls:Map<String, FieldDecl> = [];
private var __cachedFunctionDecls:Map<String, FunctionDecl> = [];
private var __cachedVarDecls:Map<String, VarDecl> = [];
public var __allowSetGet:Bool = false;
@@ -81,10 +81,6 @@ class CustomClass implements IHScriptCustomAccessBehaviour {
}
function buildClass() {
__cachedFieldDecls = [];
__cachedFunctionDecls = [];
__cachedVarDecls = [];
if (__cachedSuperFields == null)
__cachedSuperFields = [];
@@ -156,29 +152,6 @@ class CustomClass implements IHScriptCustomAccessBehaviour {
interp.variables.set(s, v);
}
}
/*
var extendString = new Printer().typeToString(__class.classDecl.extend);
if (__class.pkg != null && extendString.indexOf(".") == -1) {
extendString = __class.pkg.join(".") + "." + extendString;
}
if (Interp.customClassExist(extendString)) {
var customSuperClass:CustomClass = new CustomClass(Interp.getCustomClass(extendString), args, _cachedSuperFields, this.interp);
superClass = customSuperClass;
} else {
var c = Type.resolveClass('${extendString}_HSX');
if (c == null) {
interp.error(ECustom("could not resolve super class: " + extendString));
}
if (_cachedSuperFields != null) {
Reflect.setField(c, "__cachedFields", _cachedSuperFields); // Static field
}
superClass = Type.createInstance(c, args);
superClass.__customClass = this;
superClass.__real_fields = Type.getInstanceFields(c);
}
*/
}
function buildImports() {
@@ -254,7 +227,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour {
+ '\n'
+ 'InvalidAccess error: Super function "${name}" does not exist! Define it or call the correct superclass function.'));
}
r = Reflect.callMethod(superClass is CustomClass ? null : superClass, superFn, fixedArgs);
r = Reflect.callMethod((superClass is CustomClass) ? null : superClass, superFn, fixedArgs);
}
return r;
}
@@ -295,7 +268,7 @@ class CustomClass implements IHScriptCustomAccessBehaviour {
}
var __superClassFieldList:Array<String> = null;
// TODO: superHasField when it extends another Custom Class
public function superHasField(name:String):Bool {
if (superClass == null)
return false;
+24 -16
View File
@@ -254,7 +254,7 @@ class ClassExtendMacro {
if (returns) {
overrideExpr = macro {
var name:String = $v{name};
/*
if (__custom__variables != null) {
if(__custom__variables.exists(name)) {
var v:Dynamic = null;
@@ -263,7 +263,7 @@ class ClassExtendMacro {
}
}
}
*/
if (__customClass != null && @:privateAccess __customClass.hasFunction(name)) {
return __customClass.callFunction(name, [$a{arguments}]);
}
@@ -273,7 +273,7 @@ class ClassExtendMacro {
} else {
overrideExpr = macro {
var name:String = $v{name};
/*
if (__custom__variables != null) {
if(__custom__variables.exists(name)) {
var v:Dynamic = null;
@@ -283,7 +283,7 @@ class ClassExtendMacro {
}
}
}
*/
if (__customClass != null && @:privateAccess __customClass.hasFunction(name)) {
__customClass.callFunction(name, [$a{arguments}]);
return;
@@ -351,7 +351,7 @@ class ClassExtendMacro {
pack: cl.pack.copy(),
name: cl.name
}, [
{name: "IHScriptCustomAccessBehaviour", pack: ["hscript"]},
{name: "IHScriptCustomBehaviour", pack: ["hscript"]},
{name: "IHScriptCustomClassBehaviour", pack: ["hscript"]}
], false, true, false);
shadowClass.name = '${cl.name}$CLASS_SUFFIX';
@@ -367,21 +367,21 @@ class ClassExtendMacro {
});
// Adding hscript getters and setters
/*
shadowClass.fields.push({
name: "__interp",
pos: Context.currentPos(),
kind: FVar(macro: hscript.Interp),
access: [APublic]
});
*/
shadowClass.fields.push({
name: "__customClass",
pos: Context.currentPos(),
kind: FVar(macro: hscript.customclass.CustomClass),
access: [APublic]
});
/*
shadowClass.fields.push({
name: "__custom__variables",
pos: Context.currentPos(),
@@ -395,21 +395,23 @@ class ClassExtendMacro {
kind: FVar(macro: Bool, macro true),
access: [APublic]
});
*/
shadowClass.fields.push({
name: "__real_fields",
pos: Context.currentPos(),
kind: FVar(macro: Array<String>),
access: [APublic]
});
/*
shadowClass.fields.push({
name: "__class__fields",
pos: Context.currentPos(),
kind: FVar(macro: Array<String>),
access: [APublic]
});
*/
// Unneccessary since the get/set call is already handled.
/*
shadowClass.fields.push({
name: "__callGetter",
pos: Context.currentPos(),
@@ -463,7 +465,7 @@ class ClassExtendMacro {
}),
access: [APublic]
});
*/
// Todo: make it possible to override
if(cl.name == "FunkinShader" || cl.name == "CustomShader" || cl.name == "MultiThreadedScript") {
Context.defineModule(cl.module, [shadowClass], imports);
@@ -506,28 +508,33 @@ class ClassExtendMacro {
var hgetField = if(hasHgetInSuper) {
macro {
/*
if(__custom__variables != null) {
if(__allowSetGet && __custom__variables.exists("get_" + name))
return __callGetter(name);
if (__custom__variables.exists(name))
return __custom__variables.get(name);
}
*/
return super.hget(name);
}
} else {
macro {
/*
if(__custom__variables != null) {
if(__allowSetGet && __custom__variables.exists("get_" + name))
return __callGetter(name);
if (__custom__variables.exists(name))
return __custom__variables.get(name);
}
*/
return UnsafeReflect.getProperty(this, name);
}
}
var hsetField = if(hasHsetInSuper) {
macro {
/*
if(__custom__variables != null) {
if(__allowSetGet && __custom__variables.exists("set_" + name))
return __callSetter(name, val);
@@ -536,7 +543,7 @@ class ClassExtendMacro {
return val;
}
}
*/
if(__real_fields != null && __real_fields.contains(name)) {
UnsafeReflect.setProperty(this, name, val);
return UnsafeReflect.field(this, name);
@@ -545,6 +552,7 @@ class ClassExtendMacro {
}
} else {
macro {
/*
if(__custom__variables != null) {
if(__allowSetGet && __custom__variables.exists("set_" + name))
return __callSetter(name, val);
@@ -553,12 +561,12 @@ class ClassExtendMacro {
return val;
}
}
*/
if(__real_fields != null && __real_fields.contains(name)) {
UnsafeReflect.setProperty(this, name, val);
return UnsafeReflect.field(this, name);
}
if(__custom__variables != null) __custom__variables.set(name, val);
//if(__custom__variables != null) __custom__variables.set(name, val);
return val;
}
}
@@ -610,7 +618,7 @@ class ClassExtendMacro {
]
})
});
/*var p = new Printer();
var aa = p.printTypeDefinition(shadowClass);
if(aa.length < 5024)