]> granicus.if.org Git - php/commitdiff
Split isset/isempty for object property and object dimension hooking.
authorMarcus Boerger <helly@php.net>
Mon, 10 Nov 2003 16:14:44 +0000 (16:14 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 10 Nov 2003 16:14:44 +0000 (16:14 +0000)
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute.c
Zend/zend_object_handlers.c
Zend/zend_object_handlers.h
Zend/zend_objects_API.c

index b6971b781f004103e2b1d40ceb0ddc997caf365a..691f1faef755accd172d51a14de05a57619aefa4 100644 (file)
@@ -3050,9 +3050,11 @@ void zend_do_isset_or_isempty(int type, znode *result, znode *variable TSRMLS_DC
                        last_op->opcode = ZEND_ISSET_ISEMPTY_VAR;
                        break;
                case ZEND_FETCH_DIM_IS:
-               case ZEND_FETCH_OBJ_IS:
                        last_op->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ;
                        break;
+               case ZEND_FETCH_OBJ_IS:
+                       last_op->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ;
+                       break;
        }
        last_op->result.op_type = IS_TMP_VAR;
        last_op->extended_value = type;
index 43f95240250e5c65047ba772c2a79c181aff84cd..d53c242adeb78aeeef704df1cdaa173e0a11bbb4 100644 (file)
@@ -673,6 +673,8 @@ int zendlex(znode *zendlval TSRMLS_DC);
 
 #define ZEND_ASSIGN_DIM                                147
 
+#define ZEND_ISSET_ISEMPTY_PROP_OBJ    148
+
 /* end of block */
 /* END: OPCODES */
 
index a3e557f218b830ff4e1e01ecc0d535d320f27716..7ebb1ee86cc6c9dd872ef7640dba2fe20ad33781 100644 (file)
@@ -3769,7 +3769,7 @@ int zend_isset_isempty_var_handler(ZEND_OPCODE_HANDLER_ARGS)
 }
 
 
-int zend_isset_isempty_dim_obj_handler(ZEND_OPCODE_HANDLER_ARGS)
+static int zend_isset_isempty_dim_prop_obj_handler(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
 {
        zval **container = get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
        zval *offset = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);
@@ -3831,7 +3831,11 @@ int zend_isset_isempty_dim_obj_handler(ZEND_OPCODE_HANDLER_ARGS)
                                        break;
                        }
                } else if ((*container)->type == IS_OBJECT) {
-                       result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (EX(opline)->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
+                       if (prop_dim) {
+                               result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (EX(opline)->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
+                       } else {
+                               result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (EX(opline)->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
+                       }
                } else if ((*container)->type == IS_STRING) { /* string offsets */
                        switch (EX(opline)->extended_value) {
                                case ZEND_ISSET:
@@ -3865,6 +3869,18 @@ int zend_isset_isempty_dim_obj_handler(ZEND_OPCODE_HANDLER_ARGS)
 }
 
 
+int zend_isset_isempty_dim_obj_handler(ZEND_OPCODE_HANDLER_ARGS)
+{
+       zend_isset_isempty_dim_prop_obj_handler(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+
+
+int zend_isset_isempty_prop_obj_handler(ZEND_OPCODE_HANDLER_ARGS)
+{
+       zend_isset_isempty_dim_prop_obj_handler(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+}
+
+
 int zend_exit_handler(ZEND_OPCODE_HANDLER_ARGS)
 {
        if (EX(opline)->op1.op_type != IS_UNUSED) {
@@ -4217,6 +4233,7 @@ void zend_init_opcodes_handlers()
 
        zend_opcode_handlers[ZEND_ISSET_ISEMPTY_VAR] = zend_isset_isempty_var_handler;
        zend_opcode_handlers[ZEND_ISSET_ISEMPTY_DIM_OBJ] = zend_isset_isempty_dim_obj_handler;
+       zend_opcode_handlers[ZEND_ISSET_ISEMPTY_PROP_OBJ] = zend_isset_isempty_prop_obj_handler;
 
        zend_opcode_handlers[ZEND_PRE_INC_OBJ] = zend_pre_inc_obj_handler;
        zend_opcode_handlers[ZEND_PRE_DEC_OBJ] = zend_pre_dec_obj_handler;
index 56d212f387e5223bd0c90b1364d5c3f4c70a5a0b..637d3c37ff4f47654e324fff19dfa2f1912c990e 100644 (file)
@@ -386,6 +386,12 @@ static void zend_std_write_dimension(zval *object, zval *offset, zval *value TSR
 }
 
 
+static void zend_std_has_dimension(zval *object, zval *offset, zval *value TSRMLS_DC)
+{
+       zend_error(E_ERROR, "Cannot use object as array");
+}
+
+
 static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC)
 {
        zend_object *zobj;
@@ -902,6 +908,7 @@ zend_object_handlers std_object_handlers = {
        NULL,                                                                   /* set */
        zend_std_has_property,                                  /* has_property */
        zend_std_unset_property,                                /* unset_property */
+       zend_std_has_dimension,                                 /* has_dimension */
        zend_std_unset_dimension,                               /* unset_dimension */
        zend_std_get_properties,                                /* get_properties */
        zend_std_get_method,                                    /* get_method */
index cf11b93574649b55901caded9b463d1d9c2977df..3e98d7713b21e4b8473b0e11b3b9fe8f0f8f9963 100644 (file)
@@ -53,10 +53,13 @@ typedef zval* (*zend_object_get_t)(zval *property TSRMLS_DC);
 /* Used to check if a property of the object exists */
 typedef int (*zend_object_has_property_t)(zval *object, zval *member, int check_empty TSRMLS_DC);
 
+/* Used to check if a dimension of the object exists */
+typedef int (*zend_object_has_dimension_t)(zval *object, zval *member, int check_empty TSRMLS_DC);
+
 /* Used to remove a property of the object */
 typedef void (*zend_object_unset_property_t)(zval *object, zval *member TSRMLS_DC);
 
-/* Used to remove a property of the object */
+/* Used to remove a dimension of the object */
 typedef void (*zend_object_unset_dimension_t)(zval *object, zval *offset TSRMLS_DC);
 
 /* Used to get hash of the properties of the object, as hash of zval's */
@@ -98,6 +101,7 @@ typedef struct _zend_object_handlers {
        zend_object_set_t                                               set;
        zend_object_has_property_t                              has_property;
        zend_object_unset_property_t                    unset_property;
+       zend_object_has_dimension_t                             has_dimension;
        zend_object_unset_dimension_t                   unset_dimension;
        zend_object_get_properties_t                    get_properties;
        zend_object_get_method_t                                get_method;
index 58ef78c4e3545e5302a8d3141594b705b4020379..86fd2aab5b5538329f3095a9b85982e03e38d467 100644 (file)
@@ -280,6 +280,8 @@ static zend_object_handlers zend_object_proxy_handlers = {
        zend_object_proxy_set,          /* set */
        NULL,                                           /* has_property */
        NULL,                                           /* unset_property */
+       NULL,                                           /* has_dimension */
+       NULL,                                           /* unset_dimension */
        NULL,                                           /* get_properties */
        NULL,                                           /* get_method */
        NULL,                                           /* call_method */