static ZEND_FUNCTION(leak);
static ZEND_FUNCTION(get_used_files);
static ZEND_FUNCTION(get_imported_files);
+static ZEND_FUNCTION(is_subclass_of);
extern unsigned char first_arg_force_ref[];
ZEND_FE(leak, NULL)
ZEND_FE(get_used_files, NULL)
ZEND_FE(get_imported_files, NULL)
+ ZEND_FE(is_subclass_of, NULL)
{ NULL, NULL, NULL }
};
}
/* }}} */
+/* {{{ proto bool is_subclass_of(object object, string class_name)
+ Returns true if the object is part of hierarchy derived from passed class */
+ZEND_FUNCTION(is_subclass_of)
+{
+ zval **obj, **class_name;
+ char *lcname;
+ zend_class_entry *parent_ce = NULL;
+ CLS_FETCH();
+
+ if (ARG_COUNT(ht) != 2 || getParametersEx(2, &obj, &class_name)==FAILURE) {
+ RETURN_FALSE;
+ }
+
+ if ((*obj)->type != IS_OBJECT) {
+ RETURN_FALSE;
+ }
+
+ parent_ce = (*obj)->value.obj.ce->parent;
+ if (!parent_ce) {
+ RETURN_FALSE;
+ }
+
+ convert_to_string_ex(class_name);
+ lcname = estrndup((*class_name)->value.str.val, (*class_name)->value.str.len);
+ zend_str_tolower(lcname, (*class_name)->value.str.len);
+
+ do {
+ if (!strcmp(parent_ce->name, lcname)) {
+ efree(lcname);
+ RETURN_TRUE;
+ }
+ } while (parent_ce->parent
+ && zend_hash_find(CG(class_table), parent_ce->parent->name,
+ parent_ce->parent->name_length+1, (void**)&parent_ce)==SUCCESS);
+ efree(lcname);
+ RETURN_FALSE;
+}
+/* }}} */
+
/* {{{ proto bool method_exists(object object, string method)
Checks if the class method exists ...
*/
return FAILURE;
}
- /* Perform inheritence */
+ /* Perform inheritance */
zend_hash_merge(&ce->default_properties, &parent_ce->default_properties, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *), 0);
zend_hash_merge(&ce->function_table, &parent_ce->function_table, (void (*)(void *)) function_add_ref, &tmp_zend_function, sizeof(zend_function), 0);
ce->parent = parent_ce;
void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
- int runtime_inheritence = 0;
+ int runtime_inheritance = 0;
if (CG(active_class_entry)) {
zend_error(E_COMPILE_ERROR, "Class declarations may not be nested");
zval_dtor(&parent_class_name->u.constant);
} else {
- runtime_inheritence = 1;
+ runtime_inheritance = 1;
CG(class_entry).parent = NULL;
}
} else {
opline->op2.op_type = IS_CONST;
opline->op2.u.constant.type = IS_STRING;
opline->op2.u.constant.refcount = 1;
- if (runtime_inheritence) {
+ if (runtime_inheritance) {
char *full_class_name;
opline->op2.u.constant.value.str.len = parent_class_name->u.constant.value.str.len+1+CG(class_entry).name_length;