ID: 22237
User updated by: peter at globalvision dot com dot au
Reported By: peter at globalvision dot com dot au
Status: Verified
Bug Type: Zend Engine 2 problem
Operating System: All
PHP Version: 5CVS-2003-02-15 (dev)
New Comment:
Well... I have not had the time to solve it, but I now know pretty well
why it is caused.
**can someone please have a crack at fixing this**?
In zend_language_parser.y, the rule for object_property is either an
object_dim_list (which can be a T_STRING) or it is a
"variable_without_ibjects".
object_dim_list works for $this->foo, but $this->$foo is matched by
variable_without_objects.
HOWEVER, variable_without_objects is the match for vanilla variables,
so it consumes one '$' before it dereferences.
in other words, $this->$foo sends the $foo part off to the standard
variable compiler area which does not recognise that $foo is a
reference.
I experimented by placing a couple of rules in the lex scanner as
follows:
<ST_LOOKING_FOR_PROPERTY>"$" {
fprintf(stderr,"xxx");
yy_push_state(ST_TEST)
return '$';
}
and
<ST_TEST>";" {
fprintf(stderr,"yyy");
yy_pop_state(TSRMLS_C);
return ';';
}
<ST_TEST>{LABEL} {
fprintf(stderr,"zzz");
zendlval->value.str.val = (char *)estrndup(yytext,yyleng);
zendlval->value.str.len = yyleng;
zendlval->type = IS_STRING;
return T_VARIABLE;
}
and suddenly, it all seems to parse, however I'm clearly missing
something - it still does not display the forrect output for
echo $this->$foo;
What am I doing wrong?
Previous Comments:
------------------------------------------------------------------------
[2003-02-22 17:08:49] peter at globalvision dot com dot au
I'm assuming all OSes b/c my original report was MS Windows but a
subsequent dup report was for Linux.
I've narrowed it down a bit by running with debug mode on the ZE2
I'm 99% sure it is due to the way zend treats "$this" as special. I
don't think it's putting all the required data on the stack.
Specifically, when it processes the base_variable_without_objects bison
rule after reading T_OBJECT_OPERATOR (ie -> ) it sets yyval.u.EA.type
(see case 363 in zend_language_parser.c) but yyval.u is zero at that
time when the LH operand is $this.
Not sure why yet...
EG the following modification causes no crash:
<?php
class myClass
{
var $foo = "hi";
var $bar = "foo";
function test()
{
$t = &$this;
echo $t->$bar;
//echo $this->foo;
}
}
?>
------------------------------------------------------------------------
[2003-02-19 06:26:45] root at kitten dot net
This is pretty serious... it prevents pear from working. Can someone
please take a look at it?
Thanks
------------------------------------------------------------------------
[2003-02-15 19:15:01] [EMAIL PROTECTED]
No crash with PHP 4.3.1-dev, does crash with PHP 5-dev.
------------------------------------------------------------------------
[2003-02-15 19:06:29] peter at globalvision dot com dot au
<?php
class myClass
{
var $foo = "hi";
var $bar = "foo";
function test()
{
echo $this->$bar; //line 1
//echo $this->foo; //line 2
}
}
?>
commenting out line 1 (and optionally including line 2) cause it to run
normally. The crash occurs as soon as you
include $this->$<something>.
----------------
>From a dos command line on Windows XP Pro SP1 (build 2600):
>php c:\temp\t.php
I get
PHP Script Interpreter has encountered a problem and
needs to close (pop up).
I'm using the windows build from the snaps page. I've had this error
over the past few days of snaps too.
>php -m
[PHP Modules]
bcmath
calendar
com
ctype
ftp
mysql
odbc
pcre
rpc
session
standard
tokenizer
wddx
xml
zlib
[Zend Modules]
The crash details are:
AppName: php.exe
AppVer: 5.0.0.0
ModName: php4ts.dll
ModVer: 5.0.0.0
Offset: 000b3bdc
Exception Information:
Code: 0xc0000005 Flags: 0x00000000
Record: 0x000000000000000 Address: 0x000000000100b3bdc
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=22237&edit=1