FAQ
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.

Search Discussions

  • Felipe Pena at Jul 15, 2010 at 10:19 pm
    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
  • Stas Malyshev at Jul 16, 2010 at 7:47 am
    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
  • Ferenc Kovacs at Jul 16, 2010 at 7:58 am

    On Fri, Jul 16, 2010 at 9:47 AM, Stas Malyshev wrote:
    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

    --
    PHP Internals - PHP Runtime Development Mailing List
    To unsubscribe, visit: http://www.php.net/unsub.php
    Isn't this the same problem as the below example of the type juggling?

    "" == 0 // true
    "0" == 0 // true
    "0" == "" // false

    Tyrael
  • Dmitry Stogov at Jul 16, 2010 at 8:07 am
    Hi Stas,
    On 07/16/2010 11:47 AM, Stas Malyshev wrote:
    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.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-internals @
categoriesphp
postedJul 15, '10 at 9:10a
activeJul 16, '10 at 8:07a
posts5
users4
websitephp.net

People

Translate

site design / logo © 2022 Grokbase