소스 검색

added __forin__ __foreach__ and __has_next__

Nicolas Cannasse 13 년 전
부모
커밋
428a98b69f
2개의 변경된 파일18개의 추가작업 그리고 7개의 파일을 삭제
  1. 12 0
      genswf9.ml
  2. 6 7
      std/flash9/_std/Reflect.hx

+ 12 - 0
genswf9.ml

@@ -1300,6 +1300,18 @@ and gen_call ctx retval e el r =
 	| TLocal { v_name = "__float__" }, [e] ->
 		gen_expr ctx true e;
 		write ctx HToNumber
+	| TLocal { v_name = "__foreach__" }, [obj;counter] ->
+		gen_expr ctx true obj;
+		gen_expr ctx true counter;
+		write ctx HForEach
+	| TLocal { v_name = "__forin__" }, [obj;counter] ->
+		gen_expr ctx true obj;
+		gen_expr ctx true counter;
+		write ctx HForIn
+	| TLocal { v_name = "__has_next__" }, [obj;counter] ->
+		let oreg = match gen_access ctx obj Read with VReg r -> r | _ -> error "Must be a local variable" obj.epos in
+		let creg = match gen_access ctx counter Read with VReg r -> r | _ -> error "Must be a local variable" obj.epos in
+		write ctx (HNext (oreg.rid,creg.rid))
 	| TLocal { v_name = "__hkeys__" }, [e2]
 	| TLocal { v_name = "__foreach__" }, [e2]
 	| TLocal { v_name = "__keys__" }, [e2] ->

+ 6 - 7
std/flash9/_std/Reflect.hx

@@ -45,20 +45,19 @@
 	public static inline function setProperty( o : Dynamic, field : String, value : Dynamic ) : Void {
 		setField(o,field,value);
 	}
-	
+
 	public inline static function callMethod( o : Dynamic, func : Dynamic, args : Array<Dynamic> ) : Dynamic untyped {
 		return func.apply(o,args);
 	}
 
 	public static function fields( o : Dynamic ) : Array<String> untyped {
 		if( o == null ) return new Array();
-		var a : Array<String> = __keys__(o);
 		var i = 0;
-		while( i < a.length ){
-			if( !o.hasOwnProperty(a[i]) )
-				a.splice(i,1);
-			else
-				++i;
+		var a = [];
+		while( untyped __has_next__(o,i) ) {
+			var prop = untyped __forin__(o,i);
+			if( o.hasOwnProperty(prop) )
+				a.push(prop);
 		}
 		return a;
 	}