helly Mon Aug 4 17:56:05 2003 EDT
Modified files:
/spl php_spl.c php_spl.h spl_array.c spl_array.h
/spl/tests array_access_001.phpt array_access_002.phpt
Log:
- Unset support for spl_array_access by method set($index)
- Parameter names for array interface methods
Index: spl/php_spl.c
diff -u spl/php_spl.c:1.13 spl/php_spl.c:1.14
--- spl/php_spl.c:1.13 Sun Aug 3 18:29:20 2003
+++ spl/php_spl.c Mon Aug 4 17:56:05 2003
@@ -95,6 +95,7 @@
#ifdef SPL_ARRAY_WRITE
ZEND_EXECUTE_HOOK(ZEND_ASSIGN_DIM);
+ ZEND_EXECUTE_HOOK(ZEND_UNSET_DIM_OBJ);
#endif /* SPL_ARRAY_WRITE */
}
/* }}} */
@@ -106,13 +107,13 @@
static
ZEND_BEGIN_ARG_INFO(arginfo_one_param, 0)
- ZEND_ARG_PASS_INFO(0)
+ ZEND_ARG_INFO(0, index)
ZEND_END_ARG_INFO();
static
ZEND_BEGIN_ARG_INFO(arginfo_two_params, 0)
- ZEND_ARG_PASS_INFO(0)
- ZEND_ARG_PASS_INFO(0)
+ ZEND_ARG_INFO(0, index)
+ ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO();
function_entry spl_funcs_iterator[] = {
@@ -148,6 +149,7 @@
function_entry spl_funcs_array_access[] = {
SPL_ABSTRACT_FE(array_access, set, arginfo_two_params)
+ SPL_ABSTRACT_FE(array_access, del, arginfo_one_param)
{NULL, NULL, NULL}
};
Index: spl/php_spl.h
diff -u spl/php_spl.h:1.9 spl/php_spl.h:1.10
--- spl/php_spl.h:1.9 Sat Jul 19 16:54:22 2003
+++ spl/php_spl.h Mon Aug 4 17:56:05 2003
@@ -71,6 +71,7 @@
#endif
#ifdef SPL_ARRAY_WRITE
ZEND_EXECUTE_HOOK_PTR(ZEND_ASSIGN_DIM);
+ ZEND_EXECUTE_HOOK_PTR(ZEND_UNSET_DIM_OBJ);
#endif
ZEND_END_MODULE_GLOBALS(spl)
Index: spl/spl_array.c
diff -u spl/spl_array.c:1.13 spl/spl_array.c:1.14
--- spl/spl_array.c:1.13 Mon Aug 4 16:25:41 2003
+++ spl/spl_array.c Mon Aug 4 17:56:05 2003
@@ -240,6 +240,66 @@
#endif
/* }}} */
+/* {{{ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_UNSET_DIM_OBJ) */
+#ifdef SPL_ARRAY_WRITE
+ZEND_EXECUTE_HOOK_FUNCTION(ZEND_UNSET_DIM_OBJ)
+{
+ zval **obj;
+ zend_class_entry *obj_ce;
+ spl_is_a is_a;
+
+ if (EX(opline)->extended_value != ZEND_UNSET_DIM) {
+ ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_UNSET_DIM_OBJ);
+ }
+
+ obj = spl_get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), 0 TSRMLS_CC);
+
+ if (!obj || (obj_ce = spl_get_class_entry(*obj TSRMLS_CC)) == NULL) {
+ ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_UNSET_DIM_OBJ);
+ }
+
+ is_a = spl_implements(obj_ce);
+
+ if (is_a & SPL_IS_A_ARRAY_ACCESS) {
+ znode *op2 = &EX(opline)->op2;
+ zval *index = spl_get_zval_ptr(op2, EX(Ts), &EG(free_op2), BP_VAR_R);
+ zval tmp;
+ zval *retval;
+
+ spl_unlock_zval_ptr_ptr(&EX(opline)->op1, EX(Ts) TSRMLS_CC);
+
+ /* here we are sure we are dealing with an object */
+ switch (op2->op_type) {
+ case IS_CONST:
+ /* already a constant string */
+ break;
+ case IS_VAR:
+ tmp = *index;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ index = &tmp;
+ break;
+ case IS_TMP_VAR:
+ convert_to_string(index);
+ break;
+ }
+
+ spl_begin_method_call_arg_ex1(obj, obj_ce, NULL, "del",
sizeof("del")-1, &retval, index TSRMLS_CC);
+
+ if (index == &tmp) {
+ zval_dtor(index);
+ }
+
+ FREE_OP(Ts, op2, EG(free_op2));
+ DELETE_RET_ZVAL(retval);
+
+ NEXT_OPCODE();
+ }
+ ZEND_EXECUTE_HOOK_ORIGINAL(ZEND_UNSET_DIM_OBJ);
+}
+#endif
+/* }}} */
+
SPL_CLASS_FUNCTION(array, __construct);
SPL_CLASS_FUNCTION(array, new_iterator);
SPL_CLASS_FUNCTION(array, rewind);
Index: spl/spl_array.h
diff -u spl/spl_array.h:1.3 spl/spl_array.h:1.4
--- spl/spl_array.h:1.3 Wed Jul 16 05:48:36 2003
+++ spl/spl_array.h Mon Aug 4 17:56:05 2003
@@ -30,6 +30,7 @@
#ifdef SPL_ARRAY_WRITE
ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN_DIM);
+ZEND_EXECUTE_HOOK_FUNCTION(ZEND_UNSET_DIM_OBJ);
#endif
#endif /* SPL_ARRAY_H */
Index: spl/tests/array_access_001.phpt
diff -u spl/tests/array_access_001.phpt:1.3 spl/tests/array_access_001.phpt:1.4
--- spl/tests/array_access_001.phpt:1.3 Wed Jul 16 06:41:43 2003
+++ spl/tests/array_access_001.phpt Mon Aug 4 17:56:05 2003
@@ -22,6 +22,10 @@
echo __METHOD__ . "($index,$newval)\n";
return $this->a[$index] = $newval;
}
+ function del($index) {
+ echo __METHOD__ . "($index)\n";
+ unset($this->a[$index]);
+ }
}
$obj = new c();
@@ -55,6 +59,14 @@
var_dump($obj[6]);
var_dump($x);
+echo "===unset===\n";
+var_dump($obj->a);
+unset($obj[2]);
+unset($obj['4th']);
+unset($obj[7]);
+unset($obj['8th']);
+var_dump($obj->a);
+
print "Done\n";
?>
--EXPECTF--
@@ -119,4 +131,33 @@
c::get(6)
string(9) "changed 6"
string(9) "changed 6"
+===unset===
+array(6) {
+ [0]=>
+ string(3) "1st"
+ [1]=>
+ string(9) "Changed 1"
+ [2]=>
+ string(3) "3rd"
+ ["4th"]=>
+ string(11) "Changed 4th"
+ ["5th"]=>
+ string(9) "Added 5th"
+ [6]=>
+ string(9) "changed 6"
+}
+c::del(2)
+c::del(4th)
+c::del(7)
+c::del(8th)
+array(4) {
+ [0]=>
+ string(3) "1st"
+ [1]=>
+ string(9) "Changed 1"
+ ["5th"]=>
+ string(9) "Added 5th"
+ [6]=>
+ string(9) "changed 6"
+}
Done
Index: spl/tests/array_access_002.phpt
diff -u spl/tests/array_access_002.phpt:1.3 spl/tests/array_access_002.phpt:1.4
--- spl/tests/array_access_002.phpt:1.3 Wed Jul 16 06:41:43 2003
+++ spl/tests/array_access_002.phpt Mon Aug 4 17:56:05 2003
@@ -23,6 +23,10 @@
echo __METHOD__ . "($index,$newval)\n";
/* return */ $this->a[$index] = $newval;
}
+ function del($index) {
+ echo __METHOD__ . "($index)\n";
+ unset($this->a[$index]);
+ }
}
$obj = new c();
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php