summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TSRM/TSRM.h6
-rw-r--r--Zend/zend_API.h2
-rw-r--r--ext/standard/tests/strings/dirname_multi.phpt5
-rw-r--r--ext/standard/tests/strings/dirname_multi_win.phpt31
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