]> granicus.if.org Git - php/commitdiff
Implemented concept of "delayed early binding" that allows opcode caches to perform...
authorDmitry Stogov <dmitry@php.net>
Tue, 18 Mar 2008 08:36:30 +0000 (08:36 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 18 Mar 2008 08:36:30 +0000 (08:36 +0000)
The following pseudo-code explains how it should be used in opcode cache.

function cache_compile_file($filename) {
        if (!is_cached($filename)) {
                ...
                orig_compiler_options = CG(compiler_optins);
                CG(compiler_options) |= ZEND_COMPILE_IGNORE_INTERNAL_CLASSES |
                                        ZEND_COMPILE_DELAYED_BINDING;
                $op_array = orig_compile_file($filename);
                CG(compiler_options) = orig_copiler_options;
                ...
        } else {
                $op_array = restore_from_cache($filename);
        }
        zend_do_delayed_early_binding($op_array);
}

13 files changed:
NEWS
Zend/zend.c
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute_API.c
Zend/zend_globals.h
Zend/zend_opcode.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_opcodes.h
sapi/cgi/cgi_main.c
sapi/cli/php_cli.c
sapi/milter/php_milter.c

diff --git a/NEWS b/NEWS
index 70e0e06e370dad05a08b140cc0570b43417a378a..da0c28ca73ecc29854a018419990c56deff97256 100644 (file)
--- 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:
index 5d8eeffd01e9980c38d96e4ded5a2924ce21a23a..97fe82080c6fa110d4418a6597919e26d03f8c19 100644 (file)
@@ -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);
index f6af8c84aa0141dc9f2fc67f73a6f31ad93f67cb..2d885da9eb4dee6ee6b3f2a5c787b676a3c75b00 100644 (file)
@@ -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;
        }
 
index 4e1d5cc9ed914e43101fbbdec3fbf2268649e423..21260e8f511de16e74837cc4be4cfcfde553253f 100644 (file)
@@ -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 */
 
 /*
index 95491966baa5cd703f4cac38428d69ec4980e42d..3f646162a20e21088271678689a7a9f65dab871f 100644 (file)
@@ -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;
index 8253ff3ba0f0ad738b02ae43fddf699c33bc5b01..b387c5db1abe65046c1254c82cbacbb660f6d36b 100644 (file)
@@ -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;
 
index bc9b2ab5bb300ef86093398606e3da66f966a2eb..f1c4e1d4bb7fb27db7762574e4f03c0c272dd626 100644 (file)
@@ -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);
        }
 
index f01a76b1cb6176bf08f8b46a25551ead96bb97a0..e7b09e4bcbae13cd94f7c8a30e1e36b973275178 100644 (file)
@@ -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);
index efa6ef7d7cee3cf61df35c17648f0f3e16878ec6..95bc66e9c837fc17eaa997233e17c22ecebca9f1 100644 (file)
@@ -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,
index 3ef0386a0f5d720670389ec61ccd0c734ffbf1fb..f581404080e3d958eae0b878773d5f6f3b08dd63 100644 (file)
    +----------------------------------------------------------------------+
 */
 
-#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
index 22463ad55c519c2f6855485b81d0f971306f1e19..c5f722e04c2f574fef765470717fd9e51ad096e0 100644 (file)
@@ -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 */
index 3392fb0b22f850e7ab0d83575acb834c382fdc3f..f36f84427ae4f43dc18952835c9170e9869c7ba6 100644 (file)
@@ -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':
index e0a3c60a1c93f4836755d41d6f44ab6b738d1903..aa8e59d01b949bb2ac7b1b283331d359f8451faf 100644 (file)
@@ -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 */