cvs: ZendEngine2(PHP_5_3) / zend.c zend_compile.c zend_compile.h zend_execute_API.c zend_globals.h zend_opcode.c zend_vm_def.h zend_vm_execute.h zend_vm_opcodes.h php-src NEWS php-src/sapi/cgi cgi_main.c php-src/sapi/cli php_cli.c php-src/sapi/milter php_milter.c

[email protected] ("Dmitry Stogov")
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1205829392@cvsserver>
dmitry		Tue Mar 18 08:36:32 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src	NEWS 
    /php-src/sapi/cgi	cgi_main.c 
    /php-src/sapi/cli	php_cli.c 
    /php-src/sapi/milter	php_milter.c 
    /ZendEngine2	zend.c zend_compile.c zend_compile.h 
                	zend_execute_API.c zend_globals.h zend_opcode.c 
                	zend_vm_def.h zend_vm_execute.h zend_vm_opcodes.h 
  Log:
  Implemented 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.
  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);
  }
dmitry-20080318083632.txt (text/plain, 36.8 KB)
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.144&r2=1.2027.2.547.2.965.2.145&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.144 php-src/NEWS:1.2027.2.547.2.965.2.145
--- php-src/NEWS:1.2027.2.547.2.965.2.144	Mon Mar 17 16:34:18 2008
+++ php-src/NEWS	Tue Mar 18 08:36:27 2008
@@ -3,6 +3,9 @@
 ?? ??? 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:
http://cvs.php.net/viewvc.cgi/php-src/sapi/cgi/cgi_main.c?r1=1.267.2.15.2.50.2.14&r2=1.267.2.15.2.50.2.15&diff_format=u
Index: php-src/sapi/cgi/cgi_main.c
diff -u php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.50.2.14 php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.50.2.15
--- php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.50.2.14	Sun Mar 16 21:06:54 2008
+++ php-src/sapi/cgi/cgi_main.c	Tue Mar 18 08:36:27 2008
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: cgi_main.c,v 1.267.2.15.2.50.2.14 2008/03/16 21:06:54 helly Exp $ */
+/* $Id: cgi_main.c,v 1.267.2.15.2.50.2.15 2008/03/18 08:36:27 dmitry Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -1691,7 +1691,7 @@
 							break;
 
 						case 'e': /* enable extended info output */
-							CG(extended_info) = 1;
+							CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
 							break;
 
 						case 'f': /* parse file */
http://cvs.php.net/viewvc.cgi/php-src/sapi/cli/php_cli.c?r1=1.129.2.13.2.22.2.5&r2=1.129.2.13.2.22.2.6&diff_format=u
Index: php-src/sapi/cli/php_cli.c
diff -u php-src/sapi/cli/php_cli.c:1.129.2.13.2.22.2.5 php-src/sapi/cli/php_cli.c:1.129.2.13.2.22.2.6
--- php-src/sapi/cli/php_cli.c:1.129.2.13.2.22.2.5	Sun Mar 16 21:06:54 2008
+++ php-src/sapi/cli/php_cli.c	Tue Mar 18 08:36:27 2008
@@ -20,7 +20,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_cli.c,v 1.129.2.13.2.22.2.5 2008/03/16 21:06:54 helly Exp $ */
+/* $Id: php_cli.c,v 1.129.2.13.2.22.2.6 2008/03/18 08:36:27 dmitry Exp $ */
 
 #include "php.h"
 #include "php_globals.h"
@@ -824,7 +824,7 @@
 				break;
 
 			case 'e': /* enable extended info output */
-				CG(extended_info) = 1;
+				CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
 				break;
 
 			case 'F':
