This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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,5 +1,5 @@
|
||||
package hscript;
|
||||
|
||||
interface IHScriptCustomConstructor {
|
||||
public function hnew(args:Array<Dynamic>):Dynamic;
|
||||
public function hnew(args:Array<Dynamic>):Dynamic;
|
||||
}
|
||||
+9
-13
@@ -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 {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user