Ver código fonte

support anon and dynamic length field access via HxOverrides, fix #6259 for python

frabbit 7 anos atrás
pai
commit
23718723a3

+ 2 - 0
src/generators/genpy.ml

@@ -1426,6 +1426,8 @@ module Printer = struct
 				Printf.sprintf "len(%s)" (print_expr pctx e1)
 			| FInstance(c,_,{cf_name = "length"}) when (is_type "" "str")(TClassDecl c) ->
 				Printf.sprintf "len(%s)" (print_expr pctx e1)
+			| FAnon({cf_name = "length"}) | FDynamic ("length") ->
+				Printf.sprintf "HxOverrides.length(%s)" (print_expr pctx e1)
 			| FStatic(c,{cf_name = "fromCharCode"}) when (is_type "" "str")(TClassDecl c) ->
 				Printf.sprintf "HxString.fromCharCode"
 			| FStatic({cl_path = ["python";"internal"],"UBuiltins"},{cf_name = s}) ->

+ 10 - 0
std/python/internal/HxOverrides.hx

@@ -117,6 +117,16 @@ class HxOverrides {
 		return Syntax.callField(x, "toLowerCase");
 	}
 
+	@:ifFeature("dynamic_read.length", "anon_optional_read.length", "anon_read.length")
+	static public function length(x:Dynamic) {
+		if (Boot.isString(x)) {
+			return (x:String).length;
+		} else if (Boot.isArray(x)) {
+			return (x:Array<Dynamic>).length;
+		}
+		return Syntax.field(x, "length");
+	}
+
 	@:ifFeature("binop_>>>")
 	static public function rshift(val:Int, n:Int) {
 		return Syntax.binop(Syntax.binop(val, "%", Syntax.pythonCode("0x100000000")), ">>", n);

+ 0 - 2
tests/unit/src/unit/issues/Issue6259.hx

@@ -1,10 +1,8 @@
 package unit.issues;
 class Issue6259 extends Test{
 	function test(){
-#if !python
 		function f(a) return a.b;
 		var res = f({b: (s) -> s.length})("6259");
 		eq(res,4);
-#end
 	}
 }