Skip to content

Commit

Permalink
Merged EX(frame_kind) and EX(flags) into single word
Browse files Browse the repository at this point in the history
  • Loading branch information
dstogov committed Oct 7, 2014
1 parent e24c24c commit 33e137d
Show file tree
Hide file tree
Showing 8 changed files with 173 additions and 159 deletions.
6 changes: 3 additions & 3 deletions Zend/zend_builtin_functions.c
Expand Up @@ -402,7 +402,7 @@ ZEND_FUNCTION(func_num_args)
{
zend_execute_data *ex = EX(prev_execute_data);

if (ex->frame_kind == VM_FRAME_NESTED_FUNCTION || ex->frame_kind == VM_FRAME_TOP_FUNCTION) {
if (VM_FRAME_KIND(ex->frame_info) == VM_FRAME_NESTED_FUNCTION || VM_FRAME_KIND(ex->frame_info) == VM_FRAME_TOP_FUNCTION) {
RETURN_LONG(ex->num_args);
} else {
zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context");
Expand Down Expand Up @@ -430,7 +430,7 @@ ZEND_FUNCTION(func_get_arg)
}

ex = EX(prev_execute_data);
if (ex->frame_kind != VM_FRAME_NESTED_FUNCTION && ex->frame_kind != VM_FRAME_TOP_FUNCTION) {
if (VM_FRAME_KIND(ex->frame_info) != VM_FRAME_NESTED_FUNCTION && VM_FRAME_KIND(ex->frame_info) != VM_FRAME_TOP_FUNCTION) {
zend_error(E_WARNING, "func_get_arg(): Called from the global scope - no function context");
RETURN_FALSE;
}
Expand Down Expand Up @@ -464,7 +464,7 @@ ZEND_FUNCTION(func_get_args)
uint32_t i;
zend_execute_data *ex = EX(prev_execute_data);

if (ex->frame_kind != VM_FRAME_NESTED_FUNCTION && ex->frame_kind != VM_FRAME_TOP_FUNCTION) {
if (VM_FRAME_KIND(ex->frame_info) != VM_FRAME_NESTED_FUNCTION && VM_FRAME_KIND(ex->frame_info) != VM_FRAME_TOP_FUNCTION) {
zend_error(E_WARNING, "func_get_args(): Called from the global scope - no function context");
RETURN_FALSE;
}
Expand Down
16 changes: 11 additions & 5 deletions Zend/zend_compile.h
Expand Up @@ -360,9 +360,8 @@ struct _zend_execute_data {
zend_execute_data *call; /* current call */
void **run_time_cache;
zend_function *func; /* executed op_array */
uint32_t num_args;
zend_uchar flags;
zend_uchar frame_kind;
uint32_t num_args;
uint32_t frame_info;
zend_class_entry *called_scope;
zval This;
zend_execute_data *prev_execute_data;
Expand All @@ -374,8 +373,15 @@ struct _zend_execute_data {
zval old_error_reporting;
};

#define ZEND_CALL_CTOR (1 << 0)
#define ZEND_CALL_CTOR_RESULT_UNUSED (1 << 1)
#define VM_FRAME_KIND_MASK 0x000000ff
#define VM_FRAME_FLAGS_MASK 0xffffff00

#define ZEND_CALL_CTOR (1 << 8)
#define ZEND_CALL_CTOR_RESULT_UNUSED (1 << 9)

#define VM_FRAME_INFO(kind, flags) ((kind) | (flags))
#define VM_FRAME_KIND(info) ((info) & VM_FRAME_KIND_MASK)
#define VM_FRAME_FLAGS(info) ((info) & VM_FRAME_FLAGS_MASK)

#define ZEND_CALL_FRAME_SLOT \
((ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval)) - 1) / ZEND_MM_ALIGNED_SIZE(sizeof(zval)))
Expand Down
17 changes: 7 additions & 10 deletions Zend/zend_execute.c
Expand Up @@ -1423,14 +1423,13 @@ void zend_free_compiled_variables(zend_execute_data *execute_data TSRMLS_DC) /*
* +----------------------------------------+
*/

static zend_always_inline void i_init_func_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
static zend_always_inline void i_init_func_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value TSRMLS_DC) /* {{{ */
{
uint32_t first_extra_arg, num_args;
ZEND_ASSERT(EX(func) == (zend_function*)op_array);

EX(opline) = op_array->opcodes;
EX(call) = NULL;
EX(frame_kind) = frame_kind;
EX(return_value) = return_value;
EX(scope) = EG(scope);
EX(delayed_exception) = NULL;
Expand Down Expand Up @@ -1492,13 +1491,12 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
}
/* }}} */

static zend_always_inline void i_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
static zend_always_inline void i_init_code_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value TSRMLS_DC) /* {{{ */
{
ZEND_ASSERT(EX(func) == (zend_function*)op_array);

EX(opline) = op_array->opcodes;
EX(call) = NULL;
EX(frame_kind) = frame_kind;
EX(return_value) = return_value;
EX(scope) = EG(scope);
EX(delayed_exception) = NULL;
Expand All @@ -1520,13 +1518,12 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
}
/* }}} */

static zend_always_inline void i_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
static zend_always_inline void i_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value TSRMLS_DC) /* {{{ */
{
ZEND_ASSERT(EX(func) == (zend_function*)op_array);

EX(opline) = op_array->opcodes;
EX(call) = NULL;
EX(frame_kind) = frame_kind;
EX(return_value) = return_value;
EX(scope) = EG(scope);
EX(delayed_exception) = NULL;
Expand Down Expand Up @@ -1620,9 +1617,9 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data
NULL);

