diff --git a/hscript/CustomClassHandler.hx b/hscript/CustomClassHandler.hx index 7843598..be6dea2 100644 --- a/hscript/CustomClassHandler.hx +++ b/hscript/CustomClassHandler.hx @@ -29,7 +29,10 @@ class CustomClassHandler implements IHScriptCustomConstructor { } public function hnew(args:Array):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 { diff --git a/hscript/Expr.hx b/hscript/Expr.hx index dba62b1..5514127 100644 --- a/hscript/Expr.hx +++ b/hscript/Expr.hx @@ -105,7 +105,9 @@ enum Expr EImport( c : String, mode: KImportMode ); EClass( name:VarN, fields:Array, ?extend:String, interfaces:Array ); + #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; @@ -274,6 +277,7 @@ class InfoClass { this.variables = variables; } } +#end enum KImportMode { INormal; @@ -390,9 +394,8 @@ typedef VarDecl = { var type : Null; } +#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); -//} \ No newline at end of file +#else +typedef VarN = String; +#end \ No newline at end of file diff --git a/hscript/Interp.hx b/hscript/Interp.hx index 56913a3..413b64b 100644 --- a/hscript/Interp.hx +++ b/hscript/Interp.hx @@ -94,22 +94,20 @@ class Interp { public var errorHandler:Error->Void; public var importFailedCallback:Array->Bool; + #if INT_VARS public var _variablesNames:Array = []; public var _variables:Array = []; public var _locals:Array = []; + #else + public var locals:Map; + #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:MapExpr->Dynamic>; - //#else - //var binops:HashExpr->Dynamic>; - //#end - var depth:Int = 0; var inTry:Bool; var declared:Array = []; @@ -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(); + variables = new Map(); + publicVariables = new Map(); + staticVariables = new Map(); + + 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(array:Array):Array { return [for (a in array) a]; } + #else + public function duplicate(h:#if haxe3 Map #else Hash #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, Enum> { 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 = 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 = []; 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 = []; + 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) { - 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 = []; @@ -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(len); _locals = cast new haxe.ds.Vector(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 = []; public var usedefaults:Bool = true; @@ -1383,4 +1529,7 @@ class HScriptVariables { public function keyValueIterator() : HScriptVariablesKeyValueIterator { return new HScriptVariablesKeyValueIterator(parent._variablesNames, parent._variables); } -} \ No newline at end of file +} +#else +typedef HScriptVariables = Map; +#end \ No newline at end of file diff --git a/hscript/Parser.hx b/hscript/Parser.hx index b78a082..0eb7cc3 100644 --- a/hscript/Parser.hx +++ b/hscript/Parser.hx @@ -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; diff --git a/hscript/Postprocessor.hx b/hscript/Postprocessor.hx index 724ccba..5e0fb62 100644 --- a/hscript/Postprocessor.hx +++ b/hscript/Postprocessor.hx @@ -17,13 +17,12 @@ class Postprocessor { #end } + #if INT_VARS public static function processvars(e:Expr, ?vars:Array) { 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 = [ @@ -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 } \ No newline at end of file diff --git a/hscript/Printer.hx b/hscript/Printer.hx index 9ae6d9e..69250cc 100644 --- a/hscript/Printer.hx +++ b/hscript/Printer.hx @@ -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 } } diff --git a/hscript/Tools.hx b/hscript/Tools.hx index 94bfaeb..7e39200 100644 --- a/hscript/Tools.hx +++ b/hscript/Tools.hx @@ -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); } diff --git a/tests/linux.hxml b/tests/linux.hxml index 85d775a..ca30213 100644 --- a/tests/linux.hxml +++ b/tests/linux.hxml @@ -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 \ No newline at end of file