Skip to content

Commit bd3b7f4

Browse files
committed
Merge branch 'master' into jit-dynasm
2 parents 996a3f5 + 272f5a1 commit bd3b7f4

File tree

10 files changed

+154
-32
lines changed

10 files changed

+154
-32
lines changed

.appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ environment:
2424
PHP_BUILD_CACHE_BASE_DIR: c:\build-cache
2525
PHP_BUILD_OBJ_DIR: c:\obj
2626
PHP_BUILD_CACHE_SDK_DIR: c:\build-cache\sdk
27-
PHP_BUILD_SDK_BRANCH: php-sdk-2.0.12beta2
27+
PHP_BUILD_SDK_BRANCH: php-sdk-2.0.12beta3
2828
PHP_BUILD_CRT: vc15
2929
# ext and env setup for tests
3030
#MYSQL_TEST_PASSWD: Password12!

Zend/zend.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_li
7676
void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
7777
ZEND_API char *(*zend_getenv)(char *name, size_t name_len);
7878
ZEND_API zend_string *(*zend_resolve_path)(const char *filename, size_t filename_len);
79+
ZEND_API int (*zend_post_startup_cb)(void) = NULL;
7980

8081
void (*zend_on_timeout)(int seconds);
8182

@@ -868,7 +869,7 @@ void zend_register_standard_ini_entries(void) /* {{{ */
868869
/* Unlink the global (r/o) copies of the class, function and constant tables,
869870
* and use a fresh r/w copy for the startup thread
870871
*/
871-
void zend_post_startup(void) /* {{{ */
872+
int zend_post_startup(void) /* {{{ */
872873
{
873874
#ifdef ZTS
874875
zend_encoding **script_encoding_list;
@@ -898,6 +899,17 @@ void zend_post_startup(void) /* {{{ */
898899
global_persistent_list = &EG(persistent_list);
899900
zend_copy_ini_directives();
900901
#endif
902+
903+
if (zend_post_startup_cb) {
904+
int (*cb)(void) = zend_post_startup_cb;
905+
906+
zend_post_startup_cb = NULL;
907+
if (cb() != SUCCESS) {
908+
return FAILURE;
909+
}
910+
}
911+
912+
return SUCCESS;
901913
}
902914
/* }}} */
903915

Zend/zend.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ BEGIN_EXTERN_C()
222222
int zend_startup(zend_utility_functions *utility_functions, char **extensions);
223223
void zend_shutdown(void);
224224
void zend_register_standard_ini_entries(void);
225-
void zend_post_startup(void);
225+
int zend_post_startup(void);
226226
void zend_set_utility_values(zend_utility_values *utility_values);
227227

228228
ZEND_API ZEND_COLD void _zend_bailout(const char *filename, uint32_t lineno);
@@ -270,6 +270,7 @@ extern void (*zend_printf_to_smart_string)(smart_string *buf, const char *format
270270
extern void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
271271
extern ZEND_API char *(*zend_getenv)(char *name, size_t name_len);
272272
extern ZEND_API zend_string *(*zend_resolve_path)(const char *filename, size_t filename_len);
273+
extern ZEND_API int (*zend_post_startup_cb)(void);
273274

274275
ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
275276
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);

