int refcount;
uint32_t ce_flags;
- HashTable function_table;
- HashTable properties_info;
+ int default_properties_count;
+ int default_static_members_count;
zval *default_properties_table;
zval *default_static_members_table;
zval *static_members_table;
+ HashTable function_table;
+ HashTable properties_info;
HashTable constants_table;
- int default_properties_count;
- int default_static_members_count;
union _zend_function *constructor;
union _zend_function *destructor;
int (*serialize)(zval *object, unsigned char **buffer, uint32_t *buf_len, zend_serialize_data *data TSRMLS_DC);
int (*unserialize)(zval *object, zend_class_entry *ce, const unsigned char *buf, uint32_t buf_len, zend_unserialize_data *data TSRMLS_DC);
- zend_class_entry **interfaces;
uint32_t num_interfaces;
+ uint32_t num_traits;
+ zend_class_entry **interfaces;
zend_class_entry **traits;
- uint32_t num_traits;
zend_trait_alias **trait_aliases;
zend_trait_precedence **trait_precedences;
CG(active_op_array)->try_catch_array[try_catch_offset].finally_op = opnum_jmp + 1;
CG(active_op_array)->try_catch_array[try_catch_offset].finally_end
= get_next_op_number(CG(active_op_array));
- CG(active_op_array)->has_finally_block = 1;
+ CG(active_op_array)->fn_flags |= ZEND_ACC_HAS_FINALLY_BLOCK;
zend_emit_op(NULL, ZEND_FAST_RET, NULL, NULL TSRMLS_CC);
/* function has arguments with type hinting */
#define ZEND_ACC_HAS_TYPE_HINTS 0x10000000
+/* op_array has finally blocks */
+#define ZEND_ACC_HAS_FINALLY_BLOCK 0x20000000
+
#define ZEND_CE_IS_TRAIT(ce) (((ce)->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT)
char *zend_visibility_string(uint32_t fn_flags);
typedef struct _zend_property_info {
uint32_t flags;
- zend_string *name;
- zend_ulong h;
int offset;
+ zend_string *name;
zend_string *doc_comment;
zend_class_entry *ce;
} zend_property_info;
struct _zend_op_array {
/* Common elements */
zend_uchar type;
+ uint32_t fn_flags;
zend_string *function_name;
zend_class_entry *scope;
- uint32_t fn_flags;
zend_function *prototype;
uint32_t num_args;
uint32_t required_num_args;
uint32_t *refcount;
- zend_op *opcodes;
+ uint32_t this_var;
+
uint32_t last;
+ zend_op *opcodes;
- zend_string **vars;
int last_var;
-
uint32_t T;
+ zend_string **vars;
- zend_brk_cont_element *brk_cont_array;
int last_brk_cont;
-
- zend_try_catch_element *try_catch_array;
int last_try_catch;
- zend_bool has_finally_block;
+ zend_brk_cont_element *brk_cont_array;
+ zend_try_catch_element *try_catch_array;
/* static variables support */
HashTable *static_variables;
- uint32_t this_var;
-
zend_string *filename;
uint32_t line_start;
uint32_t line_end;
zend_string *doc_comment;
uint32_t early_binding; /* the linked list of delayed declarations */
- zval *literals;
int last_literal;
+ zval *literals;
- void **run_time_cache;
int last_cache_slot;
+ void **run_time_cache;
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
typedef struct _zend_internal_function {
/* Common elements */
zend_uchar type;
+ uint32_t fn_flags;
zend_string* function_name;
zend_class_entry *scope;
- uint32_t fn_flags;
zend_function *prototype;
uint32_t num_args;
uint32_t required_num_args;
struct {
zend_uchar type; /* never used */
+ uint32_t fn_flags;
zend_string *function_name;
zend_class_entry *scope;
- uint32_t fn_flags;
union _zend_function *prototype;
uint32_t num_args;
uint32_t required_num_args;
static const zend_internal_function zend_pass_function = {
ZEND_INTERNAL_FUNCTION, /* type */
+ 0, /* fn_flags */
NULL, /* name */
NULL, /* scope */
- 0, /* fn_flags */
NULL, /* prototype */
0, /* num_args */
0, /* required_num_args */
uint32_t op_num, finally_op_num;
int i;
- if (!ex || !ex->func->op_array.has_finally_block) {
+ if (!ex || !(ex->func->op_array.fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK)) {
return;
}
op_array->static_variables = NULL;
op_array->last_try_catch = 0;
- op_array->has_finally_block = 0;
op_array->this_var = -1;
if (!ZEND_USER_CODE(op_array->type)) {
return 0;
}
- if (op_array->has_finally_block) {
+ if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) {
zend_resolve_finally_calls(op_array TSRMLS_CC);
}
if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) {
fflush(stderr);
#endif
- if (op_array->has_finally_block) {
+ if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) {
return;
}
break;
case ZEND_JMP:
- if (op_array->has_finally_block) {
+ if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) {
break;
}
case ZEND_JMP_SET:
case ZEND_JMP_SET_VAR:
- if (op_array->has_finally_block) {
+ if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) {
break;
}
break;
case ZEND_JMPZ:
case ZEND_JMPNZ:
- if (op_array->has_finally_block) {
+ if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) {
break;
}
zend_uchar T_type = opline->result_type;
znode_op T = opline->result;
- if (op_array->has_finally_block) {
+ if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) {
break;
}
break;
case ZEND_JMPZNZ:
- if (op_array->has_finally_block) {
+ if (op_array->fn_flags & ZEND_ACC_HAS_FINALLY_BLOCK) {
break;
}