Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions polymod/hscript/_internal/Interp.hx
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,11 @@ class Interp

function assign(e1:Expr, e2:Expr):Dynamic
{
var v = expr(e2);
return assignValue(e1, expr(e2));
}

function assignValue(e1:Expr, v:Dynamic, _abstractInlineAssign:Bool = false):Dynamic
{
switch (Tools.expr(e1))
{
case EIdent(id):
Expand All @@ -154,7 +158,10 @@ class Interp
}

default:
error(EInvalidOp("="));
if (!_abstractInlineAssign)
{
error(EInvalidOp("="));
}
}
return v;
}
Expand Down
41 changes: 22 additions & 19 deletions polymod/hscript/_internal/PolymodInterpEx.hx
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ class PolymodInterpEx extends Interp
super.setVar(id, v);
}

override function assign(e1:Expr, e2:Expr):Dynamic
override function assignValue(e1:Expr, v:Dynamic, _abstractInlineAssign:Bool = false):Dynamic
{
switch (Tools.expr(e1))
{
Expand All @@ -417,8 +417,6 @@ class PolymodInterpEx extends Interp
// Also ensures property functions are accounted for.
if (_proxy != null && _proxy.superHasField(id))
{
var v = expr(e2);

if (Std.isOfType(_proxy.superClass, PolymodScriptClass))
{
var superClass:PolymodAbstractScriptClass = cast(_proxy.superClass, PolymodScriptClass);
Expand All @@ -440,7 +438,6 @@ class PolymodInterpEx extends Interp
final setName = 'set_$id';
if (!_propTrack.exists(setName))
{
var v = expr(e2);
_propTrack.set(setName, true);
var out = _proxy.callFunction(setName, [v]);
_propTrack.remove(setName);
Expand Down Expand Up @@ -469,8 +466,6 @@ class PolymodInterpEx extends Interp
{
if (_proxy != null && _proxy.superHasField(id))
{
var v = expr(e2);

if (Std.isOfType(_proxy.superClass, PolymodScriptClass))
{
var superClass:PolymodAbstractScriptClass = cast(_proxy.superClass, PolymodScriptClass);
Expand Down Expand Up @@ -508,7 +503,7 @@ class PolymodInterpEx extends Interp
default:
}
// Fallback, which calls set()
return super.assign(e1, e2);
return super.assignValue(e1, v, _abstractInlineAssign);
}

override function increment(e:Expr, prefix:Bool, delta:Int)
Expand Down Expand Up @@ -899,14 +894,28 @@ class PolymodInterpEx extends Interp
{
case EField(e, f):
var name = getIdent(e);
name = getClassDecl().imports.get(name)?.fullPath ?? name;
if (name != null && _scriptEnumDescriptors.exists(name))
if (name != null)
{
var args = new Array();
for (p in params)
args.push(expr(p));
var imp = getClassDecl().imports.get(name);
if (imp != null)
{
if (_scriptEnumDescriptors.exists(imp.fullPath))
{
var args = new Array();
for (p in params)
args.push(expr(p));

return new PolymodEnum(_scriptEnumDescriptors.get(imp.fullPath), f, args);
}
else if (imp.abs != null && imp.abs.hasInlineFunction(f))
{
var args = new Array();
for (p in params)
args.push(expr(p));

return new PolymodEnum(_scriptEnumDescriptors.get(name), f, args);
return imp.abs.callInlineFunction(this, params[0], f, args);
}
}
}
default:
}
Expand Down Expand Up @@ -1387,12 +1396,6 @@ class PolymodInterpEx extends Interp
// return result;
}

var abstractKey:String = '$oCls.$f';
if (PolymodScriptClass.abstractClassStatics.exists(abstractKey))
{
return Reflect.getProperty(PolymodScriptClass.abstractClassStatics[abstractKey], abstractKey.replace('.', '_'));
}

// Default behavior
if (Reflect.hasField(o, f))
{
Expand Down
29 changes: 2 additions & 27 deletions polymod/hscript/_internal/PolymodScriptClass.hx
Original file line number Diff line number Diff line change
Expand Up @@ -106,45 +106,20 @@ class PolymodScriptClass
var baseAbstractClassImpls:Map<String,
{
cls:Class<Dynamic>,
clsName:String,
polymodCls:Null<Class<Dynamic>>,
}> = PolymodScriptClassMacro.listAbstractImpls();

for (key => value in baseAbstractClassImpls)
{
if (value == null) continue;

_abstractClassImpls.set(key, new PolymodStaticAbstractReference(key, value.cls, value.clsName));
_abstractClassImpls.set(key, new PolymodStaticAbstractReference(key, value.cls, value.polymodCls));
}
}

return _abstractClassImpls;
}

/**
* Define a list of `fieldName -> Class` pointing to the generated class containing a reference
* to each static field of each abstract.
*/
public static var abstractClassStatics(get, never):Map<String, Class<Dynamic>>;

static var _abstractClassStatics:Map<String, Class<Dynamic>> = null;

static function get_abstractClassStatics():Map<String, Class<Dynamic>>
{
if (_abstractClassStatics == null)
{
_abstractClassStatics = new Map<String, Class<Dynamic>>();

var baseAbstractClassStatics:Map<String, Class<Dynamic>> = PolymodScriptClassMacro.listAbstractStatics();

for (key => value in baseAbstractClassStatics)
{
_abstractClassStatics.set(key, value);
}
}

return _abstractClassStatics;
}

/**
* Define a list of `typeName -> Class` which provides a reference to each typedef,
* since typedefs can't be normally resolved at runtime.
Expand Down
Loading