execute_data = zend_vm_stack_push_call_frame(
VM_FRAME_TOP_FUNCTION,
(zend_function*)op_array,
num_args,
call->flags,
call->called_scope,
Z_OBJ(call->This),
NULL TSRMLS_CC);
Expand All @@ -1641,16 +1638,16 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data

EX(symbol_table) = NULL;

i_init_func_execute_data(execute_data, op_array, return_value, VM_FRAME_TOP_FUNCTION TSRMLS_CC);
i_init_func_execute_data(execute_data, op_array, return_value TSRMLS_CC);

return execute_data;
}
/* }}} */

ZEND_API void zend_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC) /* {{{ */
ZEND_API void zend_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value TSRMLS_DC) /* {{{ */
{
EX(prev_execute_data) = EG(current_execute_data);
i_init_execute_data(execute_data, op_array, return_value, frame_kind TSRMLS_CC);
i_init_execute_data(execute_data, op_array, return_value TSRMLS_CC);
}
/* }}} */

Expand Down
6 changes: 3 additions & 3 deletions Zend/zend_execute.h
Expand Up @@ -35,7 +35,7 @@ ZEND_API extern void (*zend_execute_internal)(zend_execute_data *execute_data, z
void init_executor(TSRMLS_D);
void shutdown_executor(TSRMLS_D);
void shutdown_destructors(TSRMLS_D);
ZEND_API void zend_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, vm_frame_kind frame_kind TSRMLS_DC);
ZEND_API void zend_init_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value TSRMLS_DC);
ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data *call, zend_op_array *op_array, zval *return_value TSRMLS_DC);
ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value TSRMLS_DC);
ZEND_API void execute_ex(zend_execute_data *execute_data TSRMLS_DC);
Expand Down Expand Up @@ -205,7 +205,7 @@ static zend_always_inline zval* zend_vm_stack_alloc(size_t size TSRMLS_DC)
return (zval*)top;
}

