فهرست منبع

[python] use tuples instead of list for storing enum arguments

they are created much faster and are more memory-efficient
Dan Korostelev 6 سال پیش
والد
کامیت
f48063f4f3
3فایلهای تغییر یافته به همراه10 افزوده شده و 6 حذف شده
  1. 7 3
      src/generators/genpy.ml
  2. 1 1
      std/python/_std/Type.hx
  3. 2 2
      std/python/internal/EnumImpl.hx

+ 7 - 3
src/generators/genpy.ml

@@ -2269,11 +2269,15 @@ module Generator = struct
 				in
 				let f = handle_keywords ef.ef_name in
 				let param_str = print_args args in
-				let args_str = String.concat "," (List.map (fun (n,_,_) -> handle_keywords n) args) in
+				let args_str =
+					match args with
+					| [(n,_,_)] -> (handle_keywords n) ^ ","
+					| args -> String.concat "," (List.map (fun (n,_,_) -> handle_keywords n) args)
+				in
 				newline ctx;
 				newline ctx;
 				print ctx "    @staticmethod\n    def %s(%s):\n" f param_str;
-				print ctx "        return %s(\"%s\", %i, [%s])" p ef.ef_name ef.ef_index args_str;
+				print ctx "        return %s(\"%s\", %i, (%s))" p ef.ef_name ef.ef_index args_str;
 			| _ -> assert false
 		) param_constructors;
 
@@ -2281,7 +2285,7 @@ module Generator = struct
 			(* TODO: haxe source has api.quoteString for ef.ef_name *)
 			let f = handle_keywords ef.ef_name in
 			newline ctx;
-			print ctx "%s.%s = %s(\"%s\", %i, list())" p f p ef.ef_name ef.ef_index
+			print ctx "%s.%s = %s(\"%s\", %i, ())" p f p ef.ef_name ef.ef_index
 		) const_constructors;
 
 		if has_feature ctx "python._hx_class" then print ctx "\n%s._hx_class = %s" p p;

+ 1 - 1
std/python/_std/Type.hx

@@ -234,7 +234,7 @@ enum ValueType {
 	}
 
 	public static inline function enumParameters( e : EnumValue ) : Array<Dynamic> {
-		return asEnumImpl(e).params;
+		return asEnumImpl(e).params.toArray();
 	}
 
 	public static inline function enumIndex( e : EnumValue ) : Int {

+ 2 - 2
std/python/internal/EnumImpl.hx

@@ -31,7 +31,7 @@ class EnumImpl {
 	public var index:Int;
 
 	@:ifFeature("has_enum", "Enum.*")
-	public var params:Array<Dynamic>;
+	public var params:Tuple<Dynamic>;
 
 	@:ifFeature("has_enum", "Enum.*")
 	public function new(tag, index, params) {
@@ -45,7 +45,7 @@ class EnumImpl {
 		return if (params == null) {
 			tag;
 		} else {
-			tag + "(" + params.join(",") + ")";
+			python.Syntax.code("{0} + '(' + (', '.join(str(v) for v in {1})) + ')'", tag, params);
 		}
 	}
 }