Skip to content

Commit c0ff8b8

Browse files
committed
added support for Class<T> unify + Std.int/downcast stubs for hl
1 parent e23573e commit c0ff8b8

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

hscript/Checker.hx

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -858,11 +858,16 @@ class Checker {
858858
}
859859

860860
public function abstractCast( t1 : TType, t2 : TType, e : Expr ) {
861+
var tf1 = follow(t1);
862+
var tf2 = follow(t2);
863+
switch( [tf1,tf2] ) {
864+
case [TInst(c,[]),TAbstract(a,[ct])] if( a.name == "Class" && c.name.charCodeAt(0) == '#'.code ):
865+
return tryUnify(types.resolve(c.name.substr(1)), ct);
866+
default:
867+
}
861868
#if !hscriptPos
862869
return false;
863870
#else
864-
var tf1 = follow(t1);
865-
var tf2 = follow(t2);
866871
return getAbstractCast(tf1,tf2,e,false) || getAbstractCast(tf2,tf1,e,true);
867872
#end
868873
}
@@ -1158,10 +1163,44 @@ class Checker {
11581163
return readPath(typeExpr(o, Value), path, forWrite);
11591164
}
11601165

1166+
function patchStubAccess( ef : Expr ) {
1167+
#if hscriptPos
1168+
switch( ef.e ) {
1169+
case EField(e, f):
1170+
var g = types.resolve("hscript.Checker",[]);
1171+
if( g == null ) return false;
1172+
var acc = getTypeAccess(g, e);
1173+
if( acc == null ) return false;
1174+
e.e = acc;
1175+
ef.e = EField(e,"stub_"+f);
1176+
return true;
1177+
default:
1178+
}
1179+
#end
1180+
return false;
1181+
}
1182+
11611183
function readPath( ot : TType, path : Array<{ f : String, e : Expr }>, forWrite ) {
11621184
for( p in path ) {
11631185
var ft = getField(ot, p.f, p.e, p == path[path.length-1] ? forWrite : false);
11641186
if( ft == null ) {
1187+
switch( ot ) {
1188+
case TInst(c, _) if( c.name == "#Std" ):
1189+
// these two methods are extern in HL and we must provide
1190+
// some stubs so they both type and execute
1191+
switch( p.f ) {
1192+
case "int":
1193+
if( patchStubAccess(p.e) )
1194+
return TFun([{ name : "value", opt : false, t : TFloat }],TInt);
1195+
case "downcast":
1196+
var ct = makeMono();
1197+
var t = types.resolve("Class",[ct]);
1198+
if( t != null && patchStubAccess(p.e) )
1199+
return TFun([{ name : "value", opt : false, t : TDynamic }, { name : "cl", opt : false, t : t }],ct);
1200+
default:
1201+
}
1202+
default:
1203+
}
11651204
error(typeStr(ot)+" has no field "+p.f, p.e);
11661205
return TDynamic;
11671206
}
@@ -1776,5 +1815,7 @@ class Checker {
17761815
return { key : key, value : value };
17771816
}
17781817

1818+
static function stub_int( v : Float ) return Std.int(v);
1819+
static function stub_downcast( v : Dynamic, cl : Dynamic ) return Std.downcast(v, cl);
17791820

17801821
}

0 commit comments

Comments
 (0)