}
#define GET_REFLECTION_OBJECT_PTR(target) \
- intern = (reflection_object *) Z_OBJ_P(getThis()); \
+ intern = Z_REFLECTION_P(getThis()); \
if (intern == NULL || intern->ptr == NULL) { \
RETURN_ON_EXCEPTION \
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Internal error: Failed to retrieve the reflection object"); \
/* Struct for reflection objects */
typedef struct {
- zend_object zo;
zval dummy; /* holder for the second property */
void *ptr;
reflection_type_t ref_type;
zval obj;
zend_class_entry *ce;
unsigned int ignore_visibility:1;
+ zend_object zo;
} reflection_object;
+static inline reflection_object *reflection_object_from_obj(zend_object *obj) /* {{{ */ {
+ return (reflection_object*)((char*)(obj) - XtOffsetOf(reflection_object, zo));
+}
+
+#define Z_REFLECTION_P(zv) reflection_object_from_obj(Z_OBJ_P((zv)))
/* }}} */
static zend_object_handlers reflection_object_handlers;
static void reflection_free_objects_storage(zend_object *object TSRMLS_DC) /* {{{ */
{
- reflection_object *intern = (reflection_object *) object;
+ reflection_object *intern = reflection_object_from_obj(object);
parameter_reference *reference;
property_reference *prop_reference;
}
intern->ptr = NULL;
zval_ptr_dtor(&intern->obj);
- zend_object_free(object TSRMLS_CC);
+ zend_object_std_dtor(object TSRMLS_CC);
+ efree(intern);
}
/* }}} */
{
reflection_object *intern;
- intern = ecalloc(1, sizeof(reflection_object));
+ intern = ecalloc(1, sizeof(reflection_object) + sizeof(zval) * (class_type->default_properties_count - 1));
intern->zo.ce = class_type;
zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
object_properties_init(&intern->zo, class_type);
intern->zo.handlers = &reflection_object_handlers;
- return (zend_object*)intern;
+ return &intern->zo;
}
/* }}} */
-static zval * reflection_instantiate(zend_class_entry *pce, zval *object TSRMLS_DC) /* {{{ */
+static zval *reflection_instantiate(zend_class_entry *pce, zval *object TSRMLS_DC) /* {{{ */
{
object_init_ex(object, pce);
return object;
ZVAL_STR(&name, STR_COPY(ce->name));
reflection_instantiate(reflection_class_ptr, object TSRMLS_CC);
- intern = (reflection_object *) Z_STR_P(object);
+ intern = Z_REFLECTION_P(object);
intern->ptr = ce;
intern->ref_type = REF_TYPE_OTHER;
intern->ce = ce;
}
reflection_instantiate(reflection_extension_ptr, object TSRMLS_CC);
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
ZVAL_STRINGL(&name, module->name, name_len);
intern->ptr = module;
intern->ref_type = REF_TYPE_OTHER;
ZVAL_NULL(&name);
}
reflection_instantiate(reflection_parameter_ptr, object TSRMLS_CC);
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
reference = (parameter_reference*) emalloc(sizeof(parameter_reference));
reference->arg_info = arg_info;
reference->offset = offset;
ZVAL_STR(&name, STR_COPY(function->common.function_name));
reflection_instantiate(reflection_function_ptr, object TSRMLS_CC);
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
intern->ptr = function;
intern->ref_type = REF_TYPE_FUNCTION;
intern->ce = NULL;
zend_resolve_method_name(ce, method) : method->common.function_name));
ZVAL_STR(&classname, STR_COPY(method->common.scope->name));
reflection_instantiate(reflection_method_ptr, object TSRMLS_CC);
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
intern->ptr = method;
intern->ref_type = REF_TYPE_FUNCTION;
intern->ce = ce;
ZVAL_STR(&classname, STR_COPY(prop->ce->name));
reflection_instantiate(reflection_property_ptr, object TSRMLS_CC);
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
reference = (property_reference*) emalloc(sizeof(property_reference));
reference->ce = ce;
reference->prop = *prop;
reflection_object *intern;
parameter_reference *param;
- intern = (reflection_object *) Z_OBJ_P(getThis());
+ intern = Z_REFLECTION_P(getThis());
if (intern == NULL || intern->ptr == NULL) {
if (EG(exception) && EG(exception)->ce == reflection_exception_ptr) {
return NULL;
int name_len;
object = getThis();
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
if (intern == NULL) {
return;
}
}
object = getThis();
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
if (intern == NULL) {
return;
}
}
object = getThis();
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
if (intern == NULL) {
return;
}
return;
}
- intern = (reflection_object *) Z_OBJ_P(getThis());
+ intern = Z_REFLECTION_P(getThis());
if (intern == NULL) {
return;
}
object = getThis();
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
if (intern == NULL) {
return;
}
property_info_tmp.ce = ce;
reflection_property_factory(ce, &property_info_tmp, return_value TSRMLS_CC);
- intern = (reflection_object *) Z_OBJ_P(return_value);
+ intern = Z_REFLECTION_P(return_value);
intern->ref_type = REF_TYPE_DYNAMIC_PROPERTY;
return;
}
break;
case IS_OBJECT:
if (instanceof_function(Z_OBJCE_P(class_name), reflection_class_ptr TSRMLS_CC)) {
- argument = (reflection_object *) Z_OBJ_P(class_name);
+ argument = Z_REFLECTION_P(class_name);
if (argument == NULL || argument->ptr == NULL) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Internal error: Failed to retrieve the argument's reflection object");
/* Bails out */
break;
case IS_OBJECT:
if (instanceof_function(Z_OBJCE_P(interface), reflection_class_ptr TSRMLS_CC)) {
- argument = (reflection_object *) Z_OBJ_P(interface);
+ argument = Z_REFLECTION_P(interface);
if (argument == NULL || argument->ptr == NULL) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Internal error: Failed to retrieve the argument's reflection object");
/* Bails out */
}
object = getThis();
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
if (intern == NULL) {
return;
}
return;
}
- intern = (reflection_object *) Z_OBJ_P(getThis());
+ intern = Z_REFLECTION_P(getThis());
if (intern == NULL) {
return;
}
object = getThis();
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
if (intern == NULL) {
return;
}
}
object = getThis();
- intern = (reflection_object *) Z_OBJ_P(object);
+ intern = Z_REFLECTION_P(object);
if (intern == NULL) {
return;
}