Bladeren bron

TestIssues running (not yet passing) expect a few reported issues

Nicolas Cannasse 9 jaren geleden
bovenliggende
commit
8997893ab6
4 gewijzigde bestanden met toevoegingen van 40 en 20 verwijderingen
  1. 17 6
      genhl.ml
  2. 8 7
      std/hl/types/ArrayBase.hx
  3. 13 4
      std/hl/types/ArrayDyn.hx
  4. 2 3
      std/hl/types/ArrayObj.hx

+ 17 - 6
genhl.ml

@@ -402,7 +402,7 @@ let rec safe_cast t1 t2 =
 		in
 		loop p1
 	| HFun (args1,t1), HFun (args2,t2) when List.length args1 = List.length args2 ->
-		List.for_all2 (fun t1 t2 -> safe_cast t2 t1 || (t2 = HDyn && is_dynamic t1)) args1 args2 && safe_cast t1 t2
+		List.for_all2 (fun t1 t2 -> safe_cast t2 t1 || (t1 = HDyn && is_dynamic t2)) args1 args2 && safe_cast t1 t2
 	| _ ->
 		tsame t1 t2
 
@@ -1088,6 +1088,10 @@ and cast_to ?(force=false) ctx (r:reg) (t:ttype) p =
 		out
 	| _, HObj { pname = "String" } ->
 		let out = alloc_tmp ctx t in
+		let r = cast_to ctx r HDyn p in
+		op ctx (OJNotNull (r,2));
+		op ctx (ONull out);
+		op ctx (OJAlways 1);
 		op ctx (OCall1 (out,alloc_fun_path ctx ([],"Std") "string",r));
 		out
 	| (HObj _ | HDynObj | HDyn) , HVirtual _ ->
@@ -3452,7 +3456,7 @@ let interp code =
 
 	let caml_to_hl str =
 		let b = Buffer.create (String.length str * 2) in
-		(try UTF8.iter (fun c -> utf16_add b (UChar.code c)) str with Invalid_argument _ -> ()); (* if malformed *)
+		(try UTF8.iter (fun c -> utf16_add b (UChar.code c)) str with Invalid_argument _ | UChar.Out_of_range -> ()); (* if malformed *)
 		utf16_add b 0;
 		Buffer.contents b
 	in
@@ -3749,6 +3753,8 @@ let interp code =
 		| HObj _, HObj b when safe_cast rt t && (match get_type v with Some t -> safe_cast t rt | None -> assert false) ->
 			(* downcast *)
 			v