Zend/zend_API.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2177,7 +2177,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
21772177
while (ptr->fname) {
21782178
fname_len = strlen(ptr->fname);
21792179
internal_function->handler = ptr->handler;
2180-
internal_function->function_name = zend_new_interned_string(zend_string_init(ptr->fname, fname_len, 1));
2180+
internal_function->function_name = zend_string_init_interned(ptr->fname, fname_len, 1);
21812181
internal_function->scope = scope;
21822182
internal_function->prototype = NULL;
21832183
if (ptr->flags) {
@@ -2307,7 +2307,7 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
23072307
class_name++;
23082308
allow_null = 1;
23092309
}
2310-
str = zend_new_interned_string(zend_string_init(class_name, strlen(class_name), 1));
2310+
str = zend_string_init_interned(class_name, strlen(class_name), 1);
23112311
new_arg_info[i].type = ZEND_TYPE_ENCODE_CLASS(str, allow_null);
23122312
}
23132313
}
@@ -3863,9 +3863,12 @@ ZEND_API int zend_declare_class_constant(zend_class_entry *ce, const char *name,
38633863
{
38643864
int ret;
38653865

3866-
zend_string *key = zend_string_init(name, name_length, ce->type & ZEND_INTERNAL_CLASS);
3866+
zend_string *key;
3867+
38673868
if (ce->type == ZEND_INTERNAL_CLASS) {
3868-
key = zend_new_interned_string(key);
3869+
key = zend_string_init_interned(name, name_length, 1);
3870+
} else {
3871+
key = zend_string_init(name, name_length, 0);
38693872
}
38703873
ret = zend_declare_class_constant_ex(ce, key, value, ZEND_ACC_PUBLIC, NULL);
38713874
zend_string_release(key);

Zend/zend_API.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,7 @@ typedef struct _zend_fcall_info_cache {
193193

194194
#define INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
195195
{ \
196-
zend_string *cl_name; \
197-
cl_name = zend_string_init(class_name, class_name_len, 1); \
198-
class_container.name = zend_new_interned_string(cl_name); \
196+
class_container.name = zend_string_init_interned(class_name, class_name_len, 1); \
199197
INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
200198
}
201199

Zend/zend_string.c

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
#include "zend_globals.h"
2323

2424
ZEND_API zend_string *(*zend_new_interned_string)(zend_string *str);
25+
ZEND_API zend_string *(*zend_string_init_interned)(const char *str, size_t size, int permanent);
2526

2627
static zend_string *zend_new_interned_string_permanent(zend_string *str);
2728
static zend_string *zend_new_interned_string_request(zend_string *str);
29+
static zend_string *zend_string_init_interned_permanent(const char *str, size_t size, int permanent);
30+
static zend_string *zend_string_init_interned_request(const char *str, size_t size, int permanent);
2831

2932
/* Any strings interned in the startup phase. Common to all the threads,
3033
won't be free'd until process exit. If we want an ability to
@@ -33,6 +36,7 @@ static zend_string *zend_new_interned_string_request(zend_string *str);
3336
static HashTable interned_strings_permanent;
3437

3538
static zend_new_interned_string_func_t interned_string_request_handler = zend_new_interned_string_request;
39+
static zend_string_init_interned_func_t interned_string_init_request_handler = zend_string_init_interned_request;
3640
static zend_string_copy_storage_func_t interned_string_copy_storage = NULL;
3741

3842
ZEND_API zend_string *zend_empty_string = NULL;
@@ -72,6 +76,7 @@ ZEND_API void zend_interned_strings_init(void)
7276
zend_init_interned_strings_ht(&interned_strings_permanent, 1);
7377

7478
zend_new_interned_string = zend_new_interned_string_permanent;
79+
zend_string_init_interned = zend_string_init_interned_permanent;
7580

7681
/* interned empty string */
7782
str = zend_string_alloc(sizeof("")-1, 1);
@@ -100,20 +105,18 @@ ZEND_API void zend_interned_strings_dtor(void)
100105
zend_known_strings = NULL;
101106
}
102107

103-
static zend_always_inline zend_string *zend_interned_string_ht_lookup(zend_string *str, HashTable *interned_strings)
108+
static zend_always_inline zend_string *zend_interned_string_ht_lookup_ex(zend_ulong h, const char *str, size_t size, HashTable *interned_strings)
104109
{
105-
zend_ulong h;
106110
uint32_t nIndex;
107111
uint32_t idx;
108112
Bucket *p;
109113

110-
h = zend_string_hash_val(str);
111114
nIndex = h | interned_strings->nTableMask;
112115
idx = HT_HASH(interned_strings, nIndex);
113116
while (idx != HT_INVALID_IDX) {
114117
p = HT_HASH_TO_BUCKET(interned_strings, idx);
115-
if ((p->h == h) && (ZSTR_LEN(p->key) == ZSTR_LEN(str))) {
116-
if (!memcmp(ZSTR_VAL(p->key), ZSTR_VAL(str), ZSTR_LEN(str))) {
118+
if ((p->h == h) && (ZSTR_LEN(p->key) == size)) {
119+
if (!memcmp(ZSTR_VAL(p->key), str, size)) {
117120
return p->key;
118121
}
119122
}
@@ -123,6 +126,11 @@ static zend_always_inline zend_string *zend_interned_string_ht_lookup(zend_strin
123126
return NULL;
124127
}
125128

129+
static zend_always_inline zend_string *zend_interned_string_ht_lookup(zend_string *str, HashTable *interned_strings)
130+
{
131+
return zend_interned_string_ht_lookup_ex(ZSTR_H(str), ZSTR_VAL(str), ZSTR_LEN(str), interned_strings);
132+
}
133+
126134
/* This function might be not thread safe at least because it would update the
127135
hash val in the passed string. Be sure it is called in the appropriate context. */
128136
static zend_always_inline zend_string *zend_add_interned_string(zend_string *str, HashTable *interned_strings, uint32_t flags)
@@ -141,10 +149,10 @@ static zend_always_inline zend_string *zend_add_interned_string(zend_string *str
141149

142150
ZEND_API zend_string *zend_interned_string_find_permanent(zend_string *str)
143151
{
152+
zend_string_hash_val(str);
144153
return zend_interned_string_ht_lookup(str, &interned_strings_permanent);
145154
}
146155

147-
148156
static zend_string *zend_new_interned_string_permanent(zend_string *str)
149157
{
150158
zend_string *ret;
@@ -153,6 +161,7 @@ static zend_string *zend_new_interned_string_permanent(zend_string *str)
153161
return str;
154162
}
155163

164+
zend_string_hash_val(str);
156165
ret = zend_interned_string_ht_lookup(str, &interned_strings_permanent);
157166
if (ret) {
158167
zend_string_release(str);
@@ -170,6 +179,8 @@ static zend_string *zend_new_interned_string_request(zend_string *str)
170179
return str;
171180
}
172181

182+
zend_string_hash_val(str);
183+
173184
/* Check for permanent strings, the table is readonly at this point. */
174185
ret = zend_interned_string_ht_lookup(str, &interned_strings_permanent);
175186
if (ret) {
@@ -189,6 +200,44 @@ static zend_string *zend_new_interned_string_request(zend_string *str)
189200
return ret;
190201
}
191202

203+
static zend_string *zend_string_init_interned_permanent(const char *str, size_t size, int permanent)
204+
{
205+
zend_string *ret;
206+
zend_long h = zend_inline_hash_func(str, size);
207+
208+
ret = zend_interned_string_ht_lookup_ex(h, str, size, &interned_strings_permanent);
209+
if (ret) {
210+
return ret;
211+
}
212+
213+
ret = zend_string_init(str, size, permanent);
214+
ZSTR_H(ret) = h;
215+
return zend_add_interned_string(ret, &interned_strings_permanent, IS_STR_PERMANENT);
216+
}
217+
218+
static zend_string *zend_string_init_interned_request(const char *str, size_t size, int permanent)
219+
{
220+
zend_string *ret;
221+
zend_long h = zend_inline_hash_func(str, size);
222+
223+
/* Check for permanent strings, the table is readonly at this point. */
224+
ret = zend_interned_string_ht_lookup_ex(h, str, size, &interned_strings_permanent);
225+
if (ret) {
226+
return ret;
227+
}
228+
229+
ret = zend_interned_string_ht_lookup_ex(h, str, size, &CG(interned_strings));
230+
if (ret) {
231+
return ret;
232+
}
233+
234+
ret = zend_string_init(str, size, permanent);
235+
ZSTR_H(ret) = h;
236+
237+
/* Create a short living interned, freed after the request. */
238+
return zend_add_interned_string(ret, &CG(interned_strings), 0);
239+
}
240+
192241
ZEND_API void zend_interned_strings_activate(void)
193242
{
194243
zend_init_interned_strings_ht(&CG(interned_strings), 0);
@@ -199,9 +248,10 @@ ZEND_API void zend_interned_strings_deactivate(void)
199248
zend_hash_destroy(&CG(interned_strings));
200249
}
201250

202-
ZEND_API void zend_interned_strings_set_request_storage_handler(zend_new_interned_string_func_t handler)
251+
ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_interned_string_func_t handler, zend_string_init_interned_func_t init_handler)
203252
{
204253
interned_string_request_handler = handler;
254+
interned_string_init_request_handler = init_handler;
205255
}
206256

207257
ZEND_API void zend_interned_strings_set_permanent_storage_copy_handler(zend_string_copy_storage_func_t handler)
@@ -215,6 +265,7 @@ ZEND_API void zend_interned_strings_switch_storage(void)
215265
interned_string_copy_storage();
216266
}
217267
zend_new_interned_string = interned_string_request_handler;
268+
zend_string_init_interned = interned_string_init_request_handler;
218269
}
219270

220271
/*

Zend/zend_string.h

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,18 @@ BEGIN_EXTERN_C()
2727

2828
typedef void (*zend_string_copy_storage_func_t)(void);
2929
typedef zend_string *(*zend_new_interned_string_func_t)(zend_string *str);
30+
typedef zend_string *(*zend_string_init_interned_func_t)(const char *str, size_t size, int permanent);
3031

3132
ZEND_API extern zend_new_interned_string_func_t zend_new_interned_string;
33+
ZEND_API extern zend_string_init_interned_func_t zend_string_init_interned;
3234

3335
ZEND_API zend_ulong zend_hash_func(const char *str, size_t len);
3436
ZEND_API void zend_interned_strings_init(void);
3537
ZEND_API void zend_interned_strings_dtor(void);
3638
ZEND_API void zend_interned_strings_activate(void);
3739
ZEND_API void zend_interned_strings_deactivate(void);
3840
ZEND_API zend_string *zend_interned_string_find_permanent(zend_string *str);
39-
ZEND_API void zend_interned_strings_set_request_storage_handler(zend_new_interned_string_func_t handler);
41+
ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_interned_string_func_t handler, zend_string_init_interned_func_t init_handler);
4042
ZEND_API void zend_interned_strings_set_permanent_storage_copy_handler(zend_string_copy_storage_func_t handler);
4143
ZEND_API void zend_interned_strings_switch_storage(void);
4244

@@ -174,13 +176,6 @@ static zend_always_inline zend_string *zend_string_init(const char *str, size_t
174176
return ret;
175177
}
176178

177-
static zend_always_inline zend_string *zend_string_init_interned(const char *str, size_t len, int persistent)
178-
{
179-
zend_string *ret = zend_string_init(str, len, persistent);
180-
181-
return zend_new_interned_string(ret);
182-
}
183-
184179
static zend_always_inline zend_string *zend_string_copy(zend_string *s)
185180
{
186181
if (!ZSTR_IS_INTERNED(s)) {

ext/mysqlnd/mysqlnd_wireprotocol.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,7 @@ php_mysqlnd_rset_field_read(void * _packet)
13751375
meta->root_len = total_len;
13761376

13771377
if (meta->name != mysqlnd_empty_string) {
1378-
meta->sname = zend_new_interned_string(zend_string_init(meta->name, meta->name_length, packet->persistent_alloc));
1378+
meta->sname = zend_string_init_interned(meta->name, meta->name_length, packet->persistent_alloc);
13791379
} else {
13801380
meta->sname = ZSTR_EMPTY_ALLOC();
13811381
}

0 commit comments

Comments
 (0)