n = zend_mm_small_size_to_bit(size - 1);
return ((size-1) >> f1[n]) + f2[n];
#else
- int t1, t2, t3;
-
- if (UNEXPECTED(size <= 8)) return 0;
- t1 = (int)(size - 1);
- t2 = zend_mm_small_size_to_bit(t1);
- t3 = t2 - 6;
- t3 = (t3 < 0) ? 0 : t3;
- t2 = t3 + 3;
- t1 = t1 >> t2;
- t3 = t3 << 2;
- return t1 + t3;
+ unsigned int t1, t2;
+
+ if (size <= 64) {
+ /* we need to support size == 0 ... */
+ return (size - !!size) >> 3;
+ } else {
+ t1 = size - 1;
+ t2 = zend_mm_small_size_to_bit(t1) - 3;
+ t1 = t1 >> t2;
+ t2 = t2 - 3;
+ t2 = t2 << 2;
+ return (int)(t1 + t2);
+ }
#endif
}
fci_cache.function_handler = &my_function;
/* Runtime cache relies on bound scope to be immutable, hence we need a separate rt cache in case scope changed */
- if (ZEND_USER_CODE(my_function.type) && closure->func.common.scope != Z_OBJCE_P(newthis)) {
+ if (ZEND_USER_CODE(my_function.type) && closure->func.common.scope != Z_OBJCE_P(newthis) && my_function.op_array.cache_size) {
my_function.op_array.run_time_cache = emalloc(my_function.op_array.cache_size);
memset(my_function.op_array.run_time_cache, 0, my_function.op_array.cache_size);
}
new_closure = (zend_closure *) Z_OBJ_P(return_value);
/* Runtime cache relies on bound scope to be immutable, hence we need a separate rt cache in case scope changed */
- if (ZEND_USER_CODE(closure->func.type) && (closure->func.common.scope != new_closure->func.common.scope || (closure->func.op_array.fn_flags & ZEND_ACC_NO_RT_ARENA))) {
+ if (ZEND_USER_CODE(closure->func.type) && (closure->func.common.scope != new_closure->func.common.scope || (closure->func.op_array.fn_flags & ZEND_ACC_NO_RT_ARENA)) && new_closure->func.op_array.cache_size) {
new_closure->func.op_array.run_time_cache = emalloc(new_closure->func.op_array.cache_size);
memset(new_closure->func.op_array.run_time_cache, 0, new_closure->func.op_array.cache_size);
zend_hash_init(closure->func.op_array.static_variables, zend_hash_num_elements(static_variables), NULL, ZVAL_PTR_DTOR, 0);
zend_hash_apply_with_arguments(static_variables, zval_copy_static_var, 1, closure->func.op_array.static_variables);
}
- if (UNEXPECTED(!closure->func.op_array.run_time_cache)) {
+ if (UNEXPECTED(!closure->func.op_array.run_time_cache) && func->op_array.cache_size) {
closure->func.op_array.run_time_cache = func->op_array.run_time_cache = zend_arena_alloc(&CG(arena), func->op_array.cache_size);
memset(func->op_array.run_time_cache, 0, func->op_array.cache_size);
}
GC_REFCOUNT(Z_OBJ(EX(This)))++;
}
- if (UNEXPECTED(!op_array->run_time_cache)) {
+ if (UNEXPECTED(!op_array->run_time_cache) && op_array->cache_size) {
op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
memset(op_array->run_time_cache, 0, op_array->cache_size);
}
GC_REFCOUNT(Z_OBJ(EX(This)))++;
}
- if (!op_array->run_time_cache) {
+ if (!op_array->run_time_cache && op_array->cache_size) {
op_array->run_time_cache = emalloc(op_array->cache_size);
memset(op_array->run_time_cache, 0, op_array->cache_size);
}