浏览代码

[php7] fix Reflect.field() for strings (#6276)

Alexander Kuzmenko 8 年之前
父节点
当前提交
865233d01d
共有 3 个文件被更改,包括 45 次插入8 次删除
  1. 5 1
      std/php7/Boot.hx
  2. 3 2
      std/php7/_std/Reflect.hx
  3. 37 5
      tests/unit/src/unit/issues/Issue6276.hx

+ 5 - 1
std/php7/Boot.hx

@@ -509,6 +509,10 @@ class Boot {
 		}
 		return Syntax.getField(value, field);
 	}
+
+	public static function dynamicString( str:String ) : HxDynamicStr {
+		return @:privateAccess HxDynamicStr.wrap(str);
+	}
 }
 
 
@@ -748,7 +752,7 @@ private class HxDynamicStr {
 			case 'lastIndexOf': return HxString.lastIndexOf.bind(str);
 			case 'split':       return HxString.split.bind(str);
 			case 'toString':    return HxString.toString.bind(str);
-			case 'substring':   return HxString.substring.bind(str);
+			case 'substring':   return function(startIndex, ?endIndex) return HxString.substring(str, startIndex, endIndex);
 			case 'substr':      return HxString.substr.bind(str);
 			case 'charCodeAt':  return HxString.charCodeAt.bind(str);
 		}

+ 3 - 2
std/php7/_std/Reflect.hx

@@ -42,6 +42,9 @@ using php.Global;
 	}
 
 	public static function field( o : Dynamic, field : String ) : Dynamic {
+		if (o.is_string()) {
+			return Syntax.getField(Boot.dynamicString(o), field);
+		}
 		if (!o.is_object()) return null;
 
 		if (o.property_exists(field)) {
@@ -169,6 +172,4 @@ using php.Global;
 			return Global.call_user_func(f, @:privateAccess Array.wrap(Global.func_get_args()));
 		}
 	}
-
-
 }

+ 37 - 5
tests/unit/src/unit/issues/Issue6276.hx

@@ -1,12 +1,44 @@
 package unit.issues;
 
+using Reflect;
+
 class Issue6276 extends unit.Test {
 	function test(){
-#if (!php7 && !java && !cs)
-		var s = "foo";
-		var indexOf = Reflect.field(s, "indexOf");
-		var pos = Reflect.callMethod(s, indexOf, ["o"]);
-		eq(pos, 1);
+#if (!(php && !php7) && !java && !cs)
+		var s = "bar";
+
+		var length = s.field("length");
+		eq(3, length);
+
+		var charAt = s.field("charAt");
+		eq(s.charAt(0), charAt(0));
+
+		var charCodeAt = s.field("charCodeAt");
+		eq(s.charCodeAt(0), charCodeAt(0));
+
+		var indexOf = s.field("indexOf");
+		eq(s.indexOf("a"), indexOf("a"));
+
+		var lastIndexOf = s.field("lastIndexOf");
+		eq(s.lastIndexOf("r"), lastIndexOf("r"));
+
+		var split = s.field("split");
+		eq(s.split("a")[1], split("a")[1]);
+
+		var substr = s.field("substr");
+		eq(s.substr(1), substr(1, 2));
+
+		var substring = s.field("substring");
+		eq(s.substring(0, 2), substring(0, 2));
+
+		var toLowerCase = s.toUpperCase().field("toLowerCase");
+		eq(s, toLowerCase());
+
+		var toUpperCase = s.field("toUpperCase");
+		eq(s.toUpperCase(), toUpperCase());
+
+		var toString = s.field("toString");
+		eq(s.toString(), toString());
 #end
 	}
 }