Bug fix with locals + Compatibility improvement

This commit is contained in:
Ne_Eo
2025-01-19 21:00:20 +01:00
parent e4789d9c40
commit 77420e9873
4 changed files with 129 additions and 13 deletions
+41 -2
View File
@@ -22,7 +22,7 @@ class CustomClassHandler implements IHScriptCustomConstructor {
this.extend = extend;
this.interfaces = interfaces;
this.cl = extend == null ? TemplateClass : Type.resolveClass('${extend}_HSX');
this.cl = extend == null ? CustomTemplateClass : Type.resolveClass('${extend}_HSX');
if(cl == null)
ogInterp.error(EInvalidClass(extend));
}
@@ -153,7 +153,7 @@ class CustomClassHandler implements IHScriptCustomConstructor {
}
}
class TemplateClass implements IHScriptCustomClassBehaviour implements IHScriptCustomBehaviour {
class CustomTemplateClass implements IHScriptCustomClassBehaviour implements IHScriptCustomAccessBehaviour {
public var __interp:Interp;
public var __allowSetGet:Bool = true;
public var __custom__variables:Map<String, Dynamic>;
@@ -198,6 +198,45 @@ class TemplateClass implements IHScriptCustomClassBehaviour implements IHScriptC
}
}
/**
* This is for backwards compatibility with old hscript-improved, since some scripts use it
**/
@:dox(hide)
@:keep
class TemplateClass implements IHScriptCustomBehaviour implements IHScriptCustomAccessBehaviour {
public var __interp:Interp;
public var __allowSetGet:Bool = true;
public function hset(name:String, val:Dynamic):Dynamic {
var variables = __interp.variables;
if(__allowSetGet && variables.exists("set_" + name))
return __callSetter(name, val);
variables.set(name, val);
return val;
}
public function hget(name:String):Dynamic {
var variables = __interp.variables;
if(__allowSetGet && variables.exists("get_" + name))
return __callGetter(name);
return variables.get(name);
}
public function __callGetter(name:String):Dynamic {
__allowSetGet = false;
var v = __interp.variables.get("get_" + name)();
__allowSetGet = true;
return v;
}
public function __callSetter(name:String, val:Dynamic):Dynamic {
__allowSetGet = false;
var v = __interp.variables.get("set_" + name)(val);
__allowSetGet = true;
return v;
}
}
final class StaticHandler {
public function new() {}
}
+11
View File
@@ -0,0 +1,11 @@
package hscript;
interface IHScriptCustomAccessBehaviour {
var __allowSetGet:Bool;
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;
}
+75 -10
View File
@@ -48,6 +48,7 @@ enum abstract ScriptObjectType(UInt8) {
var SStaticClass;
var SCustomClass; // custom classes
var SBehaviourClass; // hget and hset
var SAccessBehaviourObject; // hget and hset with __allowSetGet
var SNull;
}
@@ -79,6 +80,8 @@ class Interp {
if(classFields != null)
__instanceFields = __instanceFields.concat(classFields);
_scriptObjectType = SCustomClass;
} else if(v is IHScriptCustomAccessBehaviour) {
_scriptObjectType = SAccessBehaviourObject;
} else if(v is IHScriptCustomBehaviour) {
_scriptObjectType = SBehaviourClass;
} else {
@@ -109,6 +112,7 @@ class Interp {
public var publicVariables:Map<String, Dynamic>;
public var staticVariables:Map<String, Dynamic>;
// warning can be null
public var locals:Map<String, DeclaredVar>;
var binops:Map<String, Expr->Expr->Dynamic>;
@@ -240,7 +244,8 @@ class Interp {
var v = expr(e2);
switch (Tools.expr(e1)) {
case EIdent(id):
if (!locals.exists(id)) {
var l = locals.get(id);
if (l == null) {
if (_hasScriptObject && !varExists(id)) {
var instanceHasField = __instanceFields.contains(id);
@@ -256,7 +261,17 @@ class Interp {
return res;
}
return obj.hset(id, v);
} else if (_scriptObjectType == SBehaviourClass) {
} else if(_scriptObjectType == SAccessBehaviourObject) {
var obj:IHScriptCustomAccessBehaviour = 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 == SBehaviourClass) {
var obj:IHScriptCustomBehaviour = cast scriptObject;
return obj.hset(id, v);
}
@@ -278,7 +293,6 @@ class Interp {
setVar(id, v);
}
} else {
var l = locals.get(id);
l.r = v;
if (l.depth == 0) {
setVar(id, v);
@@ -313,8 +327,9 @@ class Interp {
var v;
switch (Tools.expr(e1)) {
case EIdent(id):
var l = locals.get(id);
v = fop(expr(e1), expr(e2));
if (!locals.exists(id)) {
if (l == null) {
if(_hasScriptObject && !varExists(id)) {
var instanceHasField = __instanceFields.contains(id);
@@ -330,7 +345,17 @@ class Interp {
return res;
}
return obj.hset(id, v);
} else if (_scriptObjectType == SBehaviourClass) {
} else if(_scriptObjectType == SAccessBehaviourObject) {
var obj:IHScriptCustomAccessBehaviour = 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 == SBehaviourClass) {
var obj:IHScriptCustomBehaviour = cast scriptObject;
return obj.hset(id, v);
}
@@ -389,8 +414,8 @@ class Interp {
#end
switch (e) {
case EIdent(id):
if(locals.exists(id)) {
var l = locals.get(id);
var l = locals.get(id);
if(l != null) {
var v:Dynamic = l.r;
if (prefix) {
v += delta;
@@ -452,6 +477,8 @@ class Interp {
return exprReturn(expr);
}
public var printCallStack:Bool = true;
function exprReturn(e):Dynamic {
try {
try {
@@ -468,7 +495,10 @@ class Interp {
return v;
}
} catch(e) {
error(ECustom('${e.toString()}'));
if(printCallStack)
error(ECustom('${e.toString()}\n${CallStack.toString(CallStack.exceptionStack(true))}'));
else
error(ECustom(e.toString()));
return null;
}
} catch(e:Error) {
@@ -525,8 +555,12 @@ class Interp {
if (id == null)
return null;
id = StringTools.trim(id);
if (locals.exists(id))
return locals.get(id).r;
if (locals.exists(id)) {
var l = locals.get(id);
if(l != null)
return l.r;
}
if(variables.exists(id))
return variables.get(id);
@@ -555,6 +589,15 @@ class Interp {
return res;
}
return obj.hget(id);
} else if(_scriptObjectType == SAccessBehaviourObject) {
var obj:IHScriptCustomAccessBehaviour = cast scriptObject;
if(isBypassAccessor) {
obj.__allowSetGet = false;
var res = obj.hget(id);
obj.__allowSetGet = true;
return res;
}
return obj.hget(id);
} else if(_scriptObjectType == SBehaviourClass) {
var obj:IHScriptCustomBehaviour = cast scriptObject;
return obj.hget(id);
@@ -1171,6 +1214,17 @@ class Interp {
return obj.hget(f);
}
if (o is IHScriptCustomAccessBehaviour) {
var obj:IHScriptCustomAccessBehaviour = cast o;
if(isBypassAccessor) {
obj.__allowSetGet = false;
var res = obj.hget(f);
obj.__allowSetGet = true;
return res;
}
return obj.hget(f);
}
if (o is IHScriptCustomBehaviour) {
var obj:IHScriptCustomBehaviour = cast o;
return obj.hget(f);
@@ -1209,6 +1263,17 @@ class Interp {
return obj.hset(f, v);
}
if (o is IHScriptCustomAccessBehaviour) {
var obj:IHScriptCustomAccessBehaviour = 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 IHScriptCustomBehaviour) {
var obj:IHScriptCustomBehaviour = cast o;
return obj.hset(f, v);
+2 -1
View File
@@ -60,6 +60,7 @@ class ClassExtendMacro {
if(key == "away3d.tools.commands.SphereMaker") return fields; // Error: Unknown identifier
if(key == "away3d.tools.commands.Weld") return fields; // Error: Unknown identifier
if(fkey == "hscript.CustomClassHandler.TemplateClass") return fields; // Error: Redefined
if(fkey == "hscript.CustomClassHandler.CustomTemplateClass") return fields; // Error: Redefined
if(key == "sys.thread.EventLoop") return fields; // Error: cant override force inlined
if(Config.DISALLOW_CUSTOM_CLASSES.contains(cl.module) || Config.DISALLOW_CUSTOM_CLASSES.contains(fkey)) return fields;
if(cl.module.contains("_")) return fields; // Weird issue, sorry
@@ -330,7 +331,7 @@ class ClassExtendMacro {
pack: cl.pack.copy(),
name: cl.name
}, [
{name: "IHScriptCustomBehaviour", pack: ["hscript"]},
{name: "IHScriptCustomAccessBehaviour", pack: ["hscript"]},
{name: "IHScriptCustomClassBehaviour", pack: ["hscript"]}
], false, true, false);
shadowClass.name = '${cl.name}$CLASS_SUFFIX';