This commit is contained in:
NeeEoo
2023-03-31 22:11:48 +02:00
parent 0a64bca9ce
commit 995c3b9c8e
5 changed files with 77 additions and 35 deletions
+1 -1
View File
@@ -154,7 +154,7 @@ class ClassExtendMacro {
}
if(shadowClass.fields.length > 0) {
trace("Defining Class: " + shadowClass.name + " containing " + newFuncNames);
//trace("Defining Class: " + shadowClass.name + " containing " + newFuncNames);
Context.defineModule(cl.module, [shadowClass], Context.getLocalImports());
}
}
+64 -18
View File
@@ -1,25 +1,71 @@
package hscript;
class CustomClassHandler implements IHScriptCustomConstructor {
public var ogInterp:Interp;
public var name:String;
public var fields:Array<Expr>;
public var extend:String;
public var interfaces:Array<String>;
public var ogInterp:Interp;
public var name:String;
public var fields:Array<Expr>;
public var extend:String;
public var interfaces:Array<String>;
public function new(ogInterp:Interp, name:String, fields:Array<Expr>, ?extend:String, ?interfaces:Array<String>) {
this.ogInterp = ogInterp;
this.name = name;
this.fields = fields;
this.extend = extend;
this.interfaces = interfaces;
}
public function new(ogInterp:Interp, name:String, fields:Array<Expr>, ?extend:String, ?interfaces:Array<String>) {
this.ogInterp = ogInterp;
this.name = name;
this.fields = fields;
this.extend = extend;
this.interfaces = interfaces;
}
public function hnew(args:Array<Dynamic>):Dynamic {
return name; // TODO!!! only for testing here
}
public function hnew(args:Array<Dynamic>):Dynamic {
var interp = new Interp();
public function toString():String {
return name;
}
interp.errorHandler = ogInterp.errorHandler;
for(expr in fields) {
interp.execute(expr);
}
var cl = extend == null ? TemplateClass : Type.resolveClass('${name}_HSX');
var _class = Type.createInstance(cl, args);
//interp.variables.set("this", interp.variables);
_class.interp = interp;
var newFunc = interp.variables.get("new");
if(newFunc != null) {
Reflect.callMethod(null, newFunc, args);
}
for(variable => value in interp.variables) {
if(variable == "this") continue;
trace(variable, value, Reflect.isFunction(value));
}
return _class;
}
public function toString():String {
return name;
}
}
class TemplateClass implements IHScriptCustomBehaviour {
public var interp:Interp;
public function hset(name:String, val:Dynamic):Dynamic {
if(Reflect.hasField(this, name)) {
Reflect.setProperty(this, name, val);
return Reflect.getProperty(this, name); // Incase it overwrites the return value
}
if(this.interp.variables.exists("set_" + name)) {
return this.interp.variables.get("set_" + name)(val); // TODO: Prevent recursion from setting it in the function
}
this.interp.variables.set(name, val);
return val;
}
public function hget(name:String):Dynamic {
if(Reflect.hasField(this, name)) {
return Reflect.getProperty(this, name);
}
return this.interp.variables.get(name);
}
}
+2 -2
View File
@@ -1,6 +1,6 @@
package hscript;
interface IHScriptCustomBehaviour {
public function hset(name:String, val:Dynamic):Dynamic;
public function hget(name:String):Dynamic;
public function hset(name:String, val:Dynamic):Dynamic;
public function hget(name:String):Dynamic;
}
+1 -1
View File
@@ -1,5 +1,5 @@
package hscript;
interface IHScriptCustomConstructor {
public function hnew(args:Array<Dynamic>):Dynamic;
public function hnew(args:Array<Dynamic>):Dynamic;
}
+9 -13
View File
@@ -675,15 +675,15 @@ class Interp {
for (e in arr) {
switch (Tools.expr(e)) {
case EBinop("=>", eKey, eValue): {
var key:Dynamic = expr(eKey);
var value:Dynamic = expr(eValue);
isAllString = isAllString && (key is String);
isAllInt = isAllInt && (key is Int);
isAllObject = isAllObject && Reflect.isObject(key);
isAllEnum = isAllEnum && Reflect.isEnumValue(key);
keys.push(key);
values.push(value);
}
var key:Dynamic = expr(eKey);
var value:Dynamic = expr(eValue);
isAllString = isAllString && (key is String);
isAllInt = isAllInt && (key is Int);
isAllObject = isAllObject && Reflect.isObject(key);
isAllEnum = isAllEnum && Reflect.isEnumValue(key);
keys.push(key);
values.push(value);
}
default: throw("=> expected");
}
}
@@ -973,8 +973,4 @@ class Interp {
c = Type.resolveClass(cl);
return (c is IHScriptCustomConstructor) ? cast(c, IHScriptCustomConstructor).hnew(args) : Type.createInstance(c, args);
}
}
class TemplateClass {
}