From 777943729c7f1aee57cabfdb9969c5661ab8bfef Mon Sep 17 00:00:00 2001 From: Anton Vasiliev Date: Mon, 19 Apr 2021 09:48:14 +0100 Subject: [PATCH] #1259 - Add failing test case --- ext/stub/arrayaccesstest.zep.c | 88 ++++++++++++++++++- ext/stub/arrayaccesstest.zep.h | 14 +++ .../staticprotectedproperties.zep.c | 3 + stub/arrayaccesstest.zep | 30 +++++++ tests/Extension/ArrayAccessTest.php | 16 ++++ 5 files changed, 150 insertions(+), 1 deletion(-) diff --git a/ext/stub/arrayaccesstest.zep.c b/ext/stub/arrayaccesstest.zep.c index 18dec8135..61e9368f3 100644 --- a/ext/stub/arrayaccesstest.zep.c +++ b/ext/stub/arrayaccesstest.zep.c @@ -26,6 +26,9 @@ ZEPHIR_INIT_CLASS(Stub_ArrayAccessTest) ZEPHIR_REGISTER_CLASS(Stub, ArrayAccessTest, stub, arrayaccesstest, stub_arrayaccesstest_method_entry, 0); zend_declare_property_null(stub_arrayaccesstest_ce, SL("data"), ZEND_ACC_PROTECTED); + zend_declare_property_null(stub_arrayaccesstest_ce, SL("unsetData"), ZEND_ACC_PROTECTED); + stub_arrayaccesstest_ce->create_object = zephir_init_properties_Stub_ArrayAccessTest; + return SUCCESS; } @@ -65,7 +68,7 @@ PHP_METHOD(Stub_ArrayAccessTest, get) object_init_ex(&arr, stub_arrayaccessobj_ce); ZEPHIR_CALL_METHOD(NULL, &arr, "__construct", NULL, 3); zephir_check_call_status(); - zephir_array_fetch_string(&_0, &arr, SL("two"), PH_NOISY | PH_READONLY, "stub/arrayaccesstest.zep", 20); + zephir_array_fetch_string(&_0, &arr, SL("two"), PH_NOISY | PH_READONLY, "stub/arrayaccesstest.zep", 21); RETURN_CTOR(&_0); } @@ -333,3 +336,86 @@ PHP_METHOD(Stub_ArrayAccessTest, issue1086WontNullArrayAfterPassViaStaticWithout RETURN_CTOR(¶ms); } +/** + * @issue https://github.com/zephir-lang/zephir/issues/1259 + */ +PHP_METHOD(Stub_ArrayAccessTest, issue1259UnsetKeyFromArrayInternalVariable) +{ + zval ret, unsetData; + zephir_method_globals *ZEPHIR_METHOD_GLOBALS_PTR = NULL; + zval *this_ptr = getThis(); + + ZVAL_UNDEF(&ret); + ZVAL_UNDEF(&unsetData); + + + ZEPHIR_MM_GROW(); + + ZEPHIR_INIT_VAR(&ret); + array_init(&ret); + ZEPHIR_INIT_VAR(&unsetData); + zephir_create_array(&unsetData, 2, 0); + add_assoc_stringl_ex(&unsetData, SL("key_a"), SL("marcin")); + add_assoc_stringl_ex(&unsetData, SL("key_b"), SL("paula")); + zephir_array_append(&ret, &unsetData, PH_SEPARATE, "stub/arrayaccesstest.zep", 130); + zephir_array_unset_string(&unsetData, SL("key_a"), PH_SEPARATE); + zephir_array_append(&ret, &unsetData, PH_SEPARATE, "stub/arrayaccesstest.zep", 132); + RETURN_CTOR(&ret); +} + +/** + * @issue https://github.com/zephir-lang/zephir/issues/1259 + */ +PHP_METHOD(Stub_ArrayAccessTest, issue1259UnsetKeyFromArrayProperty) +{ + zval _0, _1, _2; + zval ret; + zephir_method_globals *ZEPHIR_METHOD_GLOBALS_PTR = NULL; + zval *this_ptr = getThis(); + + ZVAL_UNDEF(&ret); + ZVAL_UNDEF(&_0); + ZVAL_UNDEF(&_1); + ZVAL_UNDEF(&_2); + + + ZEPHIR_MM_GROW(); + + ZEPHIR_INIT_VAR(&ret); + array_init(&ret); + zephir_read_property(&_0, this_ptr, ZEND_STRL("unsetData"), PH_NOISY_CC | PH_READONLY); + zephir_array_append(&ret, &_0, PH_SEPARATE, "stub/arrayaccesstest.zep", 144); + zephir_read_property(&_1, this_ptr, ZEND_STRL("unsetData"), PH_NOISY_CC | PH_READONLY); + zephir_array_unset_string(&_1, SL("key_a"), PH_SEPARATE); + zephir_read_property(&_2, this_ptr, ZEND_STRL("unsetData"), PH_NOISY_CC | PH_READONLY); + zephir_array_append(&ret, &_2, PH_SEPARATE, "stub/arrayaccesstest.zep", 146); + RETURN_CTOR(&ret); +} + +zend_object *zephir_init_properties_Stub_ArrayAccessTest(zend_class_entry *class_type) +{ + zval _1$$3; + zval _0; + zephir_method_globals *ZEPHIR_METHOD_GLOBALS_PTR = NULL; + ZVAL_UNDEF(&_0); + ZVAL_UNDEF(&_1$$3); + + + ZEPHIR_MM_GROW(); + + { + zval local_this_ptr, *this_ptr = &local_this_ptr; + ZEPHIR_CREATE_OBJECT(this_ptr, class_type); + zephir_read_property_ex(&_0, this_ptr, ZEND_STRL("unsetData"), PH_NOISY_CC | PH_READONLY); + if (Z_TYPE_P(&_0) == IS_NULL) { + ZEPHIR_INIT_VAR(&_1$$3); + zephir_create_array(&_1$$3, 2, 0); + add_assoc_stringl_ex(&_1$$3, SL("key_a"), SL("marcin")); + add_assoc_stringl_ex(&_1$$3, SL("key_b"), SL("paula")); + zephir_update_property_zval_ex(this_ptr, ZEND_STRL("unsetData"), &_1$$3); + } + ZEPHIR_MM_RESTORE(); + return Z_OBJ_P(this_ptr); + } +} + diff --git a/ext/stub/arrayaccesstest.zep.h b/ext/stub/arrayaccesstest.zep.h index c1576e5dd..653472e86 100644 --- a/ext/stub/arrayaccesstest.zep.h +++ b/ext/stub/arrayaccesstest.zep.h @@ -14,6 +14,9 @@ PHP_METHOD(Stub_ArrayAccessTest, issue1086Strict); PHP_METHOD(Stub_ArrayAccessTest, issue1086WontNullArrayAfterPassViaStaticWithStrictParams); PHP_METHOD(Stub_ArrayAccessTest, issue1086NotStrictParams); PHP_METHOD(Stub_ArrayAccessTest, issue1086WontNullArrayAfterPassViaStaticWithoutStrictParams); +PHP_METHOD(Stub_ArrayAccessTest, issue1259UnsetKeyFromArrayInternalVariable); +PHP_METHOD(Stub_ArrayAccessTest, issue1259UnsetKeyFromArrayProperty); +zend_object *zephir_init_properties_Stub_ArrayAccessTest(zend_class_entry *class_type); ZEND_BEGIN_ARG_INFO_EX(arginfo_stub_arrayaccesstest_exits, 0, 0, 0) ZEND_END_ARG_INFO() @@ -53,6 +56,15 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stub_arrayaccesstest_issue1086wontnullarrayafterpassviastaticwithoutstrictparams, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stub_arrayaccesstest_issue1259unsetkeyfromarrayinternalvariable, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_stub_arrayaccesstest_issue1259unsetkeyfromarrayproperty, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_stub_arrayaccesstest_zephir_init_properties_stub_arrayaccesstest, 0, 0, 0) +ZEND_END_ARG_INFO() + ZEPHIR_INIT_FUNCS(stub_arrayaccesstest_method_entry) { #if PHP_VERSION_ID >= 80000 PHP_ME(Stub_ArrayAccessTest, exits, arginfo_stub_arrayaccesstest_exits, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) @@ -73,5 +85,7 @@ ZEPHIR_INIT_FUNCS(stub_arrayaccesstest_method_entry) { PHP_ME(Stub_ArrayAccessTest, issue1086WontNullArrayAfterPassViaStaticWithStrictParams, arginfo_stub_arrayaccesstest_issue1086wontnullarrayafterpassviastaticwithstrictparams, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME(Stub_ArrayAccessTest, issue1086NotStrictParams, arginfo_stub_arrayaccesstest_issue1086notstrictparams, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) PHP_ME(Stub_ArrayAccessTest, issue1086WontNullArrayAfterPassViaStaticWithoutStrictParams, arginfo_stub_arrayaccesstest_issue1086wontnullarrayafterpassviastaticwithoutstrictparams, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + PHP_ME(Stub_ArrayAccessTest, issue1259UnsetKeyFromArrayInternalVariable, arginfo_stub_arrayaccesstest_issue1259unsetkeyfromarrayinternalvariable, ZEND_ACC_PUBLIC) + PHP_ME(Stub_ArrayAccessTest, issue1259UnsetKeyFromArrayProperty, arginfo_stub_arrayaccesstest_issue1259unsetkeyfromarrayproperty, ZEND_ACC_PUBLIC) PHP_FE_END }; diff --git a/ext/stub/properties/staticprotectedproperties.zep.c b/ext/stub/properties/staticprotectedproperties.zep.c index f943280ca..0b3a75a4b 100644 --- a/ext/stub/properties/staticprotectedproperties.zep.c +++ b/ext/stub/properties/staticprotectedproperties.zep.c @@ -194,6 +194,9 @@ PHP_METHOD(Stub_Properties_StaticProtectedProperties, getSomeString) RETURN_CTORW(&_0); } +/** + * @issue https://github.com/zephir-lang/zephir/issues/1536 + */ PHP_METHOD(Stub_Properties_StaticProtectedProperties, compareStaticNull) { zval someNull, _0; diff --git a/stub/arrayaccesstest.zep b/stub/arrayaccesstest.zep index 1623871c6..64513d958 100644 --- a/stub/arrayaccesstest.zep +++ b/stub/arrayaccesstest.zep @@ -3,6 +3,7 @@ namespace Stub; class ArrayAccessTest { protected data; + protected unsetData = ["key_a": "marcin", "key_b": "paula"]; public static function exits() { @@ -117,4 +118,33 @@ class ArrayAccessTest return params; } + + /** + * @issue https://github.com/zephir-lang/zephir/issues/1259 + */ + public function issue1259UnsetKeyFromArrayInternalVariable() -> array + { + array ret = []; + array unsetData = ["key_a": "marcin", "key_b": "paula"]; + + let ret[] = unsetData; + unset(unsetData["key_a"]); + let ret[] = unsetData; + + return ret; + } + + /** + * @issue https://github.com/zephir-lang/zephir/issues/1259 + */ + public function issue1259UnsetKeyFromArrayProperty() -> array + { + array ret = []; + + let ret[] = this->unsetData; + unset(this->unsetData["key_a"]); + let ret[] = this->unsetData; + + return ret; + } } diff --git a/tests/Extension/ArrayAccessTest.php b/tests/Extension/ArrayAccessTest.php index 5544aca45..a5e46f983 100644 --- a/tests/Extension/ArrayAccessTest.php +++ b/tests/Extension/ArrayAccessTest.php @@ -75,4 +75,20 @@ public function testIssue1086StaticallyCalledFunctionWithArrayAsArgMustReturnArr $actual = $class->issue1086WontNullArrayAfterPassViaStaticWithoutStrictParams(); $this->assertSame(['test' => 123], $actual); } + + /** + * @issue https://github.com/zephir-lang/zephir/issues/1259 + */ + public function testIssue1259CheckUnsetKeyFromArray(): void + { + $class = new \Stub\ArrayAccessTest(); + + $expected = [ + ['key_a' => 'marcin', 'key_b' => 'paula'], + ['key_b' => 'paula'], + ]; + + $this->assertSame($expected, $class->issue1259UnsetKeyFromArrayInternalVariable()); + $this->assertSame($expected, $class->issue1259UnsetKeyFromArrayProperty()); + } }