]> 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:49 +0000 (08:36 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 18 Mar 2008 08:36:49 +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);
}

12 files changed:
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

index f4ef903e7ccd8f485685b5dc95c505a3166ce9d1..2c5c9a78c69d2fe537e0930bff4c5bb353882d5d 100644 (file)
@@ -688,13 +688,13 @@ 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 extended_info_default = 0;
+static zend_bool asp_tags_default                      = 0;
+static zend_bool short_tags_default                    = 1;
+static zend_uint compiler_options_default      = ZEND_COMPILE_DEFAULT;
 #else
-# define asp_tags_default              0
-# define short_tags_default            1
-# define extended_info_default 0
+# define asp_tags_default                      0
+# define short_tags_default                    1
+# define compiler_options_default      ZEND_COMPILE_DEFAULT
 #endif
 
 static void zend_set_default_compile_time_values(TSRMLS_D) /* {{{ */
@@ -702,7 +702,7 @@ static void zend_set_default_compile_time_values(TSRMLS_D) /* {{{ */
        /* default compile-time values */
        CG(asp_tags) = asp_tags_default;
        CG(short_tags) = short_tags_default;
-       CG(extended_info) = extended_info_default;
+       CG(compiler_options) = compiler_options_default;
        CG(literal_type) = ZEND_STR_TYPE;
 }
 /* }}} */
@@ -1194,7 +1194,7 @@ void zend_post_startup(TSRMLS_D) /* {{{ */
 
        asp_tags_default = CG(asp_tags);
        short_tags_default = CG(short_tags);
-       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 1ad1b5e1524fabb2467fcf25319b694a6a1c0741..5b8a09286fd73c159aa6c3d61dc6301616400f17 100644 (file)
@@ -159,7 +159,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;
        init_compiler_declarables(TSRMLS_C);
@@ -1324,7 +1323,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
                zend_u_hash_update(CG(function_table), Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), &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;
@@ -1537,7 +1536,9 @@ int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace
        }
 
        lcname = zend_u_str_case_fold(Z_TYPE(function_name->u.constant), Z_UNIVAL(function_name->u.constant), Z_UNILEN(function_name->u.constant), 0, &lcname_len);
-       if (zend_u_hash_find(CG(function_table), Z_TYPE(function_name->u.constant), lcname, lcname_len+1, (void **) &function)==FAILURE) {
+       if ((zend_u_hash_find(CG(function_table), Z_TYPE(function_name->u.constant), lcname, lcname_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.v);
                return 1; /* Dynamic */
@@ -1762,8 +1763,9 @@ void zend_resolve_class_name(znode *class_name, ulong *fetch_type, int check_ns_
                                efree(ns_lcname.v);
                        }
 
-                       if (zend_u_hash_find(CG(class_table), Z_TYPE(class_name->u.constant), lcname, lcname_len+1, (void**)&pce) == SUCCESS &&
-                           (*pce)->type == ZEND_INTERNAL_CLASS) {
+                       if ((CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES) ||
+                           (zend_u_hash_find(CG(class_table), Z_TYPE(class_name->u.constant), lcname, lcname_len+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
@@ -2970,7 +2972,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--;
@@ -2984,57 +2985,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_u_lookup_class(Z_TYPE_P(parent_name), Z_UNIVAL_P(parent_name), Z_UNILEN_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_u_lookup_class(Z_TYPE_P(parent_name), Z_UNIVAL_P(parent_name), Z_UNILEN_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;
@@ -3046,11 +3034,26 @@ void zend_do_early_binding(TSRMLS_D) /* {{{ */
        zend_u_hash_del(table, Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant));
        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_u_lookup_class(Z_TYPE(op_array->opcodes[opline_num-1].op2.u.constant), Z_UNIVAL(op_array->opcodes[opline_num-1].op2.u.constant), Z_UNILEN(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;
+       }
 }
 /* }}} */
 
@@ -4852,7 +4855,7 @@ void zend_do_extended_info(TSRMLS_D) /* {{{ */
 {
        zend_op *opline;
 
-       if (!CG(extended_info)) {
+       if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
                return;
        }
 
@@ -4868,7 +4871,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;
        }
 
@@ -4884,7 +4887,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 d322151247bb2bb4220948aaed6cde002c93caef..32be3e88d20c601b6e0526cc8434f73e2271023a 100644 (file)
@@ -229,6 +229,7 @@ struct _zend_op_array {
        zend_uint line_end;
        zstr doc_comment;
        zend_uint doc_comment_len;
+       zend_uint early_binding; /* the linked list of delayed declarations */
 
        void *reserved[ZEND_MAX_RESERVED_RESOURCES];
 };
@@ -440,6 +441,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);
 
@@ -759,6 +761,32 @@ END_EXTERN_C()
 
 #define ZEND_HALT_CONSTANT_NAME            "__COMPILER_HALT_OFFSET__"
 
+/* 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 216680ee3cc1faa1242e175c742e7f6bb21d9be8..09d4b1cf7cb4e93cec23ce9da5cbe1470b99d729 100644 (file)
@@ -1409,7 +1409,7 @@ ZEND_API int zend_u_eval_string(zend_uchar type, zstr string, zval *retval_ptr,
        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 (type == IS_UNICODE) {
@@ -1443,10 +1443,10 @@ ZEND_API int zend_u_eval_string(zend_uchar type, zstr string, zval *retval_ptr,
 
        /*printf("Evaluating '%s'\n", Z_STRVAL(pv));*/
 
-       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 45e6f5296635ce90500d7611adcb64aaa0f3b180..3feb64dd52dbf5623bc0f3e49be0247d02047235 100644 (file)
@@ -105,10 +105,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;
@@ -139,6 +135,8 @@ struct _zend_compiler_globals {
        HashTable *labels;
        zend_stack labels_stack;
 
+       zend_uint compiler_options; /* set of ZEND_COMPILE_* constants */
+
        zval      *current_namespace;
        HashTable *current_import;
 
index c206fdfe4ed1a72c7c2af44a4e7910efeabecb13..e58b54bc37705c536403535eecd05987315fef5d 100644 (file)
@@ -107,6 +107,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);
@@ -413,10 +415,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 95cf3d771e2c62f900529be658fae9d058eafda3..bd658a94d311a2e7a2a48224f334cae5570ec656 100644 (file)
@@ -4130,6 +4130,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 fb6826e8ff4597559f36cfcae3fb921fd6178b54..80130885954291ed7d855e5b144e315e8a977874 100644 (file)
@@ -490,6 +490,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);
@@ -34141,31 +34154,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 25355acf27677d3cf4fc2d8b56e18ccd3912292f..72b15286a1349cfc6e42900bf1fb3a0f39572571 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_GOTO                    100
-#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_U_NORMALIZE             151
-#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_GOTO                            100
+#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_U_NORMALIZE                     151
+#define ZEND_JMP_SET                         152
index 5252d996cf232818b0cd595a14017a1cb99fd017..75638d41e18a6e1d40d92e242c6ee1c60ffc538a 100644 (file)
@@ -1698,7 +1698,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 4478288cb7d20c5343ffb83b57629bf76c7d9f6c..05ee0cc05c9293a39e1018d0779772294cafe1c1 100644 (file)
@@ -837,7 +837,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 fab63083681956b0b236bd5608cd0eac044ad8bd..966651e77208b18d5b1e16933649b31ac11af538 100644 (file)
@@ -1032,7 +1032,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 */