Hi,
Recently I noticed that reading of string offset is performed in two
steps. At first special string_offset variant of temporary_variable is
created in zend_fetch_dimension_address_read() and then the real string
value is created in _get_zval_ptr_var_string_offset().
I think we can create the real string in the first place. This makes 50%
speed-up on string offset reading operation and allows to eliminate some
checks and conditional brunches in VM.
The patch is attached (don't forget to regenerate zend_vm_execute.h to
test it). However it changes behavior in one bogus case.
The following code now will emit "b" (currently it generates a fatal
error - cannot use string offset as an array).
$str = "abs";
var_dumo($str[1][0]);
I think it's not a problem at all.
"b" makes sense because "abs"[1] -> "b" and "b"[0] -> "b".
I'm going to commit the patch in case of no objections.
Thanks. Dmitry.
Hi Dmitry,
2010/7/15 Dmitry Stogov dmitry@zend.com
Hi,
Recently I noticed that reading of string offset is performed in two steps.
At first special string_offset variant of temporary_variable is created in
zend_fetch_dimension_address_read() and then the real string value is
created in _get_zval_ptr_var_string_offset().I think we can create the real string in the first place. This makes 50%
speed-up on string offset reading operation and allows to eliminate some
checks and conditional brunches in VM.The patch is attached (don't forget to regenerate zend_vm_execute.h to test
it). However it changes behavior in one bogus case.
The following code now will emit "b" (currently it generates a fatal error
- cannot use string offset as an array).
$str = "abs";
var_dumo($str[1][0]);I think it's not a problem at all.
"b" makes sense because "abs"[1] -> "b" and "b"[0] -> "b".I'm going to commit the patch in case of no objections.
Thanks. Dmitry.
The patch looks good, I did some tests, not found anything strange.
Good simplyfication! :)
--
Regards,
Felipe Pena
Hi!
$str = "abs";
var_dumo($str[1][0]);I think it's not a problem at all.
"b" makes sense because "abs"[1] -> "b" and "b"[0] -> "b".
Totally makes sense, but it'd be a bit strange that $str[1][0] works but
$str[1][0] = "a" does not.
Stanislav Malyshev, Software Architect
SugarCRM: http://www.sugarcrm.com/
(408)454-6900 ext. 227
Hi!
$str = "abs";
var_dumo($str[1][0]);I think it's not a problem at all.
"b" makes sense because "abs"[1] -> "b" and "b"[0] -> "b".Totally makes sense, but it'd be a bit strange that $str[1][0] works but
$str[1][0] = "a" does not.Stanislav Malyshev, Software Architect
SugarCRM: http://www.sugarcrm.com/
(408)454-6900 ext. 227--
Isn't this the same problem as the below example of the type juggling?
"" == 0 // true
"0" == 0 // true
"0" == "" // false
Tyrael
Hi Stas,
Hi!
$str = "abs";
var_dumo($str[1][0]);I think it's not a problem at all.
"b" makes sense because "abs"[1] -> "b" and "b"[0] -> "b".Totally makes sense, but it'd be a bit strange that $str[1][0] works but
$str[1][0] = "a" does not.
$str[1][0] = "a"; doesn't have to modify $str.
var_dump($str[1][1]) will return empty string
$str[1][1] = "a"; can't modify $str at all.
So I think it is not a problem.
Thanks. Dmitry.