|
@@ -511,7 +511,7 @@ class Boot {
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
@:keep
|
|
|
-private class HxDynamicStr {
|
|
|
+private class HxDynamicStr extends HxClosure {
|
|
|
static var hxString : String = (cast HxString:HxClass).phpClassName;
|
|
|
- var str : 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 ) {
|
|
|
- this.str = str;
|
|
|
+ super(str, null);
|
|
|
}
|
|
|
|
|
|
@:phpMagic
|
|
|
function __get( field:String ) : Dynamic {
|
|
|
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
|
|
|
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);
|
|
|
}
|
|
|
}
|
|
|
|