summaryrefslogtreecommitdiff
path: root/ext/opcache/zend_accelerator_util_funcs.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/opcache/zend_accelerator_util_funcs.c')
-rw-r--r--ext/opcache/zend_accelerator_util_funcs.c605
1 files changed, 20 insertions, 585 deletions
diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c
index cfd70eec12..6f101b0915 100644
--- a/ext/opcache/zend_accelerator_util_funcs.c
+++ b/ext/opcache/zend_accelerator_util_funcs.c
@@ -25,22 +25,6 @@
#include "zend_persist.h"
#include "zend_shared_alloc.h"
-#if SIZEOF_SIZE_T <= SIZEOF_ZEND_LONG
-/* If sizeof(void*) == sizeof(zend_ulong) we can use zend_hash index functions */
-# define accel_xlat_set(old, new) zend_hash_index_add_new_ptr(&ZCG(bind_hash), (zend_ulong)(zend_uintptr_t)(old), (new))
-# define accel_xlat_get(old) zend_hash_index_find_ptr(&ZCG(bind_hash), (zend_ulong)(zend_uintptr_t)(old))
-#else
-# define accel_xlat_set(old, new) zend_hash_str_add_new_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*), (new))
-# define accel_xlat_get(old) zend_hash_str_find_ptr(&ZCG(bind_hash), (char*)&(old), sizeof(void*))
-#endif
-
-#define IN_ARENA(ptr) \
- ((void*)(ptr) >= ZCG(current_persistent_script)->arena_mem && \
- (void*)(ptr) < (void*)((char*)ZCG(current_persistent_script)->arena_mem + ZCG(current_persistent_script)->arena_size))
-
-#define ARENA_REALLOC(ptr) \
- (void*)(((char*)(ptr)) + ((char*)ZCG(arena_mem) - (char*)ZCG(current_persistent_script)->arena_mem))
-
typedef int (*id_function_t)(void *, void *);
typedef void (*unique_copy_ctor_func_t)(void *pElement);
@@ -140,288 +124,6 @@ void zend_accel_move_user_classes(HashTable *src, uint32_t count, zend_script *s
src->pDestructor = orig_dtor;
}
-static void zend_hash_clone_constants(HashTable *ht)
-{
- Bucket *p, *end;
- zend_class_constant *c;
-
- if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) {
- return;
- }
-
- p = emalloc(HT_SIZE(ht));
- memcpy(p, HT_GET_DATA_ADDR(ht), HT_USED_SIZE(ht));
- HT_SET_DATA_ADDR(ht, p);
-
- p = ht->arData;
- end = p + ht->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- c = Z_PTR(p->val);
- if (IN_ARENA(c)) {
- c = ARENA_REALLOC(c);
- Z_PTR(p->val) = c;
-
- if (IN_ARENA(c->ce)) {
- c->ce = ARENA_REALLOC(c->ce);
- }
- }
- }
-}
-
-static void zend_hash_clone_methods(HashTable *ht)
-{
- Bucket *p, *end;
- zend_op_array *new_entry;
-
- ht->pDestructor = ZEND_FUNCTION_DTOR;
-
- if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) {
- return;
- }
-
- p = emalloc(HT_SIZE(ht));
- memcpy(p, HT_GET_DATA_ADDR(ht), HT_USED_SIZE(ht));
- HT_SET_DATA_ADDR(ht, p);
-
- p = ht->arData;
- end = p + ht->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- new_entry = Z_PTR(p->val);
- if (IN_ARENA(new_entry)) {
- new_entry = ARENA_REALLOC(new_entry);
- Z_PTR(p->val) = new_entry;
-
- if (IN_ARENA(new_entry->scope)) {
- new_entry->scope = ARENA_REALLOC(new_entry->scope);
-
- /* update prototype */
- if (IN_ARENA(new_entry->prototype)) {
- new_entry->prototype = ARENA_REALLOC(new_entry->prototype);
- }
- }
- if (IN_ARENA(ZEND_MAP_PTR(new_entry->run_time_cache))) {
- ZEND_MAP_PTR_INIT(new_entry->run_time_cache, ARENA_REALLOC(ZEND_MAP_PTR(new_entry->run_time_cache)));
- }
- ZEND_MAP_PTR_INIT(new_entry->static_variables_ptr, &new_entry->static_variables);
- }
- }
-}
-
-static void zend_hash_clone_prop_info(HashTable *ht)
-{
- Bucket *p, *end;
- zend_property_info *prop_info;
-
- if (HT_FLAGS(ht) & HASH_FLAG_UNINITIALIZED) {
- return;
- }
-
- p = emalloc(HT_SIZE(ht));
- memcpy(p, HT_GET_DATA_ADDR(ht), HT_USED_SIZE(ht));
- HT_SET_DATA_ADDR(ht, p);
-
- p = ht->arData;
- end = p + ht->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- prop_info = Z_PTR(p->val);
- if (IN_ARENA(prop_info)) {
- prop_info = ARENA_REALLOC(prop_info);
- Z_PTR(p->val) = prop_info;
-
- if (IN_ARENA(prop_info->ce)) {
- prop_info->ce = ARENA_REALLOC(prop_info->ce);
- }
-
- if (ZEND_TYPE_HAS_LIST(prop_info->type)) {
- zend_type_list *list = ZEND_TYPE_LIST(prop_info->type);
- if (IN_ARENA(list)) {
- list = ARENA_REALLOC(list);
- ZEND_TYPE_SET_PTR(prop_info->type, list);
-
- zend_type *list_type;
- ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(prop_info->type), list_type) {
- if (ZEND_TYPE_HAS_CE(*list_type)) {
- zend_class_entry *ce = ZEND_TYPE_CE(*list_type);
- if (IN_ARENA(ce)) {
- ce = ARENA_REALLOC(ce);
- ZEND_TYPE_SET_PTR(*list_type, ce);
- }
- }
- } ZEND_TYPE_LIST_FOREACH_END();
- }
- } else if (ZEND_TYPE_HAS_CE(prop_info->type)) {
- zend_class_entry *ce = ZEND_TYPE_CE(prop_info->type);
- if (IN_ARENA(ce)) {
- ce = ARENA_REALLOC(ce);
- ZEND_TYPE_SET_PTR(prop_info->type, ce);
- }
- }
- }
- }
-}
-
-#define zend_update_inherited_handler(handler) \
-{ \
- if (ce->handler != NULL && IN_ARENA(ce->handler)) { \
- ce->handler = ARENA_REALLOC(ce->handler); \
- } \
-}
-
-/* Protects class' refcount, copies default properties, functions and class name */
-static void zend_class_copy_ctor(zend_class_entry **pce)
-{
- zend_class_entry *ce = *pce;
- zval *src, *dst, *end;
-
- *pce = ce = ARENA_REALLOC(ce);
- ce->refcount = 1;
-
- if ((ce->ce_flags & ZEND_ACC_LINKED) && IN_ARENA(ce->parent)) {
- ce->parent = ARENA_REALLOC(ce->parent);
- }
-
- if (ce->default_properties_table) {
- dst = emalloc(sizeof(zval) * ce->default_properties_count);
- src = ce->default_properties_table;
- end = src + ce->default_properties_count;
- ce->default_properties_table = dst;
- for (; src != end; src++, dst++) {
- ZVAL_COPY_VALUE_PROP(dst, src);
- }
- }
-
- zend_hash_clone_methods(&ce->function_table);
-
- /* static members */
- if (ce->default_static_members_table) {
- int i, end;
- zend_class_entry *parent = !(ce->ce_flags & ZEND_ACC_LINKED) ? NULL : ce->parent;
-
- dst = emalloc(sizeof(zval) * ce->default_static_members_count);
- src = ce->default_static_members_table;
- ce->default_static_members_table = dst;
- i = ce->default_static_members_count - 1;
-
- /* Copy static properties in this class */
- end = parent ? parent->default_static_members_count : 0;
- for (; i >= end; i--) {
- zval *p = &dst[i];
- ZVAL_COPY_VALUE(p, &src[i]);
- }
-
- /* Create indirections to static properties from parent classes */
- while (parent && parent->default_static_members_table) {
- end = parent->parent ? parent->parent->default_static_members_count : 0;
- for (; i >= end; i--) {
- zval *p = &dst[i];
- ZVAL_INDIRECT(p, &parent->default_static_members_table[i]);
- }
-
- parent = parent->parent;
- }
- }
- ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table);
-
- /* properties_info */
- zend_hash_clone_prop_info(&ce->properties_info);
-
- /* constants table */
- zend_hash_clone_constants(&ce->constants_table);
-
- if (ce->properties_info_table) {
- int i;
- ce->properties_info_table = ARENA_REALLOC(ce->properties_info_table);
- for (i = 0; i < ce->default_properties_count; i++) {
- if (IN_ARENA(ce->properties_info_table[i])) {
- ce->properties_info_table[i] = ARENA_REALLOC(ce->properties_info_table[i]);
- }
- }
- }
-
- if (ce->num_interfaces) {
- zend_class_name *interface_names;
-
- if (!(ce->ce_flags & ZEND_ACC_LINKED)) {
- interface_names = emalloc(sizeof(zend_class_name) * ce->num_interfaces);
- memcpy(interface_names, ce->interface_names, sizeof(zend_class_name) * ce->num_interfaces);
- ce->interface_names = interface_names;
- } else {
- zend_class_entry **interfaces = emalloc(sizeof(zend_class_entry*) * ce->num_interfaces);
- uint32_t i;
-
- for (i = 0; i < ce->num_interfaces; i++) {
- if (IN_ARENA(ce->interfaces[i])) {
- interfaces[i] = ARENA_REALLOC(ce->interfaces[i]);
- } else {
- interfaces[i] = ce->interfaces[i];
- }
- }
- ce->interfaces = interfaces;
- }
- }
-
- zend_update_inherited_handler(constructor);
- zend_update_inherited_handler(destructor);
- zend_update_inherited_handler(clone);
- zend_update_inherited_handler(__get);
- zend_update_inherited_handler(__set);
- zend_update_inherited_handler(__call);
- zend_update_inherited_handler(__isset);
- zend_update_inherited_handler(__unset);
- zend_update_inherited_handler(__tostring);
- zend_update_inherited_handler(__callstatic);
- zend_update_inherited_handler(__debugInfo);
- zend_update_inherited_handler(__serialize);
- zend_update_inherited_handler(__unserialize);
-
-/* 5.4 traits */
- if (ce->num_traits) {
- zend_class_name *trait_names = emalloc(sizeof(zend_class_name) * ce->num_traits);
-
- memcpy(trait_names, ce->trait_names, sizeof(zend_class_name) * ce->num_traits);
- ce->trait_names = trait_names;
-
- if (ce->trait_aliases) {
- zend_trait_alias **trait_aliases;
- int i = 0;
-
- while (ce->trait_aliases[i]) {
- i++;
- }
- trait_aliases = emalloc(sizeof(zend_trait_alias*) * (i + 1));
- i = 0;
- while (ce->trait_aliases[i]) {
- trait_aliases[i] = emalloc(sizeof(zend_trait_alias));
- memcpy(trait_aliases[i], ce->trait_aliases[i], sizeof(zend_trait_alias));
- i++;
- }
- trait_aliases[i] = NULL;
- ce->trait_aliases = trait_aliases;
- }
-
- if (ce->trait_precedences) {
- zend_trait_precedence **trait_precedences;
- int i = 0;
-
- while (ce->trait_precedences[i]) {
- i++;
- }
- trait_precedences = emalloc(sizeof(zend_trait_precedence*) * (i + 1));
- i = 0;
- while (ce->trait_precedences[i]) {
- trait_precedences[i] = emalloc(sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
- memcpy(trait_precedences[i], ce->trait_precedences[i], sizeof(zend_trait_precedence) + (ce->trait_precedences[i]->num_excludes - 1) * sizeof(zend_string*));
- i++;
- }
- trait_precedences[i] = NULL;
- ce->trait_precedences = trait_precedences;
- }
- }
-}
-
static void zend_accel_function_hash_copy(HashTable *target, HashTable *source)
{
zend_function *function1, *function2;
@@ -436,67 +138,9 @@ static void zend_accel_function_hash_copy(HashTable *target, HashTable *source)
ZEND_ASSERT(p->key);
t = zend_hash_find_ex(target, p->key, 1);
if (UNEXPECTED(t != NULL)) {
- if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* Runtime definition key. There are two circumstances under which the key can
- * already be defined:
- * 1. The file has been re-included without being changed in the meantime. In
- * this case we can keep the old value, because we know that the definition
- * hasn't changed.
- * 2. The file has been changed in the meantime, but the RTD key ends up colliding.
- * This would be a bug.
- * As we can't distinguish these cases, we assume that it is 1. and keep the old
- * value. */
- continue;
- } else {
- goto failure;
- }
- } else {
- _zend_hash_append_ptr(target, p->key, Z_PTR(p->val));
- }
- }
- target->nInternalPointer = 0;
- return;
-
-failure:
- function1 = Z_PTR(p->val);
- function2 = Z_PTR_P(t);
- CG(in_compilation) = 1;
- zend_set_compiled_filename(function1->op_array.filename);
- CG(zend_lineno) = function1->op_array.opcodes[0].lineno;
- if (function2->type == ZEND_USER_FUNCTION
- && function2->op_array.last > 0) {
- zend_error(E_ERROR, "Cannot redeclare %s() (previously declared in %s:%d)",
- ZSTR_VAL(function1->common.function_name),
- ZSTR_VAL(function2->op_array.filename),
- (int)function2->op_array.opcodes[0].lineno);
- } else {
- zend_error(E_ERROR, "Cannot redeclare %s()", ZSTR_VAL(function1->common.function_name));
- }
-}
-
-static void zend_accel_function_hash_copy_from_shm(HashTable *target, HashTable *source)
-{
- zend_function *function1, *function2;
- Bucket *p, *end;
- zval *t;
-
- zend_hash_extend(target, target->nNumUsed + source->nNumUsed, 0);
- p = source->arData;
- end = p + source->nNumUsed;
- for (; p != end; p++) {
- ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
- ZEND_ASSERT(p->key);
- t = zend_hash_find_ex(target, p->key, 1);
- if (UNEXPECTED(t != NULL)) {
- if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* See comment in zend_accel_function_hash_copy(). */
- continue;
- } else {
- goto failure;
- }
- } else {
- _zend_hash_append_ptr_ex(target, p->key, Z_PTR(p->val), 1);
+ goto failure;
}
+ _zend_hash_append_ptr_ex(target, p->key, Z_PTR(p->val), 1);
}
target->nInternalPointer = 0;
return;
@@ -527,49 +171,20 @@ static void zend_accel_class_hash_copy(HashTable *target, HashTable *source)
p = source->arData;
end = p + source->nNumUsed;
for (; p != end; p++) {
- if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
- ZEND_ASSERT(p->key);
- t = zend_hash_find_ex(target, p->key, 1);
- if (UNEXPECTED(t != NULL)) {
- if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* See comment in zend_accel_function_hash_copy(). */
- continue;
- } else if (UNEXPECTED(!ZCG(accel_directives).ignore_dups)) {
- zend_class_entry *ce1 = Z_PTR(p->val);
- if (!(ce1->ce_flags & ZEND_ACC_ANON_CLASS)) {
- CG(in_compilation) = 1;
- zend_set_compiled_filename(ce1->info.user.filename);
- CG(zend_lineno) = ce1->info.user.line_start;
- zend_error(E_ERROR,
- "Cannot declare %s %s, because the name is already in use",
- zend_get_object_type(ce1), ZSTR_VAL(ce1->name));
- return;
- }
- continue;
- }
- } else {
- t = _zend_hash_append_ptr(target, p->key, Z_PTR(p->val));
- }
- }
- target->nInternalPointer = 0;
- return;
-}
-
-static void zend_accel_class_hash_copy_from_shm(HashTable *target, HashTable *source)
-{
- Bucket *p, *end;
- zval *t;
-
- zend_hash_extend(target, target->nNumUsed + source->nNumUsed, 0);
- p = source->arData;
- end = p + source->nNumUsed;
- for (; p != end; p++) {
ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
ZEND_ASSERT(p->key);
t = zend_hash_find_ex(target, p->key, 1);
if (UNEXPECTED(t != NULL)) {
if (EXPECTED(ZSTR_LEN(p->key) > 0) && EXPECTED(ZSTR_VAL(p->key)[0] == 0)) {
- /* See comment in zend_accel_function_hash_copy(). */
+ /* Runtime definition key. There are two circumstances under which the key can
+ * already be defined:
+ * 1. The file has been re-included without being changed in the meantime. In
+ * this case we can keep the old value, because we know that the definition
+ * hasn't changed.
+ * 2. The file has been changed in the meantime, but the RTD key ends up colliding.
+ * This would be a bug.
+ * As we can't distinguish these cases, we assume that it is 1. and keep the old
+ * value. */
continue;
} else if (UNEXPECTED(!ZCG(accel_directives).ignore_dups)) {
zend_class_entry *ce1 = Z_PTR(p->val);
@@ -586,201 +201,28 @@ static void zend_accel_class_hash_copy_from_shm(HashTable *target, HashTable *so
}
} else {
t = _zend_hash_append_ptr_ex(target, p->key, Z_PTR(p->val), 1);
- if (!(((zend_class_entry*)Z_PTR_P(t))->ce_flags & ZEND_ACC_IMMUTABLE)) {
- zend_class_copy_ctor((zend_class_entry**)&Z_PTR_P(t));
- }
}
}
target->nInternalPointer = 0;
return;
}
-#if __has_feature(memory_sanitizer)
-# define fast_memcpy memcpy
-#elif defined(__AVX__)
-# include <nmmintrin.h>
-# if defined(__GNUC__) && defined(__i386__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "vmovaps (%1), %%ymm0\n\t"
- "vmovaps 0x20(%1), %%ymm1\n\t"
- "vmovaps %%ymm0, (%1,%2)\n\t"
- "vmovaps %%ymm1, 0x20(%1,%2)\n\t"
- "addl $0x40, %1\n\t"
- "subl $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%ymm0", "%ymm1");
-}
-# elif defined(__GNUC__) && defined(__x86_64__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "vmovaps (%1), %%ymm0\n\t"
- "vmovaps 0x20(%1), %%ymm1\n\t"
- "vmovaps %%ymm0, (%1,%2)\n\t"
- "vmovaps %%ymm1, 0x20(%1,%2)\n\t"
- "addq $0x40, %1\n\t"
- "subq $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%ymm0", "%ymm1");
-}
-# else
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- __m256 *dqdest = (__m256*)dest;
- const __m256 *dqsrc = (const __m256*)src;
- const __m256 *end = (const __m256*)((const char*)src + size);
-
- do {
-#ifdef PHP_WIN32
- _mm_prefetch((const char *)(dqsrc + 2), _MM_HINT_NTA);
-#else
- _mm_prefetch(dqsrc + 2, _MM_HINT_NTA);
-#endif
-
- __m256 ymm0 = _mm256_load_ps((const float *)(dqsrc + 0));
- __m256 ymm1 = _mm256_load_ps((const float *)(dqsrc + 1));
- dqsrc += 2;
- _mm256_store_ps((float *)(dqdest + 0), ymm0);
- _mm256_store_ps((float *)(dqdest + 1), ymm1);
- dqdest += 2;
- } while (dqsrc != end);
-}
-# endif
-#elif defined(__SSE2__)
-# include <emmintrin.h>
-# if defined(__GNUC__) && defined(__i386__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "movdqa (%1), %%xmm0\n\t"
- "movdqa 0x10(%1), %%xmm1\n\t"
- "movdqa 0x20(%1), %%xmm2\n\t"
- "movdqa 0x30(%1), %%xmm3\n\t"
- "movdqa %%xmm0, (%1,%2)\n\t"
- "movdqa %%xmm1, 0x10(%1,%2)\n\t"
- "movdqa %%xmm2, 0x20(%1,%2)\n\t"
- "movdqa %%xmm3, 0x30(%1,%2)\n\t"
- "addl $0x40, %1\n\t"
- "subl $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%xmm0", "%xmm1", "%xmm1", "%xmm2");
-}
-# elif defined(__GNUC__) && defined(__x86_64__) && !defined(__ILP32__)
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- size_t delta = (char*)dest - (char*)src;
-
- __asm__ volatile (
- ".align 16\n\t"
- ".LL0%=:\n\t"
- "prefetchnta 0x40(%1)\n\t"
- "movdqa (%1), %%xmm0\n\t"
- "movdqa 0x10(%1), %%xmm1\n\t"
- "movdqa 0x20(%1), %%xmm2\n\t"
- "movdqa 0x30(%1), %%xmm3\n\t"
- "movdqa %%xmm0, (%1,%2)\n\t"
- "movdqa %%xmm1, 0x10(%1,%2)\n\t"
- "movdqa %%xmm2, 0x20(%1,%2)\n\t"
- "movdqa %%xmm3, 0x30(%1,%2)\n\t"
- "addq $0x40, %1\n\t"
- "subq $0x40, %0\n\t"
- "ja .LL0%="
- : "+r"(size),
- "+r"(src)
- : "r"(delta)
- : "cc", "memory", "%xmm0", "%xmm1", "%xmm1", "%xmm2");
-}
-# else
-static zend_always_inline void fast_memcpy(void *dest, const void *src, size_t size)
-{
- __m128i *dqdest = (__m128i*)dest;
- const __m128i *dqsrc = (const __m128i*)src;
- const __m128i *end = (const __m128i*)((const char*)src + size);
-
- do {
-#ifdef PHP_WIN32
- _mm_prefetch((const char *)(dqsrc + 4), _MM_HINT_NTA);
-#else
- _mm_prefetch(dqsrc + 4, _MM_HINT_NTA);
-#endif
-
- __m128i xmm0 = _mm_load_si128(dqsrc + 0);
- __m128i xmm1 = _mm_load_si128(dqsrc + 1);
- __m128i xmm2 = _mm_load_si128(dqsrc + 2);
- __m128i xmm3 = _mm_load_si128(dqsrc + 3);
- dqsrc += 4;
- _mm_store_si128(dqdest + 0, xmm0);
- _mm_store_si128(dqdest + 1, xmm1);
- _mm_store_si128(dqdest + 2, xmm2);
- _mm_store_si128(dqdest + 3, xmm3);
- dqdest += 4;
- } while (dqsrc != end);
-}
-# endif
-#endif
-
zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script, int from_shared_memory)
{
zend_op_array *op_array;
op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
*op_array = persistent_script->script.main_op_array;
- ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
- if (EXPECTED(from_shared_memory)) {
- zend_hash_init(&ZCG(bind_hash), 10, NULL, NULL, 0);
-
- ZCG(current_persistent_script) = persistent_script;
- ZCG(arena_mem) = NULL;
- if (EXPECTED(persistent_script->arena_size)) {
-#if defined(__AVX__) || defined(__SSE2__)
- /* Target address must be aligned to 64-byte boundary */
- _mm_prefetch(persistent_script->arena_mem, _MM_HINT_NTA);
- ZCG(arena_mem) = zend_arena_alloc(&CG(arena), persistent_script->arena_size + 64);
- ZCG(arena_mem) = (void*)(((zend_uintptr_t)ZCG(arena_mem) + 63L) & ~63L);
- fast_memcpy(ZCG(arena_mem), persistent_script->arena_mem, persistent_script->arena_size);
-#else
- ZCG(arena_mem) = zend_arena_alloc(&CG(arena), persistent_script->arena_size);
- memcpy(ZCG(arena_mem), persistent_script->arena_mem, persistent_script->arena_size);
-#endif
- }
+ if (zend_hash_num_elements(&persistent_script->script.function_table) > 0) {
+ zend_accel_function_hash_copy(CG(function_table), &persistent_script->script.function_table);
+ }
- /* Copy all the necessary stuff from shared memory to regular memory, and protect the shared script */
- if (zend_hash_num_elements(&persistent_script->script.class_table) > 0) {
- zend_accel_class_hash_copy_from_shm(CG(class_table), &persistent_script->script.class_table);
- }
- /* we must first to copy all classes and then prepare functions, since functions may try to bind
- classes - which depend on pre-bind class entries existent in the class table */
- if (zend_hash_num_elements(&persistent_script->script.function_table) > 0) {
- zend_accel_function_hash_copy_from_shm(CG(function_table), &persistent_script->script.function_table);
- }
+ if (zend_hash_num_elements(&persistent_script->script.class_table) > 0) {
+ zend_accel_class_hash_copy(CG(class_table), &persistent_script->script.class_table);
+ }
+ if (EXPECTED(from_shared_memory)) {
/* Register __COMPILER_HALT_OFFSET__ constant */
if (persistent_script->compiler_halt_offset != 0 &&
persistent_script->script.filename) {
@@ -794,15 +236,8 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
zend_string_release_ex(name, 0);
}
- zend_hash_destroy(&ZCG(bind_hash));
- ZCG(current_persistent_script) = NULL;
- zend_map_ptr_extend(ZCSG(map_ptr_last));
- } else /* if (!from_shared_memory) */ {
- if (zend_hash_num_elements(&persistent_script->script.function_table) > 0) {
- zend_accel_function_hash_copy(CG(function_table), &persistent_script->script.function_table);
- }
- if (zend_hash_num_elements(&persistent_script->script.class_table) > 0) {
- zend_accel_class_hash_copy(CG(class_table), &persistent_script->script.class_table);
+ if (ZCSG(map_ptr_last) > CG(map_ptr_last)) {
+ zend_map_ptr_extend(ZCSG(map_ptr_last));
}
}