static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(zend_function *func, uint32_t num_args, zend_uchar flags, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev TSRMLS_DC)
static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(uint32_t frame_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object, zend_execute_data *prev TSRMLS_DC)
{
uint32_t used_stack = ZEND_CALL_FRAME_SLOT + num_args;
zend_execute_data *call;
Expand All @@ -216,7 +216,7 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame(zend_
call = (zend_execute_data*)zend_vm_stack_alloc(used_stack * sizeof(zval) TSRMLS_CC);
call->func = func;
call->num_args = 0;
call->flags = flags;
call->frame_info = frame_info;
call->called_scope = called_scope;
ZVAL_OBJ(&call->This, object);
call->prev_execute_data = prev;
Expand Down
5 changes: 3 additions & 2 deletions Zend/zend_execute_API.c
Expand Up @@ -736,7 +736,8 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
}

func = fci_cache->function_handler;
call = zend_vm_stack_push_call_frame(func, fci->param_count, 0, fci_cache->called_scope, fci_cache->object, NULL TSRMLS_CC);
call = zend_vm_stack_push_call_frame(VM_FRAME_TOP_FUNCTION,
func, fci->param_count, fci_cache->called_scope, fci_cache->object, NULL TSRMLS_CC);
calling_scope = fci_cache->calling_scope;
fci->object = fci_cache->object;
if (fci->object &&
Expand Down Expand Up @@ -844,7 +845,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
EG(scope) = func->common.scope;
call->symbol_table = fci->symbol_table;
if (EXPECTED((func->op_array.fn_flags & ZEND_ACC_GENERATOR) == 0)) {
zend_init_execute_data(call, &func->op_array, fci->retval, VM_FRAME_TOP_FUNCTION TSRMLS_CC);
zend_init_execute_data(call, &func->op_array, fci->retval TSRMLS_CC);
zend_execute_ex(call TSRMLS_CC);
} else {
zend_generator_create_zval(call, &func->op_array, fci->retval TSRMLS_CC);
Expand Down
57 changes: 31 additions & 26 deletions Zend/zend_vm_def.h
Expand Up @@ -1717,7 +1717,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)

ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
{
vm_frame_kind frame_kind = EX(frame_kind);
vm_frame_kind frame_kind = VM_FRAME_KIND(EX(frame_info));

if (frame_kind == VM_FRAME_NESTED_FUNCTION) {
zend_object *object;
Expand Down Expand Up @@ -2213,8 +2213,8 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
GC_REFCOUNT(obj)++; /* For $this pointer */
}

EX(call) = zend_vm_stack_push_call_frame(
fbc, opline->extended_value, 0, called_scope, obj, EX(call) TSRMLS_CC);
EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, obj, EX(call) TSRMLS_CC);

FREE_OP2();
FREE_OP1_IF_VAR();
Expand Down Expand Up @@ -2337,8 +2337,8 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS
}
}

EX(call) = zend_vm_stack_push_call_frame(
fbc, opline->extended_value, 0, ce, object, EX(call) TSRMLS_CC);
EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
fbc, opline->extended_value, ce, object, EX(call) TSRMLS_CC);

if (OP2_TYPE == IS_UNUSED) {
EX(call)->return_value = NULL;
Expand Down Expand Up @@ -2366,8 +2366,8 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}

EX(call) = zend_vm_stack_push_call_frame(
fbc, opline->extended_value, 0, NULL, NULL, EX(call) TSRMLS_CC);
EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);

/*CHECK_EXCEPTION();*/
ZEND_VM_NEXT_OPCODE();
Expand Down Expand Up @@ -2486,8 +2486,8 @@ ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
zend_error_noreturn(E_ERROR, "Function name must be a string");
ZEND_VM_CONTINUE(); /* Never reached */
}
EX(call) = zend_vm_stack_push_call_frame(
fbc, opline->extended_value, 0, called_scope, object, EX(call) TSRMLS_CC);
EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
fbc, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);

CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
Expand Down Expand Up @@ -2540,8 +2540,8 @@ ZEND_VM_HANDLER(118, ZEND_INIT_USER_CALL, CONST, CONST|TMP|VAR|CV)
object = NULL;
}

EX(call) = zend_vm_stack_push_call_frame(
func, opline->extended_value, 0, called_scope, object, EX(call) TSRMLS_CC);
EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
func, opline->extended_value, called_scope, object, EX(call) TSRMLS_CC);

FREE_OP2();
CHECK_EXCEPTION();
Expand Down Expand Up @@ -2572,8 +2572,8 @@ ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST)
CACHE_PTR(Z_CACHE_SLOT_P(opline->op2.zv), fbc);
}

EX(call) = zend_vm_stack_push_call_frame(
fbc, opline->extended_value, 0, NULL, NULL, EX(call) TSRMLS_CC);
EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);

