Readded int vars

This commit is contained in:
Ne_Eo
2024-08-23 00:50:58 +02:00
parent a616f2affe
commit 0ad52138fe
7 changed files with 392 additions and 115 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ class CustomClassHandler implements IHScriptCustomConstructor {
}
public function hnew(args:Array<Dynamic>):Dynamic {
#if HSCRIPT_INT_VARS
#if !HSCRIPT_NO_INT_VARS
throw "todo: do all this lmao -lunar";
return null;
#else
+21 -15
View File
@@ -73,8 +73,8 @@ enum Expr
#end
{
EConst( c : Const );
EIdent( v : String );
EVar( n : String, ?t : CType, ?e : Expr, ?isPublic : Bool, ?isStatic : Bool );
EIdent( v : VarN );
EVar( n : VarN, ?t : CType, ?e : Expr, ?isPublic : Bool, ?isStatic : Bool );
EParent( e : Expr, ?noOptimize : Bool );
EBlock( e : Array<Expr> );
EField( e : Expr, f : String , ?safe : Bool );
@@ -83,18 +83,18 @@ enum Expr
ECall( e : Expr, params : Array<Expr> );
EIf( cond : Expr, e1 : Expr, ?e2 : Expr );
EWhile( cond : Expr, e : Expr );
EFor( v : String, it : Expr, e : Expr);
EForKeyValue( v : String, it : Expr, e : Expr, ithv: String);
EFor( v : VarN, it : Expr, e : Expr);
EForKeyValue( v : VarN, it : Expr, e : Expr, ithv: VarN);
EBreak;
EContinue;
EFunction( args : Array<Argument>, e : Expr, ?name : String, ?ret : CType, ?isPublic : Bool, ?isStatic : Bool, ?isOverride : Bool );
EFunction( args : Array<Argument>, e : Expr, ?name : VarN, ?ret : CType, ?isPublic : Bool, ?isStatic : Bool, ?isOverride : Bool );
EReturn( ?e : Expr );
EArray( e : Expr, index : Expr );
EMapDecl( type: MapType, keys: Array<Expr>, values: Array<Expr> );
EArrayDecl( e : Array<Expr> );
ENew( cl : String, params : Array<Expr> );
ENew( cl : VarN, params : Array<Expr> );
EThrow( e : Expr );
ETry( e : Expr, v : String, t : Null<CType>, ecatch : Expr );
ETry( e : Expr, v : VarN, t : Null<CType>, ecatch : Expr );
EObject( fl : Array<ObjectField> );
ETernary( cond : Expr, e1 : Expr, e2 : Expr );
ESwitch( e : Expr, cases : Array<SwitchCase>, ?defaultExpr : Expr );
@@ -103,10 +103,10 @@ enum Expr
ECheckType( e : Expr, t : CType );
EImport( c : String, mode: KImportMode );
EClass( name:String, fields:Array<Expr>, ?extend:String, interfaces:Array<String> );
EClass( name:VarN, fields:Array<Expr>, ?extend:String, interfaces:Array<String> );
#if HSCRIPT_INT_VARS
//EInfo( info: InfoClass, e: Expr );
#if !HSCRIPT_NO_INT_VARS
EInfo( info: InfoClass, e: Expr );
#end
}
@@ -269,14 +269,14 @@ enum abstract Unop(UInt8) {
var OpSpread;
}
#if HSCRIPT_INT_VARS
/*class InfoClass {
#if !HSCRIPT_NO_INT_VARS
class InfoClass {
public var variables:Array<String>;
public function new(variables:Array<String>) {
this.variables = variables;
}
}*/
}
#end
enum KImportMode {
@@ -304,7 +304,7 @@ final class SwitchCase {
//typedef Argument = { name : String, ?t : CType, ?opt : Bool, ?value : Expr };
class Argument {
public var name : String;
public var name : VarN;
public var t : Null<CType>;
public var opt : Bool;
public var value : Null<Expr>;
@@ -388,4 +388,10 @@ typedef VarDecl = {
var set : Null<String>;
var expr : Null<Expr>;
var type : Null<CType>;
}
}
#if !HSCRIPT_NO_INT_VARS
abstract VarN(Dynamic) from Int from String to Int to String {}
#else
typedef VarN = String;
#end
+351 -79
View File
@@ -64,7 +64,7 @@ class DeclaredVar {
@:structInit
class RedeclaredVar {
public var n:String;
public var n:VarN;
public var old:DeclaredVar;
public var depth:Int;
}
@@ -104,12 +104,19 @@ class Interp {
public var errorHandler:Error->Void;
public var importFailedCallback:Array<String>->Bool;
#if !HSCRIPT_NO_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
public var customClasses:Map<String, Dynamic>;
public var variables:Map<String, Dynamic>;
public var publicVariables:Map<String, Dynamic>;
public var staticVariables:Map<String, Dynamic>;
// Used for backwards compat when using int vars!!!
public var customClasses:HScriptVariables;
public var variables:HScriptVariables;
public var publicVariables:HScriptVariables;
public var staticVariables:HScriptVariables;
var depth:Int = 0;
var inTry:Bool;
@@ -136,6 +143,12 @@ class Interp {
resetVariables();
private function resetVariables() {
#if !HSCRIPT_NO_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>();
@@ -143,6 +156,7 @@ class Interp {
locals = new Map();
setDefaultVariables();
#end
}
private function setDefaultVariables() {
@@ -297,9 +311,12 @@ class Interp {
switch(Tools.expr(e2)) {
case EIdent(id):
if (id == "Class")
#if !HSCRIPT_NO_INT_VARS
var sid = _variablesNames[id];
#end
if (#if !HSCRIPT_NO_INT_VARS sid #else id #end == "Class")
return Std.isOfType(expr1, Class);
if (id == "Map" || id == "IMap")
if (#if !HSCRIPT_NO_INT_VARS sid #else id #end == "Map" || #if !HSCRIPT_NO_INT_VARS sid #else id #end == "IMap")
return Std.isOfType(expr1, IMap);
default:
}
@@ -308,6 +325,21 @@ class Interp {
return expr2 != null ? Std.isOfType(expr1, expr2) : false;
}
#if !HSCRIPT_NO_INT_VARS
public inline function setVar(name:String, v:Dynamic) {
isetVar(_variablesNames.indexOf(name), v);
}
public function isetVar(id:Int, v:Dynamic) {
var sid:String = _variablesNames[id];
if (allowStaticVariables && staticVariables.exists(sid))
staticVariables.set(sid, v);
else if (allowPublicVariables && publicVariables.exists(sid))
publicVariables.set(sid, v);
else
_variables[id] = v;
}
#else
public function setVar(name:String, v:Dynamic) {
if (allowStaticVariables && staticVariables.exists(name))
staticVariables.set(name, v);
@@ -316,19 +348,28 @@ class Interp {
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];
if (l == null) {
#if !HSCRIPT_NO_INT_VARS
var l = _locals[id];
if (l == null)
#else
if (locals.exists(id))
#end
{
#if !HSCRIPT_NO_INT_VARS
var sid:String = _variablesNames[id];
#end
// TODO: WHEN ADDING ENUM DEFINED THING CHANGE THIS
if (!variables.exists(id) &&
!staticVariables.exists(id) && !publicVariables.exists(id) && _hasScriptObject
if (_hasScriptObject && #if !HSCRIPT_NO_INT_VARS _variables[id] != null #else !variables.exists(id) #end &&
!staticVariables.exists(#if !HSCRIPT_NO_INT_VARS sid #else id #end) && !publicVariables.exists(#if !HSCRIPT_NO_INT_VARS sid #else id #end)
) {
if (_scriptObjectType == SObject) {
UnsafeReflect.setField(scriptObject, id, v);
UnsafeReflect.setField(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
} else {
if (_scriptObjectType == SCustomClass) {
var obj = cast(scriptObject, IHScriptCustomClassBehaviour);
@@ -344,28 +385,30 @@ class Interp {
return obj.hset(id, v);
}
if (isBypassAccessor) {
if (__instanceFields.contains(id)) {
UnsafeReflect.setField(scriptObject, id, v);
if (__instanceFields.contains(#if !HSCRIPT_NO_INT_VARS sid #else id #end)) {
UnsafeReflect.setField(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
return v;
}
}
if (__instanceFields.contains(id)) {
UnsafeReflect.setProperty(scriptObject, id, v);
} else if (__instanceFields.contains('set_$id')) { // setter
UnsafeReflect.getProperty(scriptObject, 'set_$id')(v);
if (__instanceFields.contains(#if !HSCRIPT_NO_INT_VARS sid #else id #end)) {
UnsafeReflect.setProperty(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
} else if (__instanceFields.contains('set_${#if !HSCRIPT_NO_INT_VARS sid #else id #end}')) { // setter
UnsafeReflect.getProperty(scriptObject, 'set_${#if !HSCRIPT_NO_INT_VARS sid #else id #end}')(v);
} else {
setVar(id, v);
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v);
}
}
} else {
setVar(id, v);
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v);
}
} else {
#if HSCRIPT_NO_INT_VARS
var l = locals.get(id);
#end
l.r = v;
if (l.depth == 0) {
setVar(id, v);
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v);
}
}
case EField(e, f, s):
@@ -391,41 +434,46 @@ class Interp {
var v:Dynamic = null;
switch (Tools.expr(e1)) {
case EIdent(id):
var l = locals[id];
var l = #if !HSCRIPT_NO_INT_VARS _locals #else locals #end[id];
v = fop(expr(e1), expr(e2));
if (l == null) {
if(_hasScriptObject) {
#if !HSCRIPT_NO_INT_VARS
var sid:String = _variablesNames[id];
#end
if(_scriptObjectType == SObject) {
UnsafeReflect.setField(scriptObject, id, v);
UnsafeReflect.setField(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
return v;
} else if (_scriptObjectType == SCustomClass) {
var obj = cast(scriptObject, IHScriptCustomClassBehaviour);
if(isBypassAccessor) {
obj.__allowSetGet = false;
var res = obj.hset(id, v);
var res = obj.hset(#if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
obj.__allowSetGet = true;
return res;
}
return obj.hset(id, v);
return obj.hset(#if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
} else if(_scriptObjectType == SBehaviourClass) {
var obj = cast(scriptObject, IHScriptCustomBehaviour);
return obj.hset(id, v);
return obj.hset(#if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
}
if (isBypassAccessor) {
if (__instanceFields.contains(id)) {
UnsafeReflect.setField(scriptObject, id, v);
if (__instanceFields.contains(#if !HSCRIPT_NO_INT_VARS sid #else id #end)) {
UnsafeReflect.setField(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
return v;
}
}
if (__instanceFields.contains(id)) {
UnsafeReflect.setProperty(scriptObject, id, v);
} else if (__instanceFields.contains('set_$id')) { // setter
UnsafeReflect.getProperty(scriptObject, 'set_$id')(v);
if (__instanceFields.contains(#if !HSCRIPT_NO_INT_VARS sid #else id #end)) {
UnsafeReflect.setProperty(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
} else if (__instanceFields.contains('set_${#if !HSCRIPT_NO_INT_VARS sid #else id #end}')) { // setter
UnsafeReflect.getProperty(scriptObject, 'set_${#if !HSCRIPT_NO_INT_VARS sid #else id #end}')(v);
} else {
setVar(id, v);
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v);
}
} else {
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v);
}
}
else
@@ -459,21 +507,39 @@ class Interp {
var v:Dynamic = null;
switch (Tools.expr(e1)) {
case EIdent(id):
var l = locals[id];
var l = #if !HSCRIPT_NO_INT_VARS _locals #else locals #end[id];
v = fop(aFunc, bFunc);
if (l == null) {
if(_hasScriptObject) {
#if !HSCRIPT_NO_INT_VARS
var sid:String = _variablesNames[id];
#end
if(_scriptObjectType == SObject) {
UnsafeReflect.setField(scriptObject, id, v);
} else if (__instanceFields.contains(id)) {
UnsafeReflect.setProperty(scriptObject, id, v);
} else if (__instanceFields.contains('set_${id}')) { // setter
UnsafeReflect.getProperty(scriptObject, 'set_${id}')(v);
UnsafeReflect.setField(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
return v;
} else if (_scriptObjectType == SCustomClass) {
var obj = cast(scriptObject, IHScriptCustomClassBehaviour);
if(isBypassAccessor) {
obj.__allowSetGet = false;
var res = obj.hset(#if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
obj.__allowSetGet = true;
return res;
}
return obj.hset(#if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
} else if(_scriptObjectType == SBehaviourClass) {
var obj = cast(scriptObject, IHScriptCustomBehaviour);
return obj.hset(#if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
}
if (__instanceFields.contains(#if !HSCRIPT_NO_INT_VARS sid #else id #end)) {
UnsafeReflect.setProperty(scriptObject, #if !HSCRIPT_NO_INT_VARS sid #else id #end, v);
} else if (__instanceFields.contains('set_${#if !HSCRIPT_NO_INT_VARS sid #else id #end}')) { // setter
UnsafeReflect.getProperty(scriptObject, 'set_${#if !HSCRIPT_NO_INT_VARS sid #else id #end}')(v);
} else {
setVar(id, v);
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v);
}
} else {
setVar(id, v);
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v);
}
}
else
@@ -508,26 +574,19 @@ class Interp {
#end
switch (e) {
case EIdent(id):
var l = locals[id];
var v:Dynamic = (l == null) ? resolve(id) : l.r;
var l = #if !HSCRIPT_NO_INT_VARS _locals #else locals #end[id];
var v:Dynamic = (l == null) ? #if !HSCRIPT_NO_INT_VARS iresolve #else resolve #end (id) : l.r;
if (prefix) {
v += delta;
if (l == null)
setVar(id, v)
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v)
else
l.r = v;
} else
l.r = v + delta;
return v;
} else {
var v:Dynamic = resolve(id);
if (prefix) {
v += delta;
setVar(id, v);
} else
setVar(id, v + delta);
return v;
}
} else if (l == null)
#if !HSCRIPT_NO_INT_VARS isetVar #else setVar #end (id, v + delta)
else
l.r = v + delta;
return v;
case EField(e, f, s):
var obj = expr(e);
if(s && obj == null) return null;
@@ -567,7 +626,11 @@ class Interp {
public function execute(expr:Expr):Dynamic {
depth = 0; declared = [];
#if !HSCRIPT_NO_INT_VARS
_locals = [];
#else
locals = new Map();
#end
return exprReturn(expr);
}
@@ -605,6 +668,11 @@ class Interp {
}
// TODO: use array.copy();
#if !HSCRIPT_NO_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();
@@ -615,11 +683,16 @@ class Interp {
h2.set(k, h.get(k));
return h2;
}
#end
function restore(old:Int) {
while (declared.length > old) {
var d = declared.pop();
#if !HSCRIPT_NO_INT_VARS
_locals[d.n] = d.old;
#else
locals.set(d.n, d.old);
#end
}
}
@@ -642,6 +715,46 @@ class Interp {
#end
}
#if !HSCRIPT_NO_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];
if (l != null)
return l.r;
var v = _variables[id];
if (v != null) return v;
var sid:String = _variablesNames[id];
for(map in [publicVariables, staticVariables, customClasses])
if (map.exists(sid))
return map.get(sid);
if (_hasScriptObject) {
// search in object
if (sid == "this") {
return scriptObject;
} else if (_scriptObjectType == SObject && UnsafeReflect.hasField(scriptObject, sid)) {
return UnsafeReflect.field(scriptObject, sid);
} else {
if (__instanceFields.contains(sid)) {
return UnsafeReflect.getProperty(scriptObject, sid);
} else if (__instanceFields.contains('get_$sid')) { // getter
return UnsafeReflect.getProperty(scriptObject, 'get_$sid')();
}
}
}
if (doException)
error(EUnknownVariable(sid));
//var v = variables.get(id);
return null;
}
public inline function resolve(id:String, doException:Bool = true):Dynamic {
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;
@@ -686,6 +799,7 @@ class Interp {
error(EUnknownVariable(id));
return v;
}
#end
function getClass(c:String):haxe.ds.Either<Class<Any>, Enum<Any>> {
if (importBlocklist.contains(c))
@@ -709,19 +823,29 @@ class Interp {
var e = e.e;
#end
switch (e) {
#if HSCRIPT_INT_VARS
/*case EInfo(info, e):
#if !HSCRIPT_NO_INT_VARS
case EInfo(info, e):
_variablesNames = info.variables.copy();
loadTables(_variablesNames.length);
setDefaultVariables();
variables.loadDefaults();
return expr(e);*/
return expr(e);
#end
case EClass(name, fields, extend, interfaces):
#if !HSCRIPT_NO_INT_VARS
var className:String = _variablesNames[name];
#end
#if !HSCRIPT_NO_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)
@@ -729,7 +853,11 @@ class Interp {
final variable:Class<Any> = variables.exists(thing) ? cast variables.get(thing) : null;
return variable == null ? thing : Type.getClassName(variable);
}
#if !HSCRIPT_NO_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;
@@ -804,11 +932,33 @@ class Interp {
#end
}
case EIdent(id):
#if !HSCRIPT_NO_INT_VARS
return iresolve(id);
#else
return resolve(id);
#end
case EVar(n, _, e, isPublic, isStatic):
declared.push({n: n, old: locals.get(n), depth: depth});
declared.push({n: n, old: #if !HSCRIPT_NO_INT_VARS _locals[n] #else locals.get(n) #end, depth: depth});
#if !HSCRIPT_NO_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 !HSCRIPT_NO_INT_VARS
if(isPublic == true || isStatic == true) {
var varName:String = _variablesNames[n];
if(isStatic == true) {
if(!staticVariables.exists(varName)) { // dont overwrite existing static variables
staticVariables.set(varName, _locals[n].r);
}
} else if (isPublic) {
publicVariables.set(varName, _locals[n].r);
}
}
else
_variables[n] = _locals[n].r;
#else
if(isPublic == true || isStatic == true) {
if(isStatic == true) {
if(!staticVariables.exists(n)) { // dont overwrite existing static variables
@@ -820,6 +970,7 @@ class Interp {
}
else
variables[n] = locals[n].r;
#end
}
return null;
case EParent(e):
@@ -898,11 +1049,22 @@ class Interp {
returnValue = e == null ? null : expr(e);
throw SReturn;
case EFunction(params, fexpr, name, _, isPublic, isStatic, isOverride):
#if !HSCRIPT_NO_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;
#else
var __capturedLocals = duplicate(locals);
var capturedLocals:Map<String, {r:Dynamic, depth:Int}> = [];
var capturedLocals:Map<String, DeclaredVar> = [];
for(k=>e in __capturedLocals)
if (e != null && e.depth > 0)
capturedLocals.set(k, e);
#end
var me = this;
var hasOpt = false, minParams = 0;
@@ -913,7 +1075,9 @@ class Interp {
else
minParams++;
var f = function(args:Array<Dynamic>) {
if (me.locals == null || me.variables == null) return null;
if (
#if !HSCRIPT_NO_INT_VARS me._locals #else me.locals #end == null ||
#if !HSCRIPT_NO_INT_VARS me._variables #else me.variables #end == null) return null;
if (((args == null) ? 0 : args.length) != params.length) {
if (args.length < minParams) {
@@ -937,18 +1101,23 @@ class Interp {
args2.push(args[pos++]);
args = args2;
}
var old = me.locals, depth = me.depth;
var old = #if !HSCRIPT_NO_INT_VARS me._locals #else me.locals #end, depth = me.depth;
me.depth++;
me.locals = cast me.duplicate(capturedLocals);
for (i in 0...params.length)
me.locals[params[i].name] = cast {r: args[i], depth: depth};
#if !HSCRIPT_NO_INT_VARS me._locals #else me.locals #end = me.duplicate(capturedLocals);
for (i in 0...params.length) {
#if !HSCRIPT_NO_INT_VARS
me._locals[params[i].name] = {r: args[i], depth: depth};
#else
me.locals.set(params[i].name, {r: args[i], depth: depth});
#end
}
var r = null;
var oldDecl = declared.length;
if (inTry)
try {
r = me.exprReturn(fexpr);
} catch (e:Dynamic) {
me.locals = old;
#if !HSCRIPT_NO_INT_VARS me._locals #else me.locals #end = old;
me.depth = depth;
#if neko
neko.Lib.rethrow(e);
@@ -959,11 +1128,30 @@ class Interp {
else
r = me.exprReturn(fexpr);
restore(oldDecl);
me.locals = old;
#if !HSCRIPT_NO_INT_VARS me._locals #else me.locals #end = old;
me.depth = depth;
return r;
};
var f = Reflect.makeVarArgs(f);
#if !HSCRIPT_NO_INT_VARS
if (name != null) {
if (depth == 0) {
// global function
if ((isStatic && allowStaticVariables))
staticVariables.set(_variablesNames[name], f);
else if (isPublic && allowPublicVariables)
publicVariables.set(_variablesNames[name], f);
else
_variables[name] = f;
} else {
// function-in-function is a local function
declared.push({n: name, old: _locals[name], depth: depth});
var ref:DeclaredVar = {r: f, depth: depth};
_locals[name] = ref;
capturedLocals[name] = ref; // allow self-recursion
}
}
#else
if (name != null) {
if (depth == 0) {
// global function
@@ -971,11 +1159,12 @@ class Interp {
} 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);
var ref:DeclaredVar = {r: f, depth: depth};
locals.set(name, ref);
capturedLocals.set(name, ref); // allow self-recursion
}
}
#end
return f;
case EMapDecl(type, _keys, _values):
var keys:Array<Dynamic> = [];
@@ -1037,7 +1226,7 @@ class Interp {
var a = new Array();
for (i in 0...params.length)
a.push(expr(params[i]));
return cnew(cl, a);
return cnew(#if !HSCRIPT_NO_INT_VARS _variablesNames[cl] #else cl #end, a);
case EThrow(e):
throw expr(e);
case ETry(e, n, _, ecatch):
@@ -1057,8 +1246,12 @@ class Interp {
restore(old);
inTry = oldTry;
// declare 'v'
declared.push({n: n, old: locals[n], depth: depth});
locals[n] = cast {r: err, depth: depth};
declared.push({n: n, old: #if !HSCRIPT_NO_INT_VARS _locals #else locals #end[n], depth: depth});
#if !HSCRIPT_NO_INT_VARS
_locals[n] = {r: err, depth: depth};
#else
locals.set(n, {r: err, depth: depth});
#end
var v:Dynamic = expr(ecatch);
restore(old);
return v;
@@ -1176,13 +1369,17 @@ 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 !HSCRIPT_NO_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] = cast {r: next, depth: depth};
#if !HSCRIPT_NO_INT_VARS
_locals[n] = {r: next, depth: depth};
#else
locals.set(n, {r: next, depth: depth});
#end
try {
expr(e);
} catch (err:Stop) {
@@ -1200,15 +1397,20 @@ 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 !HSCRIPT_NO_INT_VARS _locals #else locals #end[ithv], depth: depth});
declared.push({n: n, old: #if !HSCRIPT_NO_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();
#if !HSCRIPT_NO_INT_VARS
_locals[ithv] = {r: next.key, depth: depth};
_locals[n] = {r: next.value, depth: depth};
#else
locals.set(ithv, {r: next.key, depth: depth});
locals.set(n, {r: next.value, depth: depth});
#end
try {
expr(e);
} catch (err:Stop) {
@@ -1217,7 +1419,7 @@ class Interp {
case SBreak:
break;
case SReturn:
throw err;// the error again, wait go out of benchamrk
throw err;
}
}
}
@@ -1331,6 +1533,13 @@ class Interp {
return (c is IHScriptCustomConstructor) ? cast(c, IHScriptCustomConstructor).hnew(args) : Type.createInstance(c, args);
}
#if !HSCRIPT_NO_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);
//static inline function b2i(b:Bool) return untyped __cpp__("(int)({0})", b);
@@ -1357,4 +1566,67 @@ class HScriptVariablesKeyValueIterator {
_current++;
return {value: values[_current], key: names[_current]};
}
}
}
#if !HSCRIPT_NO_INT_VARS
class HScriptVariables {
public var defaults:Map<String, Dynamic> = [];
public var usedefaults:Bool = true;
public function loadDefaults() {
usedefaults = false;
for (key => value in defaults)
set(key, value);
defaults.clear();
}
public var parent:Interp;
public function new(parent:Interp)
this.parent = parent;
public inline function set(key:String, value:Dynamic) {
if (usedefaults) defaults.set(key, value);
if (parent._variablesNames.contains(key))
parent._variables[parent._variablesNames.indexOf(key)] = value;
}
public inline function get(key:String):Dynamic {
if (parent._variablesNames.contains(key))
return parent._variables[parent._variablesNames.indexOf(key)];
return null;
}
public inline function exists(key:String):Bool {
var indx:Int = parent._variablesNames.indexOf(key);
return indx != -1 && (key == "null" ? true : parent._variables[indx] != null);
}
public inline function remove(key:String)
parent._variables[parent._variablesNames.indexOf(key)] = null;
public inline function clear():Void {
parent._variablesNames.resize(0);
parent._variables.resize(0);
}
public inline function copy():Map<String, Dynamic> {
var map:Map<String, Dynamic> = [
for (i in 0...parent._variables.length)
parent._variablesNames[i] => parent._variables[i]
];
return map;
}
public inline function iterator():ArrayIterator<Dynamic>
return parent._variables.iterator();
public inline function keys():ArrayIterator<String>
return parent._variablesNames.iterator();
public function keyValueIterator() : HScriptVariablesKeyValueIterator {
return new HScriptVariablesKeyValueIterator(parent._variablesNames, parent._variables);
}
}
#else
typedef HScriptVariables = Map<String, Dynamic>;
#end
+3 -3
View File
@@ -227,9 +227,9 @@ class Parser {
expr = Preprocessor.process(expr);
if(Parser.optimize)
expr = Optimizer.optimize(expr);
//#if HSCRIPT_INT_VARS
//expr = Postprocessor.processvars(expr);
//#end
#if !HSCRIPT_NO_INT_VARS
expr = Postprocessor.processvars(expr);
#end
// trace("INPUT: " + s); // useful for debugging
//trace("OUTPUT: " + Printer.toString(expr));
return expr;
+2 -2
View File
@@ -17,7 +17,7 @@ class Postprocessor {
#end
}
/*#if HSCRIPT_INT_VARS
#if !HSCRIPT_NO_INT_VARS
public static function processvars(e:Expr, ?vars:Array<String>) {
if(vars == null) vars = [];
for(v in getvars(e)) vars.push(v);
@@ -103,5 +103,5 @@ class Postprocessor {
});
return vars;
}
#end*/
#end
}
+8 -8
View File
@@ -204,16 +204,16 @@ class Printer {
return buf.toString();
}
function getVar(v:String) {
function getVar(v:VarN) {
if( v == null ) {
return ("??NULL??");
}
//if(v is Int) {
// return ("$" + v);
//} else {
if(v is Int) {
return ("$" + v);
} else {
return (v);
//}
}
}
public static function getBinaryOp(op:Binop) {
@@ -579,9 +579,9 @@ class Printer {
add(" : ");
addType(t);
add(")");
#if HSCRIPT_INT_VARS
//case EInfo(_, e):
// expr(e);
#if !HSCRIPT_NO_INT_VARS
case EInfo(_, e):
expr(e);
#end
}
}
+6 -7
View File
@@ -62,8 +62,8 @@ 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 HSCRIPT_INT_VARS
//case EInfo(info, e): f(e);
#if !HSCRIPT_NO_INT_VARS
case EInfo(info, e): f(e);
#end
}
}
@@ -107,8 +107,8 @@ 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 HSCRIPT_INT_VARS
//case EInfo(info, e): rec(e);
#if !HSCRIPT_NO_INT_VARS
case EInfo(info, e): rec(e);
#end
}
}
@@ -143,8 +143,8 @@ 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 HSCRIPT_INT_VARS
//case EInfo(info, e): EInfo(info, f(e));
#if !HSCRIPT_NO_INT_VARS
case EInfo(info, e): EInfo(info, f(e));
#end
}
return mk(edef, e);
@@ -211,7 +211,6 @@ class Tools {
case "...": OpInterval;
default: {
var op2 = op.substr(0, op.length - 1);
trace(op + " -> " + op2);
if(isValidBinOp(op2)) {
return OpAssignOp(getOpEnum(op2));
}