Bladeren bron

dodge inline problems and activate Vector.map (see #3888)

Simon Krajewski 9 jaren geleden
bovenliggende
commit
51a8e6938c
3 gewijzigde bestanden met toevoegingen van 27 en 23 verwijderingen
  1. 4 4
      optimizer.ml
  2. 11 10
      std/haxe/ds/Vector.hx
  3. 12 9
      tests/unit/src/unitstd/haxe/ds/Vector.unit.hx

+ 4 - 4
optimizer.ml

@@ -305,7 +305,7 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
 	let has_params,map_type = match config with Some config -> config | None -> inline_default_config cf ethis.etype in
 	(* locals substitution *)
 	let locals = Hashtbl.create 0 in
-	let local ?(abstract_this=false) v =
+	let local v =
 		try
 			Hashtbl.find locals v.v_id
 		with Not_found ->
@@ -315,7 +315,7 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
 				i_var = v;
 				i_subst = v';
 				i_outside = false;
-				i_abstract_this = abstract_this;
+				i_abstract_this = Meta.has Meta.This v.v_meta;
 				i_captured = false;
 				i_write = false;
 				i_force_temp = false;
@@ -337,7 +337,7 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
 				i_var = v;
 				i_subst = v;
 				i_outside = true;
-				i_abstract_this = false;
+				i_abstract_this = Meta.has Meta.This v.v_meta;
 				i_captured = false;
 				i_write = false;
 				i_force_temp = false;
@@ -384,7 +384,7 @@ let rec type_inline ctx cf f ethis params tret config p ?(self_calling_closure=f
 	let might_be_affected,collect_modified_locals = create_affection_checker() in
 	let had_side_effect = ref false in
 	let inlined_vars = List.map2 (fun e (v,_) ->
-		let l = local ~abstract_this:(Meta.has Meta.This v.v_meta) v in
+		let l = local v in
 		if has_side_effect e then begin
 			collect_modified_locals e;
 			had_side_effect := true;

+ 11 - 10
std/haxe/ds/Vector.hx

@@ -270,16 +270,17 @@ abstract Vector<T>(VectorData<T>) {
 
 		If `f` is null, the result is unspecified.
 	**/
-	//public function map<S>(f:T->S):Vector<S> {
-		//var r = new Vector<S>(length);
-		//var i = 0;
-		//var len = length;
-		//for(i in 0...len) {
-			//var v = f(get(i));
-			//r.set(i, v);
-		//}
-		//return r;
-	//}
+	#if cs @:extern #end public inline function map<S>(f:T->S):Vector<S> {
+		var length = length;
+		var r = new Vector<S>(length);
+		var i = 0;
+		var len = length;
+		for(i in 0...len) {
+			var v = f(get(i));
+			r.set(i, v);
+		}
+		return r;
+	}
 
 	/**
 		Sorts `this` Vector according to the comparison function `f`, where

+ 12 - 9
tests/unit/src/unitstd/haxe/ds/Vector.unit.hx

@@ -135,15 +135,18 @@ vec.join(", ") == "foo, bar";
 
 // map
 
-//var vec = new haxe.ds.Vector(0);
-//vec.map(function(i) return throw false);
-//
-//var vec = new haxe.ds.Vector(2);
-//vec[0] = 12;
-//vec[1] = 13;
-//var vec2 = vec.map(function(i) return "value: " +i);
-//vec2[0] == "value: 12";
-//vec2[1] == "value: 13";
+var vec = new haxe.ds.Vector(0);
+vec.map(function(i) {
+	throw false;
+	return null;
+});
+
+var vec = new haxe.ds.Vector(2);
+vec[0] = 12;
+vec[1] = 13;
+var vec2 = vec.map(function(i) return "value: " +i);
+vec2[0] == "value: 12";
+vec2[1] == "value: 13";
 
 // sort