Browse Source

fix test for #6276

Alexander Kuzmenko 8 years ago
parent
commit
8e8105cdd6
2 changed files with 57 additions and 33 deletions
  1. 46 21
      std/php7/Boot.hx
  2. 11 12
      tests/unit/src/unit/issues/Issue6276.hx

+ 46 - 21
std/php7/Boot.hx

@@ -511,7 +511,7 @@ class Boot {
 	}
 	}
 
 
 	public static function dynamicString( str:String ) : HxDynamicStr {
 	public static function dynamicString( str:String ) : HxDynamicStr {
-		return @:privateAccess HxDynamicStr.wrap(str);
+		return @:privateAccess new HxDynamicStr(str);
 	}
 	}
 }
 }
 
 
@@ -717,13 +717,14 @@ private class HxString {
 }
 }
 
 
 /**
 /**
-	For Dynamic access which looks like String
+	For Dynamic access which looks like String.
+	Instances of this class should not be saved anywhere.
+	Instead it should be used to immediately invoke a String field right after instance creation one time only.
 **/
 **/
 @:dox(hide)
 @:dox(hide)
 @:keep
 @:keep
-private class HxDynamicStr {
+private class HxDynamicStr extends HxClosure {
 	static var hxString : String = (cast HxString:HxClass).phpClassName;
 	static var hxString : String = (cast HxString:HxClass).phpClassName;
-	var str : String;
 
 
 	/**
 	/**
 		Returns HxDynamicStr instance if `value` is a string.
 		Returns HxDynamicStr instance if `value` is a string.
@@ -737,33 +738,57 @@ private class HxDynamicStr {
 		}
 		}
 	}
 	}
 
 
+	static inline function invoke( str:String, method:String, args:NativeArray ) : Dynamic {
+		Global.array_unshift(args, str);
+		return Global.call_user_func_array(hxString + '::' + method, args);
+	}
+
 	function new( str:String ) {
 	function new( str:String ) {
-		this.str = str;
+		super(str, null);
 	}
 	}
 
 
 	@:phpMagic
 	@:phpMagic
 	function __get( field:String ) : Dynamic {
 	function __get( field:String ) : Dynamic {
 		switch (field) {
 		switch (field) {
-			case 'length':      return str.length;
-			case 'toUpperCase': return HxString.toUpperCase.bind(str);
-			case 'toLowerCase': return HxString.toLowerCase.bind(str);
-			case 'charAt':      return HxString.charAt.bind(str);
-			case 'indexOf':     return HxString.indexOf.bind(str);
-			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 'substr':      return HxString.substr.bind(str);
-			case 'charCodeAt':  return HxString.charCodeAt.bind(str);
-		}
-		/** Force invalid field access error */
-		return Syntax.getField(str, field);
+			case 'length':
+				return (target:String).length;
+			case _:
+				func = field;
+				return this;
+		}
 	}
 	}
 
 
 	@:phpMagic
 	@:phpMagic
 	function __call( method:String, args:NativeArray ) : Dynamic {
 	function __call( method:String, args:NativeArray ) : Dynamic {
-		Global.array_unshift(args, str);
-		return Global.call_user_func_array(hxString + '::' + method, args);
+		return invoke(target, method, args);
+	}
+
+	/**
+		@see http://php.net/manual/en/language.oop5.magic.php#object.invoke
+	**/
+	@:phpMagic
+	override public function __invoke() {
+		return invoke(target, func, Global.func_get_args());
+	}
+
+	/**
+		Generates callable value for PHP
+	**/
+	override public function getCallback(eThis:Dynamic = null) : NativeIndexedArray<Dynamic> {
+		if (eThis == null) {
+			return Syntax.arrayDecl((this:Dynamic), func);
+		}
+		return Syntax.arrayDecl((new HxDynamicStr(eThis):Dynamic), func);
+	}
+
+	/**
+		Invoke this closure with `newThis` instead of `this`
+	**/
+	override public function callWith( newThis:Dynamic, args:NativeArray ) : Dynamic {
+		if (newThis == null) {
+			newThis = target;
+		}
+		return invoke(newThis, func, args);
 	}
 	}
 }
 }
 
 

+ 11 - 12
tests/unit/src/unit/issues/Issue6276.hx

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