Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:27668 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 25356 invoked by uid 1010); 26 Jan 2007 14:32:14 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 25341 invoked from network); 26 Jan 2007 14:32:14 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 26 Jan 2007 14:32:14 -0000 Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 212.25.124.162 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 212.25.124.162 mail.zend.com Linux 2.5 (sometimes 2.4) (4) Received: from [212.25.124.162] ([212.25.124.162:25089] helo=mail.zend.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 9F/13-45640-CE01AB54 for ; Fri, 26 Jan 2007 09:32:14 -0500 Received: (qmail 29663 invoked from network); 26 Jan 2007 14:30:30 -0000 Received: from internal.zend.office (HELO thinkpad) (10.1.1.1) by internal.zend.office with SMTP; 26 Jan 2007 14:30:30 -0000 To: "'Sara Golemon'" , , "'Andi Gutmans'" , "'Andrei Zmievski'" Cc: "Zeev Suraski" , "Stanislav Malyshev" Date: Fri, 26 Jan 2007 17:32:05 +0300 Message-ID: <000001c74156$c1b49a20$6e02a8c0@thinkpad> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0001_01C7416F.E701D220" X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook, Build 10.0.6626 Importance: Normal In-Reply-To: <45B7BA56.40406@php.net> X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028 Subject: RE: [PHP-DEV] Runtime-JIT, the whole enchilada From: dmitry@zend.com ("Dmitry Stogov") References: <45B7BA56.40406@php.net> ------=_NextPart_000_0001_01C7416F.E701D220 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi Sara, I fixed one error in your patch, so now it passes all tests. BTW I am against this patch. 1) It adds sloppily built functionality into the core and slowdowns EACH dimension or property fetch both at run-time and compilation-time. I think it is a big cost for $_GET/$_POST encoding-conversion, but it is only my opinion. 2) It adds pointer to zend_auto_global into zend_compiled_variable. This makes troubles for opcode caches - zend_compiled_variable(s) may lay in shared memory, so they cannot point to process specific data. I think this issue can be fixed using indirect pointer (index). I would prefer rollback "auto-globals CV" patch and commit (or not) the whole patch after conclusion. Why did you reject auto-globals as overloaded arrays? Thanks. Dmitry. > -----Original Message----- > From: Sara Golemon [mailto:pollita@php.net] > Sent: Wednesday, January 24, 2007 10:58 PM > To: internals@lists.php.net; Dmitry Stogov; Andi Gutmans; > Andrei Zmievski > Subject: [PHP-DEV] Runtime-JIT, the whole enchilada > > > Dmitry- > > You asked for it, you get it :) Hopefully it'll be > self-explanatory, > the one part I hope you don't notice is that I put the > auto_global check > back into fetch_simple_variable_ex in order to force direct access to > autoglobals ($foo = $_GET; foreach($_POST as ...) etc...) as > non-auto-globals. Ultimately this made catching the > difference between > a whole var access and a dim/obj access much more > straight-forward and > computationally cheap. It comes at a slight cost for those > fetches, but > hopefully they're in the minority. > > Bench numbers with this patch: > simple 0.461 > simplecall 1.985 > simpleucall 2.900 > simpleudcall 3.488 > mandel 2.136 > mandel2 3.192 > ackermann(7) 3.490 > ary(50000) 0.154 > ary2(50000) 0.137 > ary3(2000) 1.076 > fibo(30) 9.766 > hash1(50000) 0.423 > hash2(500) 0.307 > heapsort(20000) 0.799 > matrix(20) 0.526 > nestedloop(12) 0.866 > sieve(30) 0.630 > strcat(200000) 0.303 > ------------------------ > Total 32.639 > > -Sara > > ------=_NextPart_000_0001_01C7416F.E701D220 Content-Type: text/plain; name="jit-2.diff.txt" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="jit-2.diff.txt" Index: main/php_variables.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /repository/php-src/main/php_variables.c,v=0A= retrieving revision 1.136=0A= diff -u -p -d -r1.136 php_variables.c=0A= --- main/php_variables.c 1 Jan 2007 09:29:35 -0000 1.136=0A= +++ main/php_variables.c 26 Jan 2007 10:23:11 -0000=0A= @@ -628,9 +628,9 @@ void _php_import_environment_variables(z=0A= }=0A= }=0A= =0A= -zend_bool php_std_auto_global_callback(char *name, uint name_len = TSRMLS_DC)=0A= +zend_bool php_std_auto_global_callback(zend_auto_global *auto_global, = int stage, zval *ag_val, int fetch_op, zval *member TSRMLS_DC)=0A= {=0A= - zend_printf("%s\n", name);=0A= + zend_printf("%s\n", auto_global->name);=0A= return 0; /* don't rearm */=0A= }=0A= =0A= @@ -802,9 +802,13 @@ static void php_autoglobal_merge(HashTab=0A= }=0A= /* }}} */=0A= =0A= -static zend_bool php_auto_globals_create_server(char *name, uint = name_len TSRMLS_DC);=0A= -static zend_bool php_auto_globals_create_env(char *name, uint name_len = TSRMLS_DC);=0A= -static zend_bool php_auto_globals_create_request(char *name, uint = name_len TSRMLS_DC);=0A= +static zend_auto_global *php_server_auto_global =3D NULL;=0A= +static zend_auto_global *php_env_auto_global =3D NULL;=0A= +static zend_auto_global *php_request_auto_global =3D NULL;=0A= +=0A= +static zend_bool php_auto_globals_create_server(zend_auto_global = *auto_global, int stage, zval *ag_val, int fetch_op, zval *member = TSRMLS_DC);=0A= +static zend_bool php_auto_globals_create_env(zend_auto_global = *auto_global, int stage, zval *ag_val, int fetch_op, zval *member = TSRMLS_DC);=0A= +static zend_bool php_auto_globals_create_request(zend_auto_global = *auto_global, int stage, zval *ag_val, int fetch_op, zval *member = TSRMLS_DC);=0A= =0A= /* {{{ php_hash_environment=0A= */=0A= @@ -861,16 +865,14 @@ int php_hash_environment(TSRMLS_D)=0A= case 'e':=0A= case 'E':=0A= if (!jit_initialization && !_gpc_flags[3]) {=0A= - zend_auto_global_disable_jit("_ENV", sizeof("_ENV")-1 TSRMLS_CC);=0A= - php_auto_globals_create_env("_ENV", sizeof("_ENV")-1 TSRMLS_CC);=0A= + php_env_auto_global->armed =3D = php_auto_globals_create_env(php_env_auto_global, ZEND_RT, NULL, = ZEND_FETCH_R, NULL TSRMLS_CC);=0A= _gpc_flags[3] =3D 1;=0A= }=0A= break;=0A= case 's':=0A= case 'S':=0A= if (!jit_initialization && !_gpc_flags[4]) {=0A= - zend_auto_global_disable_jit("_SERVER", sizeof("_SERVER")-1 = TSRMLS_CC);=0A= - php_register_server_variables(TSRMLS_C);=0A= + php_server_auto_global->armed =3D = php_auto_globals_create_server(php_server_auto_global, ZEND_RT, NULL, = ZEND_FETCH_R, NULL TSRMLS_CC);=0A= _gpc_flags[4] =3D 1;=0A= }=0A= break;=0A= @@ -904,15 +906,14 @@ int php_hash_environment(TSRMLS_D)=0A= =0A= /* Create _REQUEST */=0A= if (!jit_initialization) {=0A= - zend_auto_global_disable_jit("_REQUEST", sizeof("_REQUEST")-1 = TSRMLS_CC);=0A= - php_auto_globals_create_request("_REQUEST", sizeof("_REQUEST")-1 = TSRMLS_CC);=0A= + php_request_auto_global->armed =3D = php_auto_globals_create_request(php_request_auto_global, ZEND_RT, NULL, = ZEND_FETCH_R, NULL TSRMLS_CC);=0A= }=0A= =0A= return SUCCESS;=0A= }=0A= /* }}} */=0A= =0A= -static zend_bool php_auto_globals_create_server(char *name, uint = name_len TSRMLS_DC)=0A= +static zend_bool php_auto_globals_create_server(zend_auto_global = *auto_global, int stage, zval *ag_val, int fetch_op, zval *member = TSRMLS_DC)=0A= {=0A= if (PG(variables_order) && (strchr(PG(variables_order),'S') || = strchr(PG(variables_order),'s'))) {=0A= php_register_server_variables(TSRMLS_C);=0A= @@ -944,13 +945,13 @@ static zend_bool php_auto_globals_create=0A= PG(http_globals)[TRACK_VARS_SERVER] =3D server_vars;=0A= }=0A= =0A= - zend_ascii_hash_update(&EG(symbol_table), name, name_len + 1, = &PG(http_globals)[TRACK_VARS_SERVER], sizeof(zval *), NULL);=0A= + zend_ascii_hash_update(&EG(symbol_table), auto_global->name, = auto_global->name_len + 1, &PG(http_globals)[TRACK_VARS_SERVER], = sizeof(zval *), NULL);=0A= PG(http_globals)[TRACK_VARS_SERVER]->refcount++;=0A= =0A= return 0; /* don't rearm */=0A= }=0A= =0A= -static zend_bool php_auto_globals_create_env(char *name, uint name_len = TSRMLS_DC)=0A= +static zend_bool php_auto_globals_create_env(zend_auto_global = *auto_global, int stage, zval *ag_val, int fetch_op, zval *member = TSRMLS_DC)=0A= {=0A= zval *env_vars =3D NULL;=0A= ALLOC_ZVAL(env_vars);=0A= @@ -965,13 +966,13 @@ static zend_bool php_auto_globals_create=0A= php_import_environment_variables(PG(http_globals)[TRACK_VARS_ENV] = TSRMLS_CC);=0A= }=0A= =0A= - zend_ascii_hash_update(&EG(symbol_table), name, name_len + 1, = &PG(http_globals)[TRACK_VARS_ENV], sizeof(zval *), NULL);=0A= + zend_ascii_hash_update(&EG(symbol_table), auto_global->name, = auto_global->name_len + 1, &PG(http_globals)[TRACK_VARS_ENV], = sizeof(zval *), NULL);=0A= PG(http_globals)[TRACK_VARS_ENV]->refcount++;=0A= =0A= return 0; /* don't rearm */=0A= }=0A= =0A= -static zend_bool php_auto_globals_create_request(char *name, uint = name_len TSRMLS_DC)=0A= +static zend_bool php_auto_globals_create_request(zend_auto_global = *auto_global, int stage, zval *ag_val, int fetch_op, zval *member = TSRMLS_DC)=0A= {=0A= zval *form_variables;=0A= unsigned char _gpc_flags[3] =3D {0, 0, 0};=0A= @@ -1007,7 +1008,7 @@ static zend_bool php_auto_globals_create=0A= }=0A= }=0A= =0A= - zend_ascii_hash_update(&EG(symbol_table), "_REQUEST", = sizeof("_REQUEST"), &form_variables, sizeof(zval *), NULL);=0A= + zend_ascii_hash_update(&EG(symbol_table), auto_global->name, = auto_global->name_len + 1, &form_variables, sizeof(zval *), NULL);=0A= return 0;=0A= }=0A= =0A= @@ -1016,9 +1017,9 @@ void php_startup_auto_globals(TSRMLS_D)=0A= zend_register_auto_global("_GET", sizeof("_GET")-1, NULL TSRMLS_CC);=0A= zend_register_auto_global("_POST", sizeof("_POST")-1, NULL TSRMLS_CC);=0A= zend_register_auto_global("_COOKIE", sizeof("_COOKIE")-1, NULL = TSRMLS_CC);=0A= - zend_register_auto_global("_SERVER", sizeof("_SERVER")-1, = php_auto_globals_create_server TSRMLS_CC);=0A= - zend_register_auto_global("_ENV", sizeof("_ENV")-1, = php_auto_globals_create_env TSRMLS_CC);=0A= - zend_register_auto_global("_REQUEST", sizeof("_REQUEST")-1, = php_auto_globals_create_request TSRMLS_CC);=0A= + zend_register_auto_global_ex("_SERVER", sizeof("_SERVER")-1, = php_auto_globals_create_server, &php_server_auto_global TSRMLS_CC);=0A= + zend_register_auto_global_ex("_ENV", sizeof("_ENV")-1, = php_auto_globals_create_env, &php_env_auto_global TSRMLS_CC);=0A= + zend_register_auto_global_ex("_REQUEST", sizeof("_REQUEST")-1, = php_auto_globals_create_request, &php_request_auto_global TSRMLS_CC);=0A= zend_register_auto_global("_FILES", sizeof("_FILES")-1, NULL = TSRMLS_CC);=0A= }=0A= =0A= Index: Zend/zend_compile.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /repository/ZendEngine2/zend_compile.c,v=0A= retrieving revision 1.736=0A= diff -u -p -d -r1.736 zend_compile.c=0A= --- Zend/zend_compile.c 20 Jan 2007 20:36:55 -0000 1.736=0A= +++ Zend/zend_compile.c 26 Jan 2007 10:23:12 -0000=0A= @@ -290,7 +290,8 @@ static int lookup_cv(zend_op_array *op_a=0A= op_array->vars[i].name =3D name; /* estrndup(name, name_len); */=0A= op_array->vars[i].name_len =3D name_len;=0A= op_array->vars[i].hash_value =3D hash_value;=0A= - op_array->vars[i].fetch_type =3D zend_u_is_auto_global(type, name, = name_len TSRMLS_CC) ? ZEND_FETCH_GLOBAL : ZEND_FETCH_LOCAL;=0A= + op_array->vars[i].auto_global =3D NULL;=0A= + op_array->vars[i].fetch_type =3D zend_u_is_auto_global(type, name, = name_len, &(op_array->vars[i].auto_global) TSRMLS_CC) ? = ZEND_FETCH_AUTO_GLOBAL : ZEND_FETCH_LOCAL;=0A= return i;=0A= }=0A= =0A= @@ -377,18 +378,22 @@ void fetch_simple_variable_ex(znode *res=0A= zend_op opline;=0A= zend_op *opline_ptr;=0A= zend_llist *fetch_list_ptr;=0A= + long fetch_type =3D ZEND_FETCH_LOCAL;=0A= =0A= if (varname->op_type =3D=3D IS_CONST &&=0A= (Z_TYPE(varname->u.constant) =3D=3D IS_STRING ||=0A= Z_TYPE(varname->u.constant) =3D=3D IS_UNICODE) &&=0A= !(Z_UNILEN(varname->u.constant) =3D=3D (sizeof("this")-1) &&=0A= - ZEND_U_EQUAL(Z_TYPE(varname->u.constant), = Z_UNIVAL(varname->u.constant), Z_UNILEN(varname->u.constant), "this", = sizeof("this")-1)) &&=0A= - (CG(active_op_array)->last =3D=3D 0 ||=0A= - CG(active_op_array)->opcodes[CG(active_op_array)->last-1].opcode = !=3D ZEND_BEGIN_SILENCE)) {=0A= - result->op_type =3D IS_CV;=0A= - result->u.var =3D lookup_cv(CG(active_op_array), = Z_TYPE(varname->u.constant), Z_UNIVAL(varname->u.constant), = Z_UNILEN(varname->u.constant) TSRMLS_CC);=0A= - result->u.EA.type =3D 0;=0A= - return;=0A= + ZEND_U_EQUAL(Z_TYPE(varname->u.constant), = Z_UNIVAL(varname->u.constant), Z_UNILEN(varname->u.constant), "this", = sizeof("this")-1))) {=0A= + if (zend_u_is_auto_global(Z_TYPE(varname->u.constant), = Z_UNIVAL(varname->u.constant), Z_UNILEN(varname->u.constant), NULL = TSRMLS_CC)) {=0A= + fetch_type =3D ZEND_FETCH_AUTO_GLOBAL;=0A= + } else if (CG(active_op_array)->last =3D=3D 0 ||=0A= + = CG(active_op_array)->opcodes[CG(active_op_array)->last-1].opcode !=3D = ZEND_BEGIN_SILENCE) {=0A= + result->op_type =3D IS_CV;=0A= + result->u.var =3D lookup_cv(CG(active_op_array), = Z_TYPE(varname->u.constant), Z_UNIVAL(varname->u.constant), = Z_UNILEN(varname->u.constant) TSRMLS_CC);=0A= + result->u.EA.type =3D 0;=0A= + return;=0A= + }=0A= }=0A= =0A= if (bp) {=0A= @@ -405,15 +410,7 @@ void fetch_simple_variable_ex(znode *res=0A= opline_ptr->op1 =3D *varname;=0A= *result =3D opline_ptr->result;=0A= SET_UNUSED(opline_ptr->op2);=0A= -=0A= - opline_ptr->op2.u.EA.type =3D ZEND_FETCH_LOCAL;=0A= - if (varname->op_type =3D=3D IS_CONST &&=0A= - (Z_TYPE(varname->u.constant) =3D=3D IS_STRING ||=0A= - Z_TYPE(varname->u.constant) =3D=3D IS_UNICODE)) {=0A= - if (zend_u_is_auto_global(Z_TYPE(varname->u.constant), = Z_UNIVAL(varname->u.constant), Z_UNILEN(varname->u.constant) TSRMLS_CC)) = {=0A= - opline_ptr->op2.u.EA.type =3D ZEND_FETCH_GLOBAL;=0A= - }=0A= - }=0A= + opline_ptr->op2.u.EA.type =3D fetch_type;=0A= =0A= if (bp) {=0A= zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr);=0A= @@ -492,6 +489,31 @@ void fetch_array_dim(znode *result, znod=0A= zend_op opline;=0A= zend_llist *fetch_list_ptr;=0A= =0A= + zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr);=0A= + if (fetch_list_ptr->count =3D=3D 1) {=0A= + zend_llist_element *le =3D fetch_list_ptr->head;=0A= + zend_op *parentop =3D (zend_op*)le->data;=0A= +=0A= + if (parentop && parentop->opcode =3D=3D ZEND_FETCH_W &&=0A= + (parentop->op2.u.EA.type =3D=3D ZEND_FETCH_LOCAL ||=0A= + parentop->op2.u.EA.type =3D=3D ZEND_FETCH_AUTO_GLOBAL) &&=0A= + parent->op_type =3D=3D IS_VAR && parentop->result.op_type =3D=3D = IS_VAR && parent->u.var =3D=3D parentop->result.u.var &&=0A= + parentop->op1.op_type =3D=3D IS_CONST &&=0A= + (Z_TYPE(parentop->op1.u.constant) =3D=3D IS_STRING || = Z_TYPE(parentop->op1.u.constant) =3D=3D IS_UNICODE) &&=0A= + !(Z_UNILEN(parentop->op1.u.constant) =3D=3D (sizeof("this")-1) && = ZEND_U_EQUAL(Z_TYPE(parentop->op1.u.constant), = Z_UNIVAL(parentop->op1.u.constant), Z_UNILEN(parentop->op1.u.constant), = "this", sizeof("this")-1)) ) {=0A= + /* Recompile CV and rewrite previous op to direct FETCH_DIM */=0A= + zval tmp =3D parentop->op1.u.constant;=0A= + parentop->opcode =3D ZEND_FETCH_DIM_W;=0A= + parentop->op1.op_type =3D IS_CV;=0A= + parentop->op1.u.var =3D lookup_cv(CG(active_op_array), Z_TYPE(tmp), = Z_UNIVAL(tmp), Z_UNILEN(tmp) TSRMLS_CC);=0A= + parentop->op1.u.EA.type =3D 0;=0A= + parentop->op2 =3D *dim;=0A= + parentop->extended_value =3D ZEND_FETCH_STANDARD;=0A= + *result =3D parentop->result;=0A= + return;=0A= + }=0A= + }=0A= +=0A= init_op(&opline TSRMLS_CC);=0A= opline.opcode =3D ZEND_FETCH_DIM_W; /* the backpatching routine = assumes W */=0A= opline.result.op_type =3D IS_VAR;=0A= @@ -502,7 +524,6 @@ void fetch_array_dim(znode *result, znod=0A= opline.extended_value =3D ZEND_FETCH_STANDARD;=0A= *result =3D opline.result;=0A= =0A= - zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr);=0A= zend_llist_add_element(fetch_list_ptr, &opline);=0A= }=0A= =0A= @@ -3261,7 +3282,6 @@ void zend_do_fetch_property(znode *resul=0A= zend_op *opline_ptr=3DNULL;=0A= =0A= zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr);=0A= -=0A= if (fetch_list_ptr->count =3D=3D 1) {=0A= zend_llist_element *le;=0A= =0A= @@ -3295,6 +3315,21 @@ void zend_do_fetch_property(znode *resul=0A= }=0A= *result =3D opline_ptr->result;=0A= return;=0A= + } else if (opline_ptr && opline_ptr->opcode =3D=3D ZEND_FETCH_W &&=0A= + (opline_ptr->op2.u.EA.type =3D=3D ZEND_FETCH_LOCAL ||=0A= + opline_ptr->op2.u.EA.type =3D=3D ZEND_FETCH_AUTO_GLOBAL) &&=0A= + object->op_type =3D=3D IS_VAR && opline_ptr->result.op_type =3D=3D = IS_VAR && object->u.var =3D=3D opline_ptr->result.u.var &&=0A= + opline_ptr->op1.op_type =3D=3D IS_CONST &&=0A= + (Z_TYPE(opline_ptr->op1.u.constant) =3D=3D IS_STRING || = Z_TYPE(opline_ptr->op1.u.constant) =3D=3D IS_UNICODE) ) {=0A= + /* Recompile CV and rewrite previous op to direct FETCH_OBJ */=0A= + zval tmp =3D opline_ptr->op1.u.constant;=0A= + opline_ptr->opcode =3D ZEND_FETCH_OBJ_W;=0A= + opline_ptr->op1.op_type =3D IS_CV;=0A= + opline_ptr->op1.u.var =3D lookup_cv(CG(active_op_array), = Z_TYPE(tmp), Z_UNIVAL(tmp), Z_UNILEN(tmp) TSRMLS_CC);=0A= + opline_ptr->op1.u.EA.type =3D 0;=0A= + opline_ptr->op2 =3D *property;=0A= + *result =3D opline_ptr->result;=0A= + return;=0A= }=0A= }=0A= =0A= @@ -4312,13 +4347,16 @@ void zend_auto_global_dtor(zend_auto_glo=0A= }=0A= =0A= =0A= -zend_bool zend_u_is_auto_global(zend_uchar type, zstr name, uint = name_len TSRMLS_DC)=0A= +zend_bool zend_u_is_auto_global(zend_uchar type, zstr name, uint = name_len, zend_auto_global **pauto TSRMLS_DC)=0A= {=0A= zend_auto_global *auto_global;=0A= =0A= if (zend_u_hash_find(CG(auto_globals), type, name, name_len+1, (void = **) &auto_global)=3D=3DSUCCESS) {=0A= if (auto_global->armed) {=0A= - auto_global->armed =3D = auto_global->auto_global_callback(auto_global->name, = auto_global->name_len TSRMLS_CC);=0A= + auto_global->armed =3D = auto_global->auto_global_callback(auto_global, ZEND_CT, NULL, 0, NULL = TSRMLS_CC);=0A= + }=0A= + if (pauto) {=0A= + *pauto =3D auto_global;=0A= }=0A= return 1;=0A= }=0A= @@ -4327,21 +4365,26 @@ zend_bool zend_u_is_auto_global(zend_uch=0A= =0A= zend_bool zend_is_auto_global(char *name, uint name_len TSRMLS_DC)=0A= {=0A= - return zend_u_is_auto_global(IS_STRING, ZSTR(name), name_len = TSRMLS_CC);=0A= + return zend_u_is_auto_global(IS_STRING, ZSTR(name), name_len, NULL = TSRMLS_CC);=0A= }=0A= =0A= =0A= -int zend_register_auto_global(char *name, uint name_len, = zend_auto_global_callback auto_global_callback TSRMLS_DC)=0A= +int zend_register_auto_global_ex(char *name, uint name_len, = zend_auto_global_callback auto_global_callback, zend_auto_global **pauto = TSRMLS_DC)=0A= {=0A= zend_auto_global auto_global;=0A= =0A= auto_global.name =3D zend_strndup(name, name_len);=0A= auto_global.name_len =3D name_len;=0A= auto_global.auto_global_callback =3D auto_global_callback;=0A= + auto_global.armed =3D auto_global_callback ? 1 : 0;=0A= =0A= - return zend_hash_add(CG(auto_globals), name, name_len+1, &auto_global, = sizeof(zend_auto_global), NULL);=0A= + return zend_hash_add(CG(auto_globals), name, name_len+1, &auto_global, = sizeof(zend_auto_global), (void**)pauto);=0A= }=0A= =0A= +int zend_register_auto_global(char *name, uint name_len, = zend_auto_global_callback auto_global_callback TSRMLS_DC)=0A= +{=0A= + return zend_register_auto_global_ex(name, name_len, = auto_global_callback, NULL TSRMLS_CC);=0A= +}=0A= =0A= int zendlex(znode *zendlval TSRMLS_DC)=0A= {=0A= Index: Zend/zend_compile.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /repository/ZendEngine2/zend_compile.h,v=0A= retrieving revision 1.353=0A= diff -u -p -d -r1.353 zend_compile.h=0A= --- Zend/zend_compile.h 20 Jan 2007 20:36:55 -0000 1.353=0A= +++ Zend/zend_compile.h 26 Jan 2007 10:23:12 -0000=0A= @@ -51,6 +51,7 @@=0A= =0A= typedef struct _zend_op_array zend_op_array;=0A= typedef struct _zend_op zend_op;=0A= +typedef struct _zend_auto_global zend_auto_global;=0A= =0A= typedef struct _znode {=0A= int op_type;=0A= @@ -175,6 +176,7 @@ typedef struct _zend_compiled_variable {=0A= int name_len;=0A= ulong hash_value;=0A= zend_uint fetch_type;=0A= + zend_auto_global *auto_global;=0A= } zend_compiled_variable;=0A= =0A= struct _zend_op_array {=0A= @@ -575,18 +577,19 @@ ZEND_API char *zend_make_compiled_string=0A= ZEND_API void zend_initialize_class_data(zend_class_entry *ce, = zend_bool nullify_handlers TSRMLS_DC);=0A= int zend_get_class_fetch_type(zend_uchar type, zstr class_name, uint = class_name_len);=0A= =0A= -typedef zend_bool (*zend_auto_global_callback)(char *name, uint = name_len TSRMLS_DC);=0A= -typedef struct _zend_auto_global {=0A= +typedef zend_bool (*zend_auto_global_callback)(zend_auto_global = *auto_global, int stage, zval *ag_val, int fetch_op, zval *member = TSRMLS_DC);=0A= +struct _zend_auto_global {=0A= char *name;=0A= uint name_len;=0A= zend_auto_global_callback auto_global_callback;=0A= zend_bool armed;=0A= -} zend_auto_global;=0A= +};=0A= =0A= void zend_auto_global_dtor(zend_auto_global *auto_global);=0A= +ZEND_API int zend_register_auto_global_ex(char *name, uint name_len, = zend_auto_global_callback auto_global_callback, zend_auto_global **pauto = TSRMLS_DC);=0A= ZEND_API int zend_register_auto_global(char *name, uint name_len, = zend_auto_global_callback auto_global_callback TSRMLS_DC);=0A= ZEND_API zend_bool zend_is_auto_global(char *name, uint name_len = TSRMLS_DC);=0A= -ZEND_API zend_bool zend_u_is_auto_global(zend_uchar type, zstr name, = uint name_len TSRMLS_DC);=0A= +ZEND_API zend_bool zend_u_is_auto_global(zend_uchar type, zstr name, = uint name_len, zend_auto_global **pauto TSRMLS_DC);=0A= ZEND_API int zend_auto_global_disable_jit(char *varname, zend_uint = varname_length TSRMLS_DC);=0A= =0A= int zendlex(znode *zendlval TSRMLS_DC);=0A= @@ -607,7 +610,8 @@ int zendlex(znode *zendlval TSRMLS_DC);=0A= #define ZEND_FETCH_LOCAL 1=0A= #define ZEND_FETCH_STATIC 2=0A= #define ZEND_FETCH_STATIC_MEMBER 3=0A= -#define ZEND_FETCH_GLOBAL_LOCK 4=0A= +#define ZEND_FETCH_GLOBAL_LOCK 4=0A= +#define ZEND_FETCH_AUTO_GLOBAL 5=0A= =0A= =0A= /* class fetches */=0A= Index: Zend/zend_execute.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /repository/ZendEngine2/zend_execute.c,v=0A= retrieving revision 1.758=0A= diff -u -p -d -r1.758 zend_execute.c=0A= --- Zend/zend_execute.c 20 Jan 2007 20:36:55 -0000 1.758=0A= +++ Zend/zend_execute.c 26 Jan 2007 10:23:13 -0000=0A= @@ -226,7 +226,7 @@ static inline zval *_get_zval_ptr_cv(zno=0A= if (!*ptr) {=0A= zend_compiled_variable *cv =3D &CV_DEF_OF(node->u.var);=0A= zend_uchar utype =3D UG(unicode)?IS_UNICODE:IS_STRING;=0A= - HashTable *symbol_table =3D (cv->fetch_type =3D=3D ZEND_FETCH_GLOBAL) = ? &EG(symbol_table) : EG(active_symbol_table);=0A= + HashTable *symbol_table =3D (cv->fetch_type =3D=3D = ZEND_FETCH_AUTO_GLOBAL) ? &EG(symbol_table) : EG(active_symbol_table);=0A= =0A= if (zend_u_hash_quick_find(symbol_table, utype, cv->name, = cv->name_len+1, cv->hash_value, (void **)ptr)=3D=3DFAILURE) {=0A= switch (type) {=0A= @@ -297,7 +297,7 @@ static inline zval **_get_zval_ptr_ptr_c=0A= if (!*ptr) {=0A= zend_compiled_variable *cv =3D &CV_DEF_OF(node->u.var);=0A= zend_uchar utype =3D UG(unicode)?IS_UNICODE:IS_STRING;=0A= - HashTable *symbol_table =3D (cv->fetch_type =3D=3D ZEND_FETCH_GLOBAL) = ? &EG(symbol_table) : EG(active_symbol_table);=0A= + HashTable *symbol_table =3D (cv->fetch_type =3D=3D = ZEND_FETCH_AUTO_GLOBAL) ? &EG(symbol_table) : EG(active_symbol_table);=0A= =0A= if (zend_u_hash_quick_find(symbol_table, utype, cv->name, = cv->name_len+1, cv->hash_value, (void **)ptr)=3D=3DFAILURE) {=0A= switch (type) {=0A= @@ -905,6 +905,17 @@ static inline HashTable *zend_get_target=0A= case ZEND_FETCH_GLOBAL_LOCK:=0A= return &EG(symbol_table);=0A= break;=0A= + case ZEND_FETCH_AUTO_GLOBAL:=0A= + {=0A= + zend_auto_global *auto_global;=0A= +=0A= + if (SUCCESS =3D=3D zend_u_hash_find(CG(auto_globals), = Z_TYPE_P(variable), Z_UNIVAL_P(variable), Z_UNILEN_P(variable) + 1, = (void **) &auto_global) &&=0A= + auto_global->armed && auto_global->auto_global_callback) {=0A= + auto_global->armed =3D = auto_global->auto_global_callback(auto_global, ZEND_RT, NULL, = ZEND_FETCH_R + (3 * type), NULL TSRMLS_CC);=0A= + }=0A= + return &EG(symbol_table);=0A= + break;=0A= + }=0A= case ZEND_FETCH_STATIC:=0A= if (!EG(active_op_array)->static_variables) {=0A= ALLOC_HASHTABLE(EG(active_op_array)->static_variables);=0A= @@ -1030,7 +1041,7 @@ fetch_string_dim:=0A= return retval;=0A= }=0A= =0A= -static void zend_fetch_dimension_address(temp_variable *result, zval = **container_ptr, zval *dim, int dim_is_tmp_var, int type TSRMLS_DC)=0A= +static void zend_fetch_dimension_address(znode *container_node, = temp_variable *result, zval **container_ptr, zval *dim, int = dim_is_tmp_var, int type TSRMLS_DC)=0A= {=0A= zval *container;=0A= =0A= @@ -1039,6 +1050,13 @@ static void zend_fetch_dimension_address=0A= }=0A= =0A= container =3D *container_ptr;=0A= + if (container_node->op_type =3D=3D IS_CV) {=0A= + zend_auto_global *auto_global =3D = CV_DEF_OF(container_node->u.var).auto_global;=0A= +=0A= + if (auto_global && auto_global->armed && = auto_global->auto_global_callback) {=0A= + auto_global->armed =3D = auto_global->auto_global_callback(auto_global, ZEND_RT, container, = ZEND_FETCH_DIM_R + (3 * type), dim TSRMLS_CC);=0A= + }=0A= + }=0A= =0A= if (container =3D=3D EG(error_zval_ptr)) {=0A= if (result) {=0A= @@ -1232,11 +1250,19 @@ static void zend_fetch_dimension_address=0A= }=0A= }=0A= =0A= -static void zend_fetch_property_address(temp_variable *result, zval = **container_ptr, zval *prop_ptr, int type TSRMLS_DC)=0A= +static void zend_fetch_property_address(znode *container_node, = temp_variable *result, zval **container_ptr, zval *prop_ptr, int type = TSRMLS_DC)=0A= {=0A= zval *container;=0A= =0A= container =3D *container_ptr;=0A= + if (container_node->op_type =3D=3D IS_CV) {=0A= + zend_auto_global *auto_global =3D = CV_DEF_OF(container_node->u.var).auto_global;=0A= +=0A= + if (auto_global && auto_global->armed && = auto_global->auto_global_callback) {=0A= + auto_global->armed =3D = auto_global->auto_global_callback(auto_global, ZEND_RT, container, = ZEND_FETCH_OBJ_R + (3 * type), prop_ptr TSRMLS_CC);=0A= + }=0A= + }=0A= +=0A= if (container =3D=3D EG(error_zval_ptr)) {=0A= if (result) {=0A= result->var.ptr_ptr =3D &EG(error_zval_ptr);=0A= Index: Zend/zend_vm_def.h=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /repository/ZendEngine2/zend_vm_def.h,v=0A= retrieving revision 1.155=0A= diff -u -p -d -r1.155 zend_vm_def.h=0A= --- Zend/zend_vm_def.h 11 Jan 2007 22:35:36 -0000 1.155=0A= +++ Zend/zend_vm_def.h 26 Jan 2007 10:23:13 -0000=0A= @@ -418,7 +418,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_=0A= zend_op *op_data =3D opline+1;=0A= zval *dim =3D GET_OP2_ZVAL_PTR(BP_VAR_R);=0A= =0A= - zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW), dim, IS_OP2_TMP_FREE(), BP_VAR_RW = TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, = &EX_T(op_data->op2.u.var), GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW), dim, = IS_OP2_TMP_FREE(), BP_VAR_RW TSRMLS_CC);=0A= value =3D get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, = BP_VAR_R);=0A= var_ptr =3D get_zval_ptr_ptr(&op_data->op2, EX(Ts), = &free_op_data2, BP_VAR_RW);=0A= increment_opline =3D 1;=0A= @@ -978,6 +978,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address=0A= }=0A= switch (opline->op2.u.EA.type) {=0A= case ZEND_FETCH_GLOBAL:=0A= + case ZEND_FETCH_AUTO_GLOBAL:=0A= if (OP1_TYPE !=3D IS_TMP_VAR) {=0A= FREE_OP1();=0A= }=0A= @@ -1066,7 +1067,7 @@ ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, VA=0A= EX_T(opline->op1.u.var).var.ptr_ptr) {=0A= PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);=0A= }=0A= - = zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&E= X_T(opline->result.u.var), GET_OP1_ZVAL_PTR_PTR(BP_VAR_R), dim, = IS_OP2_TMP_FREE(), BP_VAR_R TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R), dim, IS_OP2_TMP_FREE(), BP_VAR_R = TSRMLS_CC);=0A= FREE_OP2();=0A= FREE_OP1_VAR_PTR();=0A= ZEND_VM_NEXT_OPCODE();=0A= @@ -1078,7 +1079,7 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VA=0A= zend_free_op free_op1, free_op2;=0A= zval *dim =3D GET_OP2_ZVAL_PTR(BP_VAR_R);=0A= =0A= - = zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&E= X_T(opline->result.u.var), GET_OP1_ZVAL_PTR_PTR(BP_VAR_W), dim, = IS_OP2_TMP_FREE(), BP_VAR_W TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W), dim, IS_OP2_TMP_FREE(), BP_VAR_W = TSRMLS_CC);=0A= FREE_OP2();=0A= if (OP1_TYPE =3D=3D IS_VAR && OP1_FREE &&=0A= READY_TO_DESTROY(free_op1.var) &&=0A= @@ -1095,7 +1096,7 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, V=0A= zend_free_op free_op1, free_op2;=0A= zval *dim =3D GET_OP2_ZVAL_PTR(BP_VAR_R);=0A= =0A= - = zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&E= X_T(opline->result.u.var), GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW), dim, = IS_OP2_TMP_FREE(), BP_VAR_RW TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW), dim, IS_OP2_TMP_FREE(), BP_VAR_RW = TSRMLS_CC);=0A= FREE_OP2();=0A= if (OP1_TYPE =3D=3D IS_VAR && OP1_FREE &&=0A= READY_TO_DESTROY(free_op1.var) &&=0A= @@ -1112,7 +1113,7 @@ ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, V=0A= zend_free_op free_op1, free_op2;=0A= zval *dim =3D GET_OP2_ZVAL_PTR(BP_VAR_R);=0A= =0A= - = zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&E= X_T(opline->result.u.var), GET_OP1_ZVAL_PTR_PTR(BP_VAR_IS), dim, = IS_OP2_TMP_FREE(), BP_VAR_IS TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_ZVAL_PTR_PTR(BP_VAR_IS), dim, IS_OP2_TMP_FREE(), BP_VAR_IS = TSRMLS_CC);=0A= FREE_OP2();=0A= FREE_OP1_VAR_PTR();=0A= ZEND_VM_NEXT_OPCODE();=0A= @@ -1129,7 +1130,7 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_=0A= zend_error_noreturn(E_ERROR, "Cannot use [] for reading");=0A= }=0A= dim =3D GET_OP2_ZVAL_PTR(BP_VAR_R);=0A= - = zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&E= X_T(opline->result.u.var), GET_OP1_ZVAL_PTR_PTR(type), dim, = IS_OP2_TMP_FREE(), type TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_ZVAL_PTR_PTR(type), dim, IS_OP2_TMP_FREE(), type TSRMLS_CC);=0A= FREE_OP2();=0A= if (OP1_TYPE =3D=3D IS_VAR && type =3D=3D BP_VAR_W && OP1_FREE &&=0A= READY_TO_DESTROY(free_op1.var) &&=0A= @@ -1157,7 +1158,7 @@ ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET=0A= SEPARATE_ZVAL_IF_NOT_REF(container);=0A= }=0A= }=0A= - = zend_fetch_dimension_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&E= X_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), = BP_VAR_UNSET TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = container, dim, IS_OP2_TMP_FREE(), BP_VAR_UNSET TSRMLS_CC);=0A= FREE_OP2();=0A= if (OP1_TYPE =3D=3D IS_VAR && OP1_FREE &&=0A= READY_TO_DESTROY(free_op1.var) &&=0A= @@ -1218,6 +1219,14 @@ ZEND_VM_HELPER_EX(zend_fetch_property_ad=0A= MAKE_REAL_ZVAL_PTR(offset);=0A= }=0A= =0A= + if (opline->op1.op_type =3D=3D IS_CV) {=0A= + zend_auto_global *auto_global =3D = CV_DEF_OF(opline->op1.u.var).auto_global;=0A= +=0A= + if (auto_global && auto_global->armed && = auto_global->auto_global_callback) {=0A= + auto_global->armed =3D = auto_global->auto_global_callback(auto_global, ZEND_RT, container, = ZEND_FETCH_OBJ_R + (3 * type), offset TSRMLS_CC);=0A= + }=0A= + }=0A= +=0A= /* here we are sure we are dealing with an object */=0A= *retval =3D Z_OBJ_HT_P(container)->read_property(container, offset, = type TSRMLS_CC);=0A= =0A= @@ -1259,7 +1268,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VA=0A= if (IS_OP2_TMP_FREE()) {=0A= MAKE_REAL_ZVAL_PTR(property);=0A= }=0A= - = zend_fetch_property_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX= _T(opline->result.u.var), GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W), property, = BP_VAR_W TSRMLS_CC);=0A= + zend_fetch_property_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W), property, BP_VAR_W TSRMLS_CC);=0A= if (IS_OP2_TMP_FREE()) {=0A= zval_ptr_dtor(&property);=0A= } else {=0A= @@ -1283,7 +1292,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, V=0A= if (IS_OP2_TMP_FREE()) {=0A= MAKE_REAL_ZVAL_PTR(property);=0A= }=0A= - = zend_fetch_property_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX= _T(opline->result.u.var), GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW), property, = BP_VAR_RW TSRMLS_CC);=0A= + zend_fetch_property_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW), property, BP_VAR_RW TSRMLS_CC);=0A= if (IS_OP2_TMP_FREE()) {=0A= zval_ptr_dtor(&property);=0A= } else {=0A= @@ -1315,7 +1324,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_=0A= if (IS_OP2_TMP_FREE()) {=0A= MAKE_REAL_ZVAL_PTR(property);=0A= }=0A= - = zend_fetch_property_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX= _T(opline->result.u.var), GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W), property, = BP_VAR_W TSRMLS_CC);=0A= + zend_fetch_property_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W), property, BP_VAR_W TSRMLS_CC);=0A= if (IS_OP2_TMP_FREE()) {=0A= zval_ptr_dtor(&property);=0A= } else {=0A= @@ -1348,7 +1357,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET=0A= if (IS_OP2_TMP_FREE()) {=0A= MAKE_REAL_ZVAL_PTR(property);=0A= }=0A= - = zend_fetch_property_address(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX= _T(opline->result.u.var), container, property, BP_VAR_R TSRMLS_CC);=0A= + zend_fetch_property_address(&opline->op1, = RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), = container, property, BP_VAR_R TSRMLS_CC);=0A= if (IS_OP2_TMP_FREE()) {=0A= zval_ptr_dtor(&property);=0A= } else {=0A= @@ -1428,7 +1437,7 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VA=0A= zval *value;=0A= zval *dim =3D GET_OP2_ZVAL_PTR(BP_VAR_R);=0A= =0A= - zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, = dim, IS_OP2_TMP_FREE(), BP_VAR_W TSRMLS_CC);=0A= + zend_fetch_dimension_address(&opline->op1, &EX_T(op_data->op2.u.var), = object_ptr, dim, IS_OP2_TMP_FREE(), BP_VAR_W TSRMLS_CC);=0A= FREE_OP2();=0A= =0A= value =3D get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, = BP_VAR_R);=0A= ------=_NextPart_000_0001_01C7416F.E701D220--