ZEND_VM_NEXT_OPCODE();
}
Expand All @@ -2596,8 +2596,8 @@ ZEND_VM_HANDLER(61, ZEND_INIT_FCALL, ANY, CONST)
CACHE_PTR(Z_CACHE_SLOT_P(fname), fbc);
}

EX(call) = zend_vm_stack_push_call_frame(
fbc, opline->extended_value, 0, NULL, NULL, EX(call) TSRMLS_CC);
EX(call) = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_FUNCTION,
fbc, opline->extended_value, NULL, NULL, EX(call) TSRMLS_CC);

FREE_OP2();

Expand Down Expand Up @@ -2719,12 +2719,14 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
zend_vm_stack_free_call_frame(call TSRMLS_CC);
} else {
call->prev_execute_data = execute_data;
i_init_func_execute_data(call, &fbc->op_array, return_value, VM_FRAME_NESTED_FUNCTION TSRMLS_CC);
i_init_func_execute_data(call, &fbc->op_array, return_value TSRMLS_CC);

if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
call->frame_kind = VM_FRAME_TOP_FUNCTION;
call->frame_info = VM_FRAME_INFO(
VM_FRAME_TOP_FUNCTION,
VM_FRAME_FLAGS(call->frame_info));
zend_execute_ex(call TSRMLS_CC);
}
}
Expand Down Expand Up @@ -3685,9 +3687,12 @@ ZEND_VM_HANDLER(68, ZEND_NEW, ANY, ANY)
} else {
/* We are not handling overloaded classes right now */
EX(call) = zend_vm_stack_push_call_frame(
constructor, opline->extended_value,
RETURN_VALUE_USED(opline) ?
ZEND_CALL_CTOR : (ZEND_CALL_CTOR | ZEND_CALL_CTOR_RESULT_UNUSED),
VM_FRAME_INFO(
VM_FRAME_NESTED_FUNCTION,
RETURN_VALUE_USED(opline) ?
ZEND_CALL_CTOR : (ZEND_CALL_CTOR | ZEND_CALL_CTOR_RESULT_UNUSED)),
constructor,
opline->extended_value,
Z_CE_P(EX_VAR(opline->op1.var)),
Z_OBJ(object_zval),
EX(call) TSRMLS_CC);
Expand Down Expand Up @@ -4179,8 +4184,8 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY)
return_value = EX_VAR(opline->result.var);
}

call = zend_vm_stack_push_call_frame(
(zend_function*)new_op_array, 0, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);
call = zend_vm_stack_push_call_frame(VM_FRAME_NESTED_CODE,
(zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)), NULL TSRMLS_CC);

if (EX(symbol_table)) {
call->symbol_table = EX(symbol_table);
Expand All @@ -4189,11 +4194,11 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY)
}

call->prev_execute_data = execute_data;
i_init_code_execute_data(call, new_op_array, return_value, VM_FRAME_NESTED_CODE TSRMLS_CC);
i_init_code_execute_data(call, new_op_array, return_value TSRMLS_CC);
if (EXPECTED(zend_execute_ex == execute_ex)) {
ZEND_VM_ENTER();
} else {
call->frame_kind = VM_FRAME_TOP_CODE;
call->frame_info = VM_FRAME_TOP_CODE;
zend_execute_ex(call TSRMLS_CC);
}

Expand Down Expand Up @@ -5453,8 +5458,8 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
zend_vm_stack_free_args(EX(call) TSRMLS_CC);

if (Z_OBJ(call->This)) {
if (call->flags & ZEND_CALL_CTOR) {
if (!(call->flags & ZEND_CALL_CTOR_RESULT_UNUSED)) {
if (call->frame_info & ZEND_CALL_CTOR) {
if (!(call->frame_info & ZEND_CALL_CTOR_RESULT_UNUSED)) {
GC_REFCOUNT(Z_OBJ(call->This))--;
}
if (GC_REFCOUNT(Z_OBJ(call->This)) == 1) {
Expand Down

0 comments on commit 33e137d

Please sign in to comment.