Browse Source

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

Alexander Kuzmenko 8 years ago
parent
commit
9ec3a3addd
4 changed files with 23 additions and 13 deletions
  1. 1 1
      src/optimization/analyzerTexpr.ml
  2. 11 11
      std/php7/Global.hx
  3. 0 1
      std/php7/Ref.hx
  4. 11 0
      tests/unit/src/unit/TestPhp.hx

+ 1 - 1
src/optimization/analyzerTexpr.ml

@@ -706,7 +706,7 @@ module Fusion = struct
 								in
 								in
 								try loop e1; true with Exit -> false
 								try loop e1; true with Exit -> false
 							in
 							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 e2 = if com.platform = Php && not (is_php_safe e1) then explore e2 else replace e2 in
 							let el = handle_el el in
 							let el = handle_el el in
 							e2,el
 							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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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
 		@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.
 	Special type which allows passing function arguments by reference.
 	This type should be used for externs only.
 	This type should be used for externs only.
 **/
 **/
-@:analyzer(as_var)
 typedef Ref<T> = T;
 typedef Ref<T> = T;

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

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