2
0
Эх сурвалжийг харах

[php7] add php.Ref<T> to arguments of array functions in php.Global

Alexander Kuzmenko 8 жил өмнө
parent
commit
9ec3a3addd

+ 1 - 1
src/optimization/analyzerTexpr.ml

@@ -706,7 +706,7 @@ module Fusion = struct
 								in
 								try loop e1; true with Exit -> false
 							in
-							(* PHP doesn't like call()() expressions. *)
+							(* PHP5 doesn't like call()() expressions. *)
 							let e2 = if com.platform = Php && not (is_php_safe e1) then explore e2 else replace e2 in
 							let el = handle_el el in
 							e2,el

+ 11 - 11
std/php7/Global.hx

@@ -172,7 +172,7 @@ extern class Global {
 	/**
 		@see http://php.net/manual/en/function.array-push.php
 	**/
-	static function array_push( array:NativeArray, value:Rest<Dynamic> ) : Int ;
+	static function array_push( array:Ref<NativeArray>, value:Rest<Dynamic> ) : Int ;
 
 	/**
 		@see http://php.net/manual/en/function.array-reverse.php
@@ -187,7 +187,7 @@ extern class Global {
 	/**
 		@see http://php.net/manual/en/function.array-shift.php
 	**/
-	static function array_shift( array:NativeArray ) : Dynamic ;
+	static function array_shift( array:Ref<NativeArray> ) : Dynamic ;
 
 	/**
 		@see http://php.net/manual/en/function.array-slice.php
@@ -197,12 +197,12 @@ extern class Global {
 	/**
 		@see http://php.net/manual/en/function.array-splice.php
 	**/
-	static function array_splice( array:NativeArray, offset:Int, lenght:Int = 0, ?replacement:Dynamic ) : NativeArray ;
+	static function array_splice( array:Ref<NativeArray>, offset:Int, lenght:Int = 0, ?replacement:Dynamic ) : NativeArray ;
 
 	/**
 		@see http://php.net/manual/en/function.array-unshift.php
 	**/
-	static function array_unshift( arr:NativeArray, value:Rest<Dynamic> ) : Int ;
+	static function array_unshift( arr:Ref<NativeArray>, value:Rest<Dynamic> ) : Int ;
 
 	/**
 		@see http://php.net/manual/en/function.array-values.php
@@ -232,32 +232,32 @@ extern class Global {
 	/**
 		@see http://php.net/manual/en/function.usort.php
 	**/
-	static function usort( array:NativeArray, value_compare_func:Dynamic->Dynamic->Int ) : Bool ;
+	static function usort( array:Ref<NativeArray>, value_compare_func:Dynamic->Dynamic->Int ) : Bool ;
 
 	/**
 		@see http://php.net/manual/en/function.reset.php
 	**/
-	static function reset( array:NativeArray ) : Dynamic;
+	static function reset( array:Ref<NativeArray> ) : Dynamic;
 
 	/**
 		@see http://php.net/manual/en/function.current.php
 	**/
-	static function current( array:NativeArray ) : Dynamic;
+	static function current( array:Ref<NativeArray> ) : Dynamic;
 
 	/**
 		@see http://php.net/manual/en/function.next.php
 	**/
-	static function next( array:NativeArray ) : Dynamic;
+	static function next( array:Ref<NativeArray> ) : Dynamic;
 
 	/**
 		@see http://php.net/manual/en/function.prev.php
 	**/
-	static function prev( array:NativeArray ) : Dynamic;
+	static function prev( array:Ref<NativeArray> ) : Dynamic;
 
 	/**
 		@see http://php.net/manual/en/function.end.php
 	**/
-	static function end( array:NativeArray ) : Dynamic;
+	static function end( array:Ref<NativeArray> ) : Dynamic;
 
 	/**
 		@see http://php.net/manual/en/function.key.php
@@ -267,7 +267,7 @@ extern class Global {
 	/**
 		@see http://php.net/manual/en/function.each.php
 	**/
-	static function each( array:NativeArray ) : NativeArray;
+	static function each( array:Ref<NativeArray> ) : NativeArray;
 
 	/**
 		@see http://php.net/manual/en/function.defined.php

+ 0 - 1
std/php7/Ref.hx

@@ -4,5 +4,4 @@ package php;
 	Special type which allows passing function arguments by reference.
 	This type should be used for externs only.
 **/
-@:analyzer(as_var)
 typedef Ref<T> = T;

+ 11 - 0
tests/unit/src/unit/TestPhp.hx

@@ -71,9 +71,14 @@ class TestPhp extends Test
 	**/
 	function testRef() {
 		function modify(i:Ref<Int>) i = 10; //avoid inlining
+
 		var i = 0;
 		modify(i);
 		eq(10, i);
+
+		var d = new DummyForRef();
+		modify(d.getThis().field);
+		eq(10, d.field);
 	}
 
 	/**
@@ -88,6 +93,12 @@ class TestPhp extends Test
 #end
 }
 
+private class DummyForRef {
+	public var field:Int = 0;
+	public function new() {}
+	public function getThis() return this;
+}
+
 class Class2146 {
 	var array:Array<Class2146>;
 	function new() {