Readded int vars
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user