http://cvs.php.net/viewvc.cgi/php-src/sapi/milter/php_milter.c?r1=1.14.2.2.2.3.2.2&r2=1.14.2.2.2.3.2.3&diff_format=u
Index: php-src/sapi/milter/php_milter.c
diff -u php-src/sapi/milter/php_milter.c:1.14.2.2.2.3.2.2 php-src/sapi/milter/php_milter.c:1.14.2.2.2.3.2.3
--- php-src/sapi/milter/php_milter.c:1.14.2.2.2.3.2.2	Mon Dec 31 07:17:18 2007
+++ php-src/sapi/milter/php_milter.c	Tue Mar 18 08:36:27 2008
@@ -1033,7 +1033,7 @@
 				break;
 
 			case 'e': /* enable extended info output */
-				CG(extended_info) = 1;
+				CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
 				break;
 
 			case 'f': /* parse file */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.c?r1=1.308.2.12.2.35.2.11&r2=1.308.2.12.2.35.2.12&diff_format=u
Index: ZendEngine2/zend.c
diff -u ZendEngine2/zend.c:1.308.2.12.2.35.2.11 ZendEngine2/zend.c:1.308.2.12.2.35.2.12
--- ZendEngine2/zend.c:1.308.2.12.2.35.2.11	Sun Mar 16 21:05:33 2008
+++ ZendEngine2/zend.c	Tue Mar 18 08:36:28 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend.c,v 1.308.2.12.2.35.2.11 2008/03/16 21:05:33 helly Exp $ */
+/* $Id: zend.c,v 1.308.2.12.2.35.2.12 2008/03/18 08:36:28 dmitry Exp $ */
 
 #include "zend.h"
 #include "zend_extensions.h"
@@ -443,15 +443,15 @@
 /* }}} */
 
 #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 @@
 	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 @@
 	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);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.51&r2=1.647.2.27.2.41.2.52&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.51 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.52
--- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.51	Mon Mar 17 14:54:42 2008
+++ ZendEngine2/zend_compile.c	Tue Mar 18 08:36:28 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.51 2008/03/17 14:54:42 tony2001 Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.52 2008/03/18 08:36:28 dmitry Exp $ */
 
 #include <zend_language_parser.h>
 #include "zend.h"
