summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--Zend/zend.c20
-rw-r--r--Zend/zend_compile.c119
-rw-r--r--Zend/zend_compile.h28
-rw-r--r--Zend/zend_execute_API.c8
-rw-r--r--Zend/zend_globals.h9
-rw-r--r--Zend/zend_opcode.c6
-rw-r--r--Zend/zend_vm_def.h13
-rw-r--r--Zend/zend_vm_execute.h63
-rw-r--r--Zend/zend_vm_opcodes.h265
-rw-r--r--sapi/cgi/cgi_main.c2
-rw-r--r--sapi/cli/php_cli.c2
-rw-r--r--sapi/milter/php_milter.c2
13 files changed, 301 insertions, 239 deletions
diff --git a/NEWS b/NEWS
index 70e0e06e37..da0c28ca73 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@ PHP NEWS
?? ??? 20??, PHP 5.3.0
- Removed the experimental RPL (master/slave) functions from mysqli. (Andrey)
+- Added concept of "delayed early binding" that allows opcode caches to perform
+ class declaration (early and/or run-time binding) in exactly the same order
+ as vanila php. (Dmitry)
- Added new error mode E_DEPRECATED which is used to inform about stuff to be
dropped in future PHP versions. (Lars Strojny, Felipe, Marcus)
- Added and improved PHP syntax and semantics:
diff --git a/Zend/zend.c b/Zend/zend.c
index 5d8eeffd01..97fe82080c 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -443,15 +443,15 @@ static void register_standard_class(TSRMLS_D) /* {{{ */
/* }}} */
#ifdef ZTS
-static zend_bool asp_tags_default = 0;
-static zend_bool short_tags_default = 1;
-static zend_bool ct_pass_ref_default = 1;
-static zend_bool extended_info_default = 0;
+static zend_bool asp_tags_default = 0;
+static zend_bool short_tags_default = 1;
+static zend_bool ct_pass_ref_default = 1;
+static zend_uint compiler_options_default = ZEND_COMPILE_DEFAULT;
#else
-# define asp_tags_default 0
-# define short_tags_default 1
-# define ct_pass_ref_default 1
-# define extended_info_default 0
+# define asp_tags_default 0
+# define short_tags_default 1
+# define ct_pass_ref_default 1
+# define compiler_options_default ZEND_COMPILE_DEFAULT
#endif
static void zend_set_default_compile_time_values(TSRMLS_D) /* {{{ */
@@ -460,7 +460,7 @@ static void zend_set_default_compile_time_values(TSRMLS_D) /* {{{ */
CG(asp_tags) = asp_tags_default;
CG(short_tags) = short_tags_default;
CG(allow_call_time_pass_reference) = ct_pass_ref_default;
- CG(extended_info) = extended_info_default;
+ CG(compiler_options) = compiler_options_default;
}
/* }}} */
@@ -721,7 +721,7 @@ void zend_post_startup(TSRMLS_D) /* {{{ */
asp_tags_default = CG(asp_tags);
short_tags_default = CG(short_tags);
ct_pass_ref_default = CG(allow_call_time_pass_reference);
- extended_info_default = CG(extended_info);
+ compiler_options_default = CG(compiler_options);
zend_destroy_rsrc_list(&EG(persistent_list) TSRMLS_CC);
free(compiler_globals->function_table);
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index f6af8c84aa..2d885da9eb 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -126,7 +126,6 @@ void zend_init_compiler_data_structures(TSRMLS_D)
zend_llist_init(&CG(list_llist), sizeof(list_llist_element), NULL, 0);
zend_llist_init(&CG(dimension_llist), sizeof(int), NULL, 0);
zend_stack_init(&CG(list_stack));
- CG(handle_op_arrays) = 1;
CG(in_compilation) = 0;
CG(start_lineno) = 0;
CG(current_namespace) = NULL;
@@ -1241,7 +1240,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
zend_hash_update(CG(function_table), opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array));
}
- if (CG(extended_info)) {
+ if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) {
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_EXT_NOP;
@@ -1420,7 +1419,9 @@ int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace
}
lcname = zend_str_tolower_dup(function_name->u.constant.value.str.val, function_name->u.constant.value.str.len);
- if (zend_hash_find(CG(function_table), lcname, function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) {
+ if ((zend_hash_find(CG(function_table), lcname, function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) ||
+ ((CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS) &&
+ (function->type == ZEND_INTERNAL_FUNCTION))) {
zend_do_begin_dynamic_function_call(function_name, prefix_len TSRMLS_CC);
efree(lcname);
return 1; /* Dynamic */
@@ -1603,8 +1604,9 @@ void zend_resolve_class_name(znode *class_name, ulong *fetch_type, int check_ns_
efree(ns_lcname);
}
- if (zend_hash_find(CG(class_table), lcname, Z_STRLEN(class_name->u.constant)+1, (void**)&pce) == SUCCESS &&
- (*pce)->type == ZEND_INTERNAL_CLASS) {
+ if ((CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES) ||
+ (zend_hash_find(CG(class_table), lcname, Z_STRLEN(class_name->u.constant)+1, (void**)&pce) == SUCCESS &&
+ (*pce)->type == ZEND_INTERNAL_CLASS)) {
/* There is an internal class with the same name exists.
PHP will need to perform additional cheks at run-time to
determine if we assume class in current namespace or
@@ -2727,7 +2729,6 @@ void zend_do_early_binding(TSRMLS_D)
{
zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1];
HashTable *table;
- zend_bool is_abstract_class = 0;
while (opline->opcode == ZEND_TICKS && opline > CG(active_op_array)->opcodes) {
opline--;
@@ -2741,57 +2742,44 @@ void zend_do_early_binding(TSRMLS_D)
table = CG(function_table);
break;
case ZEND_DECLARE_CLASS:
+ if (do_bind_class(opline, CG(class_table), 1 TSRMLS_CC) == NULL) {
+ return;
+ }
+ table = CG(class_table);
+ break;
case ZEND_DECLARE_INHERITED_CLASS:
- is_abstract_class = 1;
- /* break missing intentionally */
- case ZEND_VERIFY_ABSTRACT_CLASS: {
- zend_op *verify_abstract_class_op = opline;
-
- if (!is_abstract_class) {
- opline--;
- }
- if (opline->opcode == ZEND_DECLARE_CLASS) {
- if (do_bind_class(opline, CG(class_table), 1 TSRMLS_CC) == NULL) {
- return;
- }
- } else if (opline->opcode == ZEND_DECLARE_INHERITED_CLASS) {
- zval *parent_name = &(opline-1)->op2.u.constant;
- zend_class_entry **pce;
-
- if (zend_lookup_class(Z_STRVAL_P(parent_name), Z_STRLEN_P(parent_name), &pce TSRMLS_CC) == FAILURE) {
- return;
+ {
+ zend_op *fetch_class_opline = opline-1;
+ zval *parent_name = &fetch_class_opline->op2.u.constant;
+ zend_class_entry **pce;
+
+ if ((zend_lookup_class(Z_STRVAL_P(parent_name), Z_STRLEN_P(parent_name), &pce TSRMLS_CC) == FAILURE) ||
+ ((CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES) &&
+ ((*pce)->type == ZEND_INTERNAL_CLASS))) {
+ if (CG(compiler_options) & ZEND_COMPILE_DELAYED_BINDING) {
+ zend_uint *opline_num = &CG(active_op_array)->early_binding;
+
+ while (*opline_num != -1) {
+ opline_num = &CG(active_op_array)->opcodes[*opline_num].result.u.opline_num;
+ }
+ *opline_num = opline - CG(active_op_array)->opcodes;
+ opline->opcode = ZEND_DECLARE_INHERITED_CLASS_DELAYED;
+ opline->result.op_type = IS_UNUSED;
+ opline->result.u.opline_num = -1;
}
- if (do_bind_inherited_class(opline, CG(class_table), *pce, 1 TSRMLS_CC) == NULL) {
- return;
- }
- /* clear unnecessary ZEND_FETCH_CLASS opcode */
- if (opline > CG(active_op_array)->opcodes &&
- (opline-1)->opcode == ZEND_FETCH_CLASS) {
- zend_op *fetch_class_opline = opline-1;
-
- zval_dtor(&fetch_class_opline->op2.u.constant);
- fetch_class_opline->opcode = ZEND_NOP;
- memset(&fetch_class_opline->op1, 0, sizeof(znode));
- memset(&fetch_class_opline->op2, 0, sizeof(znode));
- SET_UNUSED(fetch_class_opline->op1);
- SET_UNUSED(fetch_class_opline->op2);
- SET_UNUSED(fetch_class_opline->result);
- }
- } else {
- /* We currently don't early-bind classes that implement interfaces */
return;
}
- table = CG(class_table);
- if (!is_abstract_class) {
- /* clear the verify_abstract_class op */
- init_op(verify_abstract_class_op TSRMLS_CC);
- SET_UNUSED(verify_abstract_class_op->op1);
- SET_UNUSED(verify_abstract_class_op->op2);
- verify_abstract_class_op->opcode = ZEND_NOP;
+ if (do_bind_inherited_class(opline, CG(class_table), *pce, 1 TSRMLS_CC) == NULL) {
+ return;
}
- }
+ /* clear unnecessary ZEND_FETCH_CLASS opcode */
+ zval_dtor(&fetch_class_opline->op2.u.constant);
+ MAKE_NOP(fetch_class_opline);
- break;
+ table = CG(class_table);
+ break;
+ }
+ case ZEND_VERIFY_ABSTRACT_CLASS:
case ZEND_ADD_INTERFACE:
/* We currently don't early-bind classes that implement interfaces */
return;
@@ -2803,13 +2791,26 @@ void zend_do_early_binding(TSRMLS_D)
zend_hash_del(table, opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len);
zval_dtor(&opline->op1.u.constant);
zval_dtor(&opline->op2.u.constant);
- opline->opcode = ZEND_NOP;
- memset(&opline->op1, 0, sizeof(znode));
- memset(&opline->op2, 0, sizeof(znode));
- SET_UNUSED(opline->op1);
- SET_UNUSED(opline->op2);
+ MAKE_NOP(opline);
}
+ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array TSRMLS_DC)
+{
+ if (op_array->early_binding != -1) {
+ zend_bool orig_in_compilation = CG(in_compilation);
+ zend_uint opline_num = op_array->early_binding;
+ zend_class_entry **pce;
+
+ CG(in_compilation) = 1;
+ while (opline_num != -1) {
+ if (zend_lookup_class(Z_STRVAL(op_array->opcodes[opline_num-1].op2.u.constant), Z_STRLEN(op_array->opcodes[opline_num-1].op2.u.constant), &pce TSRMLS_CC) == SUCCESS) {
+ do_bind_inherited_class(&op_array->opcodes[opline_num], EG(class_table), *pce, 1 TSRMLS_CC);
+ }
+ opline_num = op_array->opcodes[opline_num].result.u.opline_num;
+ }
+ CG(in_compilation) = orig_in_compilation;
+ }
+}
void zend_do_boolean_or_begin(znode *expr1, znode *op_token TSRMLS_DC)
{
@@ -4462,7 +4463,7 @@ void zend_do_extended_info(TSRMLS_D)
{
zend_op *opline;
- if (!CG(extended_info)) {
+ if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
return;
}
@@ -4478,7 +4479,7 @@ void zend_do_extended_fcall_begin(TSRMLS_D)
{
zend_op *opline;
- if (!CG(extended_info)) {
+ if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
return;
}
@@ -4494,7 +4495,7 @@ void zend_do_extended_fcall_end(TSRMLS_D)
{
zend_op *opline;
- if (!CG(extended_info)) {
+ if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
return;
}
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 4e1d5cc9ed..21260e8f51 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -224,6 +224,7 @@ struct _zend_op_array {
zend_uint line_end;
char *doc_comment;
zend_uint doc_comment_len;
+ zend_uint early_binding; /* the linked list of delayed declarations */
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
@@ -428,6 +429,7 @@ void zend_do_implements_interface(znode *interface_znode TSRMLS_DC);
ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce TSRMLS_DC);
void zend_do_early_binding(TSRMLS_D);
+ZEND_API void zend_do_delayed_early_binding(zend_op_array *op_array TSRMLS_DC);
void zend_do_pass_param(znode *param, zend_uchar op, int offset TSRMLS_DC);
@@ -711,6 +713,32 @@ END_EXTERN_C()
#define ZEND_TOSTRING_FUNC_NAME "__tostring"
#define ZEND_AUTOLOAD_FUNC_NAME "__autoload"
+/* The following constants may be combined in CG(compiler_options)
+ * to change the default compiler behavior */
+
+/* generate extended debug information */
+#define ZEND_COMPILE_EXTENDED_INFO (1<<0)
+
+/* call op_array handler of extendions */
+#define ZEND_COMPILE_HANDLE_OP_ARRAY (1<<1)
+
+/* generate ZEND_DO_FCALL_BY_NAME for internal functions instead of ZEND_DO_FCALL */
+#define ZEND_COMPILE_IGNORE_INTERNAL_FUNCTIONS (1<<2)
+
+/* don't perform early binding for classes inherited form internal ones;
+ * in namespaces assume that internal class that doesn't exist at compile-time
+ * may apper in run-time */
+#define ZEND_COMPILE_IGNORE_INTERNAL_CLASSES (1<<3)
+
+/* generate ZEND_DECLARE_INHERITED_CLASS_DELAYED opcode to delay early binding */
+#define ZEND_COMPILE_DELAYED_BINDING (1<<4)
+
+/* The default value for CG(compiler_options) */
+#define ZEND_COMPILE_DEFAULT ZEND_COMPILE_HANDLE_OP_ARRAY
+
+/* The default value for CG(compiler_options) during eval() */
+#define ZEND_COMPILE_DEFAULT_FOR_EVAL 0
+
#endif /* ZEND_COMPILE_H */
/*
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 95491966ba..3f646162a2 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1264,7 +1264,7 @@ ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSR
zval pv;
zend_op_array *new_op_array;
zend_op_array *original_active_op_array = EG(active_op_array);
- zend_uchar original_handle_op_arrays;
+ zend_uint original_compiler_options;
int retval;
if (retval_ptr) {
@@ -1284,10 +1284,10 @@ ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSR
/*printf("Evaluating '%s'\n", pv.value.str.val);*/
- original_handle_op_arrays = CG(handle_op_arrays);
- CG(handle_op_arrays) = 0;
+ original_compiler_options = CG(compiler_options);
+ CG(compiler_options) = ZEND_COMPILE_DEFAULT_FOR_EVAL;
new_op_array = zend_compile_string(&pv, string_name TSRMLS_CC);
- CG(handle_op_arrays) = original_handle_op_arrays;
+ CG(compiler_options) = original_compiler_options;
if (new_op_array) {
zval *local_retval_ptr=NULL;
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index 8253ff3ba0..b387c5db1a 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -55,6 +55,9 @@ END_EXTERN_C()
/* excpt.h on Digital Unix 4.0 defines function_table */
#undef function_table
+#define ZEND_EARLY_BINDING_COMPILE_TIME 0
+#define ZEND_EARLY_BINDING_DELAYED 1
+#define ZEND_EARLY_BINDING_DELAYED_ALL 2
typedef struct _zend_declarables {
zval ticks;
@@ -101,10 +104,6 @@ struct _zend_compiler_globals {
zend_declarables declarables;
- /* For extensions support */
- zend_bool extended_info; /* generate extension information for debugger/profiler */
- zend_bool handle_op_arrays; /* run op_arrays through op_array handlers */
-
zend_bool unclean_shutdown;
zend_bool ini_parser_unbuffered_errors;
@@ -127,6 +126,8 @@ struct _zend_compiler_globals {
char *doc_comment;
zend_uint doc_comment_len;
+ zend_uint compiler_options; /* set of ZEND_COMPILE_* constants */
+
zval *current_namespace;
HashTable *current_import;
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index bc9b2ab5bb..f1c4e1d4bb 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -101,6 +101,8 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz
op_array->fn_flags = CG(interactive)?ZEND_ACC_INTERACTIVE:0;
+ op_array->early_binding = -1;
+
memset(op_array->reserved, 0, ZEND_MAX_RESERVED_RESOURCES * sizeof(void*));
zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_ctor_handler, op_array TSRMLS_CC);
@@ -364,10 +366,10 @@ int pass_two(zend_op_array *op_array TSRMLS_DC)
if (op_array->type!=ZEND_USER_FUNCTION && op_array->type!=ZEND_EVAL_CODE) {
return 0;
}
- if (CG(extended_info)) {
+ if (CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO) {
zend_update_extended_info(op_array TSRMLS_CC);
}
- if (CG(handle_op_arrays)) {
+ if (CG(compiler_options) & ZEND_COMPILE_HANDLE_OP_ARRAY) {
zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_handler, op_array TSRMLS_CC);
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index f01a76b1cb..e7b09e4bcb 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -3962,6 +3962,19 @@ ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, ANY)
ZEND_VM_NEXT_OPCODE();
}
+ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, ANY, ANY)
+{
+ zend_op *opline = EX(opline);
+ zend_class_entry **pce, **pce_orig;
+
+ if (zend_hash_find(EG(class_table), Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void**)&pce) == FAILURE ||
+ (zend_hash_find(EG(class_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), (void**)&pce_orig) == SUCCESS &&
+ *pce != *pce_orig)) {
+ do_bind_inherited_class(opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY)
{
do_bind_function(EX(opline), EG(function_table), 0);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index efa6ef7d7c..95bc66e9c8 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -482,6 +482,19 @@ static int ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ZEND_VM_NEXT_OPCODE();
}
+static int ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zend_op *opline = EX(opline);
+ zend_class_entry **pce, **pce_orig;
+
+ if (zend_hash_find(EG(class_table), Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void**)&pce) == FAILURE ||
+ (zend_hash_find(EG(class_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), (void**)&pce_orig) == SUCCESS &&
+ *pce != *pce_orig)) {
+ do_bind_inherited_class(opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
do_bind_function(EX(opline), EG(function_table), 0);
@@ -32990,31 +33003,31 @@ void zend_init_opcodes_handlers(void)
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
- ZEND_NULL_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
+ ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h
index 3ef0386a0f..f581404080 100644
--- a/Zend/zend_vm_opcodes.h
+++ b/Zend/zend_vm_opcodes.h
@@ -18,135 +18,136 @@
+----------------------------------------------------------------------+
*/
-#define ZEND_NOP 0
-#define ZEND_ADD 1
-#define ZEND_SUB 2
-#define ZEND_MUL 3
-#define ZEND_DIV 4
-#define ZEND_MOD 5
-#define ZEND_SL 6
-#define ZEND_SR 7
-#define ZEND_CONCAT 8
-#define ZEND_BW_OR 9
-#define ZEND_BW_AND 10
-#define ZEND_BW_XOR 11
-#define ZEND_BW_NOT 12
-#define ZEND_BOOL_NOT 13
-#define ZEND_BOOL_XOR 14
-#define ZEND_IS_IDENTICAL 15
-#define ZEND_IS_NOT_IDENTICAL 16
-#define ZEND_IS_EQUAL 17
-#define ZEND_IS_NOT_EQUAL 18
-#define ZEND_IS_SMALLER 19
-#define ZEND_IS_SMALLER_OR_EQUAL 20
-#define ZEND_CAST 21
-#define ZEND_QM_ASSIGN 22
-#define ZEND_ASSIGN_ADD 23
-#define ZEND_ASSIGN_SUB 24
-#define ZEND_ASSIGN_MUL 25
-#define ZEND_ASSIGN_DIV 26
-#define ZEND_ASSIGN_MOD 27
-#define ZEND_ASSIGN_SL 28
-#define ZEND_ASSIGN_SR 29
-#define ZEND_ASSIGN_CONCAT 30
-#define ZEND_ASSIGN_BW_OR 31
-#define ZEND_ASSIGN_BW_AND 32
-#define ZEND_ASSIGN_BW_XOR 33
-#define ZEND_PRE_INC 34
-#define ZEND_PRE_DEC 35
-#define ZEND_POST_INC 36
-#define ZEND_POST_DEC 37
-#define ZEND_ASSIGN 38
-#define ZEND_ASSIGN_REF 39
-#define ZEND_ECHO 40
-#define ZEND_PRINT 41
-#define ZEND_JMP 42
-#define ZEND_JMPZ 43
-#define ZEND_JMPNZ 44
-#define ZEND_JMPZNZ 45
-#define ZEND_JMPZ_EX 46
-#define ZEND_JMPNZ_EX 47
-#define ZEND_CASE 48
-#define ZEND_SWITCH_FREE 49
-#define ZEND_BRK 50
-#define ZEND_CONT 51
-#define ZEND_BOOL 52
-#define ZEND_INIT_STRING 53
-#define ZEND_ADD_CHAR 54
-#define ZEND_ADD_STRING 55
-#define ZEND_ADD_VAR 56
-#define ZEND_BEGIN_SILENCE 57
-#define ZEND_END_SILENCE 58
-#define ZEND_INIT_FCALL_BY_NAME 59
-#define ZEND_DO_FCALL 60
-#define ZEND_DO_FCALL_BY_NAME 61
-#define ZEND_RETURN 62
-#define ZEND_RECV 63
-#define ZEND_RECV_INIT 64
-#define ZEND_SEND_VAL 65
-#define ZEND_SEND_VAR 66
-#define ZEND_SEND_REF 67
-#define ZEND_NEW 68
-#define ZEND_INIT_NS_FCALL_BY_NAME 69
-#define ZEND_FREE 70
-#define ZEND_INIT_ARRAY 71
-#define ZEND_ADD_ARRAY_ELEMENT 72
-#define ZEND_INCLUDE_OR_EVAL 73
-#define ZEND_UNSET_VAR 74
-#define ZEND_UNSET_DIM 75
-#define ZEND_UNSET_OBJ 76
-#define ZEND_FE_RESET 77
-#define ZEND_FE_FETCH 78
-#define ZEND_EXIT 79
-#define ZEND_FETCH_R 80
-#define ZEND_FETCH_DIM_R 81
-#define ZEND_FETCH_OBJ_R 82
-#define ZEND_FETCH_W 83
-#define ZEND_FETCH_DIM_W 84
-#define ZEND_FETCH_OBJ_W 85
-#define ZEND_FETCH_RW 86
-#define ZEND_FETCH_DIM_RW 87
-#define ZEND_FETCH_OBJ_RW 88
-#define ZEND_FETCH_IS 89
-#define ZEND_FETCH_DIM_IS 90
-#define ZEND_FETCH_OBJ_IS 91
-#define ZEND_FETCH_FUNC_ARG 92
-#define ZEND_FETCH_DIM_FUNC_ARG 93
-#define ZEND_FETCH_OBJ_FUNC_ARG 94
-#define ZEND_FETCH_UNSET 95
-#define ZEND_FETCH_DIM_UNSET 96
-#define ZEND_FETCH_OBJ_UNSET 97
-#define ZEND_FETCH_DIM_TMP_VAR 98
-#define ZEND_FETCH_CONSTANT 99
-#define ZEND_EXT_STMT 101
-#define ZEND_EXT_FCALL_BEGIN 102
-#define ZEND_EXT_FCALL_END 103
-#define ZEND_EXT_NOP 104
-#define ZEND_TICKS 105
-#define ZEND_SEND_VAR_NO_REF 106
-#define ZEND_CATCH 107
-#define ZEND_THROW 108
-#define ZEND_FETCH_CLASS 109
-#define ZEND_CLONE 110
-#define ZEND_INIT_METHOD_CALL 112
-#define ZEND_INIT_STATIC_METHOD_CALL 113
-#define ZEND_ISSET_ISEMPTY_VAR 114
-#define ZEND_ISSET_ISEMPTY_DIM_OBJ 115
-#define ZEND_PRE_INC_OBJ 132
-#define ZEND_PRE_DEC_OBJ 133
-#define ZEND_POST_INC_OBJ 134
-#define ZEND_POST_DEC_OBJ 135
-#define ZEND_ASSIGN_OBJ 136
-#define ZEND_INSTANCEOF 138
-#define ZEND_DECLARE_CLASS 139
-#define ZEND_DECLARE_INHERITED_CLASS 140
-#define ZEND_DECLARE_FUNCTION 141
-#define ZEND_RAISE_ABSTRACT_ERROR 142
-#define ZEND_DECLARE_CONST 143
-#define ZEND_ADD_INTERFACE 144
-#define ZEND_VERIFY_ABSTRACT_CLASS 146
-#define ZEND_ASSIGN_DIM 147
-#define ZEND_ISSET_ISEMPTY_PROP_OBJ 148
-#define ZEND_HANDLE_EXCEPTION 149
-#define ZEND_USER_OPCODE 150
-#define ZEND_JMP_SET 152
+#define ZEND_NOP 0
+#define ZEND_ADD 1
+#define ZEND_SUB 2
+#define ZEND_MUL 3
+#define ZEND_DIV 4
+#define ZEND_MOD 5
+#define ZEND_SL 6
+#define ZEND_SR 7
+#define ZEND_CONCAT 8
+#define ZEND_BW_OR 9
+#define ZEND_BW_AND 10
+#define ZEND_BW_XOR 11
+#define ZEND_BW_NOT 12
+#define ZEND_BOOL_NOT 13
+#define ZEND_BOOL_XOR 14
+#define ZEND_IS_IDENTICAL 15
+#define ZEND_IS_NOT_IDENTICAL 16
+#define ZEND_IS_EQUAL 17
+#define ZEND_IS_NOT_EQUAL 18
+#define ZEND_IS_SMALLER 19
+#define ZEND_IS_SMALLER_OR_EQUAL 20
+#define ZEND_CAST 21
+#define ZEND_QM_ASSIGN 22
+#define ZEND_ASSIGN_ADD 23
+#define ZEND_ASSIGN_SUB 24
+#define ZEND_ASSIGN_MUL 25
+#define ZEND_ASSIGN_DIV 26
+#define ZEND_ASSIGN_MOD 27
+#define ZEND_ASSIGN_SL 28
+#define ZEND_ASSIGN_SR 29
+#define ZEND_ASSIGN_CONCAT 30
+#define ZEND_ASSIGN_BW_OR 31
+#define ZEND_ASSIGN_BW_AND 32
+#define ZEND_ASSIGN_BW_XOR 33
+#define ZEND_PRE_INC 34
+#define ZEND_PRE_DEC 35
+#define ZEND_POST_INC 36
+#define ZEND_POST_DEC 37
+#define ZEND_ASSIGN 38
+#define ZEND_ASSIGN_REF 39
+#define ZEND_ECHO 40
+#define ZEND_PRINT 41
+#define ZEND_JMP 42
+#define ZEND_JMPZ 43
+#define ZEND_JMPNZ 44
+#define ZEND_JMPZNZ 45
+#define ZEND_JMPZ_EX 46
+#define ZEND_JMPNZ_EX 47
+#define ZEND_CASE 48
+#define ZEND_SWITCH_FREE 49
+#define ZEND_BRK 50
+#define ZEND_CONT 51
+#define ZEND_BOOL 52
+#define ZEND_INIT_STRING 53
+#define ZEND_ADD_CHAR 54
+#define ZEND_ADD_STRING 55
+#define ZEND_ADD_VAR 56
+#define ZEND_BEGIN_SILENCE 57
+#define ZEND_END_SILENCE 58
+#define ZEND_INIT_FCALL_BY_NAME 59
+#define ZEND_DO_FCALL 60
+#define ZEND_DO_FCALL_BY_NAME 61
+#define ZEND_RETURN 62
+#define ZEND_RECV 63
+#define ZEND_RECV_INIT 64
+#define ZEND_SEND_VAL 65
+#define ZEND_SEND_VAR 66
+#define ZEND_SEND_REF 67
+#define ZEND_NEW 68
+#define ZEND_INIT_NS_FCALL_BY_NAME 69
+#define ZEND_FREE 70
+#define ZEND_INIT_ARRAY 71
+#define ZEND_ADD_ARRAY_ELEMENT 72
+#define ZEND_INCLUDE_OR_EVAL 73
+#define ZEND_UNSET_VAR 74
+#define ZEND_UNSET_DIM 75
+#define ZEND_UNSET_OBJ 76
+#define ZEND_FE_RESET 77
+#define ZEND_FE_FETCH 78
+#define ZEND_EXIT 79
+#define ZEND_FETCH_R 80
+#define ZEND_FETCH_DIM_R 81
+#define ZEND_FETCH_OBJ_R 82
+#define ZEND_FETCH_W 83
+#define ZEND_FETCH_DIM_W 84
+#define ZEND_FETCH_OBJ_W 85
+#define ZEND_FETCH_RW 86
+#define ZEND_FETCH_DIM_RW 87
+#define ZEND_FETCH_OBJ_RW 88
+#define ZEND_FETCH_IS 89
+#define ZEND_FETCH_DIM_IS 90
+#define ZEND_FETCH_OBJ_IS 91
+#define ZEND_FETCH_FUNC_ARG 92
+#define ZEND_FETCH_DIM_FUNC_ARG 93
+#define ZEND_FETCH_OBJ_FUNC_ARG 94
+#define ZEND_FETCH_UNSET 95
+#define ZEND_FETCH_DIM_UNSET 96
+#define ZEND_FETCH_OBJ_UNSET 97
+#define ZEND_FETCH_DIM_TMP_VAR 98
+#define ZEND_FETCH_CONSTANT 99
+#define ZEND_EXT_STMT 101
+#define ZEND_EXT_FCALL_BEGIN 102
+#define ZEND_EXT_FCALL_END 103
+#define ZEND_EXT_NOP 104
+#define ZEND_TICKS 105
+#define ZEND_SEND_VAR_NO_REF 106
+#define ZEND_CATCH 107
+#define ZEND_THROW 108
+#define ZEND_FETCH_CLASS 109
+#define ZEND_CLONE 110
+#define ZEND_INIT_METHOD_CALL 112
+#define ZEND_INIT_STATIC_METHOD_CALL 113
+#define ZEND_ISSET_ISEMPTY_VAR 114
+#define ZEND_ISSET_ISEMPTY_DIM_OBJ 115
+#define ZEND_PRE_INC_OBJ 132
+#define ZEND_PRE_DEC_OBJ 133
+#define ZEND_POST_INC_OBJ 134
+#define ZEND_POST_DEC_OBJ 135
+#define ZEND_ASSIGN_OBJ 136
+#define ZEND_INSTANCEOF 138
+#define ZEND_DECLARE_CLASS 139
+#define ZEND_DECLARE_INHERITED_CLASS 140
+#define ZEND_DECLARE_FUNCTION 141
+#define ZEND_RAISE_ABSTRACT_ERROR 142
+#define ZEND_DECLARE_CONST 143
+#define ZEND_ADD_INTERFACE 144
+#define ZEND_DECLARE_INHERITED_CLASS_DELAYED 145
+#define ZEND_VERIFY_ABSTRACT_CLASS 146
+#define ZEND_ASSIGN_DIM 147
+#define ZEND_ISSET_ISEMPTY_PROP_OBJ 148
+#define ZEND_HANDLE_EXCEPTION 149
+#define ZEND_USER_OPCODE 150
+#define ZEND_JMP_SET 152
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
index 22463ad55c..c5f722e04c 100644
--- a/sapi/cgi/cgi_main.c
+++ b/sapi/cgi/cgi_main.c
@@ -1691,7 +1691,7 @@ consult the installation file that came with this distribution, or visit \n\
break;
case 'e': /* enable extended info output */
- CG(extended_info) = 1;
+ CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
break;
case 'f': /* parse file */
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index 3392fb0b22..f36f84427a 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -824,7 +824,7 @@ int main(int argc, char *argv[])
break;
case 'e': /* enable extended info output */
- CG(extended_info) = 1;
+ CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
break;
case 'F':
diff --git a/sapi/milter/php_milter.c b/sapi/milter/php_milter.c
index e0a3c60a1c..aa8e59d01b 100644
--- a/sapi/milter/php_milter.c
+++ b/sapi/milter/php_milter.c
@@ -1033,7 +1033,7 @@ int main(int argc, char *argv[])
break;
case 'e': /* enable extended info output */
- CG(extended_info) = 1;
+ CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
break;
case 'f': /* parse file */