zend_resolve_class_name(class_type TSRMLS_CC);
}
Z_STR(class_type->u.constant) = zend_new_interned_string(Z_STR(class_type->u.constant) TSRMLS_CC);
+//???: for now we have to copy it :(
+#if 1
+ cur_arg_info->class_name = estrndup(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant));
+ cur_arg_info->class_name_len = Z_STRLEN(class_type->u.constant);
+ STR_RELEASE(Z_STR(class_type->u.constant));
+#else
cur_arg_info->class_name = Z_STRVAL(class_type->u.constant);
cur_arg_info->class_name_len = Z_STRLEN(class_type->u.constant);
+#endif
if (op == ZEND_RECV_INIT) {
if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL")) || Z_TYPE(initialization->u.constant) == IS_CONSTANT_AST) {
cur_arg_info->allow_null = 1;
zend_string *fe_class_name, *proto_class_name;
if (!strcasecmp(fe_arg_info->class_name, "parent") && proto->common.scope) {
- fe_class_name = STR_INIT(
- proto->common.scope->name->val,
- proto->common.scope->name->len, 0);
+ fe_class_name = STR_COPY(proto->common.scope->name);
} else if (!strcasecmp(fe_arg_info->class_name, "self") && fe->common.scope) {
- fe_class_name = STR_INIT(
- fe->common.scope->name->val,
- fe->common.scope->name->len, 0);
+ fe_class_name = STR_COPY(fe->common.scope->name);
} else {
fe_class_name = STR_INIT(
fe_arg_info->class_name,
}
if (!strcasecmp(proto_arg_info->class_name, "parent") && proto->common.scope && proto->common.scope->parent) {
- proto_class_name = STR_INIT(
- proto->common.scope->parent->name->val,
- proto->common.scope->parent->name->len, 0);
+ proto_class_name = STR_COPY(proto->common.scope->parent->name);
} else if (!strcasecmp(proto_arg_info->class_name, "self") && proto->common.scope) {
- proto_class_name = STR_INIT(
- proto->common.scope->name->val,
- proto->common.scope->name->len, 0);
+ proto_class_name = STR_COPY(proto->common.scope->name);
} else {
proto_class_name = STR_INIT(
proto_arg_info->class_name,
const char *colon;
if (fe->common.type != ZEND_USER_FUNCTION) {
+ STR_RELEASE(proto_class_name);
+ STR_RELEASE(fe_class_name);
return 0;
} else if (strchr(proto_class_name->val, '\\') != NULL ||
(colon = zend_memrchr(fe_class_name->val, '\\', fe_class_name->len)) == NULL ||
fe_ce->type == ZEND_INTERNAL_CLASS ||
proto_ce->type == ZEND_INTERNAL_CLASS ||
fe_ce != proto_ce) {
+ STR_RELEASE(proto_class_name);
+ STR_RELEASE(fe_class_name);
return 0;
}
}
}
+ STR_RELEASE(proto_class_name);
+ STR_RELEASE(fe_class_name);
}
if (fe_arg_info->type_hint != proto_arg_info->type_hint) {
/* Incompatible type hint */