diff options
-rw-r--r-- | TSRM/TSRM.h | 6 | ||||
-rw-r--r-- | Zend/zend_API.h | 2 | ||||
-rw-r--r-- | ext/standard/tests/strings/dirname_multi.phpt | 5 | ||||
-rw-r--r-- | ext/standard/tests/strings/dirname_multi_win.phpt | 31 |
4 files changed, 42 insertions, 2 deletions
diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index 859b3fac01..67adaa3440 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -165,9 +165,11 @@ TSRM_API void *tsrm_get_ls_cache(void); #define TSRMLS_FETCH_FROM_CTX(ctx) void ***tsrm_ls = (void ***) ctx #define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_get_ls_cache() -#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) +#define TSRMG(id, type, element) (TSRMG_BULK(id, type)->element) +#define TSRMG_BULK(id, type) ((type) (*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(id)]) -#define TSRMG_STATIC(id, type, element) (((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) +#define TSRMG_STATIC(id, type, element) (TSRMG_BULK_STATIC(id, type)->element) +#define TSRMG_BULK_STATIC(id, type) ((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)]) #define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE #define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE = NULL #if ZEND_DEBUG diff --git a/Zend/zend_API.h b/Zend/zend_API.h index ee3c8d96a7..8dc3e8a2e8 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -159,6 +159,7 @@ typedef struct _zend_fcall_info_cache { #define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor) \ ts_allocate_id(&module_name##_globals_id, sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, (ts_allocate_dtor) globals_dtor); #define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) ZEND_TSRMG(module_name##_globals_id, zend_##module_name##_globals *, v) +#define ZEND_MODULE_GLOBALS_BULK(module_name) TSRMG_BULK(module_name##_globals_id, zend_##module_name##_globals *) #else @@ -169,6 +170,7 @@ typedef struct _zend_fcall_info_cache { #define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor) \ globals_ctor(&module_name##_globals); #define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) (module_name##_globals.v) +#define ZEND_MODULE_GLOBALS_BULK(module_name) (&module_name##_globals) #endif diff --git a/ext/standard/tests/strings/dirname_multi.phpt b/ext/standard/tests/strings/dirname_multi.phpt index bfd7b50ef1..febbd0c293 100644 --- a/ext/standard/tests/strings/dirname_multi.phpt +++ b/ext/standard/tests/strings/dirname_multi.phpt @@ -1,5 +1,10 @@ --TEST-- Test dirname() function : usage variations +--SKIPIF-- +<?php +if((substr(PHP_OS, 0, 3) == "WIN")) + die('skip not for Windows'); +?> --FILE-- <?php /* Prototype: string dirname ( string $path [, int nb]); diff --git a/ext/standard/tests/strings/dirname_multi_win.phpt b/ext/standard/tests/strings/dirname_multi_win.phpt new file mode 100644 index 0000000000..4fed5895e6 --- /dev/null +++ b/ext/standard/tests/strings/dirname_multi_win.phpt @@ -0,0 +1,31 @@ +--TEST-- +Test dirname() function : usage variations +--SKIPIF-- +<?php +if((substr(PHP_OS, 0, 3) != "WIN")) + die('skip Windows only'); +?> +--FILE-- +<?php +/* Prototype: string dirname ( string $path [, int nb]); + Description: Returns directory name component of path. +*/ +for ($i=0 ; $i<5 ; $i++) { + var_dump(dirname("/foo/bar/baz", $i)); +} +var_dump(dirname("/foo/bar/baz", PHP_INT_MAX)); +var_dump(dirname("g:/foo/bar/baz", PHP_INT_MAX)); +var_dump(dirname("g:foo/bar/baz", PHP_INT_MAX)); +?> +Done +--EXPECTF-- +Warning: dirname(): Invalid argument, levels must be >= 1 in %sdirname_multi_win.php on line %d +NULL +string(8) "/foo/bar" +string(4) "/foo" +string(1) "\" +string(1) "\" +string(1) "\" +string(3) "g:\" +string(3) "g:." +Done |