summaryrefslogtreecommitdiff
path: root/Zend/zend.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend.c')
-rw-r--r--Zend/zend.c108
1 files changed, 27 insertions, 81 deletions
diff --git a/Zend/zend.c b/Zend/zend.c
index de13108673..06cb9cbc78 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -156,8 +156,8 @@ static void print_hash(zend_write_func_t write_func, HashTable *ht, int indent,
if (string_key) {
if (is_object) {
const char *prop_name, *class_name;
- int prop_len;
- int mangled = zend_unmangle_property_name_ex(string_key->val, string_key->len, &class_name, &prop_name, &prop_len);
+ size_t prop_len;
+ int mangled = zend_unmangle_property_name_ex(string_key, &class_name, &prop_name, &prop_len);
ZEND_WRITE_EX(prop_name, prop_len);
if (class_name && mangled == SUCCESS) {
@@ -216,79 +216,10 @@ ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy TSRMLS_DC) /*
{
if (Z_TYPE_P(expr) == IS_STRING) {
return 0;
+ } else {
+ ZVAL_STR(expr_copy, _zval_get_string_func(expr TSRMLS_CC));
+ return 1;
}
-
-again:
- switch (Z_TYPE_P(expr)) {
- case IS_NULL:
- case IS_FALSE:
- ZVAL_EMPTY_STRING(expr_copy);
- break;
- case IS_TRUE:
- if (CG(one_char_string)['1']) {
- ZVAL_INTERNED_STR(expr_copy, CG(one_char_string)['1']);
- } else {
- ZVAL_NEW_STR(expr_copy, zend_string_init("1", 1, 0));
- }
- break;
- case IS_RESOURCE: {
- char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
- int len;
-
- len = snprintf(buf, sizeof(buf), "Resource id #" ZEND_LONG_FMT, Z_RES_HANDLE_P(expr));
- ZVAL_NEW_STR(expr_copy, zend_string_init(buf, len, 0));
- }
- break;
- case IS_ARRAY:
- zend_error(E_NOTICE, "Array to string conversion");
- // TODO: use interned string ???
- ZVAL_NEW_STR(expr_copy, zend_string_init("Array", sizeof("Array") - 1, 0));
- break;
- case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(expr, cast_object)) {
- Z_ADDREF_P(expr);
- if (Z_OBJ_HANDLER_P(expr, cast_object)(expr, expr_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
- zval_ptr_dtor(expr);
- break;
- }
- zval_ptr_dtor(expr);
- }
- if (!Z_OBJ_HANDLER_P(expr, cast_object) && Z_OBJ_HANDLER_P(expr, get)) {
- zval rv;
- zval *z = Z_OBJ_HANDLER_P(expr, get)(expr, &rv TSRMLS_CC);
-
- Z_ADDREF_P(z);
- if (Z_TYPE_P(z) != IS_OBJECT) {
- if (zend_make_printable_zval(z, expr_copy TSRMLS_CC)) {
- zval_ptr_dtor(z);
- } else {
- ZVAL_ZVAL(expr_copy, z, 0, 1);
- }
- return 1;
- }
- zval_ptr_dtor(z);
- }
- zend_error(EG(exception) ? E_ERROR : E_RECOVERABLE_ERROR, "Object of class %s could not be converted to string", Z_OBJCE_P(expr)->name->val);
- ZVAL_EMPTY_STRING(expr_copy);
- break;
- case IS_DOUBLE:
- ZVAL_DUP(expr_copy, expr);
- zend_locale_sprintf_double(expr_copy ZEND_FILE_LINE_CC);
- break;
- case IS_REFERENCE:
- expr = Z_REFVAL_P(expr);
- if (Z_TYPE_P(expr) == IS_STRING) {
- ZVAL_STR(expr_copy, zend_string_copy(Z_STR_P(expr)));
- return 1;
- }
- goto again;
- break;
- default:
- ZVAL_DUP(expr_copy, expr);
- convert_to_string(expr_copy);
- break;
- }
- return 1;
}
/* }}} */
@@ -509,11 +440,20 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals TSRMLS
compiler_globals->last_static_member = zend_hash_num_elements(compiler_globals->class_table);
if (compiler_globals->last_static_member) {
- compiler_globals->static_members_table = calloc(compiler_globals->last_static_member, sizeof(zval**));
+ compiler_globals->static_members_table = calloc(compiler_globals->last_static_member, sizeof(zval*));
} else {
compiler_globals->static_members_table = NULL;
}
compiler_globals->script_encoding_list = NULL;
+
+#ifdef ZTS
+ compiler_globals->empty_string = zend_string_alloc(sizeof("")-1, 1);
+ compiler_globals->empty_string->val[0] = '\000';
+ zend_string_hash_val(compiler_globals->empty_string);
+ compiler_globals->empty_string->gc.u.v.flags |= IS_STR_INTERNED;
+
+ memset(compiler_globals->one_char_string, 0, sizeof(compiler_globals->one_char_string));
+#endif
}
/* }}} */
@@ -538,6 +478,10 @@ static void compiler_globals_dtor(zend_compiler_globals *compiler_globals TSRMLS
pefree((char*)compiler_globals->script_encoding_list, 1);
}
compiler_globals->last_static_member = 0;
+
+#ifdef ZTS
+ zend_string_release(compiler_globals->empty_string);
+#endif
}
/* }}} */
@@ -1031,7 +975,7 @@ ZEND_API zval *zend_get_configuration_directive(zend_string *name) /* {{{ */
} \
} while (0)
-#ifndef ZEND_WIN32
+#if !defined(ZEND_WIN32) && !defined(DARWIN)
ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
#else
static void zend_error_va_list(int type, const char *format, va_list args)
@@ -1039,7 +983,7 @@ static void zend_error_va_list(int type, const char *format, va_list args)
{
char *str;
int len;
-#ifndef ZEND_WIN32
+#if !defined(ZEND_WIN32) && !defined(DARWIN)
va_list args;
#endif
va_list usr_copy;
@@ -1144,7 +1088,7 @@ static void zend_error_va_list(int type, const char *format, va_list args)
}
#endif /* HAVE_DTRACE */
-#ifndef ZEND_WIN32
+#if !defined(ZEND_WIN32) && !defined(DARWIN)
va_start(args, format);
#endif
@@ -1257,7 +1201,7 @@ static void zend_error_va_list(int type, const char *format, va_list args)
break;
}
-#ifndef ZEND_WIN32
+#if !defined(ZEND_WIN32) && !defined(DARWIN)
va_end(args);
#endif
@@ -1274,9 +1218,9 @@ static void zend_error_va_list(int type, const char *format, va_list args)
}
/* }}} */
-#if defined(__GNUC__) && __GNUC__ >= 3 && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) && !defined(__osf__)
+#if (defined(__GNUC__) && __GNUC__ >= 3 && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) && !defined(__osf__))
void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((alias("zend_error"),noreturn));
-#elif defined(ZEND_WIN32)
+#elif defined(ZEND_WIN32) || defined(DARWIN)
ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
{
va_list va;
@@ -1294,6 +1238,7 @@ ZEND_API ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ..
zend_error_va_list(type, format, va);
va_end(va);
}
+/* }}} */
#endif
ZEND_API void zend_output_debug_string(zend_bool trigger_break, const char *format, ...) /* {{{ */
@@ -1410,6 +1355,7 @@ void free_estring(char **str_p) /* {{{ */
{
efree(*str_p);
}
+/* }}} */
void free_string_zval(zval *zv) /* {{{ */
{