INT_VARS flag, kinda broken lmao
This commit is contained in:
@@ -29,7 +29,10 @@ class CustomClassHandler implements IHScriptCustomConstructor {
|
||||
}
|
||||
|
||||
public function hnew(args:Array<Dynamic>):Dynamic {
|
||||
/*
|
||||
#if INT_VARS
|
||||
throw "todo: do all this lmao -lunar";
|
||||
return null;
|
||||
#else
|
||||
var interp = new Interp();
|
||||
interp.errorHandler = ogInterp.errorHandler;
|
||||
|
||||
@@ -55,7 +58,8 @@ class CustomClassHandler implements IHScriptCustomConstructor {
|
||||
}
|
||||
|
||||
// ! lunar do NOT forget you commented this
|
||||
// _class.__custom__variables = interp.variables;
|
||||
// ! Thank u past lunar ur awesome :D
|
||||
_class.__custom__variables = interp.variables;
|
||||
|
||||
for(expr in fields) {
|
||||
@:privateAccess
|
||||
@@ -79,9 +83,8 @@ class CustomClassHandler implements IHScriptCustomConstructor {
|
||||
if(newFunc != null) {
|
||||
UnsafeReflect.callMethodUnsafe(null, newFunc, args);
|
||||
}
|
||||
*/
|
||||
throw "todo: do all this lmao -lunar";
|
||||
return null;
|
||||
return _class;
|
||||
#end
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
|
||||
+8
-5
@@ -105,7 +105,9 @@ enum Expr
|
||||
EImport( c : String, mode: KImportMode );
|
||||
EClass( name:VarN, fields:Array<Expr>, ?extend:String, interfaces:Array<String> );
|
||||
|
||||
#if INT_VARS
|
||||
EInfo( info: InfoClass, e: Expr );
|
||||
#end
|
||||
}
|
||||
|
||||
enum Binop {
|
||||
@@ -267,6 +269,7 @@ enum abstract Unop(UInt8) {
|
||||
var OpSpread;
|
||||
}
|
||||
|
||||
#if INT_VARS
|
||||
class InfoClass {
|
||||
public var variables:Array<String>;
|
||||
|
||||
@@ -274,6 +277,7 @@ class InfoClass {
|
||||
this.variables = variables;
|
||||
}
|
||||
}
|
||||
#end
|
||||
|
||||
enum KImportMode {
|
||||
INormal;
|
||||
@@ -390,9 +394,8 @@ typedef VarDecl = {
|
||||
var type : Null<CType>;
|
||||
}
|
||||
|
||||
#if INT_VARS
|
||||
abstract VarN(Dynamic) from Int from String to Int to String {}
|
||||
// abstract VarN(Int) from Int to Int {}
|
||||
//enum VarN {
|
||||
// VInt(v:Int);
|
||||
// VStr(v:String);
|
||||
//}
|
||||
#else
|
||||
typedef VarN = String;
|
||||
#end
|
||||
+214
-65
@@ -94,22 +94,20 @@ class Interp {
|
||||
public var errorHandler:Error->Void;
|
||||
public var importFailedCallback:Array<String>->Bool;
|
||||
|
||||
#if INT_VARS
|
||||
public var _variablesNames:Array<String> = [];
|
||||
public var _variables:Array<Dynamic> = [];
|
||||
public var _locals:Array<DeclaredVar> = [];
|
||||
#else
|
||||
public var locals:Map<String, DeclaredVar>;
|
||||
#end
|
||||
|
||||
// !BACKWARDS COMPAT
|
||||
// Used for backwards compat when using int vars!!!
|
||||
public var customClasses:HScriptVariables;
|
||||
public var variables:HScriptVariables;
|
||||
public var publicVariables:HScriptVariables;
|
||||
public var staticVariables:HScriptVariables;
|
||||
|
||||
//#if haxe3
|
||||
//var binops:Map<String, Expr->Expr->Dynamic>;
|
||||
//#else
|
||||
//var binops:Hash<Expr->Expr->Dynamic>;
|
||||
//#end
|
||||
|
||||
var depth:Int = 0;
|
||||
var inTry:Bool;
|
||||
var declared:Array<RedeclaredVar> = [];
|
||||
@@ -131,16 +129,24 @@ class Interp {
|
||||
var curExpr:Expr;
|
||||
#end
|
||||
|
||||
public function new() {
|
||||
public function new()
|
||||
resetVariables();
|
||||
//initOps();
|
||||
}
|
||||
|
||||
private function resetVariables() {
|
||||
#if INT_VARS
|
||||
_variablesNames = [];
|
||||
loadTables(0);
|
||||
|
||||
staticVariables = publicVariables = customClasses = variables = new HScriptVariables(this);
|
||||
#else
|
||||
customClasses = new Map<String, Dynamic>();
|
||||
variables = new Map<String, Dynamic>();
|
||||
publicVariables = new Map<String, Dynamic>();
|
||||
staticVariables = new Map<String, Dynamic>();
|
||||
|
||||
locals = new Map();
|
||||
setDefaultVariables();
|
||||
#end
|
||||
}
|
||||
|
||||
private function setDefaultVariables() {
|
||||
@@ -295,10 +301,12 @@ class Interp {
|
||||
|
||||
switch(Tools.expr(e2)) {
|
||||
case EIdent(id):
|
||||
#if INT_VARS
|
||||
var sid = _variablesNames[id];
|
||||
if (sid == "Class")
|
||||
#end
|
||||
if (#if INT_VARS sid #else id #end == "Class")
|
||||
return Std.isOfType(expr1, Class);
|
||||
if (sid == "Map" || sid == "IMap")
|
||||
if (#if INT_VARS sid #else id #end == "Map" || #if INT_VARS sid #else id #end == "IMap")
|
||||
return Std.isOfType(expr1, IMap);
|
||||
default:
|
||||
}
|
||||
@@ -307,6 +315,7 @@ class Interp {
|
||||
return expr2 != null ? Std.isOfType(expr1, expr2) : false;
|
||||
}
|
||||
|
||||
#if INT_VARS
|
||||
public inline function setVar(name:String, v:Dynamic) {
|
||||
isetVar(_variablesNames.indexOf(name), v);
|
||||
}
|
||||
@@ -320,41 +329,55 @@ class Interp {
|
||||
else
|
||||
_variables[id] = v;
|
||||
}
|
||||
#else
|
||||
public function setVar(name:String, v:Dynamic) {
|
||||
if (allowStaticVariables && staticVariables.exists(name))
|
||||
staticVariables.set(name, v);
|
||||
else if (allowPublicVariables && publicVariables.exists(name))
|
||||
publicVariables.set(name, v);
|
||||
else
|
||||
variables.set(name, v);
|
||||
}
|
||||
#end
|
||||
|
||||
function assign(e1:Expr, e2:Expr):Dynamic {
|
||||
var v = expr(e2);
|
||||
switch (Tools.expr(e1)) {
|
||||
case EIdent(id):
|
||||
var l = _locals[id];
|
||||
var l = #if INT_VARS _locals #else locals #end[id];
|
||||
if (l == null) {
|
||||
var iname:String = _variablesNames[id];
|
||||
#if INT_VARS
|
||||
var sid:String = _variablesNames[id];
|
||||
#end
|
||||
// TODO: WHEN ADDING ENUM DEFINED THING CHANGE THIS
|
||||
if (_variables[id] != null && !staticVariables.exists(iname) && !publicVariables.exists(iname) && _hasScriptObject) {
|
||||
if (#if INT_VARS _variables[id] != null #else !variables.exists(id) #end &&
|
||||
!staticVariables.exists(#if INT_VARS sid #else id #end) && !publicVariables.exists(#if INT_VARS sid #else id #end) && _hasScriptObject
|
||||
) {
|
||||
if (_scriptObjectType == SObject) {
|
||||
UnsafeReflect.setField(scriptObject, iname, v);
|
||||
UnsafeReflect.setField(scriptObject, #if INT_VARS sid #else id #end, v);
|
||||
} else {
|
||||
if (isBypassAccessor) {
|
||||
if (__instanceFields.contains(iname)) {
|
||||
UnsafeReflect.setField(scriptObject, iname, v);
|
||||
if (__instanceFields.contains(#if INT_VARS sid #else id #end)) {
|
||||
UnsafeReflect.setField(scriptObject, #if INT_VARS sid #else id #end, v);
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
if (__instanceFields.contains(iname)) {
|
||||
UnsafeReflect.setProperty(scriptObject, iname, v);
|
||||
} else if (__instanceFields.contains('set_$iname')) { // setter
|
||||
UnsafeReflect.getProperty(scriptObject, 'set_$iname')(v);
|
||||
if (__instanceFields.contains(#if INT_VARS sid #else id #end)) {
|
||||
UnsafeReflect.setProperty(scriptObject, #if INT_VARS sid #else id #end, v);
|
||||
} else if (__instanceFields.contains('set_${#if INT_VARS sid #else id #end}')) { // setter
|
||||
UnsafeReflect.getProperty(scriptObject, 'set_${#if INT_VARS sid #else id #end}')(v);
|
||||
} else {
|
||||
isetVar(id, v);
|
||||
#if INT_VARS isetVar #else setVar #end (id, v);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
isetVar(id, v);
|
||||
#if INT_VARS isetVar #else setVar #end (id, v);
|
||||
}
|
||||
} else {
|
||||
l.r = v;
|
||||
if (l.depth == 0) {
|
||||
isetVar(id, v);
|
||||
#if INT_VARS isetVar #else setVar #end (id, v);
|
||||
}
|
||||
}
|
||||
case EField(e, f, s):
|
||||
@@ -380,22 +403,24 @@ class Interp {
|
||||
var v:Dynamic = null;
|
||||
switch (Tools.expr(e1)) {
|
||||
case EIdent(id):
|
||||
var l = _locals[id];
|
||||
var l = #if INT_VARS _locals #else locals #end[id];
|
||||
v = fop(expr(e1), expr(e2));
|
||||
if (l == null) {
|
||||
if(_hasScriptObject) {
|
||||
var iname:String = _variablesNames[id];
|
||||
#if INT_VARS
|
||||
var sid:String = _variablesNames[id];
|
||||
#end
|
||||
if(_scriptObjectType == SObject) {
|
||||
UnsafeReflect.setField(scriptObject, iname, v);
|
||||
} else if (__instanceFields.contains(iname)) {
|
||||
UnsafeReflect.setProperty(scriptObject, iname, v);
|
||||
} else if (__instanceFields.contains('set_$iname')) { // setter
|
||||
UnsafeReflect.getProperty(scriptObject, 'set_$iname')(v);
|
||||
UnsafeReflect.setField(scriptObject, #if INT_VARS sid #else id #end, v);
|
||||
} else if (__instanceFields.contains(#if INT_VARS sid #else id #end)) {
|
||||
UnsafeReflect.setProperty(scriptObject, #if INT_VARS sid #else id #end, v);
|
||||
} else if (__instanceFields.contains('set_${#if INT_VARS sid #else id #end}')) { // setter
|
||||
UnsafeReflect.getProperty(scriptObject, 'set_${#if INT_VARS sid #else id #end}')(v);
|
||||
} else {
|
||||
isetVar(id, v);
|
||||
#if INT_VARS isetVar #else setVar #end (id, v);
|
||||
}
|
||||
} else {
|
||||
isetVar(id, v);
|
||||
#if INT_VARS isetVar #else setVar #end (id, v);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -429,22 +454,24 @@ class Interp {
|
||||
var v:Dynamic = null;
|
||||
switch (Tools.expr(e1)) {
|
||||
case EIdent(id):
|
||||
var l = _locals[id];
|
||||
var l = #if INT_VARS _locals #else locals #end[id];
|
||||
v = fop(aFunc, bFunc);
|
||||
if (l == null) {
|
||||
if(_hasScriptObject) {
|
||||
var iname:String = _variablesNames[id];
|
||||
#if INT_VARS
|
||||
var sid:String = _variablesNames[id];
|
||||
#end
|
||||
if(_scriptObjectType == SObject) {
|
||||
UnsafeReflect.setField(scriptObject, iname, v);
|
||||
} else if (__instanceFields.contains(iname)) {
|
||||
UnsafeReflect.setProperty(scriptObject, iname, v);
|
||||
} else if (__instanceFields.contains('set_$iname')) { // setter
|
||||
UnsafeReflect.getProperty(scriptObject, 'set_$iname')(v);
|
||||
UnsafeReflect.setField(scriptObject, #if INT_VARS sid #else id #end, v);
|
||||
} else if (__instanceFields.contains(#if INT_VARS sid #else id #end)) {
|
||||
UnsafeReflect.setProperty(scriptObject, #if INT_VARS sid #else id #end, v);
|
||||
} else if (__instanceFields.contains('set_${#if INT_VARS sid #else id #end}')) { // setter
|
||||
UnsafeReflect.getProperty(scriptObject, 'set_${#if INT_VARS sid #else id #end}')(v);
|
||||
} else {
|
||||
isetVar(id, v);
|
||||
#if INT_VARS isetVar #else setVar #end (id, v);
|
||||
}
|
||||
} else {
|
||||
isetVar(id, v);
|
||||
#if INT_VARS isetVar #else setVar #end (id, v);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -479,16 +506,16 @@ class Interp {
|
||||
#end
|
||||
switch (e) {
|
||||
case EIdent(id):
|
||||
var l = _locals[id];
|
||||
var v:Dynamic = (l == null) ? iresolve(id) : l.r;
|
||||
var l = #if INT_VARS _locals #else locals #end[id];
|
||||
var v:Dynamic = (l == null) ? #if INT_VARS iresolve #else resolve #end (id) : l.r;
|
||||
if (prefix) {
|
||||
v += delta;
|
||||
if (l == null)
|
||||
isetVar(id, v)
|
||||
#if INT_VARS isetVar #else setVar #end (id, v)
|
||||
else
|
||||
l.r = v;
|
||||
} else if (l == null)
|
||||
isetVar(id, v + delta)
|
||||
#if INT_VARS isetVar #else setVar #end (id, v + delta)
|
||||
else
|
||||
l.r = v + delta;
|
||||
return v;
|
||||
@@ -531,7 +558,11 @@ class Interp {
|
||||
|
||||
public function execute(expr:Expr):Dynamic {
|
||||
depth = 0; declared = [];
|
||||
#if INT_VARS
|
||||
_locals = [];
|
||||
#else
|
||||
locals = new Map();
|
||||
#end
|
||||
|
||||
return exprReturn(expr);
|
||||
}
|
||||
@@ -569,14 +600,31 @@ class Interp {
|
||||
}
|
||||
|
||||
// TODO: use array.copy();
|
||||
#if INT_VARS
|
||||
public function duplicate<T>(array:Array<T>):Array<T> {
|
||||
return [for (a in array) a];
|
||||
}
|
||||
#else
|
||||
public function duplicate<T>(h:#if haxe3 Map<String, T> #else Hash<T> #end) {
|
||||
#if haxe3
|
||||
var h2 = new Map();
|
||||
#else
|
||||
var h2 = new Hash();
|
||||
#end
|
||||
for (k in h.keys())
|
||||
h2.set(k, h.get(k));
|
||||
return h2;
|
||||
}
|
||||
#end
|
||||
|
||||
function restore(old:Int) {
|
||||
while (declared.length > old) {
|
||||
var d = declared.pop();
|
||||
#if INT_VARS
|
||||
_locals[d.n] = d.old;
|
||||
#else
|
||||
locals.set(d.n, d.old);
|
||||
#end
|
||||
}
|
||||
}
|
||||
|
||||
@@ -599,6 +647,7 @@ class Interp {
|
||||
#end
|
||||
}
|
||||
|
||||
#if INT_VARS
|
||||
public function iresolve(id:Int, doException:Bool = true):Dynamic {
|
||||
//var l:DeclaredVar = untyped __cpp__("this->_locals->__get(id)");//_locals[id];
|
||||
var l:DeclaredVar = _locals[id];
|
||||
@@ -637,6 +686,39 @@ class Interp {
|
||||
if (id != null) id = StringTools.trim(id);
|
||||
return iresolve(_variablesNames.indexOf(id), doException);
|
||||
}
|
||||
#else
|
||||
public function resolve(id:String, doException:Bool = true):Dynamic {
|
||||
if (id == null)
|
||||
return null;
|
||||
id = StringTools.trim(id);
|
||||
var l = locals.get(id);
|
||||
if (l != null)
|
||||
return l.r;
|
||||
|
||||
var v = variables.get(id);
|
||||
for(map in [variables, publicVariables, staticVariables, customClasses])
|
||||
if (map.exists(id))
|
||||
return map[id];
|
||||
|
||||
if (scriptObject != null) {
|
||||
// search in object
|
||||
if (id == "this") {
|
||||
return scriptObject;
|
||||
} else if ((Type.typeof(scriptObject) == TObject) && Reflect.hasField(scriptObject, id)) {
|
||||
return Reflect.field(scriptObject, id);
|
||||
} else {
|
||||
if (__instanceFields.contains(id)) {
|
||||
return Reflect.getProperty(scriptObject, id);
|
||||
} else if (__instanceFields.contains('get_$id')) { // getter
|
||||
return Reflect.getProperty(scriptObject, 'get_$id')();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (doException)
|
||||
error(EUnknownVariable(id));
|
||||
return v;
|
||||
}
|
||||
#end
|
||||
|
||||
function getClass(c:String):haxe.ds.Either<Class<Any>, Enum<Any>> {
|
||||
if (importBlocklist.contains(c))
|
||||
@@ -660,6 +742,7 @@ class Interp {
|
||||
var e = e.e;
|
||||
#end
|
||||
switch (e) {
|
||||
#if INT_VARS
|
||||
case EInfo(info, e):
|
||||
_variablesNames = info.variables.copy();
|
||||
loadTables(_variablesNames.length);
|
||||
@@ -668,11 +751,20 @@ class Interp {
|
||||
variables.loadDefaults();
|
||||
|
||||
return expr(e);
|
||||
#end
|
||||
case EClass(name, fields, extend, interfaces):
|
||||
#if INT_VARS
|
||||
var className:String = _variablesNames[name];
|
||||
#end
|
||||
|
||||
#if INT_VARS
|
||||
// TODO: Change this when we add undefined thing
|
||||
if (_variables[name] != null)
|
||||
error(EAlreadyExistingClass(className));
|
||||
#else
|
||||
if (customClasses.exists(name))
|
||||
error(EAlreadyExistingClass(name));
|
||||
#end
|
||||
|
||||
inline function importVar(thing:String):String {
|
||||
if (thing == null)
|
||||
@@ -680,7 +772,11 @@ class Interp {
|
||||
final variable:Class<Any> = variables.exists(thing) ? cast variables.get(thing) : null;
|
||||
return variable == null ? thing : Type.getClassName(variable);
|
||||
}
|
||||
#if INT_VARS
|
||||
_variables[name] = new CustomClassHandler(this, className, fields, importVar(extend), [for (i in interfaces) importVar(i)]);
|
||||
#else
|
||||
customClasses.set(name, new CustomClassHandler(this, name, fields, importVar(extend), [for (i in interfaces) importVar(i)]));
|
||||
#end
|
||||
case EImport(c, mode):
|
||||
if (!importEnabled) return null;
|
||||
|
||||
@@ -755,11 +851,20 @@ class Interp {
|
||||
#end
|
||||
}
|
||||
case EIdent(id):
|
||||
#if INT_VARS
|
||||
return iresolve(id);
|
||||
#else
|
||||
return resolve(id);
|
||||
#end
|
||||
case EVar(n, _, e, isPublic, isStatic):
|
||||
declared.push({n: n, old: _locals[n], depth: depth});
|
||||
declared.push({n: n, old: #if INT_VARS _locals[n] #else locals.get(n) #end, depth: depth});
|
||||
#if INT_VARS
|
||||
_locals[n] = {r: (e == null) ? null : expr(e), depth: depth};
|
||||
#else
|
||||
locals.set(n, {r: (e == null) ? null : expr(e), depth: depth});
|
||||
#end
|
||||
if (depth == 0) {
|
||||
#if INT_VARS
|
||||
if(isPublic == true || isStatic == true) {
|
||||
var varName:String = _variablesNames[n];
|
||||
if(isStatic == true) {
|
||||
@@ -772,6 +877,19 @@ class Interp {
|
||||
}
|
||||
else
|
||||
_variables[n] = _locals[n].r;
|
||||
#else
|
||||
if(isPublic == true || isStatic == true) {
|
||||
if(isStatic == true) {
|
||||
if(!staticVariables.exists(n)) { // dont overwrite existing static variables
|
||||
staticVariables.set(n, locals[n].r);
|
||||
}
|
||||
} else if (isPublic) {
|
||||
publicVariables.set(n, locals[n].r);
|
||||
}
|
||||
}
|
||||
else
|
||||
variables[n] = locals[n].r;
|
||||
#end
|
||||
}
|
||||
return null;
|
||||
case EParent(e):
|
||||
@@ -850,14 +968,22 @@ class Interp {
|
||||
returnValue = e == null ? null : expr(e);
|
||||
throw SReturn;
|
||||
case EFunction(params, fexpr, name, _, isPublic, isStatic, isOverride):
|
||||
#if INT_VARS
|
||||
var __capturedLocals = duplicate(_locals);
|
||||
var capturedLocals:Array<DeclaredVar> = [];
|
||||
for(k=>e in __capturedLocals)
|
||||
if (e != null && e.depth > 0)
|
||||
capturedLocals[k] = e;
|
||||
else
|
||||
// TODO: REPLACE THIS WITH UNDEFINED WHEN WE ADD -lunar
|
||||
capturedLocals[k] = null;
|
||||
// TODO: REPLACE THIS WITH UNDEFINED WHEN WE ADD -lunar
|
||||
#else
|
||||
var __capturedLocals = duplicate(locals);
|
||||
var capturedLocals:Map<String, {r:Dynamic, depth:Int}> = [];
|
||||
for(k=>e in __capturedLocals)
|
||||
if (e != null && e.depth > 0)
|
||||
capturedLocals.set(k, e);
|
||||
#end
|
||||
|
||||
var me = this;
|
||||
var hasOpt = false, minParams = 0;
|
||||
@@ -868,7 +994,9 @@ class Interp {
|
||||
else
|
||||
minParams++;
|
||||
var f = function(args:Array<Dynamic>) {
|
||||
if (me._locals == null || me._variables == null) return null;
|
||||
if (
|
||||
#if INT_VARS me._locals #else me.locals #end == null ||
|
||||
#if INT_VARS me._variables #else me.variables #end == null) return null;
|
||||
|
||||
if (((args == null) ? 0 : args.length) != params.length) {
|
||||
if (args.length < minParams) {
|
||||
@@ -892,18 +1020,18 @@ class Interp {
|
||||
args2.push(args[pos++]);
|
||||
args = args2;
|
||||
}
|
||||
var old = me._locals, depth = me.depth;
|
||||
var old = #if INT_VARS me._locals #else me.locals #end, depth = me.depth;
|
||||
me.depth++;
|
||||
me._locals = me.duplicate(capturedLocals);
|
||||
#if INT_VARS me._locals #else me.locals #end = cast me.duplicate(capturedLocals);
|
||||
for (i in 0...params.length)
|
||||
me._locals[params[i].name] = {r: args[i], depth: depth};
|
||||
#if INT_VARS me._locals #else me.locals #end[params[i].name] = cast {r: args[i], depth: depth};
|
||||
var r = null;
|
||||
var oldDecl = declared.length;
|
||||
if (inTry)
|
||||
try {
|
||||
r = me.exprReturn(fexpr);
|
||||
} catch (e:Dynamic) {
|
||||
me._locals = old;
|
||||
#if INT_VARS me._locals #else me.locals #end = old;
|
||||
me.depth = depth;
|
||||
#if neko
|
||||
neko.Lib.rethrow(e);
|
||||
@@ -914,11 +1042,12 @@ class Interp {
|
||||
else
|
||||
r = me.exprReturn(fexpr);
|
||||
restore(oldDecl);
|
||||
me._locals = old;
|
||||
#if INT_VARS me._locals #else me.locals #end = old;
|
||||
me.depth = depth;
|
||||
return r;
|
||||
};
|
||||
var f = Reflect.makeVarArgs(f);
|
||||
#if INT_VARS
|
||||
if (name != null) {
|
||||
if (depth == 0) {
|
||||
// global function
|
||||
@@ -936,6 +1065,20 @@ class Interp {
|
||||
capturedLocals[name] = ref; // allow self-recursion
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (name != null) {
|
||||
if (depth == 0) {
|
||||
// global function
|
||||
((isStatic && allowStaticVariables) ? staticVariables : ((isPublic && allowPublicVariables) ? publicVariables : variables)).set(name, f);
|
||||
} else {
|
||||
// function-in-function is a local function
|
||||
declared.push({n: name, old: locals.get(name), depth: depth});
|
||||
var ref = {r: f, depth: depth};
|
||||
locals.set(name, cast ref);
|
||||
capturedLocals.set(name, ref); // allow self-recursion
|
||||
}
|
||||
}
|
||||
#end
|
||||
return f;
|
||||
case EMapDecl(type, _keys, _values):
|
||||
var keys:Array<Dynamic> = [];
|
||||
@@ -997,7 +1140,7 @@ class Interp {
|
||||
var a = new Array();
|
||||
for (i in 0...params.length)
|
||||
a.push(expr(params[i]));
|
||||
return cnew(_variablesNames[cl], a);
|
||||
return cnew(#if INT_VARS _variablesNames[cl] #else cl #end, a);
|
||||
case EThrow(e):
|
||||
throw expr(e);
|
||||
case ETry(e, n, _, ecatch):
|
||||
@@ -1017,8 +1160,8 @@ class Interp {
|
||||
restore(old);
|
||||
inTry = oldTry;
|
||||
// declare 'v'
|
||||
declared.push({n: n, old: _locals[n], depth: depth});
|
||||
_locals[n] = {r: err, depth: depth};
|
||||
declared.push({n: n, old: #if INT_VARS _locals #else locals #end[n], depth: depth});
|
||||
#if INT_VARS _locals #else locals #end[n] = cast {r: err, depth: depth};
|
||||
var v:Dynamic = expr(ecatch);
|
||||
restore(old);
|
||||
return v;
|
||||
@@ -1137,13 +1280,13 @@ class Interp {
|
||||
|
||||
function forLoop(n, it, e) {
|
||||
var old = declared.length;
|
||||
declared.push({n: n, old: _locals[n], depth: depth});
|
||||
declared.push({n: n, old: #if INT_VARS _locals #else locals #end[n], depth: depth});
|
||||
var it = makeIterator(expr(it));
|
||||
var _hasNext = it.hasNext;
|
||||
var _next = it.next;
|
||||
while (_hasNext()) {
|
||||
var next = _next();
|
||||
_locals[n] = {r: next, depth: depth};
|
||||
#if INT_VARS _locals #else locals #end[n] = cast {r: next, depth: depth};
|
||||
try {
|
||||
expr(e);
|
||||
} catch (err:Stop) {
|
||||
@@ -1161,15 +1304,15 @@ class Interp {
|
||||
|
||||
function forLoopKeyValue(n, it, e, ithv) {
|
||||
var old = declared.length;
|
||||
declared.push({n: ithv, old: _locals[ithv], depth: depth});
|
||||
declared.push({n: n, old: _locals[n], depth: depth});
|
||||
declared.push({n: ithv, old: #if INT_VARS _locals #else locals #end[ithv], depth: depth});
|
||||
declared.push({n: n, old: #if INT_VARS _locals #else locals #end[n], depth: depth});
|
||||
var it = makeKeyValueIterator(expr(it));
|
||||
var _hasNext = it.hasNext;
|
||||
var _next = it.next;
|
||||
while (_hasNext()) {
|
||||
var next = _next();
|
||||
_locals[ithv] = {r: next.key, depth: depth};
|
||||
_locals[n] = {r: next.value, depth: depth};
|
||||
#if INT_VARS _locals #else locals #end[ithv] = cast {r: next.key, depth: depth};
|
||||
#if INT_VARS _locals #else locals #end[n] = cast {r: next.value, depth: depth};
|
||||
try {
|
||||
expr(e);
|
||||
} catch (err:Stop) {
|
||||
@@ -1293,10 +1436,12 @@ class Interp {
|
||||
return (c is IHScriptCustomConstructor) ? cast(c, IHScriptCustomConstructor).hnew(args) : Type.createInstance(c, args);
|
||||
}
|
||||
|
||||
#if INT_VARS
|
||||
inline function loadTables(len:Int) {
|
||||
_variables = cast new haxe.ds.Vector<Dynamic>(len);
|
||||
_locals = cast new haxe.ds.Vector<Dynamic>(len);
|
||||
}
|
||||
#end
|
||||
|
||||
#if cpp
|
||||
static inline function b2i(b:Bool) return untyped __cpp__("({0} ? 1 : 0)", b);
|
||||
@@ -1326,6 +1471,7 @@ class HScriptVariablesKeyValueIterator {
|
||||
}
|
||||
}
|
||||
|
||||
#if INT_VARS
|
||||
class HScriptVariables {
|
||||
public var defaults:Map<String, Dynamic> = [];
|
||||
public var usedefaults:Bool = true;
|
||||
@@ -1383,4 +1529,7 @@ class HScriptVariables {
|
||||
public function keyValueIterator() : HScriptVariablesKeyValueIterator {
|
||||
return new HScriptVariablesKeyValueIterator(parent._variablesNames, parent._variables);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
typedef HScriptVariables = Map<String, Dynamic>;
|
||||
#end
|
||||
@@ -227,7 +227,9 @@ class Parser {
|
||||
expr = Preprocessor.process(expr);
|
||||
if(Parser.optimize)
|
||||
expr = Optimizer.optimize(expr);
|
||||
#if INT_VARS
|
||||
expr = Postprocessor.processvars(expr);
|
||||
#end
|
||||
// trace("INPUT: " + s); // useful for debugging
|
||||
//trace("OUTPUT: " + Printer.toString(expr));
|
||||
return expr;
|
||||
|
||||
@@ -17,13 +17,12 @@ class Postprocessor {
|
||||
#end
|
||||
}
|
||||
|
||||
#if INT_VARS
|
||||
public static function processvars(e:Expr, ?vars:Array<String>) {
|
||||
if(vars == null) vars = [];
|
||||
for(v in getvars(e)) vars.push(v);
|
||||
e = _processvars(e, vars);
|
||||
|
||||
//trace(vars);
|
||||
|
||||
return mk(EInfo(new InfoClass(vars), e), e);
|
||||
}
|
||||
|
||||
@@ -33,14 +32,10 @@ class Postprocessor {
|
||||
var doExtra = true;
|
||||
var e = switch (expr(e)) {
|
||||
case EIdent(v) if (v is String):
|
||||
//trace(v +" -> " + vars.indexOf(v));
|
||||
mk(EIdent(vars.indexOf(v)), e);
|
||||
case EVar(n, t, _e, p, s) if (n is String):
|
||||
//trace(n + " -> " + vars.indexOf(n));
|
||||
mk(EVar(vars.indexOf(n), t, _e, p, s), e);
|
||||
case EImport(c, IAs(n)) if (n is String):
|
||||
//trace(n + " -> " + vars.indexOf(n));
|
||||
// IAsReturn, doesnt store it in variables array, only returns the import as a expression like value
|
||||
mk(EVar(vars.indexOf(n), null, mk(EImport(c, IAsReturn), e), false, false), e);
|
||||
case EFunction(args, _e, n, r, p, s, o) if (n is String):
|
||||
var _args:Array<Argument> = [
|
||||
@@ -63,11 +58,8 @@ class Postprocessor {
|
||||
case ETry(_e, v, t, ec) if (v is String):
|
||||
mk(ETry(_e, vars.indexOf(v), t, ec), e);
|
||||
case EFor(v, it, _e) if (v is String):
|
||||
//trace(v + " -> " + vars.indexOf(v));
|
||||
mk(EFor(vars.indexOf(v), it, _e), e);
|
||||
case EForKeyValue(v, it, _e, ithv) if (v is String && ithv is String):
|
||||
//trace(v + " -> " + vars.indexOf(v));
|
||||
//trace(ithv + " -> " + vars.indexOf(ithv));
|
||||
mk(EForKeyValue(vars.indexOf(v), it, _e, vars.indexOf(ithv)), e);
|
||||
default: {
|
||||
doExtra = false;
|
||||
@@ -79,8 +71,6 @@ class Postprocessor {
|
||||
return _processvars(e, vars);
|
||||
});
|
||||
|
||||
//if(doExtra) e = _processvars(e, vars);
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
@@ -113,4 +103,5 @@ class Postprocessor {
|
||||
});
|
||||
return vars;
|
||||
}
|
||||
#end
|
||||
}
|
||||
+302
-300
@@ -266,321 +266,323 @@ class Printer {
|
||||
// TODO: make else if print correctly
|
||||
|
||||
switch( Tools.expr(e) ) {
|
||||
case EImport(c, mode):
|
||||
add("import " + c);
|
||||
switch(mode) {
|
||||
case IAs(name): add(' as $name');
|
||||
case IAll: add('.*');
|
||||
default:
|
||||
}
|
||||
case EClass(name, fields, extend, interfaces):
|
||||
add('class ${getVar(name)}');
|
||||
if (extend != null)
|
||||
add(' extends $extend');
|
||||
for(_interface in interfaces) {
|
||||
add(' implements $_interface');
|
||||
}
|
||||
add(' {\n');
|
||||
tabs += "\t";
|
||||
// TODO: Print fields
|
||||
//for(field in fields) {
|
||||
// expr(field);
|
||||
//}
|
||||
|
||||
tabs = tabs.substr(1);
|
||||
add("}");
|
||||
case EConst(c):
|
||||
switch( c ) {
|
||||
case CInt(i): add(i);
|
||||
case CFloat(f): add(f);
|
||||
case CString(s):
|
||||
add('"');
|
||||
add(getEscapedString(s));
|
||||
add('"');
|
||||
}
|
||||
case EIdent(v):
|
||||
add(getVar(v));
|
||||
case EVar(n, t, e): // TODO: static, public, override
|
||||
add("var " + getVar(n));
|
||||
if( t != null )
|
||||
addType(t);
|
||||
else
|
||||
switch( Tools.expr(e) ) {
|
||||
case EMapDecl(type, _, _):
|
||||
add(" : Map<");
|
||||
switch( type ) {
|
||||
case ObjectMap: add("Dynamic");
|
||||
case StringMap: add("String");
|
||||
case EnumMap: add("EnumValue");
|
||||
case IntMap: add("Int");
|
||||
case UnknownMap: add("?");
|
||||
case Null: add("Null");
|
||||
}
|
||||
add(", Dynamic>");
|
||||
case EImport(c, mode):
|
||||
add("import " + c);
|
||||
switch(mode) {
|
||||
case IAs(name): add(' as $name');
|
||||
case IAll: add('.*');
|
||||
default:
|
||||
}
|
||||
if( e != null ) {
|
||||
add(" = ");
|
||||
expr(e);
|
||||
}
|
||||
case EParent(e):
|
||||
add("("); expr(e); add(")");
|
||||
case EBlock(el):
|
||||
if( el.length == 0 ) {
|
||||
add("{}");
|
||||
} else {
|
||||
case EClass(name, fields, extend, interfaces):
|
||||
add('class ${getVar(name)}');
|
||||
if (extend != null)
|
||||
add(' extends $extend');
|
||||
for(_interface in interfaces) {
|
||||
add(' implements $_interface');
|
||||
}
|
||||
add(' {\n');
|
||||
tabs += "\t";
|
||||
add("{\n");
|
||||
for( e in el ) {
|
||||
add(tabs);
|
||||
// TODO: Print fields
|
||||
//for(field in fields) {
|
||||
// expr(field);
|
||||
//}
|
||||
|
||||
tabs = tabs.substr(1);
|
||||
add("}");
|
||||
case EConst(c):
|
||||
switch( c ) {
|
||||
case CInt(i): add(i);
|
||||
case CFloat(f): add(f);
|
||||
case CString(s):
|
||||
add('"');
|
||||
add(getEscapedString(s));
|
||||
add('"');
|
||||
}
|
||||
case EIdent(v):
|
||||
add(getVar(v));
|
||||
case EVar(n, t, e): // TODO: static, public, override
|
||||
add("var " + getVar(n));
|
||||
if( t != null )
|
||||
addType(t);
|
||||
else
|
||||
switch( Tools.expr(e) ) {
|
||||
case EMapDecl(type, _, _):
|
||||
add(" : Map<");
|
||||
switch( type ) {
|
||||
case ObjectMap: add("Dynamic");
|
||||
case StringMap: add("String");
|
||||
case EnumMap: add("EnumValue");
|
||||
case IntMap: add("Int");
|
||||
case UnknownMap: add("?");
|
||||
case Null: add("Null");
|
||||
}
|
||||
add(", Dynamic>");
|
||||
default:
|
||||
}
|
||||
if( e != null ) {
|
||||
add(" = ");
|
||||
expr(e);
|
||||
}
|
||||
case EParent(e):
|
||||
add("("); expr(e); add(")");
|
||||
case EBlock(el):
|
||||
if( el.length == 0 ) {
|
||||
add("{}");
|
||||
} else {
|
||||
tabs += "\t";
|
||||
add("{\n");
|
||||
for( e in el ) {
|
||||
add(tabs);
|
||||
expr(e);
|
||||
add(";\n");
|
||||
}
|
||||
tabs = tabs.substr(1);
|
||||
add(tabs);
|
||||
add("}");
|
||||
}
|
||||
case EField(e, f, s):
|
||||
expr(e);
|
||||
add((s == true ? "?." : ".") + f);
|
||||
case EBinop(op, e1, e2):
|
||||
/*var op1 = switch(Tools.expr(e1)) {
|
||||
case EBinop(op, _, _): op;
|
||||
case EConst(_): "_";
|
||||
case EIdent(_): "_";
|
||||
default: null;
|
||||
}
|
||||
var op2 = switch(Tools.expr(e2)) {
|
||||
case EBinop(op, _, _): op;
|
||||
case EConst(_): "_";
|
||||
case EIdent(_): "_";
|
||||
default: null;
|
||||
}
|
||||
var paran = Tools.checkOpPrecedence(op, op1, op2);*/
|
||||
var paran = 2;
|
||||
|
||||
var op = getBinaryOp(op);
|
||||
|
||||
if(paran == 0 || paran == 2) {
|
||||
add("(");
|
||||
expr(e1);
|
||||
add(")");
|
||||
} else {
|
||||
expr(e1);
|
||||
}
|
||||
if(op == "...")
|
||||
add(op);
|
||||
else
|
||||
add(" " + op + " ");
|
||||
if(paran == 1 || paran == 2) {
|
||||
add("(");
|
||||
expr(e2);
|
||||
add(")");
|
||||
} else {
|
||||
expr(e2);
|
||||
}
|
||||
case EUnop(op, pre, e):
|
||||
var op = getUnaryOp(op);
|
||||
|
||||
if( pre ) {
|
||||
add(op);
|
||||
expr(e);
|
||||
} else {
|
||||
expr(e);
|
||||
add(op);
|
||||
}
|
||||
case ECall(e, args):
|
||||
if( e == null )
|
||||
expr(e);
|
||||
else switch( Tools.expr(e) ) {
|
||||
case EField(_), EIdent(_), EConst(_):
|
||||
expr(e);
|
||||
default:
|
||||
add("(");
|
||||
expr(e);
|
||||
add(")");
|
||||
}
|
||||
add("(");
|
||||
var first = true;
|
||||
for( a in args ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(a);
|
||||
}
|
||||
add(")");
|
||||
case EIf(cond,e1,e2):
|
||||
add("if( ");
|
||||
expr(cond);
|
||||
add(" )");
|
||||
var wasBlock = block(e1, true);
|
||||
|
||||
if( e2 != null ) {
|
||||
if(!wasBlock) add("\n" + tabs);
|
||||
add(" else ");
|
||||
block(e2);
|
||||
}
|
||||
case EWhile(cond,e):
|
||||
add("while( ");
|
||||
expr(cond);
|
||||
add(" )");
|
||||
block(e, true);
|
||||
case EDoWhile(cond,e):
|
||||
add("do");
|
||||
block(e, true);
|
||||
add(" while ( ");
|
||||
expr(cond);
|
||||
add(" )");
|
||||
case EFor(v, it, e):
|
||||
add("for( "+getVar(v)+" in ");
|
||||
expr(it);
|
||||
add(" )");
|
||||
block(e, true);
|
||||
case EForKeyValue(v, it, e, ithv):
|
||||
add("for( "+getVar(ithv)+" => "+getVar(v)+" in ");
|
||||
expr(it);
|
||||
add(" )");
|
||||
block(e, true);
|
||||
case EBreak:
|
||||
add("break");
|
||||
case EContinue:
|
||||
add("continue");
|
||||
case EFunction(params, e, name, ret): // TODO: static, public, override
|
||||
add("function");
|
||||
if( name != null )
|
||||
add(" " + getVar(name));
|
||||
add("(");
|
||||
var first = true;
|
||||
for( a in params ) {
|
||||
if( first ) first = false else add(", ");
|
||||
if( a.opt ) add("?");
|
||||
add(getVar(a.name));
|
||||
addType(a.t);
|
||||
}
|
||||
add(")");
|
||||
addType(ret);
|
||||
add(" ");
|
||||
expr(e);
|
||||
case EReturn(e):
|
||||
add("return");
|
||||
if( e != null ) {
|
||||
add(" ");
|
||||
expr(e);
|
||||
}
|
||||
case EArray(e,index):
|
||||
expr(e);
|
||||
add("[");
|
||||
expr(index);
|
||||
add("]");
|
||||
case EMapDecl(type, keys, values):
|
||||
add("[");
|
||||
var first = true;
|
||||
for( i in 0...keys.length ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(keys[i]);
|
||||
add(" => ");
|
||||
expr(values[i]);
|
||||
}
|
||||
add("]");
|
||||
case EArrayDecl(el):
|
||||
add("[");
|
||||
var first = true;
|
||||
for( e in el ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(e);
|
||||
}
|
||||
add("]");
|
||||
case ENew(cl, args):
|
||||
add("new " + getVar(cl) + "(");
|
||||
var first = true;
|
||||
for( e in args ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(e);
|
||||
}
|
||||
add(")");
|
||||
case EThrow(e):
|
||||
add("throw ");
|
||||
expr(e);
|
||||
case ETry(e, v, t, ecatch):
|
||||
add("try");
|
||||
var wasBlock = block(e);
|
||||
if( !wasBlock ) {
|
||||
add("\n" + tabs);
|
||||
} else add(" ");
|
||||
add("catch( " + v);
|
||||
addType(t);
|
||||
add(" )");
|
||||
block(ecatch);
|
||||
case EObject(fl):
|
||||
if( fl.length == 0 ) {
|
||||
add("{}");
|
||||
} else {
|
||||
tabs += "\t";
|
||||
add("{\n");
|
||||
for( i=>f in fl ) {
|
||||
add(tabs);
|
||||
var name = isJson(f.name) ? "\"" + f.name + "\"" : f.name;
|
||||
add(name+" : ");
|
||||
expr(f.e);
|
||||
if( i != fl.length - 1 ) add(",");
|
||||
add("\n");
|
||||
}
|
||||
tabs = tabs.substr(1);
|
||||
add(tabs);
|
||||
add("}");
|
||||
}
|
||||
case ETernary(c,e1,e2):
|
||||
expr(c);
|
||||
add(" ? ");
|
||||
expr(e1);
|
||||
add(" : ");
|
||||
expr(e2);
|
||||
case ESwitch(e, cases, def):
|
||||
add("switch( ");
|
||||
expr(e);
|
||||
add(" ) {\n");
|
||||
tabs += "\t";
|
||||
for( c in cases ) {
|
||||
add(tabs);
|
||||
add("case ");
|
||||
var first = true;
|
||||
for( v in c.values ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(v);
|
||||
}
|
||||
add(":");
|
||||
block(c.expr, true);
|
||||
add(";\n");
|
||||
}
|
||||
if( def != null ) {
|
||||
add(tabs);
|
||||
add("default: ");
|
||||
block(def, true);
|
||||
add(";\n");
|
||||
}
|
||||
tabs = tabs.substr(1);
|
||||
add(tabs);
|
||||
add("}");
|
||||
}
|
||||
case EField(e, f, s):
|
||||
expr(e);
|
||||
add((s == true ? "?." : ".") + f);
|
||||
case EBinop(op, e1, e2):
|
||||
/*var op1 = switch(Tools.expr(e1)) {
|
||||
case EBinop(op, _, _): op;
|
||||
case EConst(_): "_";
|
||||
case EIdent(_): "_";
|
||||
default: null;
|
||||
}
|
||||
var op2 = switch(Tools.expr(e2)) {
|
||||
case EBinop(op, _, _): op;
|
||||
case EConst(_): "_";
|
||||
case EIdent(_): "_";
|
||||
default: null;
|
||||
}
|
||||
var paran = Tools.checkOpPrecedence(op, op1, op2);*/
|
||||
var paran = 2;
|
||||
|
||||
var op = getBinaryOp(op);
|
||||
|
||||
if(paran == 0 || paran == 2) {
|
||||
add("(");
|
||||
expr(e1);
|
||||
add(")");
|
||||
} else {
|
||||
expr(e1);
|
||||
}
|
||||
if(op == "...")
|
||||
add(op);
|
||||
else
|
||||
add(" " + op + " ");
|
||||
if(paran == 1 || paran == 2) {
|
||||
add("(");
|
||||
expr(e2);
|
||||
add(")");
|
||||
} else {
|
||||
expr(e2);
|
||||
}
|
||||
case EUnop(op, pre, e):
|
||||
var op = getUnaryOp(op);
|
||||
|
||||
if( pre ) {
|
||||
add(op);
|
||||
expr(e);
|
||||
} else {
|
||||
expr(e);
|
||||
add(op);
|
||||
}
|
||||
case ECall(e, args):
|
||||
if( e == null )
|
||||
expr(e);
|
||||
else switch( Tools.expr(e) ) {
|
||||
case EField(_), EIdent(_), EConst(_):
|
||||
expr(e);
|
||||
default:
|
||||
case EMeta(name, args, e):
|
||||
add("@");
|
||||
add(name);
|
||||
if( args != null && args.length > 0 ) {
|
||||
add("(");
|
||||
expr(e);
|
||||
var first = true;
|
||||
for( a in args ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(e);
|
||||
}
|
||||
add(")");
|
||||
}
|
||||
add("(");
|
||||
var first = true;
|
||||
for( a in args ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(a);
|
||||
}
|
||||
add(")");
|
||||
case EIf(cond,e1,e2):
|
||||
add("if( ");
|
||||
expr(cond);
|
||||
add(" )");
|
||||
var wasBlock = block(e1, true);
|
||||
|
||||
if( e2 != null ) {
|
||||
if(!wasBlock) add("\n" + tabs);
|
||||
add(" else ");
|
||||
block(e2);
|
||||
}
|
||||
case EWhile(cond,e):
|
||||
add("while( ");
|
||||
expr(cond);
|
||||
add(" )");
|
||||
block(e, true);
|
||||
case EDoWhile(cond,e):
|
||||
add("do");
|
||||
block(e, true);
|
||||
add(" while ( ");
|
||||
expr(cond);
|
||||
add(" )");
|
||||
case EFor(v, it, e):
|
||||
add("for( "+getVar(v)+" in ");
|
||||
expr(it);
|
||||
add(" )");
|
||||
block(e, true);
|
||||
case EForKeyValue(v, it, e, ithv):
|
||||
add("for( "+getVar(ithv)+" => "+getVar(v)+" in ");
|
||||
expr(it);
|
||||
add(" )");
|
||||
block(e, true);
|
||||
case EBreak:
|
||||
add("break");
|
||||
case EContinue:
|
||||
add("continue");
|
||||
case EFunction(params, e, name, ret): // TODO: static, public, override
|
||||
add("function");
|
||||
if( name != null )
|
||||
add(" " + getVar(name));
|
||||
add("(");
|
||||
var first = true;
|
||||
for( a in params ) {
|
||||
if( first ) first = false else add(", ");
|
||||
if( a.opt ) add("?");
|
||||
add(getVar(a.name));
|
||||
addType(a.t);
|
||||
}
|
||||
add(")");
|
||||
addType(ret);
|
||||
add(" ");
|
||||
expr(e);
|
||||
case EReturn(e):
|
||||
add("return");
|
||||
if( e != null ) {
|
||||
}
|
||||
add(" ");
|
||||
expr(e);
|
||||
}
|
||||
case EArray(e,index):
|
||||
expr(e);
|
||||
add("[");
|
||||
expr(index);
|
||||
add("]");
|
||||
case EMapDecl(type, keys, values):
|
||||
add("[");
|
||||
var first = true;
|
||||
for( i in 0...keys.length ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(keys[i]);
|
||||
add(" => ");
|
||||
expr(values[i]);
|
||||
}
|
||||
add("]");
|
||||
case EArrayDecl(el):
|
||||
add("[");
|
||||
var first = true;
|
||||
for( e in el ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(e);
|
||||
}
|
||||
add("]");
|
||||
case ENew(cl, args):
|
||||
add("new " + getVar(cl) + "(");
|
||||
var first = true;
|
||||
for( e in args ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(e);
|
||||
}
|
||||
add(")");
|
||||
case EThrow(e):
|
||||
add("throw ");
|
||||
expr(e);
|
||||
case ETry(e, v, t, ecatch):
|
||||
add("try");
|
||||
var wasBlock = block(e);
|
||||
if( !wasBlock ) {
|
||||
add("\n" + tabs);
|
||||
} else add(" ");
|
||||
add("catch( " + v);
|
||||
addType(t);
|
||||
add(" )");
|
||||
block(ecatch);
|
||||
case EObject(fl):
|
||||
if( fl.length == 0 ) {
|
||||
add("{}");
|
||||
} else {
|
||||
tabs += "\t";
|
||||
add("{\n");
|
||||
for( i=>f in fl ) {
|
||||
add(tabs);
|
||||
var name = isJson(f.name) ? "\"" + f.name + "\"" : f.name;
|
||||
add(name+" : ");
|
||||
expr(f.e);
|
||||
if( i != fl.length - 1 ) add(",");
|
||||
add("\n");
|
||||
}
|
||||
tabs = tabs.substr(1);
|
||||
add(tabs);
|
||||
add("}");
|
||||
}
|
||||
case ETernary(c,e1,e2):
|
||||
expr(c);
|
||||
add(" ? ");
|
||||
expr(e1);
|
||||
add(" : ");
|
||||
expr(e2);
|
||||
case ESwitch(e, cases, def):
|
||||
add("switch( ");
|
||||
expr(e);
|
||||
add(" ) {\n");
|
||||
tabs += "\t";
|
||||
for( c in cases ) {
|
||||
add(tabs);
|
||||
add("case ");
|
||||
var first = true;
|
||||
for( v in c.values ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(v);
|
||||
}
|
||||
add(":");
|
||||
block(c.expr, true);
|
||||
add(";\n");
|
||||
}
|
||||
if( def != null ) {
|
||||
add(tabs);
|
||||
add("default: ");
|
||||
block(def, true);
|
||||
add(";\n");
|
||||
}
|
||||
tabs = tabs.substr(1);
|
||||
add(tabs);
|
||||
add("}");
|
||||
case EMeta(name, args, e):
|
||||
add("@");
|
||||
add(name);
|
||||
if( args != null && args.length > 0 ) {
|
||||
case ECheckType(e, t):
|
||||
add("(");
|
||||
var first = true;
|
||||
for( a in args ) {
|
||||
if( first ) first = false else add(", ");
|
||||
expr(e);
|
||||
}
|
||||
expr(e);
|
||||
add(" : ");
|
||||
addType(t);
|
||||
add(")");
|
||||
}
|
||||
add(" ");
|
||||
expr(e);
|
||||
case ECheckType(e, t):
|
||||
add("(");
|
||||
expr(e);
|
||||
add(" : ");
|
||||
addType(t);
|
||||
add(")");
|
||||
case EInfo(_, e):
|
||||
expr(e);
|
||||
#if INT_VARS
|
||||
case EInfo(_, e):
|
||||
expr(e);
|
||||
#end
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,9 @@ class Tools {
|
||||
if( def != null ) f(def);
|
||||
case EMeta(name, args, e): if( args != null ) for( a in args ) f(a); f(e);
|
||||
case ECheckType(e,_): f(e);
|
||||
#if INT_VARS
|
||||
case EInfo(info, e): f(e);
|
||||
#end
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,7 +107,9 @@ class Tools {
|
||||
if( def != null ) rec(def);
|
||||
case EMeta(name, args, e): if( args != null ) for( a in args ) rec(a); rec(e);
|
||||
case ECheckType(e,_): rec(e);
|
||||
#if INT_VARS
|
||||
case EInfo(info, e): rec(e);
|
||||
#end
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,7 +143,9 @@ class Tools {
|
||||
case ECheckType(e,t): ECheckType(f(e), t);
|
||||
case EImport(c, m): EImport(c, m);
|
||||
case EClass(name, el, extend, interfaces): EClass(name, [for( e in el ) f(e)], extend, interfaces);
|
||||
#if INT_VARS
|
||||
case EInfo(info, e): EInfo(info, f(e));
|
||||
#end
|
||||
}
|
||||
return mk(edef, e);
|
||||
}
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
--define linux
|
||||
|
||||
# Copying the assets from source code to bin folder
|
||||
--cmd rm -rf bin/cpp/assets
|
||||
--cmd cp -r assets bin/cpp/assets
|
||||
--cpp bin/cpp
|
||||
--cmd cd bin/cpp
|
||||
--cmd ./Main
|
||||
Reference in New Issue
Block a user