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;
#define ZEND_ASSIGN_DIM 147
+#define ZEND_ISSET_ISEMPTY_PROP_OBJ 148
+
/* end of block */
/* END: OPCODES */
}
-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);
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:
}
+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) {
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;
}
+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;
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 */
/* 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 */
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;
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 */