summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_alloc.c10
-rw-r--r--Zend/zend_alloc.h14
-rw-r--r--Zend/zend_smart_str.h17
3 files changed, 25 insertions, 16 deletions
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 6701ca4902..16fd42e80f 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -287,16 +287,6 @@ struct _zend_mm_bin {
char bytes[ZEND_MM_PAGE_SIZE * 8];
};
-#if ZEND_DEBUG
-typedef struct _zend_mm_debug_info {
- size_t size;
- const char *filename;
- const char *orig_filename;
- uint lineno;
- uint orig_lineno;
-} zend_mm_debug_info;
-#endif
-
struct _zend_mm_free_slot {
zend_mm_free_slot *next_free_slot;
};
diff --git a/Zend/zend_alloc.h b/Zend/zend_alloc.h
index 6d89884f0d..0cb3a71d34 100644
--- a/Zend/zend_alloc.h
+++ b/Zend/zend_alloc.h
@@ -50,6 +50,20 @@ typedef struct _zend_leak_info {
uint orig_lineno;
} zend_leak_info;
+#if ZEND_DEBUG
+typedef struct _zend_mm_debug_info {
+ size_t size;
+ const char *filename;
+ const char *orig_filename;
+ uint lineno;
+ uint orig_lineno;
+} zend_mm_debug_info;
+
+# define ZEND_MM_OVERHEAD ZEND_MM_ALIGNED_SIZE(sizeof(zend_mm_debug_info))
+#else
+# define ZEND_MM_OVERHEAD 0
+#endif
+
BEGIN_EXTERN_C()
ZEND_API char* ZEND_FASTCALL zend_strndup(const char *s, size_t length) ZEND_ATTRIBUTE_MALLOC;
diff --git a/Zend/zend_smart_str.h b/Zend/zend_smart_str.h
index c18b133dfe..4a37dd66f0 100644
--- a/Zend/zend_smart_str.h
+++ b/Zend/zend_smart_str.h
@@ -22,14 +22,19 @@
#include <zend.h>
#include "zend_smart_str_public.h"
-#ifndef SMART_STR_PREALLOC
-#define SMART_STR_PREALLOC 128
+#define SMART_STR_OVERHEAD (ZEND_MM_OVERHEAD + _STR_HEADER_SIZE)
+
+#ifndef SMART_STR_PAGE
+# define SMART_STR_PAGE 4096
#endif
#ifndef SMART_STR_START_SIZE
-#define SMART_STR_START_SIZE 78
+# define SMART_STR_START_SIZE (256 - SMART_STR_OVERHEAD - 1)
#endif
+#define SMART_STR_NEW_SIZE(newlen) \
+ (((newlen + SMART_STR_OVERHEAD + SMART_STR_PAGE) & ~(SMART_STR_PAGE - 1)) - SMART_STR_OVERHEAD - 1)
+
#define smart_str_appends_ex(dest, src, what) \
smart_str_appendl_ex((dest), (src), strlen(src), (what))
#define smart_str_appends(dest, src) \
@@ -55,14 +60,14 @@ static zend_always_inline size_t smart_str_alloc(smart_str *str, size_t len, zen
newlen = len;
str->a = newlen < SMART_STR_START_SIZE
? SMART_STR_START_SIZE
- : newlen + SMART_STR_PREALLOC;
+ : SMART_STR_NEW_SIZE(newlen);
str->s = zend_string_alloc(str->a, persistent);
str->s->len = 0;
} else {
newlen = str->s->len + len;
if (newlen >= str->a) {
- str->a = newlen + SMART_STR_PREALLOC;
- str->s = (zend_string *) perealloc(str->s, _STR_HEADER_SIZE + str->a + 1, persistent);
+ str->a = SMART_STR_NEW_SIZE(newlen);
+ str->s = (zend_string *) perealloc2(str->s, _STR_HEADER_SIZE + str->a + 1, _STR_HEADER_SIZE + str->s->len + 1, persistent);
}
}
return newlen;