+		| (HObj _ | HDynObj | HVirtual _), HVirtual vp ->
+			to_virtual v vp
 		| HObj p, _ ->
 			(match get_method p "__cast" with
 			| None -> invalid()
@@ -4078,17 +4084,22 @@ let interp code =
 				let f = functions.(fid) in
 				set r (VClosure (f,Some (get v)))
 			| OMethod (r, o, m) ->
-				set r (match get o with
+				let m = (match get o with
 				| VObj v as obj -> VClosure (v.oproto.pmethods.(m), Some obj)
 				| VNull -> null_access()
 				| VVirtual v ->
 					let name, _, _ = v.vtype.vfields.(m) in
 					(match v.vvalue with
 					| VObj o as obj ->
-						let m = (try PMap.find name o.oproto.pclass.pfunctions with Not_found -> assert false) in
-						VClosure (functions.(m), Some obj)
+						(try
+							let m = PMap.find name o.oproto.pclass.pfunctions in
+							VClosure (functions.(m), Some obj)
+						with Not_found ->
+							VNull)
 					| _ -> assert false)
-				| _ -> assert false)
+				| _ -> assert false
+				) in
+				set r (if m = VNull then m else dyn_cast m (match get_type m with None -> assert false | Some v -> v) (rtype r))
 			| OThrow r ->
 				throw (get r)
 			| ORethrow r ->

+ 8 - 7
std/hl/types/ArrayBase.hx

@@ -51,7 +51,12 @@ class ArrayBase extends ArrayAccess {
 		throw "Not implemented";
 	}
 
-	public function spliceDyn( pos : Int, len : Int ) : ArrayObj<Dynamic> {
+	public function slice( pos : Int, ?end : Int ) : ArrayBase{
+		throw "Not implemented";
+		return null;
+	}
+
+	public function splice( pos : Int, len : Int ) : ArrayBase{
 		throw "Not implemented";
 		return null;
 	}
@@ -175,7 +180,7 @@ class BasicIterator<T> {
 		return v;
 	}
 
-	public function slice( pos : Int, ?end : Int ) : ArrayBasic<T> {
+	override function slice( pos : Int, ?end : Int ) : ArrayBasic<T> {
 		if( pos < 0 ) {
 			pos = this.length + pos;
 			if( pos < 0 )
@@ -207,7 +212,7 @@ class BasicIterator<T> {
 			(bytes:Bytes).sortF64(0, length, cast f);
 	}
 
-	public function splice( pos : Int, len : Int ) : ArrayBasic<T> {
+	override function splice( pos : Int, len : Int ) : ArrayBasic<T> {
 		throw "TODO";
 		return null;
 	}
@@ -325,10 +330,6 @@ class BasicIterator<T> {
 	override function insertDyn( pos : Int, v : Dynamic ) insert(pos, v);
 	override function removeDyn( v : Dynamic ) return remove(v);
 	override function sortDyn( f : Dynamic -> Dynamic -> Int ) sort(f);
-	override function spliceDyn( pos : Int, len : Int ) : ArrayObj<Dynamic> {
-		throw "Not implemented";
-		return null;
-	}
 
 	// called by compiler when accessing the array outside of its bounds, might trigger resize
 	function __expand( index : Int ) {

+ 13 - 4
std/hl/types/ArrayDyn.hx

@@ -74,8 +74,7 @@ class ArrayDyn extends ArrayAccess {
 	}
 
 	public function slice( pos : Int, ?end : Int ) : ArrayDyn {
-		throw "TODO";
-		return null;
+		return alloc(array.slice(pos,end),true);
 	}
 
 	public function sort( f : Dynamic -> Dynamic -> Int ) : Void {
@@ -83,7 +82,7 @@ class ArrayDyn extends ArrayAccess {
 	}
 
 	public function splice( pos : Int, len : Int ) : ArrayDyn {
-		return alloc(array.spliceDyn(pos,len),true);
+		return alloc(array.splice(pos,len),true);
 	}
 
 	public function toString() : String {
@@ -115,7 +114,17 @@ class ArrayDyn extends ArrayAccess {
 	}
 
 	public function lastIndexOf( x : Dynamic, ?fromIndex:Int ) : Int {
-		throw "TODO";
+		var len = length;
+		var i:Int = fromIndex != null ? fromIndex : len - 1;
+		if( i >= len )
+			i = len - 1;
+		else if( i  < 0 )
+			i += len;
+		while( i >= 0 ) {
+			if( array.getDyn(i) == x )
+				return i;
+			i--;
+		}
 		return -1;
 	}
 

+ 2 - 3
std/hl/types/ArrayObj.hx

@@ -64,7 +64,7 @@ class ArrayObj<T> extends ArrayBase {
 		return v;
 	}
 
-	public function slice( pos : Int, ?end : Int ) : ArrayObj<T> {
+	override function slice( pos : Int, ?end : Int ) : ArrayObj<T> {
 		if( pos < 0 ) {
 			pos = this.length + pos;
 			if( pos < 0 )
@@ -91,7 +91,7 @@ class ArrayObj<T> extends ArrayBase {
 		haxe.ds.ArraySort.sort(cast this, f);
 	}
 
-	public function splice( pos : Int, len : Int ) : ArrayObj<T> {
+	override function splice( pos : Int, len : Int ) : ArrayObj<T> {
 		if( len < 0 ) return new ArrayObj();
 		if( pos < 0 ){
 			pos = this.length + pos;
@@ -246,7 +246,6 @@ class ArrayObj<T> extends ArrayBase {
 	override function insertDyn( pos : Int, v : Dynamic ) insert(pos, v);
 	override function removeDyn( v : Dynamic ) return remove(v);
 	override function sortDyn( f : Dynamic -> Dynamic -> Int ) sort(f);
-	override function spliceDyn( pos : Int, len : Int ) return splice(pos, len);
 
 	public static function alloc<T>( a : hl.types.NativeArray<T> ) : ArrayObj<T> {
 		var arr : ArrayObj<T> = untyped $new(ArrayObj);