php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | |
Patch SplFixedArrayOptimizations for SPL related Bug #60341Patch version 2011-12-12 23:21 UTC Return to Bug #60341 | Download this patchThis patch renders other patches obsolete Obsolete patches:
Developer: morrison.levi@gmail.comIndex: ext/spl/tests/fixedarray_002.phpt =================================================================== --- ext/spl/tests/fixedarray_002.phpt (revision 319659) +++ ext/spl/tests/fixedarray_002.phpt (working copy) @@ -30,17 +30,17 @@ // errors try { $a[0] = "value1"; -} catch (RuntimeException $e) { +} catch (OutOfBoundsException $e) { echo "Exception: ".$e->getMessage()."\n"; } try { var_dump($a["asdf"]); -} catch (RuntimeException $e) { +} catch (InvalidArgumentException $e) { echo "Exception: ".$e->getMessage()."\n"; } try { unset($a[-1]); -} catch (RuntimeException $e) { +} catch (OutOfBoundsException $e) { echo "Exception: ".$e->getMessage()."\n"; } $a->setSize(10); @@ -67,11 +67,11 @@ ===DONE=== --EXPECTF-- A::offsetSet -Exception: Index invalid or out of range +Exception: Index out of range A::offsetGet -Exception: Index invalid or out of range +Exception: Index invalid A::offsetUnset -Exception: Index invalid or out of range +Exception: Index out of range A::offsetSet A::offsetSet A::offsetSet Index: ext/spl/tests/fixedarray_012.phpt =================================================================== --- ext/spl/tests/fixedarray_012.phpt (revision 319659) +++ ext/spl/tests/fixedarray_012.phpt (working copy) @@ -7,7 +7,7 @@ try { $b = &$a[]; -} catch (Exception $e) { +} catch (InvalidArgumentException $e) { echo $e->getMessage(), "\n"; } @@ -15,5 +15,5 @@ ?> --EXPECT-- -Index invalid or out of range +Index invalid: does not accept NULL ok Index: ext/spl/tests/fixedarray_004.phpt =================================================================== --- ext/spl/tests/fixedarray_004.phpt (revision 319659) +++ ext/spl/tests/fixedarray_004.phpt (working copy) @@ -14,5 +14,5 @@ ?> ===DONE=== --EXPECTF-- -string(29) "Index invalid or out of range" +string(31) "You cannot add to a fixed array" ===DONE=== Index: ext/spl/tests/fixedarray_013.phpt =================================================================== --- ext/spl/tests/fixedarray_013.phpt (revision 319659) +++ ext/spl/tests/fixedarray_013.phpt (working copy) @@ -12,10 +12,10 @@ try { test($a[]); -} catch (Exception $e) { +} catch (InvalidArgumentException $e) { echo $e->getMessage(), "\n"; } ?> --EXPECT-- -Index invalid or out of range +Index invalid: does not accept NULL Index: ext/spl/tests/fixedarray_014.phpt =================================================================== --- ext/spl/tests/fixedarray_014.phpt (revision 319659) +++ ext/spl/tests/fixedarray_014.phpt (working copy) @@ -6,10 +6,10 @@ try { $a = new SplFixedArray(NULL); echo $a[0]++; -} catch (Exception $e) { +} catch (OutOfBoundsException $e) { echo $e->getMessage(); } ?> --EXPECT-- -Index invalid or out of range +Index out of range Index: ext/spl/tests/fixedarray_006.phpt =================================================================== --- ext/spl/tests/fixedarray_006.phpt (revision 319659) +++ ext/spl/tests/fixedarray_006.phpt (working copy) @@ -10,7 +10,7 @@ for ($i = 0; $i < 100; $i++) { $a[] = new stdClass; } -} catch (Exception $e) { +} catch (OverflowException $e) { echo $e->getMessage(), "\n"; } @@ -18,5 +18,5 @@ ?> --EXPECT-- -Index invalid or out of range +You cannot add to a fixed array ok Index: ext/spl/tests/fixedarray_015.phpt =================================================================== --- ext/spl/tests/fixedarray_015.phpt (revision 319659) +++ ext/spl/tests/fixedarray_015.phpt (working copy) @@ -7,17 +7,17 @@ try { var_dump($a[1]); -} catch (Exception $e) { +} catch (OutOfBoundsException $e) { echo $e->getMessage(), "\n"; } try { $a[1] = 1; -} catch (Exception $e) { +} catch (OutOfBoundsException $e) { echo $e->getMessage(), "\n"; } try { var_dump(count($a[1])); -} catch (Exception $e) { +} catch (OutOfBoundsException $e) { echo $e->getMessage(), "\n"; } try { @@ -41,9 +41,9 @@ ?> --EXPECTF-- Warning: SplFixedArray::__construct() expects parameter 1 to be long, string given in %s on line %d -Index invalid or out of range -Index invalid or out of range -Index invalid or out of range +Index out of range +Index out of range +Index out of range int(0) bool(true) Done Index: ext/spl/tests/fixedarray_001.phpt =================================================================== --- ext/spl/tests/fixedarray_001.phpt (revision 319659) +++ ext/spl/tests/fixedarray_001.phpt (working copy) @@ -6,24 +6,36 @@ // errors try { $a[0] = "value1"; -} catch (RuntimeException $e) { +} catch (OutOfBoundsException $e) { echo "Exception: ".$e->getMessage()."\n"; } try { + $a['0'] = "value1"; //key as a string +} catch (OutOfBoundsException $e) { + echo "Exception: ".$e->getMessage()."\n"; +} +try { var_dump($a["asdf"]); -} catch (RuntimeException $e) { +} catch (InvalidArgumentException $e) { echo "Exception: ".$e->getMessage()."\n"; } try { unset($a[-1]); -} catch (RuntimeException $e) { +} catch (OutOfBoundsException $e) { echo "Exception: ".$e->getMessage()."\n"; } $a->setSize(10); +//more errors +try { + $a['0.1'] = "value0.1"; +} catch (InvalidArgumentException $e) { + echo "Exception: ".$e->getMessage()."\n"; +} $a[0] = "value0"; $a[1] = "value1"; +$a['1'] = "value1"; $a[2] = "value2"; $a[3] = "value3"; $ref = "value4"; @@ -46,9 +58,11 @@ ?> ===DONE=== --EXPECTF-- -Exception: Index invalid or out of range -Exception: Index invalid or out of range -Exception: Index invalid or out of range +Exception: Index out of range +Exception: Index out of range +Exception: Index invalid +Exception: Index out of range +Exception: Index invalid string(6) "value0" string(6) "value2" string(6) "value3" Index: ext/spl/spl_fixedarray.c =================================================================== --- ext/spl/spl_fixedarray.c (revision 319659) +++ ext/spl/spl_fixedarray.c (working copy) @@ -327,18 +327,38 @@ /* we have to return NULL on error here to avoid memleak because of * ZE duplicating uninitialized_zval_ptr */ if (!offset) { - zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0 TSRMLS_CC); + zend_throw_exception(spl_ce_InvalidArgumentException, "Index invalid: does not accept NULL", 0 TSRMLS_CC); return NULL; } - if (Z_TYPE_P(offset) != IS_LONG) { + unsigned char offsetType = Z_TYPE_P(offset); + + //none of these types can exist as keys in SplFixedArray + switch (offsetType) { + case IS_RESOURCE: + case IS_BOOL: + case IS_ARRAY: + case IS_DOUBLE: + case IS_OBJECT: + zend_throw_exception(spl_ce_InvalidArgumentException, "Index invalid", 0 TSRMLS_CC); + return NULL; + break; + } + + //strings must represent an int or they should fail + if (offsetType == IS_STRING) { + if (is_numeric_string(offset->value.str.val, offset->value.str.len, &index, NULL, -1) != IS_LONG) { + zend_throw_exception(spl_ce_InvalidArgumentException, "Index invalid", 0 TSRMLS_CC); + return NULL; + } + } else if (offsetType != IS_LONG) { index = spl_offset_convert_to_long(offset TSRMLS_CC); } else { index = Z_LVAL_P(offset); } if (index < 0 || intern->array == NULL || index >= intern->array->size) { - zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0 TSRMLS_CC); + zend_throw_exception(spl_ce_OutOfBoundsException, "Index out of range", 0 TSRMLS_CC); return NULL; } else if(!intern->array->elements[index]) { return NULL; @@ -383,18 +403,38 @@ if (!offset) { /* '$array[] = value' syntax is not supported */ - zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0 TSRMLS_CC); + zend_throw_exception(spl_ce_OverflowException, "You cannot add to a fixed array", 0 TSRMLS_CC); return; } - if (Z_TYPE_P(offset) != IS_LONG) { + unsigned char offsetType = Z_TYPE_P(offset); + + //none of these types can exist as keys in SplFixedArray + switch (offsetType) { + case IS_RESOURCE: + case IS_BOOL: + case IS_ARRAY: + case IS_DOUBLE: + case IS_OBJECT: + zend_throw_exception(spl_ce_InvalidArgumentException, "Index invalid", 0 TSRMLS_CC); + return; + break; + } + + //strings must represent an int or they should fail + if (offsetType == IS_STRING) { + if (is_numeric_string(offset->value.str.val, offset->value.str.len, &index, NULL, -1) != IS_LONG) { + zend_throw_exception(spl_ce_InvalidArgumentException, "Index invalid", 0 TSRMLS_CC); + return; + } + } else if (offsetType != IS_LONG) { index = spl_offset_convert_to_long(offset TSRMLS_CC); } else { index = Z_LVAL_P(offset); } if (index < 0 || intern->array == NULL || index >= intern->array->size) { - zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0 TSRMLS_CC); + zend_throw_exception(spl_ce_OutOfBoundsException, "Index out of range", 0 TSRMLS_CC); return; } else { if (intern->array->elements[index]) { @@ -432,15 +472,35 @@ static inline void spl_fixedarray_object_unset_dimension_helper(spl_fixedarray_object *intern, zval *offset TSRMLS_DC) /* {{{ */ { long index; - - if (Z_TYPE_P(offset) != IS_LONG) { + + unsigned char offsetType = Z_TYPE_P(offset); + + //none of these types can exist as keys in SplFixedArray + switch (offsetType) { + case IS_RESOURCE: + case IS_BOOL: + case IS_ARRAY: + case IS_DOUBLE: + case IS_OBJECT: + zend_throw_exception(spl_ce_InvalidArgumentException, "Index invalid", 0 TSRMLS_CC); + return; + break; + } + + //strings must represent an int or they should fail + if (offsetType == IS_STRING) { + if (is_numeric_string(offset->value.str.val, offset->value.str.len, &index, NULL, -1) != IS_LONG) { + zend_throw_exception(spl_ce_InvalidArgumentException, "Index invalid", 0 TSRMLS_CC); + return; + } + } else if (offsetType != IS_LONG) { index = spl_offset_convert_to_long(offset TSRMLS_CC); } else { index = Z_LVAL_P(offset); } if (index < 0 || intern->array == NULL || index >= intern->array->size) { - zend_throw_exception(spl_ce_RuntimeException, "Index invalid or out of range", 0 TSRMLS_CC); + zend_throw_exception(spl_ce_OutOfBoundsException, "Index out of range", 0 TSRMLS_CC); return; } else { if (intern->array->elements[index]) { |
Copyright © 2001-2024 The PHP Group All rights reserved. |
Last updated: Sun Dec 22 05:01:30 2024 UTC |