@@ -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