com php-src: Revert "Remove static calls from incompatible $this context": Zend/tests/incompat_ctx_user.phpt Zend/zend_vm_def .h
Zend/zend_vm_execute.h

From: Date: Mon, 19 Jan 2015 14:12:51 +0000
Subject: com php-src: Revert "Remove static calls from incompatible $this context": Zend/tests/incompat_ctx_user.phpt Zend/zend_vm_def .h
Zend/zend_vm_execute.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-84183@lists.php.net to get a copy of this message
Commit: 5f0248304ed2bb5fbf72fee9be2a819f9833d6a2 Author: Nikita Popov <nikic@php.net> Mon, 19 Jan 2015 15:12:51 +0100 Parents: 230bfb1067a3637f8669801aed3be0c314f3f3f5 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=5f0248304ed2bb5fbf72fee9be2a819f9833d6a2 Log: Revert "Remove static calls from incompatible $this context" This reverts commit dc9991b167533c7ee13ff96da6048988e6e31bc2. Changed paths: M Zend/tests/incompat_ctx_user.phpt M Zend/zend_vm_def.h M Zend/zend_vm_execute.h

diff --git a/Zend/tests/incompat_ctx_user.phpt b/Zend/tests/incompat_ctx_user.phpt index 5923d5a..2d9b59c 100644 --- a/Zend/tests/incompat_ctx_user.phpt +++ b/Zend/tests/incompat_ctx_user.phpt @@ -16,4 +16,5 @@ $b->bar(); ?> --EXPECTF-- -Fatal error: Non-static method A::foo() cannot be called statically, assuming $this from incompatible context in %s on line %d +Deprecated: Non-static method A::foo() should not be called statically, assuming $this from incompatible context in %s on line %d +string(1) "B" diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0958002..dc3547a 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2471,24 +2471,24 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index da9636e..1d56205 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4257,24 +4257,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER( object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } @@ -6052,24 +6052,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } @@ -7127,24 +7127,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEN object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } @@ -8265,24 +8265,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } @@ -13393,24 +13393,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZE object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } @@ -14882,24 +14882,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } @@ -16329,24 +16329,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_ object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } } @@ -17766,24 +17766,24 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(Z object = Z_OBJ(EX(This)); GC_REFCOUNT(object)++; } - if (!object) { + if (!object || + !instanceof_function(object->ce, ce)) { + /* We are calling method of the other (incompatible) class, + but passing $this. This is done for compatibility with php-4. */ if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) { - /* We allow calling userland non-static methods without $this */ - zend_error(E_STRICT, - "Non-static method %s::%s() should not be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + zend_error( + object ? E_DEPRECATED : E_STRICT, + "Non-static method %s::%s() should not be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } else { - /* An internal function assumes $this is present and won't check that. - * So PHP would crash by allowing the call. */ - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically", - fbc->common.scope->name->val, fbc->common.function_name->val); + /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */ + zend_error_noreturn( + E_ERROR, + "Non-static method %s::%s() cannot be called statically%s", + fbc->common.scope->name->val, fbc->common.function_name->val, + object ? ", assuming $this from incompatible context" : ""); } - } else if (!instanceof_function(object->ce, ce)) { - zend_error_noreturn(E_ERROR, - "Non-static method %s::%s() cannot be called statically, " - "assuming $this from incompatible context", - fbc->common.scope->name->val, fbc->common.function_name->val); } }
« previous php.cvs (#84183) next »