@@ -126,7 +126,6 @@
 	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 @@
 		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 @@
 	}
 	
 	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 @@
 				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 @@
 {
 	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 @@
 			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 @@
 	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 @@
 {
 	zend_op *opline;
 
-	if (!CG(extended_info)) {
+	if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
 		return;
 	}
 
@@ -4478,7 +4479,7 @@
 {
 	zend_op *opline;
 
-	if (!CG(extended_info)) {
+	if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
 		return;
 	}
 
@@ -4494,7 +4495,7 @@
 {
 	zend_op *opline;
 
-	if (!CG(extended_info)) {
+	if (!(CG(compiler_options) & ZEND_COMPILE_EXTENDED_INFO)) {
 		return;
 	}
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.h?r1=1.316.2.8.2.12.2.17&r2=1.316.2.8.2.12.2.18&diff_format=u
Index: ZendEngine2/zend_compile.h
diff -u ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.17 ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.18
--- ZendEngine2/zend_compile.h:1.316.2.8.2.12.2.17	Sun Mar 16 21:42:42 2008
+++ ZendEngine2/zend_compile.h	Tue Mar 18 08:36:28 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_compile.h,v 1.316.2.8.2.12.2.17 2008/03/16 21:42:42 helly Exp $ */
+/* $Id: zend_compile.h,v 1.316.2.8.2.12.2.18 2008/03/18 08:36:28 dmitry Exp $ */
 
 #ifndef ZEND_COMPILE_H
 #define ZEND_COMPILE_H
@@ -224,6 +224,7 @@
 	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 @@
 
 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 @@
 #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 */
 
 /*
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.331.2.20.2.24.2.28&r2=1.331.2.20.2.24.2.29&diff_format=u
Index: ZendEngine2/zend_execute_API.c
diff -u ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.28 ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.29
--- ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.28	Sun Mar  9 20:52:29 2008
+++ ZendEngine2/zend_execute_API.c	Tue Mar 18 08:36:28 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.28 2008/03/09 20:52:29 tony2001 Exp $ */
+/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.29 2008/03/18 08:36:28 dmitry Exp $ */
 
 #include <stdio.h>
 #include <signal.h>
@@ -1264,7 +1264,7 @@
 	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 @@
 
 	/*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;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_globals.h?r1=1.141.2.3.2.7.2.9&r2=1.141.2.3.2.7.2.10&diff_format=u
Index: ZendEngine2/zend_globals.h
diff -u ZendEngine2/zend_globals.h:1.141.2.3.2.7.2.9 ZendEngine2/zend_globals.h:1.141.2.3.2.7.2.10
--- ZendEngine2/zend_globals.h:1.141.2.3.2.7.2.9	Sun Mar 16 21:05:33 2008
+++ ZendEngine2/zend_globals.h	Tue Mar 18 08:36:28 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_globals.h,v 1.141.2.3.2.7.2.9 2008/03/16 21:05:33 helly Exp $ */
+/* $Id: zend_globals.h,v 1.141.2.3.2.7.2.10 2008/03/18 08:36:28 dmitry Exp $ */
 
 #ifndef ZEND_GLOBALS_H
 #define ZEND_GLOBALS_H
@@ -55,6 +55,9 @@
 /* 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 @@
 
 	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 @@
 	char *doc_comment;
 	zend_uint doc_comment_len;
 
+	zend_uint compiler_options; /* set of ZEND_COMPILE_* constants */
+
 	zval      *current_namespace;
 	HashTable *current_import;
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_opcode.c?r1=1.110.2.6.2.3.2.5&r2=1.110.2.6.2.3.2.6&diff_format=u
Index: ZendEngine2/zend_opcode.c
diff -u ZendEngine2/zend_opcode.c:1.110.2.6.2.3.2.5 ZendEngine2/zend_opcode.c:1.110.2.6.2.3.2.6
--- ZendEngine2/zend_opcode.c:1.110.2.6.2.3.2.5	Mon Dec 31 07:17:04 2007
+++ ZendEngine2/zend_opcode.c	Tue Mar 18 08:36:28 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_opcode.c,v 1.110.2.6.2.3.2.5 2007/12/31 07:17:04 sebastian Exp $ */
+/* $Id: zend_opcode.c,v 1.110.2.6.2.3.2.6 2008/03/18 08:36:28 dmitry Exp $ */
 
 #include <stdio.h>
 
@@ -101,6 +101,8 @@
 
 	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 @@
 	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);
 	}
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.43&r2=1.59.2.29.2.48.2.44&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.43 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.44
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.43	Sun Mar 16 21:05:33 2008
+++ ZendEngine2/zend_vm_def.h	Tue Mar 18 08:36:28 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.43 2008/03/16 21:05:33 helly Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.44 2008/03/18 08:36:28 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -3962,6 +3962,19 @@
 	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);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.49.2.42&r2=1.62.2.30.2.49.2.43&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.42 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.43
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.42	Sun Mar 16 21:05:33 2008
+++ ZendEngine2/zend_vm_execute.h	Tue Mar 18 08:36:28 2008
@@ -482,6 +482,19 @@
 	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 @@
   	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,
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_opcodes.h?r1=1.42.2.17.2.1.2.4&r2=1.42.2.17.2.1.2.5&diff_format=u
Index: ZendEngine2/zend_vm_opcodes.h
diff -u ZendEngine2/zend_vm_opcodes.h:1.42.2.17.2.1.2.4 ZendEngine2/zend_vm_opcodes.h:1.42.2.17.2.1.2.5
--- ZendEngine2/zend_vm_opcodes.h:1.42.2.17.2.1.2.4	Mon Dec 31 07:17:06 2007
+++ ZendEngine2/zend_vm_opcodes.h	Tue Mar 18 08:36:30 2008
@@ -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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.