9485 changed files with 0 additions and 1714017 deletions
-
26TSRM/LICENSE
-
6TSRM/Makefile.am
-
2TSRM/TODO
-
764TSRM/TSRM.c
-
186TSRM/TSRM.dsp
-
177TSRM/TSRM.h
-
1TSRM/acconfig.h
-
5TSRM/acinclude.m4
-
43TSRM/build.mk
-
33TSRM/buildconf
-
10TSRM/config.w32
-
31TSRM/configure.in
-
47TSRM/readdir.h
-
173TSRM/threads.m4
-
128TSRM/tsrm.m4
-
20TSRM/tsrm_config.w32.h
-
62TSRM/tsrm_config_common.h
-
240TSRM/tsrm_nw.c
-
29TSRM/tsrm_nw.h
-
63TSRM/tsrm_strtok_r.c
-
6TSRM/tsrm_strtok_r.h
-
1317TSRM/tsrm_virtual_cwd.c
-
310TSRM/tsrm_virtual_cwd.h
-
397TSRM/tsrm_win32.c
-
106TSRM/tsrm_win32.h
-
22097Zend/ChangeLog
-
186Zend/FlexLexer.h
-
56Zend/LICENSE
-
54Zend/Makefile.am
-
1Zend/Makefile.frag
-
195Zend/OBJECTS2_HOWTO
-
34Zend/README.ZEND_MM
-
108Zend/README.ZEND_VM
-
136Zend/RFCs/001.txt
-
169Zend/RFCs/002.txt
-
72Zend/RFCs/003.txt
-
1166Zend/ZEND_CHANGES
-
594Zend/Zend.dsp
-
390Zend/Zend.m4
-
258Zend/ZendCore.dep
-
728Zend/ZendTS.dsp
-
121Zend/acconfig.h
-
107Zend/acinclude.m4
-
420Zend/bench.php
-
43Zend/build.mk
-
33Zend/buildconf
-
51Zend/configure.in
-
1648Zend/flex.skl
-
19Zend/header
-
54Zend/tests/001.phpt
-
108Zend/tests/002.phpt
-
81Zend/tests/003.phpt
-
25Zend/tests/004.phpt
-
27Zend/tests/005.phpt
-
31Zend/tests/006.phpt
-
63Zend/tests/007.phpt
-
53Zend/tests/008.phpt
-
46Zend/tests/009.phpt
-
59Zend/tests/010.phpt
-
89Zend/tests/011.phpt
-
34Zend/tests/012.phpt
-
34Zend/tests/013.phpt
-
3Zend/tests/014.inc
-
52Zend/tests/014.phpt
-
35Zend/tests/015.phpt
-
12Zend/tests/016.phpt
-
86Zend/tests/017.phpt
-
36Zend/tests/018.phpt
-
1332Zend/tests/019.phpt
-
31Zend/tests/020.phpt
-
14Zend/tests/abstract-static.phpt
-
73Zend/tests/add_001.phpt
-
19Zend/tests/add_002.phpt
-
19Zend/tests/add_003.phpt
-
14Zend/tests/add_004.phpt
-
22Zend/tests/add_005.phpt
-
49Zend/tests/add_006.phpt
-
16Zend/tests/add_007.phpt
-
39Zend/tests/and_001.phpt
-
16Zend/tests/array_append_COW.phpt
-
15Zend/tests/array_type_hint_001.phpt
-
16Zend/tests/array_unshift_COW.phpt
-
22Zend/tests/bug19859.phpt
-
43Zend/tests/bug20240.phpt
-
26Zend/tests/bug20242.phpt
-
37Zend/tests/bug21478.phpt
-
36Zend/tests/bug21888.phpt
-
31Zend/tests/bug22725.phpt
-
34Zend/tests/bug22836.phpt
-
12Zend/tests/bug23104.phpt
-
24Zend/tests/bug24436.phpt
-
30Zend/tests/bug24635.phpt
-
13Zend/tests/bug24699.phpt
-
9Zend/tests/bug24773.phpt
-
28Zend/tests/bug24884.phpt
-
19Zend/tests/bug26010.phpt
-
9Zend/tests/bug26077.phpt
-
74Zend/tests/bug26166.phpt
-
29Zend/tests/bug26229.phpt
-
13Zend/tests/bug26281.phpt
@ -1,26 +0,0 @@ |
|||
Copyright (c) 1999-2006, Andi Gutmans, Sascha Schumann, Zeev Suraski. |
|||
All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, are permitted provided that the following conditions are |
|||
met: |
|||
|
|||
- Redistributions of source code must retain the above copyright notice, |
|||
this list of conditions and the following disclaimer. |
|||
|
|||
- Neither name of the copyright holders nor the names of their contributors |
|||
may be used to endorse or promote products derived from this software |
|||
without specific prior written permission. |
|||
|
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS |
|||
IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
|||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|||
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR |
|||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
|||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
@ -1,6 +0,0 @@ |
|||
## process this file with automake to produce Makefile.am
|
|||
AUTOMAKE_OPTIONS=foreign |
|||
noinst_LTLIBRARIES=libtsrm.la |
|||
libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c |
|||
|
|||
depend: |
|||
@ -1,2 +0,0 @@ |
|||
- Improve the lock in ts_resource_ex() in order to cover less code. |
|||
This can probably be done by more careful hash table access |
|||
@ -1,764 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| Thread Safe Resource Manager | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1999-2008, Andi Gutmans, Sascha Schumann, Zeev Suraski | |
|||
| This source file is subject to the TSRM license, that is bundled | |
|||
| with this package in the file LICENSE | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Zeev Suraski <zeev@zend.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#include "TSRM.h" |
|||
|
|||
#ifdef ZTS |
|||
|
|||
#include <stdio.h> |
|||
|
|||
#if HAVE_STDARG_H |
|||
#include <stdarg.h> |
|||
#endif |
|||
|
|||
typedef struct _tsrm_tls_entry tsrm_tls_entry; |
|||
|
|||
struct _tsrm_tls_entry { |
|||
void **storage; |
|||
int count; |
|||
THREAD_T thread_id; |
|||
tsrm_tls_entry *next; |
|||
}; |
|||
|
|||
|
|||
typedef struct { |
|||
size_t size; |
|||
ts_allocate_ctor ctor; |
|||
ts_allocate_dtor dtor; |
|||
int done; |
|||
} tsrm_resource_type; |
|||
|
|||
|
|||
/* The memory manager table */ |
|||
static tsrm_tls_entry **tsrm_tls_table=NULL; |
|||
static int tsrm_tls_table_size; |
|||
static ts_rsrc_id id_count; |
|||
|
|||
/* The resource sizes table */ |
|||
static tsrm_resource_type *resource_types_table=NULL; |
|||
static int resource_types_table_size; |
|||
|
|||
|
|||
static MUTEX_T tsmm_mutex; /* thread-safe memory manager mutex */ |
|||
|
|||
/* New thread handlers */ |
|||
static tsrm_thread_begin_func_t tsrm_new_thread_begin_handler; |
|||
static tsrm_thread_end_func_t tsrm_new_thread_end_handler; |
|||
|
|||
/* Debug support */ |
|||
int tsrm_error(int level, const char *format, ...); |
|||
|
|||
/* Read a resource from a thread's resource storage */ |
|||
static int tsrm_error_level; |
|||
static FILE *tsrm_error_file; |
|||
|
|||
#if TSRM_DEBUG |
|||
#define TSRM_ERROR(args) tsrm_error args |
|||
#define TSRM_SAFE_RETURN_RSRC(array, offset, range) \ |
|||
{ \ |
|||
int unshuffled_offset = TSRM_UNSHUFFLE_RSRC_ID(offset); \ |
|||
\ |
|||
if (offset==0) { \ |
|||
return &array; \ |
|||
} else if ((unshuffled_offset)>=0 && (unshuffled_offset)<(range)) { \ |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Successfully fetched resource id %d for thread id %ld - 0x%0.8X", \ |
|||
unshuffled_offset, (long) thread_resources->thread_id, array[unshuffled_offset])); \ |
|||
return array[unshuffled_offset]; \ |
|||
} else { \ |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Resource id %d is out of range (%d..%d)", \ |
|||
unshuffled_offset, TSRM_SHUFFLE_RSRC_ID(0), TSRM_SHUFFLE_RSRC_ID(thread_resources->count-1))); \ |
|||
return NULL; \ |
|||
} \ |
|||
} |
|||
#else |
|||
#define TSRM_ERROR(args) |
|||
#define TSRM_SAFE_RETURN_RSRC(array, offset, range) \ |
|||
if (offset==0) { \ |
|||
return &array; \ |
|||
} else { \ |
|||
return array[TSRM_UNSHUFFLE_RSRC_ID(offset)]; \ |
|||
} |
|||
#endif |
|||
|
|||
#if defined(PTHREADS) |
|||
/* Thread local storage */ |
|||
static pthread_key_t tls_key; |
|||
# define tsrm_tls_set(what) pthread_setspecific(tls_key, (void*)(what)) |
|||
# define tsrm_tls_get() pthread_getspecific(tls_key) |
|||
|
|||
#elif defined(TSRM_ST) |
|||
static int tls_key; |
|||
# define tsrm_tls_set(what) st_thread_setspecific(tls_key, (void*)(what)) |
|||
# define tsrm_tls_get() st_thread_getspecific(tls_key) |
|||
|
|||
#elif defined(TSRM_WIN32) |
|||
static DWORD tls_key; |
|||
# define tsrm_tls_set(what) TlsSetValue(tls_key, (void*)(what)) |
|||
# define tsrm_tls_get() TlsGetValue(tls_key) |
|||
|
|||
#elif defined(BETHREADS) |
|||
static int32 tls_key; |
|||
# define tsrm_tls_set(what) tls_set(tls_key, (void*)(what)) |
|||
# define tsrm_tls_get() (tsrm_tls_entry*)tls_get(tls_key) |
|||
|
|||
#else |
|||
# define tsrm_tls_set(what) |
|||
# define tsrm_tls_get() NULL |
|||
# warning tsrm_set_interpreter_context is probably broken on this platform |
|||
#endif |
|||
|
|||
/* Startup TSRM (call once for the entire process) */ |
|||
TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename) |
|||
{ |
|||
#if defined(GNUPTH) |
|||
pth_init(); |
|||
#elif defined(PTHREADS) |
|||
pthread_key_create( &tls_key, 0 ); |
|||
#elif defined(TSRM_ST) |
|||
st_init(); |
|||
st_key_create(&tls_key, 0); |
|||
#elif defined(TSRM_WIN32) |
|||
tls_key = TlsAlloc(); |
|||
#elif defined(BETHREADS) |
|||
tls_key = tls_allocate(); |
|||
#endif |
|||
|
|||
tsrm_error_file = stderr; |
|||
tsrm_error_set(debug_level, debug_filename); |
|||
tsrm_tls_table_size = expected_threads; |
|||
|
|||
tsrm_tls_table = (tsrm_tls_entry **) calloc(tsrm_tls_table_size, sizeof(tsrm_tls_entry *)); |
|||
if (!tsrm_tls_table) { |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate TLS table")); |
|||
return 0; |
|||
} |
|||
id_count=0; |
|||
|
|||
resource_types_table_size = expected_resources; |
|||
resource_types_table = (tsrm_resource_type *) calloc(resource_types_table_size, sizeof(tsrm_resource_type)); |
|||
if (!resource_types_table) { |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate resource types table")); |
|||
free(tsrm_tls_table); |
|||
tsrm_tls_table = NULL; |
|||
return 0; |
|||
} |
|||
|
|||
tsmm_mutex = tsrm_mutex_alloc(); |
|||
|
|||
tsrm_new_thread_begin_handler = tsrm_new_thread_end_handler = NULL; |
|||
|
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Started up TSRM, %d expected threads, %d expected resources", expected_threads, expected_resources)); |
|||
return 1; |
|||
} |
|||
|
|||
|
|||
/* Shutdown TSRM (call once for the entire process) */ |
|||
TSRM_API void tsrm_shutdown(void) |
|||
{ |
|||
int i; |
|||
|
|||
if (tsrm_tls_table) { |
|||
for (i=0; i<tsrm_tls_table_size; i++) { |
|||
tsrm_tls_entry *p = tsrm_tls_table[i], *next_p; |
|||
|
|||
while (p) { |
|||
int j; |
|||
|
|||
next_p = p->next; |
|||
for (j=0; j<p->count; j++) { |
|||
if (p->storage[j]) { |
|||
if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) { |
|||
resource_types_table[j].dtor(p->storage[j], &p->storage); |
|||
} |
|||
free(p->storage[j]); |
|||
} |
|||
} |
|||
free(p->storage); |
|||
free(p); |
|||
p = next_p; |
|||
} |
|||
} |
|||
free(tsrm_tls_table); |
|||
tsrm_tls_table = NULL; |
|||
} |
|||
if (resource_types_table) { |
|||
free(resource_types_table); |
|||
resource_types_table=NULL; |
|||
} |
|||
tsrm_mutex_free(tsmm_mutex); |
|||
tsmm_mutex = NULL; |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Shutdown TSRM")); |
|||
if (tsrm_error_file!=stderr) { |
|||
fclose(tsrm_error_file); |
|||
} |
|||
#if defined(GNUPTH) |
|||
pth_kill(); |
|||
#elif defined(PTHREADS) |
|||
pthread_setspecific(tls_key, 0); |
|||
pthread_key_delete(tls_key); |
|||
#elif defined(TSRM_WIN32) |
|||
TlsFree(tls_key); |
|||
#endif |
|||
} |
|||
|
|||
|
|||
/* allocates a new thread-safe-resource id */ |
|||
TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor) |
|||
{ |
|||
int i; |
|||
|
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Obtaining a new resource id, %d bytes", size)); |
|||
|
|||
tsrm_mutex_lock(tsmm_mutex); |
|||
|
|||
/* obtain a resource id */ |
|||
*rsrc_id = TSRM_SHUFFLE_RSRC_ID(id_count++); |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Obtained resource id %d", *rsrc_id)); |
|||
|
|||
/* store the new resource type in the resource sizes table */ |
|||
if (resource_types_table_size < id_count) { |
|||
resource_types_table = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count); |
|||
if (!resource_types_table) { |
|||
tsrm_mutex_unlock(tsmm_mutex); |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate storage for resource")); |
|||
*rsrc_id = 0; |
|||
return 0; |
|||
} |
|||
resource_types_table_size = id_count; |
|||
} |
|||
resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].size = size; |
|||
resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].ctor = ctor; |
|||
resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].dtor = dtor; |
|||
resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].done = 0; |
|||
|
|||
/* enlarge the arrays for the already active threads */ |
|||
for (i=0; i<tsrm_tls_table_size; i++) { |
|||
tsrm_tls_entry *p = tsrm_tls_table[i]; |
|||
|
|||
while (p) { |
|||
if (p->count < id_count) { |
|||
int j; |
|||
|
|||
p->storage = (void *) realloc(p->storage, sizeof(void *)*id_count); |
|||
for (j=p->count; j<id_count; j++) { |
|||
p->storage[j] = (void *) malloc(resource_types_table[j].size); |
|||
if (resource_types_table[j].ctor) { |
|||
resource_types_table[j].ctor(p->storage[j], &p->storage); |
|||
} |
|||
} |
|||
p->count = id_count; |
|||
} |
|||
p = p->next; |
|||
} |
|||
} |
|||
tsrm_mutex_unlock(tsmm_mutex); |
|||
|
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Successfully allocated new resource id %d", *rsrc_id)); |
|||
return *rsrc_id; |
|||
} |
|||
|
|||
|
|||
static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_T thread_id) |
|||
{ |
|||
int i; |
|||
|
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Creating data structures for thread %x", thread_id)); |
|||
(*thread_resources_ptr) = (tsrm_tls_entry *) malloc(sizeof(tsrm_tls_entry)); |
|||
(*thread_resources_ptr)->storage = (void **) malloc(sizeof(void *)*id_count); |
|||
(*thread_resources_ptr)->count = id_count; |
|||
(*thread_resources_ptr)->thread_id = thread_id; |
|||
(*thread_resources_ptr)->next = NULL; |
|||
|
|||
/* Set thread local storage to this new thread resources structure */ |
|||
tsrm_tls_set(*thread_resources_ptr); |
|||
|
|||
if (tsrm_new_thread_begin_handler) { |
|||
tsrm_new_thread_begin_handler(thread_id, &((*thread_resources_ptr)->storage)); |
|||
} |
|||
for (i=0; i<id_count; i++) { |
|||
if (resource_types_table[i].done) { |
|||
(*thread_resources_ptr)->storage[i] = NULL; |
|||
} else |
|||
{ |
|||
(*thread_resources_ptr)->storage[i] = (void *) malloc(resource_types_table[i].size); |
|||
if (resource_types_table[i].ctor) { |
|||
resource_types_table[i].ctor((*thread_resources_ptr)->storage[i], &(*thread_resources_ptr)->storage); |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (tsrm_new_thread_end_handler) { |
|||
tsrm_new_thread_end_handler(thread_id, &((*thread_resources_ptr)->storage)); |
|||
} |
|||
|
|||
tsrm_mutex_unlock(tsmm_mutex); |
|||
} |
|||
|
|||
|
|||
/* fetches the requested resource for the current thread */ |
|||
TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id) |
|||
{ |
|||
THREAD_T thread_id; |
|||
int hash_value; |
|||
tsrm_tls_entry *thread_resources; |
|||
|
|||
#ifdef NETWARE |
|||
/* The below if loop is added for NetWare to fix an abend while unloading PHP |
|||
* when an Apache unload command is issued on the system console. |
|||
* While exiting from PHP, at the end for some reason, this function is called |
|||
* with tsrm_tls_table = NULL. When this happened, the server abends when |
|||
* tsrm_tls_table is accessed since it is NULL. |
|||
*/ |
|||
if(tsrm_tls_table) { |
|||
#endif |
|||
if (!th_id) { |
|||
/* Fast path for looking up the resources for the current |
|||
* thread. Its used by just about every call to |
|||
* ts_resource_ex(). This avoids the need for a mutex lock |
|||
* and our hashtable lookup. |
|||
*/ |
|||
thread_resources = tsrm_tls_get(); |
|||
|
|||
if (thread_resources) { |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Fetching resource id %d for current thread %d", id, (long) thread_resources->thread_id)); |
|||
/* Read a specific resource from the thread's resources. |
|||
* This is called outside of a mutex, so have to be aware about external |
|||
* changes to the structure as we read it. |
|||
*/ |
|||
TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count); |
|||
} |
|||
thread_id = tsrm_thread_id(); |
|||
} else { |
|||
thread_id = *th_id; |
|||
} |
|||
|
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Fetching resource id %d for thread %ld", id, (long) thread_id)); |
|||
tsrm_mutex_lock(tsmm_mutex); |
|||
|
|||
hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); |
|||
thread_resources = tsrm_tls_table[hash_value]; |
|||
|
|||
if (!thread_resources) { |
|||
allocate_new_resource(&tsrm_tls_table[hash_value], thread_id); |
|||
return ts_resource_ex(id, &thread_id); |
|||
} else { |
|||
do { |
|||
if (thread_resources->thread_id == thread_id) { |
|||
break; |
|||
} |
|||
if (thread_resources->next) { |
|||
thread_resources = thread_resources->next; |
|||
} else { |
|||
allocate_new_resource(&thread_resources->next, thread_id); |
|||
return ts_resource_ex(id, &thread_id); |
|||
/* |
|||
* thread_resources = thread_resources->next; |
|||
* break; |
|||
*/ |
|||
} |
|||
} while (thread_resources); |
|||
} |
|||
tsrm_mutex_unlock(tsmm_mutex); |
|||
/* Read a specific resource from the thread's resources. |
|||
* This is called outside of a mutex, so have to be aware about external |
|||
* changes to the structure as we read it. |
|||
*/ |
|||
TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count); |
|||
#ifdef NETWARE |
|||
} /* if(tsrm_tls_table) */ |
|||
#endif |
|||
} |
|||
|
|||
/* frees an interpreter context. You are responsible for making sure that |
|||
* it is not linked into the TSRM hash, and not marked as the current interpreter */ |
|||
void tsrm_free_interpreter_context(void *context) |
|||
{ |
|||
tsrm_tls_entry *next, *thread_resources = (tsrm_tls_entry*)context; |
|||
int i; |
|||
|
|||
while (thread_resources) { |
|||
next = thread_resources->next; |
|||
|
|||
for (i=0; i<thread_resources->count; i++) { |
|||
if (resource_types_table[i].dtor) { |
|||
resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); |
|||
} |
|||
} |
|||
for (i=0; i<thread_resources->count; i++) { |
|||
free(thread_resources->storage[i]); |
|||
} |
|||
free(thread_resources->storage); |
|||
free(thread_resources); |
|||
thread_resources = next; |
|||
} |
|||
} |
|||
|
|||
void *tsrm_set_interpreter_context(void *new_ctx) |
|||
{ |
|||
tsrm_tls_entry *current; |
|||
|
|||
current = tsrm_tls_get(); |
|||
|
|||
/* TODO: unlink current from the global linked list, and replace it |
|||
* it with the new context, protected by mutex where/if appropriate */ |
|||
|
|||
/* Set thread local storage to this new thread resources structure */ |
|||
tsrm_tls_set(new_ctx); |
|||
|
|||
/* return old context, so caller can restore it when they're done */ |
|||
return current; |
|||
} |
|||
|
|||
|
|||
/* allocates a new interpreter context */ |
|||
void *tsrm_new_interpreter_context(void) |
|||
{ |
|||
tsrm_tls_entry *new_ctx, *current; |
|||
THREAD_T thread_id; |
|||
|
|||
thread_id = tsrm_thread_id(); |
|||
tsrm_mutex_lock(tsmm_mutex); |
|||
|
|||
current = tsrm_tls_get(); |
|||
|
|||
allocate_new_resource(&new_ctx, thread_id); |
|||
|
|||
/* switch back to the context that was in use prior to our creation |
|||
* of the new one */ |
|||
return tsrm_set_interpreter_context(current); |
|||
} |
|||
|
|||
|
|||
/* frees all resources allocated for the current thread */ |
|||
void ts_free_thread(void) |
|||
{ |
|||
tsrm_tls_entry *thread_resources; |
|||
int i; |
|||
THREAD_T thread_id = tsrm_thread_id(); |
|||
int hash_value; |
|||
tsrm_tls_entry *last=NULL; |
|||
|
|||
tsrm_mutex_lock(tsmm_mutex); |
|||
hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); |
|||
thread_resources = tsrm_tls_table[hash_value]; |
|||
|
|||
while (thread_resources) { |
|||
if (thread_resources->thread_id == thread_id) { |
|||
for (i=0; i<thread_resources->count; i++) { |
|||
if (resource_types_table[i].dtor) { |
|||
resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); |
|||
} |
|||
} |
|||
for (i=0; i<thread_resources->count; i++) { |
|||
free(thread_resources->storage[i]); |
|||
} |
|||
free(thread_resources->storage); |
|||
if (last) { |
|||
last->next = thread_resources->next; |
|||
} else { |
|||
tsrm_tls_table[hash_value] = thread_resources->next; |
|||
} |
|||
tsrm_tls_set(0); |
|||
free(thread_resources); |
|||
break; |
|||
} |
|||
if (thread_resources->next) { |
|||
last = thread_resources; |
|||
} |
|||
thread_resources = thread_resources->next; |
|||
} |
|||
tsrm_mutex_unlock(tsmm_mutex); |
|||
} |
|||
|
|||
|
|||
/* frees all resources allocated for all threads except current */ |
|||
void ts_free_worker_threads(void) |
|||
{ |
|||
tsrm_tls_entry *thread_resources; |
|||
int i; |
|||
THREAD_T thread_id = tsrm_thread_id(); |
|||
int hash_value; |
|||
tsrm_tls_entry *last=NULL; |
|||
|
|||
tsrm_mutex_lock(tsmm_mutex); |
|||
hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); |
|||
thread_resources = tsrm_tls_table[hash_value]; |
|||
|
|||
while (thread_resources) { |
|||
if (thread_resources->thread_id != thread_id) { |
|||
for (i=0; i<thread_resources->count; i++) { |
|||
if (resource_types_table[i].dtor) { |
|||
resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); |
|||
} |
|||
} |
|||
for (i=0; i<thread_resources->count; i++) { |
|||
free(thread_resources->storage[i]); |
|||
} |
|||
free(thread_resources->storage); |
|||
if (last) { |
|||
last->next = thread_resources->next; |
|||
} else { |
|||
tsrm_tls_table[hash_value] = thread_resources->next; |
|||
} |
|||
free(thread_resources); |
|||
if (last) { |
|||
thread_resources = last->next; |
|||
} else { |
|||
thread_resources = tsrm_tls_table[hash_value]; |
|||
} |
|||
} else { |
|||
if (thread_resources->next) { |
|||
last = thread_resources; |
|||
} |
|||
thread_resources = thread_resources->next; |
|||
} |
|||
} |
|||
tsrm_mutex_unlock(tsmm_mutex); |
|||
} |
|||
|
|||
|
|||
/* deallocates all occurrences of a given id */ |
|||
void ts_free_id(ts_rsrc_id id) |
|||
{ |
|||
int i; |
|||
int j = TSRM_UNSHUFFLE_RSRC_ID(id); |
|||
|
|||
tsrm_mutex_lock(tsmm_mutex); |
|||
|
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Freeing resource id %d", id)); |
|||
|
|||
if (tsrm_tls_table) { |
|||
for (i=0; i<tsrm_tls_table_size; i++) { |
|||
tsrm_tls_entry *p = tsrm_tls_table[i]; |
|||
|
|||
while (p) { |
|||
if (p->count > j && p->storage[j]) { |
|||
if (resource_types_table && resource_types_table[j].dtor) { |
|||
resource_types_table[j].dtor(p->storage[j], &p->storage); |
|||
} |
|||
free(p->storage[j]); |
|||
p->storage[j] = NULL; |
|||
} |
|||
p = p->next; |
|||
} |
|||
} |
|||
} |
|||
resource_types_table[j].done = 1; |
|||
|
|||
tsrm_mutex_unlock(tsmm_mutex); |
|||
|
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Successfully freed resource id %d", id)); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
/* |
|||
* Utility Functions |
|||
*/ |
|||
|
|||
/* Obtain the current thread id */ |
|||
TSRM_API THREAD_T tsrm_thread_id(void) |
|||
{ |
|||
#ifdef TSRM_WIN32 |
|||
return GetCurrentThreadId(); |
|||
#elif defined(GNUPTH) |
|||
return pth_self(); |
|||
#elif defined(PTHREADS) |
|||
return pthread_self(); |
|||
#elif defined(NSAPI) |
|||
return systhread_current(); |
|||
#elif defined(PI3WEB) |
|||
return PIThread_getCurrent(); |
|||
#elif defined(TSRM_ST) |
|||
return st_thread_self(); |
|||
#elif defined(BETHREADS) |
|||
return find_thread(NULL); |
|||
#endif |
|||
} |
|||
|
|||
|
|||
/* Allocate a mutex */ |
|||
TSRM_API MUTEX_T tsrm_mutex_alloc(void) |
|||
{ |
|||
MUTEX_T mutexp; |
|||
#ifdef TSRM_WIN32 |
|||
mutexp = malloc(sizeof(CRITICAL_SECTION)); |
|||
InitializeCriticalSection(mutexp); |
|||
#elif defined(GNUPTH) |
|||
mutexp = (MUTEX_T) malloc(sizeof(*mutexp)); |
|||
pth_mutex_init(mutexp); |
|||
#elif defined(PTHREADS) |
|||
mutexp = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); |
|||
pthread_mutex_init(mutexp,NULL); |
|||
#elif defined(NSAPI) |
|||
mutexp = crit_init(); |
|||
#elif defined(PI3WEB) |
|||
mutexp = PIPlatform_allocLocalMutex(); |
|||
#elif defined(TSRM_ST) |
|||
mutexp = st_mutex_new(); |
|||
#elif defined(BETHREADS) |
|||
mutexp = (beos_ben*)malloc(sizeof(beos_ben)); |
|||
mutexp->ben = 0; |
|||
mutexp->sem = create_sem(1, "PHP sempahore"); |
|||
#endif |
|||
#ifdef THR_DEBUG |
|||
printf("Mutex created thread: %d\n",mythreadid()); |
|||
#endif |
|||
return( mutexp ); |
|||
} |
|||
|
|||
|
|||
/* Free a mutex */ |
|||
TSRM_API void tsrm_mutex_free(MUTEX_T mutexp) |
|||
{ |
|||
if (mutexp) { |
|||
#ifdef TSRM_WIN32 |
|||
DeleteCriticalSection(mutexp); |
|||
free(mutexp); |
|||
#elif defined(GNUPTH) |
|||
free(mutexp); |
|||
#elif defined(PTHREADS) |
|||
pthread_mutex_destroy(mutexp); |
|||
free(mutexp); |
|||
#elif defined(NSAPI) |
|||
crit_terminate(mutexp); |
|||
#elif defined(PI3WEB) |
|||
PISync_delete(mutexp); |
|||
#elif defined(TSRM_ST) |
|||
st_mutex_destroy(mutexp); |
|||
#elif defined(BETHREADS) |
|||
delete_sem(mutexp->sem); |
|||
free(mutexp); |
|||
#endif |
|||
} |
|||
#ifdef THR_DEBUG |
|||
printf("Mutex freed thread: %d\n",mythreadid()); |
|||
#endif |
|||
} |
|||
|
|||
|
|||
/* Lock a mutex */ |
|||
TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp) |
|||
{ |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Mutex locked thread: %ld", tsrm_thread_id())); |
|||
#ifdef TSRM_WIN32 |
|||
EnterCriticalSection(mutexp); |
|||
return 1; |
|||
#elif defined(GNUPTH) |
|||
return pth_mutex_acquire(mutexp, 0, NULL); |
|||
#elif defined(PTHREADS) |
|||
return pthread_mutex_lock(mutexp); |
|||
#elif defined(NSAPI) |
|||
return crit_enter(mutexp); |
|||
#elif defined(PI3WEB) |
|||
return PISync_lock(mutexp); |
|||
#elif defined(TSRM_ST) |
|||
return st_mutex_lock(mutexp); |
|||
#elif defined(BETHREADS) |
|||
if (atomic_add(&mutexp->ben, 1) != 0) |
|||
return acquire_sem(mutexp->sem); |
|||
return 0; |
|||
#endif |
|||
} |
|||
|
|||
|
|||
/* Unlock a mutex */ |
|||
TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp) |
|||
{ |
|||
TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Mutex unlocked thread: %ld", tsrm_thread_id())); |
|||
#ifdef TSRM_WIN32 |
|||
LeaveCriticalSection(mutexp); |
|||
return 1; |
|||
#elif defined(GNUPTH) |
|||
return pth_mutex_release(mutexp); |
|||
#elif defined(PTHREADS) |
|||
return pthread_mutex_unlock(mutexp); |
|||
#elif defined(NSAPI) |
|||
return crit_exit(mutexp); |
|||
#elif defined(PI3WEB) |
|||
return PISync_unlock(mutexp); |
|||
#elif defined(TSRM_ST) |
|||
return st_mutex_unlock(mutexp); |
|||
#elif defined(BETHREADS) |
|||
if (atomic_add(&mutexp->ben, -1) != 1) |
|||
return release_sem(mutexp->sem); |
|||
return 0; |
|||
#endif |
|||
} |
|||
|
|||
|
|||
TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler) |
|||
{ |
|||
void *retval = (void *) tsrm_new_thread_begin_handler; |
|||
|
|||
tsrm_new_thread_begin_handler = new_thread_begin_handler; |
|||
return retval; |
|||
} |
|||
|
|||
|
|||
TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler) |
|||
{ |
|||
void *retval = (void *) tsrm_new_thread_end_handler; |
|||
|
|||
tsrm_new_thread_end_handler = new_thread_end_handler; |
|||
return retval; |
|||
} |
|||
|
|||
|
|||
|
|||
/* |
|||
* Debug support |
|||
*/ |
|||
|
|||
#if TSRM_DEBUG |
|||
int tsrm_error(int level, const char *format, ...) |
|||
{ |
|||
if (level<=tsrm_error_level) { |
|||
va_list args; |
|||
int size; |
|||
|
|||
fprintf(tsrm_error_file, "TSRM: "); |
|||
va_start(args, format); |
|||
size = vfprintf(tsrm_error_file, format, args); |
|||
va_end(args); |
|||
fprintf(tsrm_error_file, "\n"); |
|||
fflush(tsrm_error_file); |
|||
return size; |
|||
} else { |
|||
return 0; |
|||
} |
|||
} |
|||
#endif |
|||
|
|||
|
|||
void tsrm_error_set(int level, char *debug_filename) |
|||
{ |
|||
tsrm_error_level = level; |
|||
|
|||
#if TSRM_DEBUG |
|||
if (tsrm_error_file!=stderr) { /* close files opened earlier */ |
|||
fclose(tsrm_error_file); |
|||
} |
|||
|
|||
if (debug_filename) { |
|||
tsrm_error_file = fopen(debug_filename, "w"); |
|||
if (!tsrm_error_file) { |
|||
tsrm_error_file = stderr; |
|||
} |
|||
} else { |
|||
tsrm_error_file = stderr; |
|||
} |
|||
#endif |
|||
} |
|||
|
|||
#endif /* ZTS */ |
|||
@ -1,186 +0,0 @@ |
|||
# Microsoft Developer Studio Project File - Name="TSRM" - Package Owner=<4> |
|||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 |
|||
# ** DO NOT EDIT ** |
|||
|
|||
# TARGTYPE "Win32 (x86) Static Library" 0x0104 |
|||
|
|||
CFG=TSRM - Win32 Debug_TS |
|||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, |
|||
!MESSAGE use the Export Makefile command and run |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "TSRM.mak". |
|||
!MESSAGE |
|||
!MESSAGE You can specify a configuration when running NMAKE |
|||
!MESSAGE by defining the macro CFG on the command line. For example: |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "TSRM.mak" CFG="TSRM - Win32 Debug_TS" |
|||
!MESSAGE |
|||
!MESSAGE Possible choices for configuration are: |
|||
!MESSAGE |
|||
!MESSAGE "TSRM - Win32 Debug_TS" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "TSRM - Win32 Release_TS" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "TSRM - Win32 Release_TS_inline" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "TSRM - Win32 Release_TSDbg" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE |
|||
|
|||
# Begin Project |
|||
# PROP AllowPerConfigDependencies 0 |
|||
# PROP Scc_ProjName "" |
|||
# PROP Scc_LocalPath "" |
|||
CPP=cl.exe |
|||
RSC=rc.exe |
|||
|
|||
!IF "$(CFG)" == "TSRM - Win32 Debug_TS" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 1 |
|||
# PROP BASE Output_Dir "TSRM___Win32_Debug_TS" |
|||
# PROP BASE Intermediate_Dir "TSRM___Win32_Debug_TS" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 1 |
|||
# PROP Output_Dir "Debug_TS" |
|||
# PROP Intermediate_Dir "Debug_TS" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "C:\Projects\TSRM" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c |
|||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_DEBUG" /D "ZTS" /D "_LIB" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D TSRM_DEBUG=1 /YX /FD /GZ /c |
|||
# ADD BASE RSC /l 0x40d /d "_DEBUG" |
|||
# ADD RSC /l 0x40d /d "_DEBUG" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "TSRM - Win32 Release_TS" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 0 |
|||
# PROP BASE Output_Dir "TSRM___Win32_Release_TS" |
|||
# PROP BASE Intermediate_Dir "TSRM___Win32_Release_TS" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 0 |
|||
# PROP Output_Dir "Release_TS" |
|||
# PROP Intermediate_Dir "Release_TS" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "ZTS" /D "_LIB" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D TSRM_DEBUG=0 /YX /FD /c |
|||
# ADD BASE RSC /l 0x40d /d "NDEBUG" |
|||
# ADD RSC /l 0x40d /d "NDEBUG" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "TSRM - Win32 Release_TS_inline" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 0 |
|||
# PROP BASE Output_Dir "TSRM___Win32_Release_TS_inline" |
|||
# PROP BASE Intermediate_Dir "TSRM___Win32_Release_TS_inline" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 0 |
|||
# PROP Output_Dir "Release_TS_inline" |
|||
# PROP Intermediate_Dir "Release_TS_inline" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "TSRM_EXPORTS" /YX /FD /c |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "ZTS" /D "_LIB" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D TSRM_DEBUG=0 /YX /FD /c |
|||
# ADD BASE RSC /l 0x40d /d "NDEBUG" |
|||
# ADD RSC /l 0x40d /d "NDEBUG" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "TSRM - Win32 Release_TSDbg" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Use_Debug_Libraries 0 |
|||
# PROP BASE Output_Dir "TSRM___Win32_Release_TSDbg" |
|||
# PROP BASE Intermediate_Dir "TSRM___Win32_Release_TSDbg" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Use_Debug_Libraries 0 |
|||
# PROP Output_Dir "Release_TSDbg" |
|||
# PROP Intermediate_Dir "Release_TSDbg" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "ZTS" /D "_LIB" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D TSRM_DEBUG=0 /YX /FD /c |
|||
# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "." /D "NDEBUG" /D "ZTS" /D "_LIB" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D TSRM_DEBUG=0 /YX /FD /c |
|||
# ADD BASE RSC /l 0x40d /d "NDEBUG" |
|||
# ADD RSC /l 0x40d /d "NDEBUG" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ENDIF |
|||
|
|||
# Begin Target |
|||
|
|||
# Name "TSRM - Win32 Debug_TS" |
|||
# Name "TSRM - Win32 Release_TS" |
|||
# Name "TSRM - Win32 Release_TS_inline" |
|||
# Name "TSRM - Win32 Release_TSDbg" |
|||
# Begin Group "Source Files" |
|||
|
|||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\TSRM.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_strtok_r.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_virtual_cwd.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_win32.c |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Header Files" |
|||
|
|||
# PROP Default_Filter "h;hpp;hxx;hm;inl" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\readdir.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\TSRM.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_config.w32.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_config_common.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_strtok_r.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_virtual_cwd.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\tsrm_win32.h |
|||
# End Source File |
|||
# End Group |
|||
# End Target |
|||
# End Project |
|||
@ -1,177 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| Thread Safe Resource Manager | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1999-2008, Andi Gutmans, Sascha Schumann, Zeev Suraski | |
|||
| This source file is subject to the TSRM license, that is bundled | |
|||
| with this package in the file LICENSE | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Zeev Suraski <zeev@zend.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
#ifndef TSRM_H |
|||
#define TSRM_H |
|||
|
|||
#if !defined(__CYGWIN__) && defined(WIN32) |
|||
# define TSRM_WIN32 |
|||
# include "tsrm_config.w32.h" |
|||
#else |
|||
# include <tsrm_config.h> |
|||
#endif |
|||
|
|||
#ifdef TSRM_WIN32 |
|||
# ifdef TSRM_EXPORTS |
|||
# define TSRM_API __declspec(dllexport) |
|||
# else |
|||
# define TSRM_API __declspec(dllimport) |
|||
# endif |
|||
#else |
|||
# define TSRM_API |
|||
#endif |
|||
|
|||
#ifdef _WIN64 |
|||
typedef __int64 tsrm_intptr_t; |
|||
typedef unsigned __int64 tsrm_uintptr_t; |
|||
#else |
|||
typedef long tsrm_intptr_t; |
|||
typedef unsigned long tsrm_uintptr_t; |
|||
#endif |
|||
|
|||
/* Only compile multi-threading functions if we're in ZTS mode */ |
|||
#ifdef ZTS |
|||
|
|||
#ifdef TSRM_WIN32 |
|||
# ifndef TSRM_INCLUDE_FULL_WINDOWS_HEADERS |
|||
# define WIN32_LEAN_AND_MEAN |
|||
# endif |
|||
# include <windows.h> |
|||
# include <shellapi.h> |
|||
#elif defined(GNUPTH) |
|||
# include <pth.h> |
|||
#elif defined(PTHREADS) |
|||
# include <pthread.h> |
|||
#elif defined(TSRM_ST) |
|||
# include <st.h> |
|||
#elif defined(BETHREADS) |
|||
#include <kernel/OS.h> |
|||
#include <TLS.h> |
|||
#endif |
|||
|
|||
typedef int ts_rsrc_id; |
|||
|
|||
/* Define THREAD_T and MUTEX_T */ |
|||
#ifdef TSRM_WIN32 |
|||
# define THREAD_T DWORD |
|||
# define MUTEX_T CRITICAL_SECTION * |
|||
#elif defined(GNUPTH) |
|||
# define THREAD_T pth_t |
|||
# define MUTEX_T pth_mutex_t * |
|||
#elif defined(PTHREADS) |
|||
# define THREAD_T pthread_t |
|||
# define MUTEX_T pthread_mutex_t * |
|||
#elif defined(NSAPI) |
|||
# define THREAD_T SYS_THREAD |
|||
# define MUTEX_T CRITICAL |
|||
#elif defined(PI3WEB) |
|||
# define THREAD_T PIThread * |
|||
# define MUTEX_T PISync * |
|||
#elif defined(TSRM_ST) |
|||
# define THREAD_T st_thread_t |
|||
# define MUTEX_T st_mutex_t |
|||
#elif defined(BETHREADS) |
|||
# define THREAD_T thread_id |
|||
typedef struct { |
|||
sem_id sem; |
|||
int32 ben; |
|||
} beos_ben; |
|||
# define MUTEX_T beos_ben * |
|||
#endif |
|||
|
|||
typedef void (*ts_allocate_ctor)(void *, void ***); |
|||
typedef void (*ts_allocate_dtor)(void *, void ***); |
|||
|
|||
#define THREAD_HASH_OF(thr,ts) (unsigned long)thr%(unsigned long)ts |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
/* startup/shutdown */ |
|||
TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename); |
|||
TSRM_API void tsrm_shutdown(void); |
|||
|
|||
/* allocates a new thread-safe-resource id */ |
|||
TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor); |
|||
|
|||
/* fetches the requested resource for the current thread */ |
|||
TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id); |
|||
#define ts_resource(id) ts_resource_ex(id, NULL) |
|||
|
|||
/* frees all resources allocated for the current thread */ |
|||
TSRM_API void ts_free_thread(void); |
|||
|
|||
/* frees all resources allocated for all threads except current */ |
|||
void ts_free_worker_threads(void); |
|||
|
|||
/* deallocates all occurrences of a given id */ |
|||
TSRM_API void ts_free_id(ts_rsrc_id id); |
|||
|
|||
|
|||
/* Debug support */ |
|||
#define TSRM_ERROR_LEVEL_ERROR 1 |
|||
#define TSRM_ERROR_LEVEL_CORE 2 |
|||
#define TSRM_ERROR_LEVEL_INFO 3 |
|||
|
|||
typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id, void ***tsrm_ls); |
|||
typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id, void ***tsrm_ls); |
|||
|
|||
|
|||
TSRM_API int tsrm_error(int level, const char *format, ...); |
|||
TSRM_API void tsrm_error_set(int level, char *debug_filename); |
|||
|
|||
/* utility functions */ |
|||
TSRM_API THREAD_T tsrm_thread_id(void); |
|||
TSRM_API MUTEX_T tsrm_mutex_alloc(void); |
|||
TSRM_API void tsrm_mutex_free(MUTEX_T mutexp); |
|||
TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp); |
|||
TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp); |
|||
|
|||
TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler); |
|||
TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler); |
|||
|
|||
/* these 3 APIs should only be used by people that fully understand the threading model |
|||
* used by PHP/Zend and the selected SAPI. */ |
|||
TSRM_API void *tsrm_new_interpreter_context(void); |
|||
TSRM_API void *tsrm_set_interpreter_context(void *new_ctx); |
|||
TSRM_API void tsrm_free_interpreter_context(void *context); |
|||
|
|||
#define TSRM_SHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)+1) |
|||
#define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1) |
|||
|
|||
#define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL) |
|||
#define TSRMLS_FETCH_FROM_CTX(ctx) void ***tsrm_ls = (void ***) ctx |
|||
#define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_ls |
|||
#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) |
|||
#define TSRMLS_D void ***tsrm_ls |
|||
#define TSRMLS_DC , TSRMLS_D |
|||
#define TSRMLS_C tsrm_ls |
|||
#define TSRMLS_CC , TSRMLS_C |
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
|
|||
#else /* non ZTS */ |
|||
|
|||
#define TSRMLS_FETCH() |
|||
#define TSRMLS_FETCH_FROM_CTX(ctx) |
|||
#define TSRMLS_SET_CTX(ctx) |
|||
#define TSRMLS_D void |
|||
#define TSRMLS_DC |
|||
#define TSRMLS_C |
|||
#define TSRMLS_CC |
|||
|
|||
#endif /* ZTS */ |
|||
|
|||
#endif /* TSRM_H */ |
|||
@ -1 +0,0 @@ |
|||
#undef PTHREADS |
|||
@ -1,5 +0,0 @@ |
|||
|
|||
AC_DEFUN([AM_SET_LIBTOOL_VARIABLE],[ |
|||
LIBTOOL='$(SHELL) $(top_builddir)/libtool $1' |
|||
]) |
|||
|
|||
@ -1,43 +0,0 @@ |
|||
# Makefile to generate build tools
|
|||
#
|
|||
# Standard usage:
|
|||
# make -f build.mk
|
|||
#
|
|||
# Written by Sascha Schumann
|
|||
#
|
|||
# $Id$
|
|||
|
|||
|
|||
LT_TARGETS = ltmain.sh ltconfig |
|||
|
|||
config_h_in = tsrm_config.h.in |
|||
|
|||
makefile_am_files = Makefile.am |
|||
makefile_in_files = $(makefile_am_files:.am=.in) |
|||
makefile_files = $(makefile_am_files:e.am=e) |
|||
|
|||
targets = $(makefile_in_files) $(LT_TARGETS) configure $(config_h_in) |
|||
|
|||
all: $(targets) |
|||
|
|||
clean: |
|||
rm -f $(targets) |
|||
|
|||
$(LT_TARGETS): |
|||
rm -f $(LT_TARGETS) |
|||
libtoolize --automake $(AMFLAGS) -f |
|||
|
|||
$(makefile_in_files): $(makefile_am_files) |
|||
automake -a -i $(AMFLAGS) $(makefile_files) |
|||
|
|||
aclocal.m4: configure.in acinclude.m4 |
|||
aclocal |
|||
|
|||
$(config_h_in): configure.in acconfig.h |
|||
# explicitly remove target since autoheader does not seem to work
|
|||
# correctly otherwise (timestamps are not updated)
|
|||
@rm -f $@ |
|||
autoheader |
|||
|
|||
configure: aclocal.m4 configure.in |
|||
autoconf |
|||
@ -1,33 +0,0 @@ |
|||
#!/bin/sh |
|||
|
|||
case "$1" in |
|||
--copy) |
|||
automake_flags=--copy |
|||
shift |
|||
;; |
|||
esac |
|||
|
|||
libtoolize --force --automake $automake_flags |
|||
|
|||
mv aclocal.m4 aclocal.m4.old 2>/dev/null |
|||
aclocal |
|||
if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then |
|||
echo "buildconf: keeping ${1}aclocal.m4" |
|||
mv aclocal.m4.old aclocal.m4 |
|||
else |
|||
echo "buildconf: created or modified ${1}aclocal.m4" |
|||
fi |
|||
|
|||
autoheader |
|||
|
|||
automake --add-missing --include-deps $automake_flags |
|||
|
|||
mv configure configure.old 2>/dev/null |
|||
autoconf |
|||
if cmp configure.old configure > /dev/null 2>&1; then |
|||
echo "buildconf: keeping ${1}configure" |
|||
mv configure.old configure |
|||
else |
|||
echo "buildconf: created or modified ${1}configure" |
|||
fi |
|||
|
|||
@ -1,10 +0,0 @@ |
|||
// vim:ft=javascript |
|||
// $Id$ |
|||
|
|||
if (CHECK_HEADER_ADD_INCLUDE("NewAPIs.h", "CFLAGS_PHP", php_usual_include_suspects)) { |
|||
// Need to add the flag directly, since TSRM doesn't include the config |
|||
// header |
|||
ADD_FLAG("CFLAGS_PHP", "/DHAVE_NEWAPIS_H=1"); |
|||
} |
|||
ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c tsrm_win32.c"); |
|||
|
|||
@ -1,31 +0,0 @@ |
|||
dnl $Id$ |
|||
dnl |
|||
dnl Minimalistic configure.in for TSRM. |
|||
dnl |
|||
|
|||
AC_INIT(TSRM.c) |
|||
AM_INIT_AUTOMAKE(TSRM, 1.0, nodefine) |
|||
AM_CONFIG_HEADER(tsrm_config.h) |
|||
|
|||
sinclude(tsrm.m4) |
|||
|
|||
TSRM_BASIC_CHECKS |
|||
TSRM_THREADS_CHECKS |
|||
|
|||
AM_PROG_LIBTOOL |
|||
if test "$enable_debug" != "yes"; then |
|||
AM_SET_LIBTOOL_VARIABLE([--silent]) |
|||
fi |
|||
|
|||
dnl TSRM_PTHREAD |
|||
|
|||
AC_CHECK_HEADERS( |
|||
utime.h \ |
|||
dirent.h \ |
|||
stdarg.h \ |
|||
alloca.h \ |
|||
unistd.h \ |
|||
limits.h |
|||
) |
|||
|
|||
AC_OUTPUT(Makefile) |
|||
@ -1,47 +0,0 @@ |
|||
#ifndef READDIR_H |
|||
#define READDIR_H |
|||
|
|||
|
|||
/* |
|||
* Structures and types used to implement opendir/readdir/closedir |
|||
* on Windows 95/NT. |
|||
*/ |
|||
|
|||
#define _WIN32_WINNT 0x0400 |
|||
|
|||
#include <windows.h> |
|||
|
|||
#include <io.h> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <sys/types.h> |
|||
#include <direct.h> |
|||
|
|||
/* struct dirent - same as Unix */ |
|||
|
|||
struct dirent { |
|||
long d_ino; /* inode (always 1 in WIN32) */ |
|||
off_t d_off; /* offset to this dirent */ |
|||
unsigned short d_reclen; /* length of d_name */ |
|||
char d_name[_MAX_FNAME + 1]; /* filename (null terminated) */ |
|||
}; |
|||
|
|||
|
|||
/* typedef DIR - not the same as Unix */ |
|||
typedef struct { |
|||
HANDLE handle; /* _findfirst/_findnext handle */ |
|||
short offset; /* offset into directory */ |
|||
short finished; /* 1 if there are not more files */ |
|||
WIN32_FIND_DATA fileinfo; /* from _findfirst/_findnext */ |
|||
char *dir; /* the dir we are reading */ |
|||
struct dirent dent; /* the dirent to return */ |
|||
} DIR; |
|||
|
|||
/* Function prototypes */ |
|||
DIR *opendir(const char *); |
|||
struct dirent *readdir(DIR *); |
|||
int readdir_r(DIR *, struct dirent *, struct dirent **); |
|||
int closedir(DIR *); |
|||
int rewinddir(DIR *); |
|||
|
|||
#endif /* READDIR_H */ |
|||
@ -1,173 +0,0 @@ |
|||
dnl Copyright (c) 1999, 2000 Sascha Schumann. All rights reserved. |
|||
dnl |
|||
dnl Redistribution and use in source and binary forms, with or without |
|||
dnl modification, are permitted provided that the following conditions |
|||
dnl are met: |
|||
dnl |
|||
dnl 1. Redistributions of source code must retain the above copyright |
|||
dnl notice, this list of conditions and the following disclaimer. |
|||
dnl |
|||
dnl 2. Redistributions in binary form must reproduce the above copyright |
|||
dnl notice, this list of conditions and the following disclaimer in |
|||
dnl the documentation and/or other materials provided with the |
|||
dnl distribution. |
|||
dnl |
|||
dnl THIS SOFTWARE IS PROVIDED BY SASCHA SCHUMANN ``AS IS'' AND ANY |
|||
dnl EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|||
dnl IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|||
dnl PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SASCHA SCHUMANN OR |
|||
dnl HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|||
dnl NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
dnl LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|||
dnl HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
|||
dnl STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
|||
dnl ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED |
|||
dnl OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
dnl |
|||
dnl PTHREADS_FLAGS |
|||
dnl |
|||
dnl Set some magic defines to achieve POSIX threads conformance |
|||
dnl |
|||
AC_DEFUN([PTHREADS_FLAGS],[ |
|||
if test -z "$host_alias" && test -n "$host"; then |
|||
host_alias=$host |
|||
fi |
|||
if test -z "$host_alias"; then |
|||
AC_MSG_ERROR(host_alias is not set. Make sure to run config.guess) |
|||
fi |
|||
case $host_alias in |
|||
*solaris*) |
|||
PTHREAD_FLAGS="-D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT";; |
|||
*freebsd*) |
|||
PTHREAD_FLAGS="-D_REENTRANT -D_THREAD_SAFE";; |
|||
*linux*) |
|||
PTHREAD_FLAGS=-D_REENTRANT;; |
|||
*aix*) |
|||
PTHREAD_FLAGS=-D_THREAD_SAFE;; |
|||
*irix*) |
|||
PTHREAD_FLAGS=-D_POSIX_THREAD_SAFE_FUNCTIONS;; |
|||
*hpux*) |
|||
PTHREAD_FLAGS=-D_REENTRANT;; |
|||
*sco*) |
|||
PTHREAD_FLAGS=-D_REENTRANT;; |
|||
dnl Solves sigwait() problem, creates problems with u_long etc. |
|||
dnl PTHREAD_FLAGS="-D_REENTRANT -D_XOPEN_SOURCE=500 -D_POSIX_C_SOURCE=199506 -D_XOPEN_SOURCE_EXTENDED=1";; |
|||
esac |
|||
|
|||
if test -n "$PTHREAD_FLAGS"; then |
|||
CPPFLAGS="$CPPFLAGS $PTHREAD_FLAGS" |
|||
fi |
|||
])dnl |
|||
dnl |
|||
dnl PTHREADS_CHECK_COMPILE |
|||
dnl |
|||
dnl Check whether the current setup can use POSIX threads calls |
|||
dnl |
|||
AC_DEFUN([PTHREADS_CHECK_COMPILE], [ |
|||
AC_TRY_RUN( [ |
|||
#include <pthread.h> |
|||
#include <stddef.h> |
|||
|
|||
void *thread_routine(void *data) { |
|||
return data; |
|||
} |
|||
|
|||
int main() { |
|||
pthread_t thd; |
|||
pthread_mutexattr_t mattr; |
|||
int data = 1; |
|||
pthread_mutexattr_init(&mattr); |
|||
return pthread_create(&thd, NULL, thread_routine, &data); |
|||
} ], [ |
|||
pthreads_working=yes |
|||
], [ |
|||
pthreads_working=no |
|||
], [ |
|||
dnl For cross compiling running this test is of no use. NetWare supports pthreads |
|||
pthreads_working=no |
|||
case $host_alias in |
|||
*netware*) |
|||
pthreads_working=yes |
|||
esac |
|||
] |
|||
) ] )dnl |
|||
dnl |
|||
dnl PTHREADS_CHECK() |
|||
dnl |
|||
dnl Try to find a way to enable POSIX threads |
|||
dnl |
|||
dnl Magic flags |
|||
dnl -kthread gcc (FreeBSD) |
|||
dnl -Kthread UDK cc (UnixWare) |
|||
dnl -mt WorkShop cc (Solaris) |
|||
dnl -mthreads gcc (AIX) |
|||
dnl -pthread gcc (Linux, FreeBSD, NetBSD, OpenBSD) |
|||
dnl -pthreads gcc (Solaris) |
|||
dnl -qthreaded AIX cc V5 |
|||
dnl -threads gcc (HP-UX) |
|||
dnl |
|||
AC_DEFUN([PTHREADS_CHECK],[ |
|||
|
|||
if test "$beos_threads" = "1"; then |
|||
pthreads_working="yes" |
|||
ac_cv_pthreads_cflags="" |
|||
else |
|||
save_CFLAGS=$CFLAGS |
|||
save_LIBS=$LIBS |
|||
PTHREADS_ASSIGN_VARS |
|||
PTHREADS_CHECK_COMPILE |
|||
LIBS=$save_LIBS |
|||
CFLAGS=$save_CFLAGS |
|||
|
|||
AC_CACHE_CHECK(for pthreads_cflags,ac_cv_pthreads_cflags,[ |
|||
ac_cv_pthreads_cflags= |
|||
if test "$pthreads_working" != "yes"; then |
|||
for flag in -kthread -pthread -pthreads -mthreads -Kthread -threads -mt -qthreaded; do |
|||
ac_save=$CFLAGS |
|||
CFLAGS="$CFLAGS $flag" |
|||
PTHREADS_CHECK_COMPILE |
|||
CFLAGS=$ac_save |
|||
if test "$pthreads_working" = "yes"; then |
|||
ac_cv_pthreads_cflags=$flag |
|||
break |
|||
fi |
|||
done |
|||
fi |
|||
fi |
|||
]) |
|||
|
|||
AC_CACHE_CHECK(for pthreads_lib, ac_cv_pthreads_lib,[ |
|||
ac_cv_pthreads_lib= |
|||
if test "$pthreads_working" != "yes"; then |
|||
for lib in pthread pthreads c_r; do |
|||
ac_save=$LIBS |
|||
LIBS="$LIBS -l$lib" |
|||
PTHREADS_CHECK_COMPILE |
|||
LIBS=$ac_save |
|||
if test "$pthreads_working" = "yes"; then |
|||
ac_cv_pthreads_lib=$lib |
|||
break |
|||
fi |
|||
done |
|||
fi |
|||
]) |
|||
|
|||
if test "$pthreads_working" = "yes"; then |
|||
threads_result="POSIX-Threads found" |
|||
else |
|||
threads_result="POSIX-Threads not found" |
|||
fi |
|||
])dnl |
|||
dnl |
|||
dnl |
|||
AC_DEFUN([PTHREADS_ASSIGN_VARS],[ |
|||
if test -n "$ac_cv_pthreads_lib"; then |
|||
LIBS="$LIBS -l$ac_cv_pthreads_lib" |
|||
fi |
|||
|
|||
if test -n "$ac_cv_pthreads_cflags"; then |
|||
CFLAGS="$CFLAGS $ac_cv_pthreads_cflags" |
|||
fi |
|||
])dnl |
|||
@ -1,128 +0,0 @@ |
|||
|
|||
dnl TSRM_CHECK_GCC_ARG(ARG, ACTION-IF-FOUND, ACTION-IF-NOT_FOUND) |
|||
AC_DEFUN([TSRM_CHECK_GCC_ARG],[ |
|||
gcc_arg_name=[ac_cv_gcc_arg]translit($1,A-Z-,a-z_) |
|||
AC_CACHE_CHECK([whether $CC supports $1], [ac_cv_gcc_arg]translit($1,A-Z-,a-z_), [ |
|||
echo 'void somefunc() { };' > conftest.c |
|||
cmd='$CC $1 -c conftest.c' |
|||
if eval $cmd 2>&1 | egrep -e $1 >/dev/null ; then |
|||
ac_result=no |
|||
else |
|||
ac_result=yes |
|||
fi |
|||
eval $gcc_arg_name=$ac_result |
|||
rm -f conftest.* |
|||
]) |
|||
if eval test "\$$gcc_arg_name" = "yes"; then |
|||
$2 |
|||
else |
|||
: |
|||
$3 |
|||
fi |
|||
]) |
|||
|
|||
AC_DEFUN([TSRM_BASIC_CHECKS],[ |
|||
|
|||
AC_REQUIRE([AC_PROG_CC])dnl |
|||
dnl AC_REQUIRE([AM_PROG_CC_STDC])dnl |
|||
AC_REQUIRE([AC_PROG_CC_C_O])dnl |
|||
AC_REQUIRE([AC_PROG_RANLIB])dnl |
|||
|
|||
AC_CHECK_HEADERS(stdarg.h) |
|||
|
|||
]) |
|||
|
|||
|
|||
AC_DEFUN([TSRM_CHECK_PTH],[ |
|||
|
|||
AC_MSG_CHECKING(for GNU Pth) |
|||
PTH_PREFIX="`$1 --prefix`" |
|||
if test -z "$PTH_PREFIX"; then |
|||
AC_MSG_RESULT(Please check your Pth installation) |
|||
fi |
|||
|
|||
CPPFLAGS="$CPPFLAGS `$1 --cflags`" |
|||
LDFLAGS="$LDFLAGS `$1 --ldflags`" |
|||
LIBS="$LIBS `$1 --libs`" |
|||
|
|||
AC_DEFINE(GNUPTH, 1, [Whether you use GNU Pth]) |
|||
AC_MSG_RESULT(yes - installed in $PTH_PREFIX) |
|||
|
|||
]) |
|||
|
|||
AC_DEFUN([TSRM_CHECK_ST],[ |
|||
if test -r "$1/include/st.h"; then |
|||
CPPFLAGS="$CPPFLAGS -I$1/include" |
|||
LDFLAGS="$LDFLAGS -L$1/lib" |
|||
elif test -r "$1/st.h"; then |
|||
CPPFLAGS="$CPPFLAGS -I$1" |
|||
LDFLAGS="$LDFLAGS -L$1" |
|||
fi |
|||
AC_CHECK_HEADERS(st.h,[],[ |
|||
AC_MSG_ERROR([Sorry[,] I was unable to locate the State Threads header file. Please specify the prefix using --with-tsrm-st=/prefix]) |
|||
]) |
|||
LIBS="$LIBS -lst" |
|||
AC_MSG_CHECKING(for SGI's State Threads) |
|||
AC_MSG_RESULT(yes) |
|||
AC_DEFINE(TSRM_ST, 1, [ ]) |
|||
]) |
|||
|
|||
sinclude(threads.m4) |
|||
|
|||
AC_DEFUN([TSRM_CHECK_PTHREADS],[ |
|||
|
|||
PTHREADS_CHECK |
|||
|
|||
if test "$beos_threads" = "1"; then |
|||
AC_DEFINE(BETHREADS, 1, Whether to use native BeOS threads) |
|||
else |
|||
if test "$pthreads_working" != "yes"; then |
|||
AC_MSG_ERROR(Your system seems to lack POSIX threads.) |
|||
fi |
|||
|
|||
AC_DEFINE(PTHREADS, 1, Whether to use Pthreads) |
|||
|
|||
AC_MSG_CHECKING(for POSIX threads) |
|||
AC_MSG_RESULT(yes) |
|||
fi |
|||
]) |
|||
|
|||
|
|||
AC_DEFUN([TSRM_THREADS_CHECKS],[ |
|||
|
|||
dnl For the thread implementations, we always use --with-* |
|||
dnl to maintain consistency |
|||
|
|||
AC_ARG_WITH(tsrm-pth, |
|||
[ --with-tsrm-pth[=pth-config] |
|||
Use GNU Pth],[ |
|||
TSRM_PTH=$withval |
|||
],[ |
|||
TSRM_PTH=no |
|||
]) |
|||
|
|||
AC_ARG_WITH(tsrm-st, |
|||
[ --with-tsrm-st Use SGI's State Threads],[ |
|||
TSRM_ST=$withval |
|||
],[ |
|||
TSRM_ST=no |
|||
]) |
|||
|
|||
AC_ARG_WITH(tsrm-pthreads, |
|||
[ --with-tsrm-pthreads Use POSIX threads (default)],[ |
|||
TSRM_PTHREADS=$withval |
|||
],[ |
|||
TSRM_PTHREADS=yes |
|||
]) |
|||
|
|||
test "$TSRM_PTH" = "yes" && TSRM_PTH=pth-config |
|||
|
|||
if test "$TSRM_PTH" != "no"; then |
|||
TSRM_CHECK_PTH($TSRM_PTH) |
|||
elif test "$TSRM_ST" != "no"; then |
|||
TSRM_CHECK_ST($TSRM_ST) |
|||
elif test "$TSRM_PTHREADS" != "no"; then |
|||
TSRM_CHECK_PTHREADS |
|||
fi |
|||
|
|||
]) |
|||
@ -1,20 +0,0 @@ |
|||
#ifndef TSRM_CONFIG_W32_H |
|||
#define TSRM_CONFIG_W32_H |
|||
|
|||
#define HAVE_UTIME 1 |
|||
#define HAVE_ALLOCA 1 |
|||
#define HAVE_REALPATH 1 |
|||
|
|||
#include <malloc.h> |
|||
#include <stdlib.h> |
|||
#include <crtdbg.h> |
|||
|
|||
#undef inline |
|||
#ifdef ZEND_WIN32_FORCE_INLINE |
|||
# define inline __forceinline |
|||
#else |
|||
# define inline |
|||
#endif |
|||
|
|||
|
|||
#endif |
|||
@ -1,62 +0,0 @@ |
|||
#ifndef TSRM_CONFIG_COMMON_H |
|||
#define TSRM_CONFIG_COMMON_H |
|||
|
|||
#ifndef __CYGWIN__ |
|||
# if WINNT|WIN32 |
|||
# define TSRM_WIN32 |
|||
# endif |
|||
#endif |
|||
|
|||
#ifdef TSRM_WIN32 |
|||
# include "tsrm_config.w32.h" |
|||
#else |
|||
# include <tsrm_config.h> |
|||
# include <sys/param.h> |
|||
#endif |
|||
|
|||
#if HAVE_ALLOCA_H && !defined(_ALLOCA_H) |
|||
# include <alloca.h> |
|||
#endif |
|||
|
|||
/* AIX requires this to be the first thing in the file. */ |
|||
#ifndef __GNUC__ |
|||
# ifndef HAVE_ALLOCA_H |
|||
# ifdef _AIX |
|||
#pragma alloca |
|||
# else |
|||
# ifndef alloca /* predefined by HP cc +Olibcalls */ |
|||
# ifndef NETWARE |
|||
char *alloca (); |
|||
# endif |
|||
# endif |
|||
# endif |
|||
# endif |
|||
#endif |
|||
|
|||
#if HAVE_UNISTD_H |
|||
#include <unistd.h> |
|||
#endif |
|||
|
|||
#if HAVE_LIMITS_H |
|||
#include <limits.h> |
|||
#endif |
|||
|
|||
#ifndef MAXPATHLEN |
|||
# ifdef PATH_MAX |
|||
# define MAXPATHLEN PATH_MAX |
|||
# elif defined(MAX_PATH) |
|||
# define MAXPATHLEN MAX_PATH |
|||
# else |
|||
# define MAXPATHLEN 256 |
|||
# endif |
|||
#endif |
|||
|
|||
#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) |
|||
# define tsrm_do_alloca(p) alloca(p) |
|||
# define tsrm_free_alloca(p) |
|||
#else |
|||
# define tsrm_do_alloca(p) malloc(p) |
|||
# define tsrm_free_alloca(p) free(p) |
|||
#endif |
|||
|
|||
#endif /* TSRM_CONFIG_COMMON_H */ |
|||
@ -1,240 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997-2008 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Venkat Raghavan S <rvenkat@novell.com> | |
|||
| Anantha Kesari H Y <hyanantha@novell.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
/* $Id$ */ |
|||
|
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <fcntl.h> |
|||
|
|||
#include "TSRM.h" |
|||
|
|||
#ifdef NETWARE |
|||
|
|||
#ifdef USE_MKFIFO |
|||
#include <sys/stat.h> |
|||
#elif !defined(USE_PIPE_OPEN) /* NXFifoOpen */ |
|||
#include <nks/fsio.h> |
|||
#endif |
|||
|
|||
#include <nks/vm.h> |
|||
#include <nks/memory.h> |
|||
|
|||
#include <string.h> |
|||
|
|||
#include "mktemp.h" |
|||
|
|||
/* strtok() call in LibC is abending when used in a different address space |
|||
* -- hence using PHP's version itself for now |
|||
*/ |
|||
#include "tsrm_strtok_r.h" |
|||
#define tsrm_strtok_r(a,b,c) strtok((a),(b)) |
|||
|
|||
#define WHITESPACE " \t" |
|||
#define MAX_ARGS 10 |
|||
|
|||
|
|||
TSRM_API FILE* popen(const char *commandline, const char *type) |
|||
{ |
|||
char *command = NULL, *argv[MAX_ARGS] = {'\0'}, **env = NULL; |
|||
char *tempName = "sys:/php/temp/phpXXXXXX.tmp"; |
|||
char *filePath = NULL; |
|||
char *ptr = NULL; |
|||
int ptrLen = 0, argc = 0, i = 0, envCount = 0, err = 0; |
|||
FILE *stream = NULL; |
|||
#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO) |
|||
int pipe_handle; |
|||
int mode = O_RDONLY; |
|||
#else |
|||
NXHandle_t pipe_handle; |
|||
NXMode_t mode = NX_O_RDONLY; |
|||
#endif |
|||
NXExecEnvSpec_t envSpec; |
|||
NXNameSpec_t nameSpec; |
|||
NXVmId_t newVM = 0; |
|||
|
|||
/* Check for validity of input parameters */ |
|||
if (!commandline || !type) |
|||
return NULL; |
|||
|
|||
/* Get temporary file name */ |
|||
filePath = mktemp(tempName); |
|||
if (!filePath) |
|||
return NULL; |
|||
|
|||
/* Set pipe mode according to type -- for now allow only "r" or "w" */ |
|||
if (strcmp(type, "r") == 0) |
|||
#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO) |
|||
mode = O_RDONLY; |
|||
#else |
|||
mode = NX_O_RDONLY; |
|||
#endif |
|||
else if (strcmp(type, "w") == 0) |
|||
#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO) |
|||
mode = O_WRONLY; |
|||
#else |
|||
mode = NX_O_WRONLY; |
|||
#endif |
|||
else |
|||
return NULL; |
|||
|
|||
#ifdef USE_PIPE_OPEN |
|||
pipe_handle = pipe_open(filePath, mode); |
|||
if (pipe_handle == -1) |
|||
return NULL; |
|||
#elif defined(USE_MKFIFO) |
|||
pipe_handle = mkfifo(filePath, mode); |
|||
if (pipe_handle == -1) |
|||
return NULL; |
|||
#else |
|||
/* - NetWare doesn't require first parameter |
|||
* - Allowing LibC to choose the buffer size for now |
|||
*/ |
|||
err = NXFifoOpen(0, filePath, mode, 0, &pipe_handle); |
|||
if (err) |
|||
return NULL; |
|||
#endif |
|||
|
|||
/* Copy the environment variables in preparation for the spawn call */ |
|||
envCount = NXGetEnvCount() + 1; /* add one for NULL */ |
|||
env = (char **) NXMemAlloc(sizeof(char *) * envCount, 0); |
|||
if (!env) |
|||
return NULL; |
|||
|
|||
err = NXCopyEnv(env, envCount); |
|||
if (err) { |
|||
NXMemFree (env); |
|||
return NULL; |
|||
} |
|||
|
|||
/* Separate commandline string into words */ |
|||
ptr = tsrm_strtok_r((char*)commandline, WHITESPACE, NULL); |
|||
ptrLen = strlen(ptr); |
|||
|
|||
command = (char*)malloc(ptrLen + 1); |
|||
if (!command) { |
|||
NXMemFree (env); |
|||
return NULL; |
|||
} |
|||
|
|||
strcpy (command, ptr); |
|||
|
|||
ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL); |
|||
while (ptr && (argc < MAX_ARGS)) { |
|||
ptrLen = strlen(ptr); |
|||
|
|||
argv[argc] = (char*)malloc(ptrLen + 1); |
|||
if (!argv[argc]) { |
|||
NXMemFree (env); |
|||
if (command) |
|||
free (command); |
|||
|
|||
for (i = 0; i < argc; i++) { |
|||
if (argv[i]) |
|||
free (argv[i]); |
|||
} |
|||
|
|||
return NULL; |
|||
} |
|||
|
|||
strcpy (argv[argc], ptr); |
|||
argc++; |
|||
ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL); |
|||
} |
|||
|
|||
/* Setup the execution environment and spawn new process */ |
|||
envSpec.esFlags = 0; /* Not used */ |
|||
envSpec.esArgc = argc; |
|||
envSpec.esArgv = (void **) argv; |
|||
envSpec.esEnv = (void **) env; |
|||
|
|||
/* envSpec.esStdin.ssType = */ |
|||
envSpec.esStdout.ssType = NX_OBJ_FIFO; |
|||
envSpec.esStderr.ssType = NX_OBJ_FILE; |
|||
|
|||
/* 'ssHandle' is not a struct/union/class member */ |
|||
/* |
|||
envSpec.esStdin.ssHandle = |
|||
envSpec.esStdout.ssHandle = |
|||
envSpec.esStderr.ssHandle = -1; |
|||
*/ |
|||
envSpec.esStdin.ssPathCtx = NULL; |
|||
envSpec.esStdout.ssPathCtx = NULL; |
|||
envSpec.esStderr.ssPathCtx = NULL; |
|||
|
|||
#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO) |
|||
if (mode == O_RDONLY) { |
|||
#else |
|||
if (mode == NX_O_RDONLY) { |
|||
#endif |
|||
envSpec.esStdin.ssPath = filePath; |
|||
envSpec.esStdout.ssPath = stdout; |
|||
} else { /* Write Only */ |
|||
envSpec.esStdin.ssPath = stdin; |
|||
envSpec.esStdout.ssPath = filePath; |
|||
} |
|||
|
|||
envSpec.esStderr.ssPath = stdout; |
|||
|
|||
nameSpec.ssType = NX_OBJ_FIFO; |
|||
/* nameSpec.ssHandle = 0; */ /* 'ssHandle' is not a struct/union/class member */ |
|||
nameSpec.ssPathCtx = NULL; /* Not used */ |
|||
nameSpec.ssPath = argv[0]; |
|||
err = NXVmSpawn(&nameSpec, &envSpec, 0, &newVM); |
|||
if (!err) |
|||
/* Get file pointer corresponding to the pipe (file) opened */ |
|||
stream = fdopen(pipe_handle, type); |
|||
|
|||
/* Clean-up */ |
|||
if (env) |
|||
NXMemFree (env); |
|||
|
|||
if (pipe_handle) |
|||
#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO) |
|||
close(pipe_handle); |
|||
#else |
|||
NXClose(pipe_handle); |
|||
#endif |
|||
|
|||
if (command) |
|||
free (command); |
|||
|
|||
for (i = 0; i < argc; i++) { |
|||
if (argv[i]) |
|||
free (argv[i]); |
|||
} |
|||
|
|||
return stream; |
|||
} |
|||
|
|||
TSRM_API int pclose(FILE* stream) |
|||
{ |
|||
int err = 0; |
|||
NXHandle_t fd = 0; |
|||
|
|||
/* Get the process associated with this pipe (file) handle and terminate it */ |
|||
fd = fileno(stream); |
|||
NXClose (fd); |
|||
|
|||
err = fclose(stream); |
|||
|
|||
return err; |
|||
} |
|||
|
|||
#endif /* NETWARE */ |
|||
@ -1,29 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997-2008 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Venkat Raghavan S <rvenkat@novell.com> | |
|||
| Anantha Kesari H Y <hyanantha@novell.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
|
|||
#ifndef TSRM_NW_H |
|||
#define TSRM_NW_H |
|||
|
|||
#include "TSRM.h" |
|||
|
|||
TSRM_API FILE* popen(const char *command, const char *type); |
|||
TSRM_API int pclose(FILE* stream); |
|||
|
|||
#endif |
|||
@ -1,63 +0,0 @@ |
|||
#include <stdio.h> |
|||
|
|||
#include "tsrm_config_common.h" |
|||
#include "tsrm_strtok_r.h" |
|||
|
|||
static inline int in_character_class(char ch, const char *delim) |
|||
{ |
|||
while (*delim) { |
|||
if (*delim == ch) { |
|||
return 1; |
|||
} |
|||
delim++; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
char *tsrm_strtok_r(char *s, const char *delim, char **last) |
|||
{ |
|||
char *token; |
|||
|
|||
if (s == NULL) { |
|||
s = *last; |
|||
} |
|||
|
|||
while (*s && in_character_class(*s, delim)) { |
|||
s++; |
|||
} |
|||
if (!*s) { |
|||
return NULL; |
|||
} |
|||
|
|||
token = s; |
|||
|
|||
while (*s && !in_character_class(*s, delim)) { |
|||
s++; |
|||
} |
|||
if (!*s) { |
|||
*last = s; |
|||
} else { |
|||
*s = '\0'; |
|||
*last = s + 1; |
|||
} |
|||
return token; |
|||
} |
|||
|
|||
#if 0 |
|||
|
|||
main() |
|||
{ |
|||
char foo[] = "/foo/bar//\\barbara"; |
|||
char *last; |
|||
char *token; |
|||
|
|||
token = tsrm_strtok_r(foo, "/\\", &last); |
|||
while (token) { |
|||
printf ("Token = '%s'\n", token); |
|||
token = tsrm_strtok_r(NULL, "/\\", &last); |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
#endif |
|||
@ -1,6 +0,0 @@ |
|||
#ifndef TSRM_STRTOK_R |
|||
#define TSRM_STRTOK_R |
|||
|
|||
char *tsrm_strtok_r(char *s, const char *delim, char **last); |
|||
|
|||
#endif |
|||
1317
TSRM/tsrm_virtual_cwd.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,310 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997-2008 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Andi Gutmans <andi@zend.com> | |
|||
| Sascha Schumann <sascha@schumann.cx> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
/* $Id$ */ |
|||
|
|||
#ifndef VIRTUAL_CWD_H |
|||
#define VIRTUAL_CWD_H |
|||
|
|||
#include "TSRM.h" |
|||
#include "tsrm_config_common.h" |
|||
|
|||
#include <sys/types.h> |
|||
#include <sys/stat.h> |
|||
#include <ctype.h> |
|||
|
|||
#ifdef HAVE_UTIME_H |
|||
#include <utime.h> |
|||
#endif |
|||
|
|||
#ifdef HAVE_STDARG_H |
|||
#include <stdarg.h> |
|||
#endif |
|||
|
|||
#ifdef ZTS |
|||
#define VIRTUAL_DIR |
|||
#endif |
|||
|
|||
#ifndef TSRM_WIN32 |
|||
#include <unistd.h> |
|||
#else |
|||
#include <direct.h> |
|||
#endif |
|||
|
|||
#if defined(__osf__) || defined(_AIX) |
|||
#include <errno.h> |
|||
#endif |
|||
|
|||
#ifdef TSRM_WIN32 |
|||
#include "readdir.h" |
|||
#include <sys/utime.h> |
|||
/* mode_t isn't defined on Windows */ |
|||
typedef unsigned short mode_t; |
|||
|
|||
#define DEFAULT_SLASH '\\' |
|||
#define DEFAULT_DIR_SEPARATOR ';' |
|||
#define IS_SLASH(c) ((c) == '/' || (c) == '\\') |
|||
#define IS_SLASH_P(c) (*(c) == '/' || \ |
|||
(*(c) == '\\' && !IsDBCSLeadByte(*(c-1)))) |
|||
|
|||
/* COPY_WHEN_ABSOLUTE is 2 under Win32 because by chance both regular absolute paths |
|||
in the file system and UNC paths need copying of two characters */ |
|||
#define COPY_WHEN_ABSOLUTE(path) 2 |
|||
#define IS_UNC_PATH(path, len) \ |
|||
(len >= 2 && IS_SLASH(path[0]) && IS_SLASH(path[1])) |
|||
#define IS_ABSOLUTE_PATH(path, len) \ |
|||
(len >= 2 && ((isalpha(path[0]) && path[1] == ':') || IS_UNC_PATH(path, len))) |
|||
|
|||
#elif defined(NETWARE) |
|||
#ifdef HAVE_DIRENT_H |
|||
#include <dirent.h> |
|||
#endif |
|||
|
|||
#define DEFAULT_SLASH '/' |
|||
#define DEFAULT_DIR_SEPARATOR ';' |
|||
#define IS_SLASH(c) ((c) == '/' || (c) == '\\') |
|||
#define IS_SLASH_P(c) IS_SLASH(*(c)) |
|||
/* Colon indicates volume name, either first character should be forward slash or backward slash */ |
|||
#define IS_ABSOLUTE_PATH(path, len) \ |
|||
((strchr(path, ':') != NULL) || ((len >= 1) && ((path[0] == '/') || (path[0] == '\\')))) |
|||
|
|||
#else |
|||
#ifdef HAVE_DIRENT_H |
|||
#include <dirent.h> |
|||
#endif |
|||
|
|||
#define DEFAULT_SLASH '/' |
|||
|
|||
#ifdef __riscos__ |
|||
#define DEFAULT_DIR_SEPARATOR ';' |
|||
#else |
|||
#define DEFAULT_DIR_SEPARATOR ':' |
|||
#endif |
|||
|
|||
#define IS_SLASH(c) ((c) == '/') |
|||
#define IS_SLASH_P(c) (*(c) == '/') |
|||
|
|||
#endif |
|||
|
|||
|
|||
#ifndef COPY_WHEN_ABSOLUTE |
|||
#define COPY_WHEN_ABSOLUTE(path) 0 |
|||
#endif |
|||
|
|||
#ifndef IS_ABSOLUTE_PATH |
|||
#define IS_ABSOLUTE_PATH(path, len) \ |
|||
(IS_SLASH(path[0])) |
|||
#endif |
|||
|
|||
#ifdef TSRM_EXPORTS |
|||
#define CWD_EXPORTS |
|||
#endif |
|||
|
|||
#ifdef TSRM_WIN32 |
|||
# ifdef CWD_EXPORTS |
|||
# define CWD_API __declspec(dllexport) |
|||
# else |
|||
# define CWD_API __declspec(dllimport) |
|||
# endif |
|||
#else |
|||
#define CWD_API |
|||
#endif |
|||
|
|||
#ifdef TSRM_WIN32 |
|||
CWD_API int php_sys_stat(const char *path, struct stat *buf); |
|||
#else |
|||
# define php_sys_stat stat |
|||
#endif |
|||
|
|||
typedef struct _cwd_state { |
|||
char *cwd; |
|||
int cwd_length; |
|||
} cwd_state; |
|||
|
|||
typedef int (*verify_path_func)(const cwd_state *); |
|||
|
|||
CWD_API void virtual_cwd_startup(void); |
|||
CWD_API void virtual_cwd_shutdown(void); |
|||
CWD_API char *virtual_getcwd_ex(size_t *length TSRMLS_DC); |
|||
CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC); |
|||
CWD_API int virtual_chdir(const char *path TSRMLS_DC); |
|||
CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path TSRMLS_DC) TSRMLS_DC); |
|||
CWD_API int virtual_filepath(const char *path, char **filepath TSRMLS_DC); |
|||
CWD_API int virtual_filepath_ex(const char *path, char **filepath, verify_path_func verify_path TSRMLS_DC); |
|||
CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC); |
|||
CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC); |
|||
CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...); |
|||
CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC); |
|||
CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC); |
|||
CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC); |
|||
#if !defined(TSRM_WIN32) |
|||
CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC); |
|||
#endif |
|||
CWD_API int virtual_unlink(const char *path TSRMLS_DC); |
|||
CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC); |
|||
CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC); |
|||
CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC); |
|||
CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC); |
|||
CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC); |
|||
#if defined(TSRM_WIN32) |
|||
/* these are not defined in win32 headers */ |
|||
#ifndef W_OK |
|||
#define W_OK 0x02 |
|||
#endif |
|||
#ifndef R_OK |
|||
#define R_OK 0x04 |
|||
#endif |
|||
#ifndef X_OK |
|||
#define X_OK 0x01 |
|||
#endif |
|||
#ifndef F_OK |
|||
#define F_OK 0x00 |
|||
#endif |
|||
#endif |
|||
|
|||
#if HAVE_UTIME |
|||
CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC); |
|||
#endif |
|||
CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC); |
|||
#if !defined(TSRM_WIN32) && !defined(NETWARE) |
|||
CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int link TSRMLS_DC); |
|||
#endif |
|||
|
|||
/* One of the following constants must be used as the last argument |
|||
in virtual_file_ex() call. */ |
|||
|
|||
#define CWD_EXPAND 0 /* expand "." and ".." but dont resolve symlinks */ |
|||
#define CWD_FILEPATH 1 /* resolve symlinks if file is exist otherwise expand */ |
|||
#define CWD_REALPATH 2 /* call realpath(), resolve symlinks. File must exist */ |
|||
|
|||
CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath); |
|||
|
|||
CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC); |
|||
|
|||
#define REALPATH_CACHE_TTL (2*60) /* 2 minutes */ |
|||
#define REALPATH_CACHE_SIZE 0 /* disabled while php.ini isn't loaded */ |
|||
|
|||
typedef struct _realpath_cache_bucket { |
|||
unsigned long key; |
|||
char *path; |
|||
int path_len; |
|||
char *realpath; |
|||
int realpath_len; |
|||
time_t expires; |
|||
struct _realpath_cache_bucket *next; |
|||
} realpath_cache_bucket; |
|||
|
|||
typedef struct _virtual_cwd_globals { |
|||
cwd_state cwd; |
|||
long realpath_cache_size; |
|||
long realpath_cache_size_limit; |
|||
long realpath_cache_ttl; |
|||
realpath_cache_bucket *realpath_cache[1024]; |
|||
} virtual_cwd_globals; |
|||
|
|||
#ifdef ZTS |
|||
extern ts_rsrc_id cwd_globals_id; |
|||
# define CWDG(v) TSRMG(cwd_globals_id, virtual_cwd_globals *, v) |
|||
#else |
|||
extern virtual_cwd_globals cwd_globals; |
|||
# define CWDG(v) (cwd_globals.v) |
|||
#endif |
|||
|
|||
CWD_API void realpath_cache_clean(TSRMLS_D); |
|||
CWD_API void realpath_cache_del(const char *path, int path_len TSRMLS_DC); |
|||
|
|||
/* The actual macros to be used in programs using TSRM |
|||
* If the program defines VIRTUAL_DIR it will use the |
|||
* virtual_* functions |
|||
*/ |
|||
|
|||
#ifdef VIRTUAL_DIR |
|||
|
|||
#define VCWD_GETCWD(buff, size) virtual_getcwd(buff, size TSRMLS_CC) |
|||
#define VCWD_FOPEN(path, mode) virtual_fopen(path, mode TSRMLS_CC) |
|||
/* Because open() has two modes, we have to macros to replace it */ |
|||
#define VCWD_OPEN(path, flags) virtual_open(path TSRMLS_CC, flags) |
|||
#define VCWD_OPEN_MODE(path, flags, mode) virtual_open(path TSRMLS_CC, flags, mode) |
|||
#define VCWD_CREAT(path, mode) virtual_creat(path, mode TSRMLS_CC) |
|||
#define VCWD_CHDIR(path) virtual_chdir(path TSRMLS_CC) |
|||
#define VCWD_CHDIR_FILE(path) virtual_chdir_file(path, virtual_chdir TSRMLS_CC) |
|||
#define VCWD_GETWD(buf) |
|||
#define VCWD_REALPATH(path, real_path) virtual_realpath(path, real_path TSRMLS_CC) |
|||
#define VCWD_RENAME(oldname, newname) virtual_rename(oldname, newname TSRMLS_CC) |
|||
#define VCWD_STAT(path, buff) virtual_stat(path, buff TSRMLS_CC) |
|||
#if !defined(TSRM_WIN32) |
|||
#define VCWD_LSTAT(path, buff) virtual_lstat(path, buff TSRMLS_CC) |
|||
#endif |
|||
#define VCWD_UNLINK(path) virtual_unlink(path TSRMLS_CC) |
|||
#define VCWD_MKDIR(pathname, mode) virtual_mkdir(pathname, mode TSRMLS_CC) |
|||
#define VCWD_RMDIR(pathname) virtual_rmdir(pathname TSRMLS_CC) |
|||
#define VCWD_OPENDIR(pathname) virtual_opendir(pathname TSRMLS_CC) |
|||
#define VCWD_POPEN(command, type) virtual_popen(command, type TSRMLS_CC) |
|||
#define VCWD_ACCESS(pathname, mode) virtual_access(pathname, mode TSRMLS_CC) |
|||
#if HAVE_UTIME |
|||
#define VCWD_UTIME(path, time) virtual_utime(path, time TSRMLS_CC) |
|||
#endif |
|||
#define VCWD_CHMOD(path, mode) virtual_chmod(path, mode TSRMLS_CC) |
|||
#if !defined(TSRM_WIN32) && !defined(NETWARE) |
|||
#define VCWD_CHOWN(path, owner, group) virtual_chown(path, owner, group, 0 TSRMLS_CC) |
|||
#if HAVE_LCHOWN |
|||
#define VCWD_LCHOWN(path, owner, group) virtual_chown(path, owner, group, 1 TSRMLS_CC) |
|||
#endif |
|||
#endif |
|||
|
|||
#else |
|||
|
|||
#define VCWD_GETCWD(buff, size) getcwd(buff, size) |
|||
#define VCWD_FOPEN(path, mode) fopen(path, mode) |
|||
#define VCWD_OPEN(path, flags) open(path, flags) |
|||
#define VCWD_OPEN_MODE(path, flags, mode) open(path, flags, mode) |
|||
#define VCWD_CREAT(path, mode) creat(path, mode) |
|||
#define VCWD_RENAME(oldname, newname) rename(oldname, newname) |
|||
#define VCWD_CHDIR(path) chdir(path) |
|||
#define VCWD_CHDIR_FILE(path) virtual_chdir_file(path, chdir) |
|||
#define VCWD_GETWD(buf) getwd(buf) |
|||
#define VCWD_STAT(path, buff) php_sys_stat(path, buff) |
|||
#define VCWD_LSTAT(path, buff) lstat(path, buff) |
|||
#define VCWD_UNLINK(path) unlink(path) |
|||
#define VCWD_MKDIR(pathname, mode) mkdir(pathname, mode) |
|||
#define VCWD_RMDIR(pathname) rmdir(pathname) |
|||
#define VCWD_OPENDIR(pathname) opendir(pathname) |
|||
#define VCWD_POPEN(command, type) popen(command, type) |
|||
#if defined(TSRM_WIN32) |
|||
#define VCWD_ACCESS(pathname, mode) tsrm_win32_access(pathname, mode) |
|||
#else |
|||
#define VCWD_ACCESS(pathname, mode) access(pathname, mode) |
|||
#endif |
|||
|
|||
#define VCWD_REALPATH(path, real_path) tsrm_realpath(path, real_path TSRMLS_CC) |
|||
|
|||
#if HAVE_UTIME |
|||
#define VCWD_UTIME(path, time) utime(path, time) |
|||
#endif |
|||
#define VCWD_CHMOD(path, mode) chmod(path, mode) |
|||
#if !defined(TSRM_WIN32) && !defined(NETWARE) |
|||
#define VCWD_CHOWN(path, owner, group) chown(path, owner, group) |
|||
#if HAVE_LCHOWN |
|||
#define VCWD_LCHOWN(path, owner, group) lchown(path, owner, group) |
|||
#endif |
|||
#endif |
|||
|
|||
#endif |
|||
|
|||
#endif /* VIRTUAL_CWD_H */ |
|||
@ -1,397 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997-2008 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Daniel Beulshausen <daniel@php4win.de> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
/* $Id$ */ |
|||
|
|||
#include <stdio.h> |
|||
#include <fcntl.h> |
|||
#include <io.h> |
|||
#include <process.h> |
|||
#include <time.h> |
|||
|
|||
#define TSRM_INCLUDE_FULL_WINDOWS_HEADERS |
|||
|
|||
#include "TSRM.h" |
|||
|
|||
#ifdef TSRM_WIN32 |
|||
|
|||
#include "tsrm_win32.h" |
|||
|
|||
#ifdef ZTS |
|||
static ts_rsrc_id win32_globals_id; |
|||
#else |
|||
static tsrm_win32_globals win32_globals; |
|||
#endif |
|||
|
|||
static void tsrm_win32_ctor(tsrm_win32_globals *globals TSRMLS_DC) |
|||
{ |
|||
globals->process = NULL; |
|||
globals->shm = NULL; |
|||
globals->process_size = 0; |
|||
globals->shm_size = 0; |
|||
globals->comspec = _strdup((GetVersion()<0x80000000)?"cmd.exe":"command.com"); |
|||
} |
|||
|
|||
static void tsrm_win32_dtor(tsrm_win32_globals *globals TSRMLS_DC) |
|||
{ |
|||
shm_pair *ptr; |
|||
|
|||
if (globals->process) { |
|||
free(globals->process); |
|||
} |
|||
|
|||
if (globals->shm) { |
|||
for (ptr = globals->shm; ptr < (globals->shm + globals->shm_size); ptr++) { |
|||
UnmapViewOfFile(ptr->addr); |
|||
CloseHandle(ptr->segment); |
|||
UnmapViewOfFile(ptr->descriptor); |
|||
CloseHandle(ptr->info); |
|||
} |
|||
free(globals->shm); |
|||
} |
|||
|
|||
free(globals->comspec); |
|||
} |
|||
|
|||
TSRM_API void tsrm_win32_startup(void) |
|||
{ |
|||
#ifdef ZTS |
|||
ts_allocate_id(&win32_globals_id, sizeof(tsrm_win32_globals), (ts_allocate_ctor)tsrm_win32_ctor, (ts_allocate_ctor)tsrm_win32_dtor); |
|||
#else |
|||
tsrm_win32_ctor(&win32_globals TSRMLS_CC); |
|||
#endif |
|||
} |
|||
|
|||
TSRM_API void tsrm_win32_shutdown(void) |
|||
{ |
|||
#ifndef ZTS |
|||
tsrm_win32_dtor(&win32_globals TSRMLS_CC); |
|||
#endif |
|||
} |
|||
|
|||
TSRM_API int tsrm_win32_access(const char *pathname, int mode) |
|||
{ |
|||
if (mode == 1 /*X_OK*/) { |
|||
#if 1 |
|||
/* This code is not supported by Windows 98, |
|||
* but we don't support it anymore */ |
|||
DWORD type; |
|||
|
|||
return GetBinaryType(pathname, &type)?0:-1; |
|||
#else |
|||
SHFILEINFO sfi; |
|||
|
|||
return access(pathname, 0) == 0 && |
|||
SHGetFileInfo(pathname, 0, &sfi, sizeof(SHFILEINFO), SHGFI_EXETYPE) != 0 ? 0 : -1; |
|||
#endif |
|||
} else { |
|||
return access(pathname, mode); |
|||
} |
|||
} |
|||
|
|||
|
|||
static process_pair *process_get(FILE *stream TSRMLS_DC) |
|||
{ |
|||
process_pair *ptr; |
|||
process_pair *newptr; |
|||
|
|||
for (ptr = TWG(process); ptr < (TWG(process) + TWG(process_size)); ptr++) { |
|||
if (ptr->stream == stream) { |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (ptr < (TWG(process) + TWG(process_size))) { |
|||
return ptr; |
|||
} |
|||
|
|||
newptr = (process_pair*)realloc((void*)TWG(process), (TWG(process_size)+1)*sizeof(process_pair)); |
|||
if (newptr == NULL) { |
|||
return NULL; |
|||
} |
|||
|
|||
TWG(process) = newptr; |
|||
ptr = newptr + TWG(process_size); |
|||
TWG(process_size)++; |
|||
return ptr; |
|||
} |
|||
|
|||
static shm_pair *shm_get(int key, void *addr) |
|||
{ |
|||
shm_pair *ptr; |
|||
shm_pair *newptr; |
|||
TSRMLS_FETCH(); |
|||
|
|||
for (ptr = TWG(shm); ptr < (TWG(shm) + TWG(shm_size)); ptr++) { |
|||
if (!ptr->descriptor) { |
|||
continue; |
|||
} |
|||
if (!addr && ptr->descriptor->shm_perm.key == key) { |
|||
break; |
|||
} else if (ptr->addr == addr) { |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (ptr < (TWG(shm) + TWG(shm_size))) { |
|||
return ptr; |
|||
} |
|||
|
|||
newptr = (shm_pair*)realloc((void*)TWG(shm), (TWG(shm_size)+1)*sizeof(shm_pair)); |
|||
if (newptr == NULL) { |
|||
return NULL; |
|||
} |
|||
|
|||
TWG(shm) = newptr; |
|||
ptr = newptr + TWG(shm_size); |
|||
TWG(shm_size)++; |
|||
return ptr; |
|||
} |
|||
|
|||
static HANDLE dupHandle(HANDLE fh, BOOL inherit) { |
|||
HANDLE copy, self = GetCurrentProcess(); |
|||
if (!DuplicateHandle(self, fh, self, ©, 0, inherit, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE)) { |
|||
return NULL; |
|||
} |
|||
return copy; |
|||
} |
|||
|
|||
TSRM_API FILE *popen(const char *command, const char *type) |
|||
{ |
|||
return popen_ex(command, type, NULL, NULL); |
|||
} |
|||
|
|||
TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env) |
|||
{ |
|||
FILE *stream = NULL; |
|||
int fno, str_len = strlen(type), read, mode; |
|||
STARTUPINFO startup; |
|||
PROCESS_INFORMATION process; |
|||
SECURITY_ATTRIBUTES security; |
|||
HANDLE in, out; |
|||
char *cmd; |
|||
process_pair *proc; |
|||
TSRMLS_FETCH(); |
|||
|
|||
security.nLength = sizeof(SECURITY_ATTRIBUTES); |
|||
security.bInheritHandle = TRUE; |
|||
security.lpSecurityDescriptor = NULL; |
|||
|
|||
if (!str_len || !CreatePipe(&in, &out, &security, 2048L)) { |
|||
return NULL; |
|||
} |
|||
|
|||
memset(&startup, 0, sizeof(STARTUPINFO)); |
|||
memset(&process, 0, sizeof(PROCESS_INFORMATION)); |
|||
|
|||
startup.cb = sizeof(STARTUPINFO); |
|||
startup.dwFlags = STARTF_USESTDHANDLES; |
|||
startup.hStdError = GetStdHandle(STD_ERROR_HANDLE); |
|||
|
|||
read = (type[0] == 'r') ? TRUE : FALSE; |
|||
mode = ((str_len == 2) && (type[1] == 'b')) ? O_BINARY : O_TEXT; |
|||
|
|||
|
|||
if (read) { |
|||
in = dupHandle(in, FALSE); |
|||
startup.hStdInput = GetStdHandle(STD_INPUT_HANDLE); |
|||
startup.hStdOutput = out; |
|||
} else { |
|||
out = dupHandle(out, FALSE); |
|||
startup.hStdInput = in; |
|||
startup.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); |
|||
} |
|||
|
|||
cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c ")); |
|||
sprintf(cmd, "%s /c %s", TWG(comspec), command); |
|||
if (!CreateProcess(NULL, cmd, &security, &security, security.bInheritHandle, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, env, cwd, &startup, &process)) { |
|||
return NULL; |
|||
} |
|||
free(cmd); |
|||
|
|||
CloseHandle(process.hThread); |
|||
proc = process_get(NULL TSRMLS_CC); |
|||
|
|||
if (read) { |
|||
fno = _open_osfhandle((tsrm_intptr_t)in, _O_RDONLY | mode); |
|||
CloseHandle(out); |
|||
} else { |
|||
fno = _open_osfhandle((tsrm_intptr_t)out, _O_WRONLY | mode); |
|||
CloseHandle(in); |
|||
} |
|||
|
|||
stream = _fdopen(fno, type); |
|||
proc->prochnd = process.hProcess; |
|||
proc->stream = stream; |
|||
return stream; |
|||
} |
|||
|
|||
TSRM_API int pclose(FILE *stream) |
|||
{ |
|||
DWORD termstat = 0; |
|||
process_pair *process; |
|||
TSRMLS_FETCH(); |
|||
|
|||
if ((process = process_get(stream TSRMLS_CC)) == NULL) { |
|||
return 0; |
|||
} |
|||
|
|||
fflush(process->stream); |
|||
fclose(process->stream); |
|||
|
|||
WaitForSingleObject(process->prochnd, INFINITE); |
|||
GetExitCodeProcess(process->prochnd, &termstat); |
|||
process->stream = NULL; |
|||
CloseHandle(process->prochnd); |
|||
|
|||
return termstat; |
|||
} |
|||
|
|||
TSRM_API int shmget(int key, int size, int flags) |
|||
{ |
|||
shm_pair *shm; |
|||
char shm_segment[26], shm_info[29]; |
|||
HANDLE shm_handle, info_handle; |
|||
BOOL created = FALSE; |
|||
|
|||
if (size < 0) { |
|||
return -1; |
|||
} |
|||
|
|||
sprintf(shm_segment, "TSRM_SHM_SEGMENT:%d", key); |
|||
sprintf(shm_info, "TSRM_SHM_DESCRIPTOR:%d", key); |
|||
|
|||
shm_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment); |
|||
info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info); |
|||
|
|||
if ((!shm_handle && !info_handle)) { |
|||
if (flags & IPC_CREAT) { |
|||
shm_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, shm_segment); |
|||
info_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shm->descriptor), shm_info); |
|||
created = TRUE; |
|||
} |
|||
if ((!shm_handle || !info_handle)) { |
|||
return -1; |
|||
} |
|||
} else { |
|||
if (flags & IPC_EXCL) { |
|||
return -1; |
|||
} |
|||
} |
|||
|
|||
shm = shm_get(key, NULL); |
|||
shm->segment = shm_handle; |
|||
shm->info = info_handle; |
|||
shm->descriptor = MapViewOfFileEx(shm->info, FILE_MAP_ALL_ACCESS, 0, 0, 0, NULL); |
|||
|
|||
if (created) { |
|||
shm->descriptor->shm_perm.key = key; |
|||
shm->descriptor->shm_segsz = size; |
|||
shm->descriptor->shm_ctime = time(NULL); |
|||
shm->descriptor->shm_cpid = getpid(); |
|||
shm->descriptor->shm_perm.mode = flags; |
|||
|
|||
shm->descriptor->shm_perm.cuid = shm->descriptor->shm_perm.cgid= 0; |
|||
shm->descriptor->shm_perm.gid = shm->descriptor->shm_perm.uid = 0; |
|||
shm->descriptor->shm_atime = shm->descriptor->shm_dtime = 0; |
|||
shm->descriptor->shm_lpid = shm->descriptor->shm_nattch = 0; |
|||
shm->descriptor->shm_perm.mode = shm->descriptor->shm_perm.seq = 0; |
|||
} |
|||
|
|||
if (shm->descriptor->shm_perm.key != key || size > shm->descriptor->shm_segsz ) { |
|||
CloseHandle(shm->segment); |
|||
UnmapViewOfFile(shm->descriptor); |
|||
CloseHandle(shm->info); |
|||
return -1; |
|||
} |
|||
|
|||
return key; |
|||
} |
|||
|
|||
TSRM_API void *shmat(int key, const void *shmaddr, int flags) |
|||
{ |
|||
shm_pair *shm = shm_get(key, NULL); |
|||
|
|||
if (!shm->segment) { |
|||
return (void*)-1; |
|||
} |
|||
|
|||
shm->descriptor->shm_atime = time(NULL); |
|||
shm->descriptor->shm_lpid = getpid(); |
|||
shm->descriptor->shm_nattch++; |
|||
|
|||
shm->addr = MapViewOfFileEx(shm->segment, FILE_MAP_ALL_ACCESS, 0, 0, 0, NULL); |
|||
|
|||
return shm->addr; |
|||
} |
|||
|
|||
TSRM_API int shmdt(const void *shmaddr) |
|||
{ |
|||
shm_pair *shm = shm_get(0, (void*)shmaddr); |
|||
|
|||
if (!shm->segment) { |
|||
return -1; |
|||
} |
|||
|
|||
shm->descriptor->shm_dtime = time(NULL); |
|||
shm->descriptor->shm_lpid = getpid(); |
|||
shm->descriptor->shm_nattch--; |
|||
|
|||
return UnmapViewOfFile(shm->addr) ? 0 : -1; |
|||
} |
|||
|
|||
TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf) { |
|||
shm_pair *shm = shm_get(key, NULL); |
|||
|
|||
if (!shm->segment) { |
|||
return -1; |
|||
} |
|||
|
|||
switch (cmd) { |
|||
case IPC_STAT: |
|||
memcpy(buf, shm->descriptor, sizeof(struct shmid_ds)); |
|||
return 0; |
|||
|
|||
case IPC_SET: |
|||
shm->descriptor->shm_ctime = time(NULL); |
|||
shm->descriptor->shm_perm.uid = buf->shm_perm.uid; |
|||
shm->descriptor->shm_perm.gid = buf->shm_perm.gid; |
|||
shm->descriptor->shm_perm.mode = buf->shm_perm.mode; |
|||
return 0; |
|||
|
|||
case IPC_RMID: |
|||
if (shm->descriptor->shm_nattch < 1) { |
|||
shm->descriptor->shm_perm.key = -1; |
|||
} |
|||
return 0; |
|||
|
|||
default: |
|||
return -1; |
|||
} |
|||
} |
|||
|
|||
TSRM_API char *realpath(char *orig_path, char *buffer) |
|||
{ |
|||
int ret = GetFullPathName(orig_path, _MAX_PATH, buffer, NULL); |
|||
if(!ret || ret > _MAX_PATH) { |
|||
return NULL; |
|||
} |
|||
return buffer; |
|||
} |
|||
|
|||
#endif |
|||
@ -1,106 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| PHP Version 5 | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1997-2008 The PHP Group | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 3.01 of the PHP license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.php.net/license/3_01.txt | |
|||
| If you did not receive a copy of the PHP license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@php.net so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Daniel Beulshausen <daniel@php4win.de> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
/* $Id$ */ |
|||
|
|||
#ifndef TSRM_WIN32_H |
|||
#define TSRM_WIN32_H |
|||
|
|||
#include "TSRM.h" |
|||
#include <windows.h> |
|||
|
|||
struct ipc_perm { |
|||
int key; |
|||
unsigned short uid; |
|||
unsigned short gid; |
|||
unsigned short cuid; |
|||
unsigned short cgid; |
|||
unsigned short mode; |
|||
unsigned short seq; |
|||
}; |
|||
|
|||
struct shmid_ds { |
|||
struct ipc_perm shm_perm; |
|||
int shm_segsz; |
|||
time_t shm_atime; |
|||
time_t shm_dtime; |
|||
time_t shm_ctime; |
|||
unsigned short shm_cpid; |
|||
unsigned short shm_lpid; |
|||
short shm_nattch; |
|||
}; |
|||
|
|||
typedef struct { |
|||
FILE *stream; |
|||
HANDLE prochnd; |
|||
} process_pair; |
|||
|
|||
typedef struct { |
|||
void *addr; |
|||
HANDLE info; |
|||
HANDLE segment; |
|||
struct shmid_ds *descriptor; |
|||
} shm_pair; |
|||
|
|||
typedef struct { |
|||
process_pair *process; |
|||
shm_pair *shm; |
|||
int process_size; |
|||
int shm_size; |
|||
char *comspec; |
|||
} tsrm_win32_globals; |
|||
|
|||
#ifdef ZTS |
|||
# define TWG(v) TSRMG(win32_globals_id, tsrm_win32_globals *, v) |
|||
#else |
|||
# define TWG(v) (win32_globals.v) |
|||
#endif |
|||
|
|||
#define IPC_PRIVATE 0 |
|||
#define IPC_CREAT 00001000 |
|||
#define IPC_EXCL 00002000 |
|||
#define IPC_NOWAIT 00004000 |
|||
|
|||
#define IPC_RMID 0 |
|||
#define IPC_SET 1 |
|||
#define IPC_STAT 2 |
|||
#define IPC_INFO 3 |
|||
|
|||
#define SHM_R PAGE_READONLY |
|||
#define SHM_W PAGE_READWRITE |
|||
|
|||
#define SHM_RDONLY FILE_MAP_READ |
|||
#define SHM_RND FILE_MAP_WRITE |
|||
#define SHM_REMAP FILE_MAP_COPY |
|||
|
|||
|
|||
TSRM_API void tsrm_win32_startup(void); |
|||
TSRM_API void tsrm_win32_shutdown(void); |
|||
|
|||
TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env); |
|||
TSRM_API FILE *popen(const char *command, const char *type); |
|||
TSRM_API int pclose(FILE *stream); |
|||
TSRM_API int tsrm_win32_access(const char *pathname, int mode); |
|||
|
|||
TSRM_API int shmget(int key, int size, int flags); |
|||
TSRM_API void *shmat(int key, const void *shmaddr, int flags); |
|||
TSRM_API int shmdt(const void *shmaddr); |
|||
TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf); |
|||
|
|||
TSRM_API char *realpath(char *orig_path, char *buffer); |
|||
#endif |
|||
22097
Zend/ChangeLog
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,186 +0,0 @@ |
|||
// $Header$ |
|||
|
|||
// FlexLexer.h -- define interfaces for lexical analyzer classes generated |
|||
// by flex |
|||
|
|||
// Copyright (c) 1993 The Regents of the University of California. |
|||
// All rights reserved. |
|||
// |
|||
// This code is derived from software contributed to Berkeley by |
|||
// Kent Williams and Tom Epperly. |
|||
// |
|||
// Redistribution and use in source and binary forms with or without |
|||
// modification are permitted provided that: (1) source distributions retain |
|||
// this entire copyright notice and comment, and (2) distributions including |
|||
// binaries display the following acknowledgement: ``This product includes |
|||
// software developed by the University of California, Berkeley and its |
|||
// contributors'' in the documentation or other materials provided with the |
|||
// distribution and in all advertising materials mentioning features or use |
|||
// of this software. Neither the name of the University nor the names of |
|||
// its contributors may be used to endorse or promote products derived from |
|||
// this software without specific prior written permission. |
|||
|
|||
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED |
|||
// WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF |
|||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
|||
|
|||
// This file defines FlexLexer, an abstract class which specifies the |
|||
// external interface provided to flex C++ lexer objects, and yyFlexLexer, |
|||
// which defines a particular lexer class. |
|||
// |
|||
// If you want to create multiple lexer classes, you use the -P flag |
|||
// to rename each yyFlexLexer to some other xxFlexLexer. You then |
|||
// include <FlexLexer.h> in your other sources once per lexer class: |
|||
// |
|||
// #undef yyFlexLexer |
|||
// #define yyFlexLexer xxFlexLexer |
|||
// #include <FlexLexer.h> |
|||
// |
|||
// #undef yyFlexLexer |
|||
// #define yyFlexLexer zzFlexLexer |
|||
// #include <FlexLexer.h> |
|||
// ... |
|||
|
|||
#ifndef FLEXLEXER_H |
|||
// Never included before - need to define base class. |
|||
#define FLEXLEXER_H |
|||
#include <iostream.h> |
|||
|
|||
extern "C++" { |
|||
|
|||
struct yy_buffer_state; |
|||
typedef int yy_state_type; |
|||
|
|||
class FlexLexer { |
|||
public: |
|||
virtual ~FlexLexer() { } |
|||
|
|||
const char* YYText() { return yytext; } |
|||
int YYLeng() { return yyleng; } |
|||
|
|||
virtual void |
|||
yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0; |
|||
virtual struct yy_buffer_state* |
|||
yy_create_buffer( istream* s, int size ) = 0; |
|||
virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; |
|||
virtual void yyrestart( istream* s ) = 0; |
|||
|
|||
virtual int yylex() = 0; |
|||
|
|||
// Call yylex with new input/output sources. |
|||
int yylex( istream* new_in, ostream* new_out = 0 ) |
|||
{ |
|||
switch_streams( new_in, new_out ); |
|||
return yylex(); |
|||
} |
|||
|
|||
// Switch to new input/output streams. A nil stream pointer |
|||
// indicates "keep the current one". |
|||
virtual void switch_streams( istream* new_in = 0, |
|||
ostream* new_out = 0 ) = 0; |
|||
|
|||
int lineno() const { return yylineno; } |
|||
|
|||
int debug() const { return yy_flex_debug; } |
|||
void set_debug( int flag ) { yy_flex_debug = flag; } |
|||
|
|||
protected: |
|||
char* yytext; |
|||
int yyleng; |
|||
int yylineno; // only maintained if you use %option yylineno |
|||
int yy_flex_debug; // only has effect with -d or "%option debug" |
|||
}; |
|||
|
|||
} |
|||
#endif |
|||
|
|||
#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) |
|||
// Either this is the first time through (yyFlexLexerOnce not defined), |
|||
// or this is a repeated include to define a different flavor of |
|||
// yyFlexLexer, as discussed in the flex man page. |
|||
#define yyFlexLexerOnce |
|||
|
|||
class yyFlexLexer : public FlexLexer { |
|||
public: |
|||
// arg_yyin and arg_yyout default to the cin and cout, but we |
|||
// only make that assignment when initializing in yylex(). |
|||
yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 ); |
|||
|
|||
virtual ~yyFlexLexer(); |
|||
|
|||
void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ); |
|||
struct yy_buffer_state* yy_create_buffer( istream* s, int size ); |
|||
void yy_delete_buffer( struct yy_buffer_state* b ); |
|||
void yyrestart( istream* s ); |
|||
|
|||
virtual int yylex(); |
|||
virtual void switch_streams( istream* new_in, ostream* new_out ); |
|||
|
|||
protected: |
|||
virtual int LexerInput( char* buf, int max_size ); |
|||
virtual void LexerOutput( const char* buf, int size ); |
|||
virtual void LexerError( const char* msg ); |
|||
|
|||
void yyunput( int c, char* buf_ptr ); |
|||
int yyinput(); |
|||
|
|||
void yy_load_buffer_state(); |
|||
void yy_init_buffer( struct yy_buffer_state* b, istream* s ); |
|||
void yy_flush_buffer( struct yy_buffer_state* b ); |
|||
|
|||
int yy_start_stack_ptr; |
|||
int yy_start_stack_depth; |
|||
int* yy_start_stack; |
|||
|
|||
void yy_push_state( int new_state ); |
|||
void yy_pop_state(); |
|||
int yy_top_state(); |
|||
|
|||
yy_state_type yy_get_previous_state(); |
|||
yy_state_type yy_try_NUL_trans( yy_state_type current_state ); |
|||
int yy_get_next_buffer(); |
|||
|
|||
istream* yyin; // input source for default LexerInput |
|||
ostream* yyout; // output sink for default LexerOutput |
|||
|
|||
struct yy_buffer_state* yy_current_buffer; |
|||
|
|||
// yy_hold_char holds the character lost when yytext is formed. |
|||
char yy_hold_char; |
|||
|
|||
// Number of characters read into yy_ch_buf. |
|||
int yy_n_chars; |
|||
|
|||
// Points to current character in buffer. |
|||
char* yy_c_buf_p; |
|||
|
|||
int yy_init; // whether we need to initialize |
|||
int yy_start; // start state number |
|||
|
|||
// Flag which is used to allow yywrap()'s to do buffer switches |
|||
// instead of setting up a fresh yyin. A bit of a hack ... |
|||
int yy_did_buffer_switch_on_eof; |
|||
|
|||
// The following are not always needed, but may be depending |
|||
// on use of certain flex features (like REJECT or yymore()). |
|||
|
|||
yy_state_type yy_last_accepting_state; |
|||
char* yy_last_accepting_cpos; |
|||
|
|||
yy_state_type* yy_state_buf; |
|||
yy_state_type* yy_state_ptr; |
|||
|
|||
char* yy_full_match; |
|||
int* yy_full_state; |
|||
int yy_full_lp; |
|||
|
|||
int yy_lp; |
|||
int yy_looking_for_trail_begin; |
|||
|
|||
int yy_more_flag; |
|||
int yy_more_len; |
|||
int yy_more_offset; |
|||
int yy_prev_more_offset; |
|||
}; |
|||
|
|||
#endif |
|||
@ -1,56 +0,0 @@ |
|||
-------------------------------------------------------------------- |
|||
The Zend Engine License, Version 2.00 |
|||
Copyright (c) 1999-2006 Zend Technologies Ltd. All rights reserved. |
|||
-------------------------------------------------------------------- |
|||
|
|||
Redistribution and use in source and binary forms, with or without |
|||
modification, is permitted provided that the following conditions |
|||
are met: |
|||
|
|||
1. Redistributions of source code must retain the above copyright |
|||
notice, this list of conditions and the following disclaimer. |
|||
|
|||
2. Redistributions in binary form must reproduce the above |
|||
copyright notice, this list of conditions and the following |
|||
disclaimer in the documentation and/or other materials provided |
|||
with the distribution. |
|||
|
|||
3. The names "Zend" and "Zend Engine" must not be used to endorse |
|||
or promote products derived from this software without prior |
|||
permission from Zend Technologies Ltd. For written permission, |
|||
please contact license@zend.com. |
|||
|
|||
4. Zend Technologies Ltd. may publish revised and/or new versions |
|||
of the license from time to time. Each version will be given a |
|||
distinguishing version number. |
|||
Once covered code has been published under a particular version |
|||
of the license, you may always continue to use it under the |
|||
terms of that version. You may also choose to use such covered |
|||
code under the terms of any subsequent version of the license |
|||
published by Zend Technologies Ltd. No one other than Zend |
|||
Technologies Ltd. has the right to modify the terms applicable |
|||
to covered code created under this License. |
|||
|
|||
5. Redistributions of any form whatsoever must retain the following |
|||
acknowledgment: |
|||
"This product includes the Zend Engine, freely available at |
|||
http://www.zend.com" |
|||
|
|||
6. All advertising materials mentioning features or use of this |
|||
software must display the following acknowledgment: |
|||
"The Zend Engine is freely available at http://www.zend.com" |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY ZEND TECHNOLOGIES LTD. ``AS IS'' AND |
|||
ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
|||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
|||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ZEND |
|||
TECHNOLOGIES LTD. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
|||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
|||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
|||
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|||
SUCH DAMAGE. |
|||
|
|||
-------------------------------------------------------------------- |
|||
@ -1,54 +0,0 @@ |
|||
## Process this file with automake to produce Makefile.in -*- makefile -*-
|
|||
|
|||
#CLEANFILES = zend_language_parser.c zend_language_parser.h zend_language_scanner.c zend_language_parser.output zend_ini_parser.c zend_ini_parser.h zend_ini_scanner.c zend_ini_parser.output
|
|||
|
|||
AUTOMAKE_OPTIONS=foreign |
|||
noinst_LTLIBRARIES=libZend.la |
|||
|
|||
libZend_la_SOURCES=\
|
|||
zend_language_parser.y zend_language_scanner.l \
|
|||
zend_ini_parser.y zend_ini_scanner.l \
|
|||
zend_alloc.c zend_compile.c zend_constants.c zend_dynamic_array.c \
|
|||
zend_execute.c zend_execute_API.c zend_highlight.c zend_llist.c \
|
|||
zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \
|
|||
zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \
|
|||
zend_list.c zend_indent.c zend_builtin_functions.c zend_sprintf.c \
|
|||
zend_ini.c zend_qsort.c zend_objects.c zend_object_handlers.c \
|
|||
zend_objects_API.c zend_ts_hash.c zend_stream.c \
|
|||
zend_default_classes.c \
|
|||
zend_iterators.c zend_interfaces.c zend_exceptions.c \
|
|||
zend_strtod.c zend_multibyte.c |
|||
|
|||
libZend_la_LDFLAGS = |
|||
libZend_la_LIBADD = @ZEND_EXTRA_LIBS@ |
|||
|
|||
# automake isn't too clever about "non-standard" use of lex and yacc
|
|||
|
|||
$(libZend_la_OBJECTS): zend_language_parser.h |
|||
|
|||
zend_ini_scanner.lo: zend_ini_parser.h |
|||
|
|||
# Language parser/scanner rules
|
|||
|
|||
zend_language_scanner.c: $(srcdir)/zend_language_scanner.l |
|||
$(LEX) -Pzend -S$(srcdir)/flex.skl -o$@ -i $(srcdir)/zend_language_scanner.l |
|||
|
|||
zend_language_parser.h: zend_language_parser.c |
|||
zend_language_parser.c: $(srcdir)/zend_language_parser.y |
|||
$(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o zend_language_parser.c |
|||
|
|||
# INI parser/scanner rules
|
|||
|
|||
zend_ini_parser.c: $(srcdir)/zend_ini_parser.y |
|||
$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c |
|||
|
|||
zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l |
|||
$(LEX) -Pini_ -S$(srcdir)/flex.skl -o$@ -i $(srcdir)/zend_ini_scanner.l |
|||
|
|||
zend_ini_parser.h: zend_ini_parser.c |
|||
|
|||
depend: |
|||
|
|||
zend_execute.lo: $(srcdir)/zend_execute.c |
|||
$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(INLINE_CFLAGS) -c $(srcdir)/zend_execute.c |
|||
|
|||
@ -1 +0,0 @@ |
|||
Zend/zend_execute.lo: $(srcdir)/zend_vm_execute.h $(srcdir)/zend_vm_opcodes.h |
|||
@ -1,195 +0,0 @@ |
|||
Creating an object |
|||
------------------ |
|||
|
|||
Object can be created in the following ways: |
|||
|
|||
1. As a result of a function call. E.g.: |
|||
|
|||
$foo = create_new_foo("parameter"); |
|||
$foo->run(); |
|||
|
|||
The function should create a new zval, create new object and get the |
|||
handle for it, set handle and handler table as needed. Note that the |
|||
handle is the only ID of the object, so it should be enough to |
|||
identify it. |
|||
|
|||
2. Overriding create_object handler for class. E.g.: |
|||
|
|||
$foo = new Java("some.Class.here", "parameter"); |
|||
$foo->run(); |
|||
|
|||
The create_object handler function should create a new zval, create |
|||
new object and get the handle for it, set handle and handler table as |
|||
needed, and also provide constructor method that would handle |
|||
constructor call. The get_constructor handler table entry should be |
|||
used for that. Do not rely class entry's constructor, unless you refer |
|||
to it from get_constructor handler. |
|||
|
|||
Object maintenance |
|||
------------------ |
|||
|
|||
The handlers add_ref and del_ref are called when a new zval referring |
|||
to the object is created. This does not create a new object - both |
|||
zvals still refer to the same object. |
|||
|
|||
clone_obj handler should create a new object, identical to an old one, |
|||
but being a separate entity. |
|||
|
|||
delete_obj should destroy an object, all references to it become |
|||
invalid. |
|||
|
|||
Object access - read |
|||
-------------------- |
|||
|
|||
read_property is used to read object's property. This value is not |
|||
meant to be changed. The handler returns zval * with the value. |
|||
|
|||
Object access - write |
|||
--------------------- |
|||
|
|||
write_property is used to directly write object's property by |
|||
name. This handler is used to assign property variables or to change them |
|||
in operations like += or ++ (unless get_property_zval_ptr is also set). |
|||
|
|||
get_property_zval_ptr is used to obtain pointer to modifiable zval for |
|||
operations like += or ++. This should be used only if your object model |
|||
stores properties as real zval's that can be modified from outside. |
|||
Otherwise this handler should be NULL and the engine will use |
|||
read_property and write_property instead. |
|||
|
|||
get_property_ptr is used to obtain zval ** for future writing to |
|||
it. If your object properties are stored as zval*, return real place |
|||
where the property is stored. If the aren't, the best way is to create |
|||
proxy object and handle it via get and set methods (see below). |
|||
This method is meant to be used for send-by-reference and assign-by-reference |
|||
use of object properties. If you don;t want to implement property |
|||
referencing for your objects, you can set this handler to NULL. |
|||
|
|||
get and set handlers are used when engine needs to access the object |
|||
as a value. E.g., in the following situation: |
|||
|
|||
$foo =& $obj->bar; |
|||
$foo = 1; |
|||
|
|||
if $foo is an object (e.g., proxy object from get_property_ptr) it |
|||
would be accessed using write handler. |
|||
|
|||
Object access - method call |
|||
--------------------------- |
|||
|
|||
get_method handler is used to find method description by name. It |
|||
should set right type, function name and parameter mask for the |
|||
method. If the type is ZEND_OVERLOADED_FUNCTION, the method would be |
|||
called via call_method handler, otherwise it would be called with |
|||
standard Zend means. |
|||
|
|||
get_constructor performs the same function as get_method, but for the |
|||
object constructor. |
|||
|
|||
call_method handler is used to perform method call. Parameters are |
|||
passed like to any other Zend internal function. |
|||
|
|||
Object - comparison |
|||
------------------- |
|||
|
|||
Objects can be compared via compare_objects handler. This is used with |
|||
== operation, === compares objects by handles, i.e., return true if |
|||
and only if it's really the same object. Note that objects from |
|||
different object types (i.e., having different handlers) can not be |
|||
compared. |
|||
|
|||
Objects - reflection |
|||
-------------------- |
|||
|
|||
get_class_name is used to retrieve class name of the object. |
|||
get_class_entry returns class entry (zend_class_entry) for the object, |
|||
in case there exists PHP class for it. |
|||
No other reflection functions are currently implemented. |
|||
|
|||
Objects - data structures and handlers |
|||
--------------------------------------- |
|||
|
|||
The object is represented by the following structure: |
|||
|
|||
struct _zend_object_value { |
|||
zend_object_handle handle; |
|||
zend_object_handlers *handlers; |
|||
}; |
|||
|
|||
handle is an ID of the object among the objects of the same type (not |
|||
class!). The type of the object and how it behaves is determined by |
|||
the handler table. |
|||
|
|||
typedef struct _zend_object_handlers { |
|||
zend_object_add_ref_t add_ref; |
|||
zend_object_del_ref_t del_ref; |
|||
zend_object_delete_obj_t delete_obj; |
|||
zend_object_clone_obj_t clone_obj; |
|||
zend_object_read_property_t read_property; |
|||
zend_object_write_property_t write_property; |
|||
zend_object_get_property_ptr_t get_property_ptr; |
|||
zend_object_get_property_zval_ptr_t get_property_zval_ptr; |
|||
zend_object_get_t get; |
|||
zend_object_set_t set; |
|||
zend_object_has_property_t has_property; |
|||
zend_object_unset_property_t unset_property; |
|||
zend_object_get_properties_t get_properties; |
|||
zend_object_get_method_t get_method; |
|||
zend_object_call_method_t call_method; |
|||
zend_object_get_constructor_t get_constructor; |
|||
zend_object_get_class_entry_t get_class_entry; |
|||
zend_object_get_class_name_t get_class_name; |
|||
zend_object_compare_t compare_objects; |
|||
} zend_object_handlers; |
|||
|
|||
See zend_object_handlers.h for prototypes. All objects are passed as zval's. |
|||
|
|||
Handlers explained: |
|||
|
|||
add_ref - called when a copy of the object handle is created. |
|||
|
|||
del_ref - called when a copy of the object handle is destroyed. |
|||
|
|||
delete_obj - called when an object needs to be destroyed. |
|||
|
|||
clone_obj - called when a new object identical to an old one should be |
|||
created (unlike Zend Engine 1, this never happens unless explicitly |
|||
asked for). |
|||
|
|||
read_property - returns zval *, containing the value of the |
|||
property. Is used when value of the property should be retrieved for |
|||
reading. |
|||
|
|||
write_property - assigns value to certain property of the object. |
|||
|
|||
get_property_zval_ptr - retrieves zval** for being directly modified by |
|||
the engine. If your properties are not zval's, don't define it. |
|||
|
|||
get_property_ptr - retrieves zval** for the property of the value, to |
|||
be used for read and write. If object properties are not zval's |
|||
natively, this method should create and return proxy object for use |
|||
with get and set methods. |
|||
|
|||
get - retrieves zval* for object contents. To be used mainly with |
|||
proxy objects from get_property_ptr, but also may be used for |
|||
convert_to_* functions. |
|||
|
|||
set - sets value for object contents. To be used mainly with |
|||
proxy objects from get_property_ptr. |
|||
|
|||
has_property - checks if the object has certain property set. |
|||
|
|||
unset_property - removes value for the property of the object |
|||
|
|||
get_method - retrieves description of the method |
|||
|
|||
call_method - calls the method (parameters should be put on stack like |
|||
for any other PHP internal function). |
|||
|
|||
get_constructor - get description for the object constructor method |
|||
|
|||
get_class_entry - should return the class entry for the object |
|||
|
|||
get_class_name - get the name of the class the object belongs to |
|||
|
|||
compare_objects - compares if two objects are equal |
|||
@ -1,34 +0,0 @@ |
|||
Zend Memory Manager |
|||
=================== |
|||
|
|||
General: |
|||
-------- |
|||
|
|||
The goal of the new memory manager (available since PHP 5.2) is to reduce memory |
|||
allocation overhead and speedup memory management. |
|||
|
|||
The new manager's "configure" has no "--disable-zend-memory-manager" option, |
|||
but it has "--enable-malloc-mm" instead. It is enabled by default in DEBUG |
|||
build and disabled by default in RELEASE build. when enabled it allows selecting |
|||
between malloc and emalloc at runtime so you can use internal and external memory |
|||
debuggers without recompilation. |
|||
|
|||
Debugging: |
|||
---------- |
|||
|
|||
Normal: |
|||
|
|||
$ sapi/cli/php -r 'leak();' |
|||
|
|||
Zend MM disabled: |
|||
|
|||
$ USE_ZEND_ALLOC=0 valgrind --leak-check=full sapi/cli/php -r 'leak();' |
|||
|
|||
Tweaking: |
|||
--------- |
|||
|
|||
The Zend MM can be tweaked using ZEND_MM_MEM_TYPE and ZEND_MM_SEG_SIZE environment |
|||
variables. Default values are "malloc" and "256K". Dependent on target system you |
|||
can also use "mmap_anon", "mmap_zero" and "win32" storage managers. |
|||
|
|||
$ ZEND_MM_MEM_TYPE=mmap_anon ZEND_MM_SEG_SIZE=1M sapi/cli/php ..etc. |
|||
@ -1,108 +0,0 @@ |
|||
ZEND_VM |
|||
======= |
|||
|
|||
ZEND_VM architecture allows specializing opcode handlers according to op_type |
|||
fields and using different execution methods (call threading, switch threading |
|||
and direct threading). As a result ZE2 got more than 20% speedup on raw PHP |
|||
code execution (with specialized executor and direct threading execution |
|||
method). As in most PHP applications raw execution speed isn't the limiting |
|||
factor but system calls and database callls are, your mileage with this patch |
|||
will vary. |
|||
|
|||
Most parts of the old zend_execute.c go into zend_vm_def.h. Here you can |
|||
find opcode handlers and helpers. The typical opcode handler template looks |
|||
like this: |
|||
|
|||
ZEND_VM_HANDLER(<OPCODE-NUMBER>, <OPCODE>, <OP1_TYPES>, <OP2_TYPES>) |
|||
{ |
|||
<HANDLER'S CODE> |
|||
} |
|||
|
|||
<OPCODE-NUMBER> is a opcode number (0, 1, ...) |
|||
<OPCODE> is an opcode name (ZEN_NOP, ZEND_ADD, :) |
|||
<OP1_TYPES> & <OP2_TYPES> are masks for allowed operand op_types. Specializer |
|||
will generate code only for defined combination of types. You can use any |
|||
combination of the following op_types UNUSED, CONST, VAR, TMP and CV also |
|||
you can use ANY mask to disable specialization according operand's op_type. |
|||
<HANDLER'S CODE> is a handler's code itself. For most handlers it stills the |
|||
same as in old zend_execute.c, but now it uses macros to access opcode operands |
|||
and some internal executor data. |
|||
|
|||
You can see the conformity of new macros to old code in the following list: |
|||
|
|||
EXECUTE_DATA |
|||
execute_data |
|||
ZEND_VM_DISPATCH_TO_HANDLER(<OP>) |
|||
return <OP>_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU) |
|||
ZEND_VM_DISPATCH_TO_HELPER(<NAME>) |
|||
return <NAME>(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU) |
|||
ZEND_VM_DISPATCH_TO_HELPER_EX(<NAME>,<PARAM>,<VAL>) |
|||
return <NAME>(<VAL>, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU) |
|||
ZEND_VM_CONTINUE() |
|||
return 0 |
|||
ZEND_VM_NEXT_OPCODE() |
|||
NEXT_OPCODE() |
|||
ZEND_VM_SET_OPCODE(<TARGET> |
|||
SET_OPCODE(<TARGET> |
|||
ZEND_VM_INC_OPCODE() |
|||
INC_OPCOD() |
|||
ZEND_VM_RETURN_FROM_EXECUTE_LOOP() |
|||
RETURN_FROM_EXECUTE_LOOP() |
|||
ZEND_VM_C_LABEL(<LABEL>): |
|||
<LABEL>: |
|||
ZEND_VM_C_GOTO(<LABEL>) |
|||
goto <LABEL> |
|||
OP<X>_TYPE |
|||
opline->op<X>.op_type |
|||
GET_OP<X>_ZVAL_PTR(<TYPE>) |
|||
get_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>) |
|||
GET_OP<X>_ZVAL_PTR_PTR(<TYPE>) |
|||
get_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>) |
|||
GET_OP<X>_OBJ_ZVAL_PTR(<TYPE>) |
|||
get_obj_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>) |
|||
GET_OP<X>_OBJ_ZVAL_PTR_PTR(<TYPE>) |
|||
get_obj_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>) |
|||
IS_OP<X>_TMP_FREE() |
|||
IS_TMP_FREE(free_op<X>) |
|||
FREE_OP<X>() |
|||
FREE_OP(free_op<X>) |
|||
FREE_OP<X>_IF_VAR() |
|||
FREE_VAR(free_op<X>) |
|||
FREE_OP<X>_VAR_PTR() |
|||
FREE_VAR_PTR(free_op<X>) |
|||
|
|||
|
|||
Executor's helpers can be defined without parameters or with one parameter. |
|||
This is done with the following constructs: |
|||
|
|||
ZEND_VM_HELPER(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>) |
|||
{ |
|||
<HELPER'S CODE> |
|||
} |
|||
|
|||
ZEND_VM_HELPER_EX(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>, <PARAM_SPEC>) |
|||
{ |
|||
<HELPER'S CODE> |
|||
} |
|||
|
|||
Executor's code is generated by PHP script zend_vm_gen.php it uses zend_vm_def.h |
|||
and zend_vm_execute.skl as input and produces zend_vm_opcodes.h and |
|||
zend_vm_execute.h. The first file is a list of opcode definitions. It is |
|||
included from zend_compile.h. The second one is an executor code itself. It is |
|||
included from zend_execute.c. |
|||
|
|||
zend_vm_gen.php can produce different kind of executors. You can select |
|||
different opcode threading model using --with-vm-kind=CALL|SWITCH|GOTO. You can |
|||
disable opcode specialization using --without-specializer. You can include or |
|||
exclude old executor together with specialized one using --without-old-executor. |
|||
At last you can debug executor using original zend_vm_def.h or generated file |
|||
zend_vm_execute.h. Debugging with original file requires --with-lines |
|||
option. By default ZE2 uses the following command to generate executor: |
|||
|
|||
$ php zend_vm_gen.php --with-vm-kind=CALL |
|||
|
|||
Zend Engine II currently includes two executors during the build process, one |
|||
is the specialized version and the other is the old one non-specialized with |
|||
function handlers. By default Zend Engine II uses the specialized one but you |
|||
can switch to the old executor at runtime by calling zend_vm_use_old_executor(). |
|||
|
|||
@ -1,136 +0,0 @@ |
|||
Revamped object model using object handles |
|||
=========================================== |
|||
|
|||
Background |
|||
---------- |
|||
|
|||
In the Zend Engine 1.0 (and its predecessor the PHP 3 scripting |
|||
engine) the object model's design is that instantiated objects are |
|||
language values. This means that when programmers are performing |
|||
operations, such variable assignment and passing parameters to |
|||
functions, objects are handled very similarly to the way other |
|||
primitive types are handled such as integers and strings. |
|||
Semantically this means that the whole object is being copied. The |
|||
approach Java takes is different where one refers to objects by handle |
|||
and not by value (one can think of a handle as an objects' ID). |
|||
|
|||
Need |
|||
---- |
|||
|
|||
Unfortunately, the approach taken up to now has severely limited the |
|||
Zend Engine's object oriented model, both feature and simplicity |
|||
wise. One of the main problems with the former approach is that object |
|||
instantiation and duplication is very hard to control, a problem which |
|||
can not only lead to inefficient development but also often to strange |
|||
run-time behavior. Changing the object model to a handle oriented |
|||
model will allow the addressing of many needs such as destructors, |
|||
de-referencing method return values, tight control of object |
|||
duplication and more. |
|||
|
|||
Overview |
|||
-------- |
|||
|
|||
The proposed object model is very much influenced by the Java |
|||
model. In general, when you create a new object you will be getting a |
|||
handle to the object instead of the object itself. When this handle is |
|||
sent to functions, assigned and copied it is only the handle which is |
|||
copied/sent/assigned. The object itself is never copied nor |
|||
duplicated. This results in all handles of this object to always point |
|||
at the same object making it a very consistent solution and saving |
|||
unnecessary duplication and confusing behavior. |
|||
|
|||
Functionality |
|||
------------- |
|||
|
|||
After this change the basic use of objects will be almost identical to |
|||
previous versions of the scripting engine. However, you won't bump |
|||
into awkward and confusing copying & destructing of objects. In order |
|||
to create and use a new object instance you will do the following: |
|||
$object = new MyClass(); $object->method(); |
|||
|
|||
The previous code will assign $object the handle of a new instance of |
|||
the class MyClass and call one of its methods. |
|||
|
|||
|
|||
Consider the following code: |
|||
|
|||
1 class MyClass |
|||
2 { |
|||
3 function setMember($value) |
|||
4 { |
|||
5 $this->member = $value; |
|||
6 } |
|||
7 |
|||
8 function getMember() |
|||
9 { |
|||
10 return $this->member; |
|||
11 } |
|||
12 } |
|||
13 |
|||
14 function foo($obj) |
|||
15 { |
|||
16 $obj->setMember("foo"); |
|||
17 } |
|||
18 |
|||
19 $object = new MyClass(); |
|||
20 $object->setMember("bar"); |
|||
21 foo($object); |
|||
22 print $object->getMember(); |
|||
|
|||
Without the new Java-like handles, at line 20 the objects' data member |
|||
member is set to the string value of "bar". Because of the internal |
|||
representation of objects in the Zend Engine 1.0, the object is marked |
|||
as a reference, and when it is sent by value to the function foo, it |
|||
is duplicated (!). Therefore, the call to foo() on line 21 will |
|||
result in the $obj->setMember("foo") call being called on a duplicate |
|||
of $object. Line 22 will then result in "bar" being printed. |
|||
|
|||
This is how the scripting engine has worked until today. Most |
|||
developers are probably unaware of the fact that they aren't always |
|||
talking to the same object but often duplicates; others may have |
|||
realized this can usually be solved by always passing objects by |
|||
reference (unless a replica is actually desired, which is uncommon). |
|||
|
|||
The new object model will allow for a much more intuitive |
|||
implementation of the code. On line 21, the object's handle (ID) is |
|||
passed to foo() by value. Inside foo(), the object is fetched |
|||
according to this handle and, therefore, the setMember() method is |
|||
called on the originally instantiated object and not a copy. Line 22 |
|||
will therefore result in "foo" being printed. This approach gives |
|||
developers tighter control of when objects are created and duplicated. |
|||
An additional not-as-important benefit is that the object handle will |
|||
be passed to foo() by value, which most probably will also save |
|||
unnecessary duplication of the value containing the ID itself and thus |
|||
additionally improving run-time performance. |
|||
|
|||
This was just a simple description of why the new object model solves |
|||
awkward behavior and makes object handling much easier, intuitive and |
|||
efficient. The importance of this change goes far beyond what is |
|||
mentioned in this section as you will see in further sections which |
|||
describe new features with a majority of them being based on this |
|||
change. |
|||
|
|||
Compatibility Notes |
|||
-------------------- |
|||
|
|||
Many PHP programmers aren't even aware of the copying quirks of the |
|||
current object model and, therefore, there is a relatively good chance |
|||
that the amount of PHP applications that will work out of the box or |
|||
after a very small amount of modifications would be high. |
|||
|
|||
To simplify migration, version 2.0 will support an optional |
|||
'auto-clone' feature, which will perform a cloning of the object |
|||
whenever it would have been copied in version 1.0. Optionally, it |
|||
will also be possible to request that the engine will emit an E_NOTICE |
|||
message whenever such an automatic clone occurs, in order to allow |
|||
developers to gradually migrate to the version 2.0-style behavior |
|||
(without automatic clones). |
|||
|
|||
Dependencies |
|||
------------ |
|||
|
|||
The new object model is not dependent on other features. Many of the |
|||
other Zend Engine 2.0 features, such as the $foo->bar()->barbara() |
|||
syntax, destructors and others completely rely on this new object |
|||
model. |
|||
|
|||
@ -1,169 +0,0 @@ |
|||
Title: Zend 2.0 Namespaces |
|||
Version: $Revision$ |
|||
Status: declined |
|||
Maintainer: Stig S. Bakken <ssb@php.net> |
|||
Created: 2001-09-08 |
|||
Modified: 2001-09-08 |
|||
|
|||
|
|||
1. Background/Need |
|||
================== |
|||
|
|||
PHP and Zend 1.0 have come to a point where a lot of reusable code is |
|||
being written; from simple functions and classes to entire application |
|||
frameworks. It is becoming increasingly difficult to avoid symbol |
|||
name collisions with the current scoping methods. |
|||
|
|||
The symbol scopes available in Zend 1.0 are the global scope, the |
|||
class scope and the function scope. All scopes but classes may |
|||
contain variables, only the class and global scopes may contain |
|||
functions, while only the global scope may contain constants and |
|||
classes. This means that all of Zend 1.0's scoping methods are |
|||
inherently limited for solving symbol name collision problems. |
|||
|
|||
|
|||
2. Overview |
|||
=========== |
|||
|
|||
Namespaces in Zend 2.0 provide a way to manage the symbol collision |
|||
problem by making it possible to define multiple symbol tables able to |
|||
contain all types of symbols. Zend will get the notion of a current |
|||
namespace, defaulting to the current global one. The current name |
|||
space may be changed on a file-by-file basis. Symbols in other name |
|||
spaces than the current one may be referenced using a new namespace |
|||
operator. It will be possible to "import" symbols from one namespace |
|||
into another. |
|||
|
|||
|
|||
3. Functionality |
|||
================ |
|||
|
|||
3.1. Namespace Syntax |
|||
===================== |
|||
|
|||
The namespace operator ":" is used to refer to symbols in other |
|||
namespaces than the current one: |
|||
|
|||
Class: Namespace:class |
|||
Function: Namespace:function |
|||
Static method: Namespace:class::method |
|||
Variable: $Namespace:variable |
|||
Constant: Namespace:CONSTANT |
|||
Class variable: $Namespace:class::variable |
|||
|
|||
To refer to symbols in the global namespace, symbols are prefixed with |
|||
only the namespace operator: |
|||
|
|||
Class: :class |
|||
Function: :function |
|||
Static method: :class::method |
|||
Variable: $:variable |
|||
Constant: :CONSTANT |
|||
Class variable: $:class::variable |
|||
|
|||
Note: $:variable will effectively be just another syntax for |
|||
$GLOBALS['variable']. |
|||
|
|||
A namespace may have a name containing a ":", it is always the last |
|||
":" character in the symbol qualifier that is the actual namespace |
|||
operator: |
|||
|
|||
Class: Name:Space:class |
|||
Function: Name:Space:function |
|||
Static method: Name:Space:class::method |
|||
Variable: $Name:Space:variable |
|||
Constant: Name:Space:CONSTANT |
|||
Class variable: $Name:Space:class::variable |
|||
|
|||
(Here, the ":" between "Name" and "Space" is part of the name, it is |
|||
the one after "Space" that is the namespace operator.) |
|||
|
|||
|
|||
3.2. Defining Namespaces |
|||
======================== |
|||
|
|||
Individual files may define a namespace that will apply to the entire |
|||
file. If no "namespace" operator occurs in the file, it will be in |
|||
the global namespace: |
|||
|
|||
1 namespace HTML; |
|||
2 |
|||
3 class Form { |
|||
4 function Form() { |
|||
5 // constructor |
|||
6 } |
|||
7 // ... |
|||
8 } |
|||
|
|||
Or with the "nested" name syntax: |
|||
|
|||
1 namespace HTML:Form; |
|||
2 |
|||
3 class Image { |
|||
4 var $src; |
|||
5 function Image($src) { |
|||
6 $this->src = $src; |
|||
7 } |
|||
8 // ... |
|||
9 } |
|||
|
|||
Code executed within the "HTML" namespace may refer to the Form class |
|||
as just "Form". Code executed from within other namespaces has to |
|||
refer to it as "HTML:Form". The "namespace" statement must occur |
|||
before any other statements in the file. |
|||
|
|||
# [ssb 2001-09-08]: |
|||
# Should it be possible to "add" symbols to a namespace by including a |
|||
# second file with the same namespace statement? |
|||
|
|||
|
|||
3.3. Importing Symbols |
|||
====================== |
|||
|
|||
It is possible to import symbols from another namespace into the |
|||
current one with the "import" statement: |
|||
|
|||
import * from HTML; // all symbols |
|||
|
|||
import Form from HTML; // single symbols |
|||
|
|||
import Form,Table from HTML; // multiple symbols |
|||
|
|||
There is a potential for name clashes between symols of different |
|||
types that have the same qualifier syntax. These are resolved in this |
|||
order: class, function, constant. |
|||
|
|||
Optionally, the symbol type may be explicitly given to import (as |
|||
"class", "function", "variable" or "constant"): |
|||
|
|||
import class Form from HTML; |
|||
|
|||
And finally, you may import all symbols of a given type: |
|||
|
|||
import constant * from HTML:Table; |
|||
|
|||
The namespace with its symbols must already be defined before using |
|||
"import". |
|||
|
|||
|
|||
4. Compatibility Notes |
|||
====================== |
|||
|
|||
Old code that does not take advantage of namespaces will run without |
|||
modifications. |
|||
|
|||
|
|||
5. Dependencies |
|||
=============== |
|||
|
|||
The class variable syntax depends on this class variables being |
|||
implemented in the new ZE2 object model. |
|||
|
|||
|
|||
6. Acknowledgements |
|||
=================== |
|||
|
|||
Andi Gutmans <andi@zend.com> and Zeev Suraski <zeev@zend.com> for |
|||
initial ZE2 namespaces proposal |
|||
|
|||
Dean Hall <php@apt7.com> for the initial symbol qualification syntax |
|||
@ -1,72 +0,0 @@ |
|||
Title: Loose type requirements for functions |
|||
Version: $Revision$ |
|||
Status: draft |
|||
Maintainer: Brian Moon <brianm@dealnews.com> |
|||
Created: 2001-09-17 |
|||
Modified: 2001-09-17 |
|||
|
|||
|
|||
1. Background/Need |
|||
================== |
|||
|
|||
Many internal function of PHP will reject parameters because of their |
|||
type (the array and variable function come to mind). For userland |
|||
this is not an easy task as there is no uniform way to do it. An |
|||
addition to the engine for requiring loose types would allow |
|||
delevopers to know that the data passed to their functions is of the |
|||
correct type and reduce the need for duplicating the same code in |
|||
every function to check for the type of data. |
|||
|
|||
|
|||
2. Overview |
|||
=========== |
|||
|
|||
Loose typing mostly means evaluating the contents of the variable and |
|||
not the type of the variable itself. The requirements for this would |
|||
and should work much like several of the is_* functions do now. |
|||
|
|||
The typing of parameters would be optional and those not typed would |
|||
simply continue to be treated as they are now. |
|||
|
|||
3. Functionality |
|||
================ |
|||
|
|||
3.1. Allowed Types |
|||
================== |
|||
|
|||
Only loose types should be needed to ensure the data is usable by the |
|||
function. Duplicating the functionallity of is_scalar, is_resource, |
|||
is_array and is_object should give developers all the information they |
|||
need to use a variable correctly. |
|||
|
|||
3.2. Syntax |
|||
=========== |
|||
|
|||
The current function syntax should be expanded to allow typing of |
|||
variables inline in a C style. |
|||
|
|||
function foo ($var){ |
|||
} |
|||
|
|||
could be changed to require an array such as: |
|||
|
|||
function foo (array $var){ |
|||
} |
|||
|
|||
3.3. Errors |
|||
=========== |
|||
|
|||
Mis-matches in type should be reported as fatal errors and should halt |
|||
the execution of a script as that function can not be run and code |
|||
following could not reliably run. |
|||
|
|||
|
|||
4. Compatibility Notes |
|||
====================== |
|||
|
|||
Old code that does not take advantage of this will run without |
|||
modifications. |
|||
|
|||
|
|||
|
|||
|
|||
1166
Zend/ZEND_CHANGES
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,594 +0,0 @@ |
|||
# Microsoft Developer Studio Project File - Name="Zend" - Package Owner=<4> |
|||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 |
|||
# ** DO NOT EDIT ** |
|||
|
|||
# TARGTYPE "Win32 (x86) Static Library" 0x0104 |
|||
|
|||
CFG=Zend - Win32 Release_inline |
|||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, |
|||
!MESSAGE use the Export Makefile command and run |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "Zend.mak". |
|||
!MESSAGE |
|||
!MESSAGE You can specify a configuration when running NMAKE |
|||
!MESSAGE by defining the macro CFG on the command line. For example: |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "Zend.mak" CFG="Zend - Win32 Release_inline" |
|||
!MESSAGE |
|||
!MESSAGE Possible choices for configuration are: |
|||
!MESSAGE |
|||
!MESSAGE "Zend - Win32 Release" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "Zend - Win32 Debug" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "Zend - Win32 Release_inline" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE |
|||
|
|||
# Begin Project |
|||
# PROP AllowPerConfigDependencies 0 |
|||
# PROP Scc_ProjName "" |
|||
# PROP Scc_LocalPath "" |
|||
CPP=cl.exe |
|||
RSC=rc.exe |
|||
|
|||
!IF "$(CFG)" == "Zend - Win32 Release" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Output_Dir "Release" |
|||
# PROP BASE Intermediate_Dir "Release" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Output_Dir "Release" |
|||
# PROP Intermediate_Dir "Release" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDebug" /D "_MBCS" /D "_LIB" /YX /FD /c |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug" /D "_LIB" /D "Zend_EXPORTS" /D ZEND_DEBUG=0 /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D "ZEND_WIN32" /FR /FD /c |
|||
# SUBTRACT CPP /YX |
|||
# ADD BASE RSC /l 0x40d /d "NDebug" |
|||
# ADD RSC /l 0x40d /d "NDebug" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Debug" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Output_Dir "Debug" |
|||
# PROP BASE Intermediate_Dir "Debug" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Output_Dir "Debug" |
|||
# PROP Intermediate_Dir "Debug" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_Debug" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c |
|||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_Debug" /D "_LIB" /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D ZEND_DEBUG=1 /D "ZEND_WIN32" /D "WIN32" /D "_MBCS" /FR /YX /FD /GZ /c |
|||
# ADD BASE RSC /l 0x40d /d "_Debug" |
|||
# ADD RSC /l 0x40d /d "_Debug" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Release_inline" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Output_Dir "Zend___Win32_Release_inline" |
|||
# PROP BASE Intermediate_Dir "Zend___Win32_Release_inline" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Output_Dir "Release_inline" |
|||
# PROP Intermediate_Dir "Release_inline" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug" /D "_LIB" /D "Zend_EXPORTS" /D ZEND_DEBUG=0 /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /FR /FD /c |
|||
# SUBTRACT BASE CPP /YX |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug" /D "_LIB" /D "Zend_EXPORTS" /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D ZEND_DEBUG=0 /D "ZEND_WIN32_FORCE_INLINE" /D "WIN32" /D "_MBCS" /D "ZEND_WIN32" /FR /FD /c |
|||
# SUBTRACT CPP /YX |
|||
# ADD BASE RSC /l 0x40d /d "NDebug" |
|||
# ADD RSC /l 0x40d /d "NDebug" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ENDIF |
|||
|
|||
# Begin Target |
|||
|
|||
# Name "Zend - Win32 Release" |
|||
# Name "Zend - Win32 Debug" |
|||
# Name "Zend - Win32 Release_inline" |
|||
# Begin Group "Source Files" |
|||
|
|||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_alloc.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_API.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_builtin_functions.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_compile.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_constants.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_default_classes.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_dynamic_array.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_execute.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_execute_API.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_extensions.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_hash.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_highlight.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_indent.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_parser.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_scanner.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_interfaces.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_parser.c" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_scanner.c" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_list.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_llist.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_object_handlers.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects_API.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_opcode.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_operators.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ptr_stack.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_qsort.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_sprintf.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stack.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stream.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_strtod.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ts_hash.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_variables.c |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Header Files" |
|||
|
|||
# PROP Default_Filter "h;hpp;hxx;hm;inl" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\FlexLexer.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_alloc.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_API.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_builtin_functions.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_compile.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_config.w32.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_constants.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_default_classes.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_dynamic_array.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_errors.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_execute.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_execute_locks.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_extensions.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_fast_cache.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_globals.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_globals_macros.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_hash.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_highlight.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_indent.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_parser.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_scanner.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_interfaces.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_istdiostream.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_parser.h" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_scanner.h" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_list.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_llist.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_modules.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_object_handlers.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects_API.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_operators.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ptr_stack.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_qsort.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stack.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stream.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_strtod.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ts_hash.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_variables.h |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Parsers" |
|||
|
|||
# PROP Default_Filter "y" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_parser.y |
|||
|
|||
!IF "$(CFG)" == "Zend - Win32 Release" |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Debug" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=.\zend_ini_parser.y |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_ini_parser.c -v -d -p ini_ zend_ini_parser.y |
|||
|
|||
"$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_ini_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Release_inline" |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_parser.y" |
|||
|
|||
!IF "$(CFG)" == "Zend - Win32 Release" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=".\zend_language_parser.y" |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_language_parser.c -v -d -p zend zend_language_parser.y |
|||
|
|||
"$(InputDir)\zend_language_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_language_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Debug" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=".\zend_language_parser.y" |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_language_parser.c -v -d -p zend zend_language_parser.y |
|||
|
|||
"$(InputDir)\zend_language_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_language_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Release_inline" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=".\zend_language_parser.y" |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_language_parser.c -v -d -p zend zend_language_parser.y |
|||
|
|||
"$(InputDir)\zend_language_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_language_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Scanners" |
|||
|
|||
# PROP Default_Filter "l" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\flex.skl |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_scanner.l |
|||
|
|||
!IF "$(CFG)" == "Zend - Win32 Release" |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Debug" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=.\zend_ini_scanner.l |
|||
|
|||
"zend_ini_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.c zend_ini_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Release_inline" |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_scanner.l" |
|||
|
|||
!IF "$(CFG)" == "Zend - Win32 Release" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=".\zend_language_scanner.l" |
|||
|
|||
"zend_language_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -i -Pzend -ozend_language_scanner.c zend_language_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Debug" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=".\zend_language_scanner.l" |
|||
|
|||
"zend_language_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -i -Pzend -ozend_language_scanner.c zend_language_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "Zend - Win32 Release_inline" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=".\zend_language_scanner.l" |
|||
|
|||
"zend_language_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -i -Pzend -ozend_language_scanner.c zend_language_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Text Files" |
|||
|
|||
# PROP Default_Filter "" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\ZEND_BUGS |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\ZEND_CHANGES |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\ZEND_TODO |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Resources" |
|||
|
|||
# PROP Default_Filter "" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend.ico |
|||
# End Source File |
|||
# End Group |
|||
# End Target |
|||
# End Project |
|||
@ -1,390 +0,0 @@ |
|||
dnl |
|||
dnl $Id$ |
|||
dnl |
|||
dnl This file contains Zend specific autoconf functions. |
|||
dnl |
|||
|
|||
AC_DEFUN([LIBZEND_CHECK_INT_TYPE],[ |
|||
AC_MSG_CHECKING(for $1) |
|||
AC_TRY_COMPILE([ |
|||
#if HAVE_SYS_TYPES_H |
|||
#include <sys/types.h> |
|||
#endif |
|||
#if HAVE_INTTYPES_H |
|||
#include <inttypes.h> |
|||
#elif HAVE_STDINT_H |
|||
#include <stdint.h> |
|||
#endif], |
|||
[if (($1 *) 0) |
|||
return 0; |
|||
if (sizeof ($1)) |
|||
return 0; |
|||
],[ |
|||
AC_DEFINE_UNQUOTED([HAVE_]translit($1,a-z_-,A-Z__), 1,[Define if $1 type is present. ]) |
|||
AC_MSG_RESULT(yes) |
|||
], AC_MSG_RESULT(no) |
|||
)dnl |
|||
]) |
|||
|
|||
AC_DEFUN([LIBZEND_BASIC_CHECKS],[ |
|||
|
|||
AC_REQUIRE([AC_PROG_YACC]) |
|||
AC_REQUIRE([AC_PROG_CC]) |
|||
AC_REQUIRE([AC_PROG_CC_C_O]) |
|||
AC_REQUIRE([AC_PROG_LEX]) |
|||
AC_REQUIRE([AC_HEADER_STDC]) |
|||
|
|||
LIBZEND_BISON_CHECK |
|||
|
|||
dnl Ugly hack to get around a problem with gcc on AIX. |
|||
if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \ |
|||
"`uname -sv`" = "AIX 4"; then |
|||
CFLAGS=`echo $CFLAGS | sed -e 's/-g//'` |
|||
fi |
|||
|
|||
dnl Hack to work around a Mac OS X cpp problem |
|||
dnl Known versions needing this workaround are 5.3 and 5.4 |
|||
if test "$ac_cv_prog_gcc" = "yes" -a "`uname -s`" = "Rhapsody"; then |
|||
CPPFLAGS="$CPPFLAGS -traditional-cpp" |
|||
fi |
|||
|
|||
AC_CHECK_HEADERS( |
|||
inttypes.h \ |
|||
stdint.h \ |
|||
limits.h \ |
|||
malloc.h \ |
|||
string.h \ |
|||
unistd.h \ |
|||
stdarg.h \ |
|||
sys/types.h \ |
|||
sys/time.h \ |
|||
signal.h \ |
|||
unix.h \ |
|||
stdlib.h \ |
|||
mach-o/dyld.h \ |
|||
dlfcn.h) |
|||
|
|||
AC_TYPE_SIZE_T |
|||
AC_TYPE_SIGNAL |
|||
|
|||
AC_DEFUN([LIBZEND_LIBDL_CHECKS],[ |
|||
AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"]) |
|||
AC_CHECK_FUNC(dlopen,[AC_DEFINE(HAVE_LIBDL, 1,[ ])]) |
|||
]) |
|||
|
|||
AC_DEFUN([LIBZEND_DLSYM_CHECK],[ |
|||
dnl |
|||
dnl Ugly hack to check if dlsym() requires a leading underscore in symbol name. |
|||
dnl |
|||
AC_MSG_CHECKING([whether dlsym() requires a leading underscore in symbol names]) |
|||
_LT_AC_TRY_DLOPEN_SELF([ |
|||
AC_MSG_RESULT(no) |
|||
], [ |
|||
AC_MSG_RESULT(yes) |
|||
AC_DEFINE(DLSYM_NEEDS_UNDERSCORE, 1, [Define if dlsym() requires a leading underscore in symbol names. ]) |
|||
], [ |
|||
AC_MSG_RESULT(no) |
|||
], []) |
|||
]) |
|||
|
|||
dnl This is required for QNX and may be some BSD derived systems |
|||
AC_CHECK_TYPE( uint, unsigned int ) |
|||
AC_CHECK_TYPE( ulong, unsigned long ) |
|||
|
|||
dnl Check if int32_t and uint32_t are defined |
|||
LIBZEND_CHECK_INT_TYPE(int32_t) |
|||
LIBZEND_CHECK_INT_TYPE(uint32_t) |
|||
|
|||
dnl Checks for library functions. |
|||
AC_FUNC_VPRINTF |
|||
AC_FUNC_MEMCMP |
|||
AC_FUNC_ALLOCA |
|||
AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass) |
|||
AC_ZEND_BROKEN_SPRINTF |
|||
|
|||
AC_CHECK_FUNCS(finite isfinite isinf isnan) |
|||
|
|||
ZEND_FP_EXCEPT |
|||
|
|||
]) |
|||
|
|||
AC_DEFUN([LIBZEND_ENABLE_DEBUG],[ |
|||
|
|||
AC_ARG_ENABLE(debug, |
|||
[ --enable-debug Compile with debugging symbols],[ |
|||
ZEND_DEBUG=$enableval |
|||
],[ |
|||
ZEND_DEBUG=no |
|||
]) |
|||
|
|||
]) |
|||
|
|||
AC_DEFUN([LIBZEND_OTHER_CHECKS],[ |
|||
|
|||
AC_ARG_WITH(zend-vm, |
|||
[ --with-zend-vm=TYPE Set virtual machine dispatch method. Type is |
|||
one of "CALL", "SWITCH" or "GOTO" [TYPE=CALL]],[ |
|||
PHP_ZEND_VM=$withval |
|||
],[ |
|||
PHP_ZEND_VM=CALL |
|||
]) |
|||
|
|||
AC_ARG_ENABLE(maintainer-zts, |
|||
[ --enable-maintainer-zts Enable thread safety - for code maintainers only!!],[ |
|||
ZEND_MAINTAINER_ZTS=$enableval |
|||
],[ |
|||
ZEND_MAINTAINER_ZTS=no |
|||
]) |
|||
|
|||
AC_ARG_ENABLE(inline-optimization, |
|||
[ --disable-inline-optimization |
|||
If building zend_execute.lo fails, try this switch],[ |
|||
ZEND_INLINE_OPTIMIZATION=$enableval |
|||
],[ |
|||
ZEND_INLINE_OPTIMIZATION=yes |
|||
]) |
|||
|
|||
AC_ARG_ENABLE(zend-multibyte, |
|||
[ --enable-zend-multibyte Compile with zend multibyte support], [ |
|||
ZEND_MULTIBYTE=$enableval |
|||
],[ |
|||
ZEND_MULTIBYTE=no |
|||
]) |
|||
|
|||
AC_MSG_CHECKING([virtual machine dispatch method]) |
|||
AC_MSG_RESULT($PHP_ZEND_VM) |
|||
|
|||
AC_MSG_CHECKING(whether to enable thread-safety) |
|||
AC_MSG_RESULT($ZEND_MAINTAINER_ZTS) |
|||
|
|||
AC_MSG_CHECKING(whether to enable inline optimization for GCC) |
|||
AC_MSG_RESULT($ZEND_INLINE_OPTIMIZATION) |
|||
|
|||
AC_MSG_CHECKING(whether to enable Zend debugging) |
|||
AC_MSG_RESULT($ZEND_DEBUG) |
|||
|
|||
AC_MSG_CHECKING(whether to enable Zend multibyte) |
|||
AC_MSG_RESULT($ZEND_MULTIBYTE) |
|||
|
|||
case $PHP_ZEND_VM in |
|||
SWITCH) |
|||
AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_SWITCH,[virtual machine dispatch method]) |
|||
;; |
|||
GOTO) |
|||
AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_GOTO,[virtual machine dispatch method]) |
|||
;; |
|||
*) |
|||
PHP_ZEND_VM=CALL |
|||
AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_CALL,[virtual machine dispatch method]) |
|||
;; |
|||
esac |
|||
|
|||
if test "$ZEND_DEBUG" = "yes"; then |
|||
AC_DEFINE(ZEND_DEBUG,1,[ ]) |
|||
echo " $CFLAGS" | grep ' -g' >/dev/null || DEBUG_CFLAGS="-g" |
|||
if test "$CFLAGS" = "-g -O2"; then |
|||
CFLAGS=-g |
|||
fi |
|||
test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall" |
|||
test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \ |
|||
DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations" |
|||
else |
|||
AC_DEFINE(ZEND_DEBUG,0,[ ]) |
|||
fi |
|||
|
|||
test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS" |
|||
|
|||
if test "$ZEND_MAINTAINER_ZTS" = "yes"; then |
|||
AC_DEFINE(ZTS,1,[ ]) |
|||
CFLAGS="$CFLAGS -DZTS" |
|||
LIBZEND_CPLUSPLUS_CHECKS |
|||
fi |
|||
|
|||
if test "$ZEND_MULTIBYTE" = "yes"; then |
|||
AC_DEFINE(ZEND_MULTIBYTE, 1, [ ]) |
|||
fi |
|||
|
|||
changequote({,}) |
|||
if test -n "$GCC" && test "$ZEND_INLINE_OPTIMIZATION" != "yes"; then |
|||
INLINE_CFLAGS=`echo $ac_n "$CFLAGS $ac_c" | sed s/-O[0-9s]*//` |
|||
else |
|||
INLINE_CFLAGS="$CFLAGS" |
|||
fi |
|||
changequote([,]) |
|||
|
|||
AC_C_INLINE |
|||
|
|||
AC_SUBST(INLINE_CFLAGS) |
|||
|
|||
AC_MSG_CHECKING(target system is Darwin) |
|||
if echo "$target" | grep "darwin" > /dev/null; then |
|||
AC_DEFINE([DARWIN], 1, [Define if the target system is darwin]) |
|||
AC_MSG_RESULT(yes) |
|||
else |
|||
AC_MSG_RESULT(no) |
|||
fi |
|||
|
|||
dnl test and set the alignment define for ZEND_MM |
|||
dnl this also does the logarithmic test for ZEND_MM. |
|||
AC_MSG_CHECKING(for MM alignment and log values) |
|||
|
|||
AC_TRY_RUN([ |
|||
#include <stdio.h> |
|||
|
|||
typedef union _mm_align_test { |
|||
void *ptr; |
|||
double dbl; |
|||
long lng; |
|||
} mm_align_test; |
|||
|
|||
#if (defined (__GNUC__) && __GNUC__ >= 2) |
|||
#define ZEND_MM_ALIGNMENT (__alignof__ (mm_align_test)) |
|||
#else |
|||
#define ZEND_MM_ALIGNMENT (sizeof(mm_align_test)) |
|||
#endif |
|||
|
|||
int main() |
|||
{ |
|||
int i = ZEND_MM_ALIGNMENT; |
|||
int zeros = 0; |
|||
FILE *fp; |
|||
|
|||
while (i & ~0x1) { |
|||
zeros++; |
|||
i = i >> 1; |
|||
} |
|||
|
|||
fp = fopen("conftest.zend", "w"); |
|||
fprintf(fp, "%d %d\n", ZEND_MM_ALIGNMENT, zeros); |
|||
fclose(fp); |
|||
|
|||
exit(0); |
|||
} |
|||
], [ |
|||
LIBZEND_MM_ALIGN=`cat conftest.zend | cut -d ' ' -f 1` |
|||
LIBZEND_MM_ALIGN_LOG2=`cat conftest.zend | cut -d ' ' -f 2` |
|||
AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, $LIBZEND_MM_ALIGN, [ ]) |
|||
AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, $LIBZEND_MM_ALIGN_LOG2, [ ]) |
|||
], [], [ |
|||
dnl cross-compile needs something here |
|||
LIBZEND_MM_ALIGN=8 |
|||
]) |
|||
|
|||
AC_MSG_RESULT(done) |
|||
|
|||
dnl test for memory allocation using mmap(MAP_ANON) |
|||
AC_MSG_CHECKING(for memory allocation using mmap(MAP_ANON)) |
|||
|
|||
AC_TRY_RUN([ |
|||
#include <sys/types.h> |
|||
#include <sys/stat.h> |
|||
#include <fcntl.h> |
|||
#include <sys/mman.h> |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#ifndef MAP_ANON |
|||
# ifdef MAP_ANONYMOUS |
|||
# define MAP_ANON MAP_ANONYMOUS |
|||
# endif |
|||
#endif |
|||
#ifndef MREMAP_MAYMOVE |
|||
# define MREMAP_MAYMOVE 0 |
|||
#endif |
|||
#ifndef MAP_FAILED |
|||
# define MAP_FAILED ((void*)-1) |
|||
#endif |
|||
|
|||
#define SEG_SIZE (256*1024) |
|||
|
|||
int main() |
|||
{ |
|||
void *seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); |
|||
if (seg == MAP_FAILED) { |
|||
return 1; |
|||
} |
|||
if (munmap(seg, SEG_SIZE) != 0) { |
|||
return 2; |
|||
} |
|||
return 0; |
|||
} |
|||
], [ |
|||
AC_DEFINE([HAVE_MEM_MMAP_ANON], 1, [Define if the target system has support for memory allocation using mmap(MAP_ANON)]) |
|||
AC_MSG_RESULT(yes) |
|||
], [ |
|||
AC_MSG_RESULT(no) |
|||
], [ |
|||
dnl cross-compile needs something here |
|||
AC_MSG_RESULT(no) |
|||
]) |
|||
|
|||
dnl test for memory allocation using mmap("/dev/zero") |
|||
AC_MSG_CHECKING(for memory allocation using mmap("/dev/zero")) |
|||
|
|||
AC_TRY_RUN([ |
|||
#include <sys/types.h> |
|||
#include <sys/stat.h> |
|||
#include <fcntl.h> |
|||
#include <sys/mman.h> |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#ifndef MAP_ANON |
|||
# ifdef MAP_ANONYMOUS |
|||
# define MAP_ANON MAP_ANONYMOUS |
|||
# endif |
|||
#endif |
|||
#ifndef MREMAP_MAYMOVE |
|||
# define MREMAP_MAYMOVE 0 |
|||
#endif |
|||
#ifndef MAP_FAILED |
|||
# define MAP_FAILED ((void*)-1) |
|||
#endif |
|||
|
|||
#define SEG_SIZE (256*1024) |
|||
|
|||
int main() |
|||
{ |
|||
int fd; |
|||
void *seg; |
|||
|
|||
fd = open("/dev/zero", O_RDWR, S_IRUSR | S_IWUSR); |
|||
if (fd < 0) { |
|||
return 1; |
|||
} |
|||
seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); |
|||
if (seg == MAP_FAILED) { |
|||
return 2; |
|||
} |
|||
if (munmap(seg, SEG_SIZE) != 0) { |
|||
return 3; |
|||
} |
|||
if (close(fd) != 0) { |
|||
return 4; |
|||
} |
|||
return 0; |
|||
} |
|||
], [ |
|||
AC_DEFINE([HAVE_MEM_MMAP_ZERO], 1, [Define if the target system has support for memory allocation using mmap("/dev/zero")]) |
|||
AC_MSG_RESULT(yes) |
|||
], [ |
|||
AC_MSG_RESULT(no) |
|||
], [ |
|||
dnl cross-compile needs something here |
|||
AC_MSG_RESULT(no) |
|||
]) |
|||
|
|||
AC_CHECK_FUNCS(mremap) |
|||
|
|||
]) |
|||
|
|||
|
|||
AC_DEFUN([LIBZEND_CPLUSPLUS_CHECKS],[ |
|||
|
|||
]) |
|||
|
|||
AC_MSG_CHECKING(whether /dev/urandom exists) |
|||
if test -r "/dev/urandom" && test -c "/dev/urandom"; then |
|||
AC_DEFINE([HAVE_DEV_URANDOM], 1, [Define if the target system has /dev/urandom device]) |
|||
AC_MSG_RESULT(yes) |
|||
else |
|||
AC_MSG_RESULT(no) |
|||
fi |
|||
@ -1,258 +0,0 @@ |
|||
# Microsoft Developer Studio Generated Dependency File, included by ZendCore.mak |
|||
|
|||
.\zend_alloc.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\alloca.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_compile.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_modules.h"\ |
|||
".\zend_operators.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_API.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
".\zend_ini.h"\ |
|||
|
|||
|
|||
.\zend_constants.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_constants.h"\ |
|||
".\zend_operators.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_execute.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_constants.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_modules.h"\ |
|||
".\zend_operators.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_API.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
".\zend_ini.h"\ |
|||
|
|||
|
|||
.\zend_highlight.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_highlight.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend_language_parser.tab.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_llist.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_opcode.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_modules.h"\ |
|||
".\zend_operators.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_API.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
".\zend_ini.h"\ |
|||
|
|||
|
|||
.\zend_operators.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_operators.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_ptr_stack.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_stack.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_variables.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_constants.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_modules.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_API.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
".\zend_ini.h"\ |
|||
".\zend_list.h"\ |
|||
|
|||
|
|||
.\zend.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_operators.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_API.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_compile.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend_constants.h"\ |
|||
".\zend_execute.h"\ |
|||
".\zend_llist.h"\ |
|||
".\zend_modules.h"\ |
|||
".\zend_operators.h"\ |
|||
".\zend_ptr_stack.h"\ |
|||
".\zend_stack.h"\ |
|||
".\zend_variables.h"\ |
|||
".\zend.h"\ |
|||
".\zend_API.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_globals.h"\ |
|||
".\zend_hash.h"\ |
|||
".\zend_ini.h"\ |
|||
".\zend_list.h"\ |
|||
|
|||
|
|||
.\zend_hash.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
|
|||
|
|||
.\zend_ini.c : \ |
|||
"..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\ |
|||
".\zend_alloc.h"\ |
|||
".\zend_config.w32.h"\ |
|||
".\zend.h"\ |
|||
".\zend_errors.h"\ |
|||
".\zend_hash.h"\ |
|||
".\zend_ini.h"\ |
|||
|
|||
|
|||
!IF "$(CFG)" == "ZendCore - Win32 Release" |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" |
|||
|
|||
!ENDIF |
|||
|
|||
!IF "$(CFG)" == "ZendCore - Win32 Release" |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" |
|||
|
|||
!ENDIF |
|||
|
|||
!IF "$(CFG)" == "ZendCore - Win32 Release" |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" |
|||
|
|||
!ENDIF |
|||
|
|||
!IF "$(CFG)" == "ZendCore - Win32 Release" |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug" |
|||
|
|||
!ENDIF |
|||
|
|||
@ -1,728 +0,0 @@ |
|||
# Microsoft Developer Studio Project File - Name="ZendTS" - Package Owner=<4> |
|||
# Microsoft Developer Studio Generated Build File, Format Version 6.00 |
|||
# ** DO NOT EDIT ** |
|||
|
|||
# TARGTYPE "Win32 (x86) Static Library" 0x0104 |
|||
|
|||
CFG=ZendTS - Win32 Release_TSDbg |
|||
!MESSAGE This is not a valid makefile. To build this project using NMAKE, |
|||
!MESSAGE use the Export Makefile command and run |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "ZendTS.mak". |
|||
!MESSAGE |
|||
!MESSAGE You can specify a configuration when running NMAKE |
|||
!MESSAGE by defining the macro CFG on the command line. For example: |
|||
!MESSAGE |
|||
!MESSAGE NMAKE /f "ZendTS.mak" CFG="ZendTS - Win32 Release_TSDbg" |
|||
!MESSAGE |
|||
!MESSAGE Possible choices for configuration are: |
|||
!MESSAGE |
|||
!MESSAGE "ZendTS - Win32 Release_TS" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "ZendTS - Win32 Debug_TS" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "ZendTS - Win32 Release_TS_inline" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE "ZendTS - Win32 Release_TSDbg" (based on "Win32 (x86) Static Library") |
|||
!MESSAGE |
|||
|
|||
# Begin Project |
|||
# PROP AllowPerConfigDependencies 0 |
|||
# PROP Scc_ProjName "" |
|||
# PROP Scc_LocalPath "" |
|||
CPP=cl.exe |
|||
RSC=rc.exe |
|||
|
|||
!IF "$(CFG)" == "ZendTS - Win32 Release_TS" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Output_Dir "Release_TS" |
|||
# PROP BASE Intermediate_Dir "Release_TS" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Output_Dir "Release_TS" |
|||
# PROP Intermediate_Dir "Release_TS" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDebug_TS" /D "_MBCS" /D "_LIB" /YX /FD /c |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug_TS" /D ZEND_DEBUG=0 /D _WIN32_WINNT=0x400 /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "ZEND_WIN32" /D "WIN32" /D "_MBCS" /FR /FD /c |
|||
# SUBTRACT CPP /YX |
|||
# ADD BASE RSC /l 0x40d /d "NDebug_TS" |
|||
# ADD RSC /l 0x40d /d "NDebug_TS" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Debug_TS" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Output_Dir "Debug_TS" |
|||
# PROP BASE Intermediate_Dir "Debug_TS" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Output_Dir "Debug_TS" |
|||
# PROP Intermediate_Dir "Debug_TS" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_Debug_TS" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c |
|||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_Debug_TS" /D ZEND_DEBUG=1 /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "ZEND_WIN32" /D "WIN32" /D "_MBCS" /FR /YX /FD /GZ /c |
|||
# ADD BASE RSC /l 0x40d /d "_Debug_TS" |
|||
# ADD RSC /l 0x40d /d "_Debug_TS" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TS_inline" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Output_Dir "ZendTS___Win32_Release_TS_inline" |
|||
# PROP BASE Intermediate_Dir "ZendTS___Win32_Release_TS_inline" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Output_Dir "Release_TS_inline" |
|||
# PROP Intermediate_Dir "Release_TS_inline" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug_TS" /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "WIN32" /D "_MBCS" /D ZEND_DEBUG=0 /FR /FD /c |
|||
# SUBTRACT BASE CPP /YX |
|||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug_TS" /D ZEND_DEBUG=0 /D "ZEND_WIN32_FORCE_INLINE" /D _WIN32_WINNT=0x400 /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "ZEND_WIN32" /D "WIN32" /D "_MBCS" /FR /FD /c |
|||
# SUBTRACT CPP /YX |
|||
# ADD BASE RSC /l 0x40d /d "NDebug_TS" |
|||
# ADD RSC /l 0x40d /d "NDebug_TS" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TSDbg" |
|||
|
|||
# PROP BASE Use_MFC 0 |
|||
# PROP BASE Output_Dir "ZendTS___Win32_Release_TSDbg" |
|||
# PROP BASE Intermediate_Dir "ZendTS___Win32_Release_TSDbg" |
|||
# PROP BASE Target_Dir "" |
|||
# PROP Use_MFC 0 |
|||
# PROP Output_Dir "Release_TSDbg" |
|||
# PROP Intermediate_Dir "Release_TSDbg" |
|||
# PROP Target_Dir "" |
|||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug_TS" /D ZEND_DEBUG=0 /D _WIN32_WINNT=0x400 /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "ZEND_WIN32" /D "WIN32" /D "_MBCS" /FR /FD /c |
|||
# SUBTRACT BASE CPP /YX |
|||
# ADD CPP /nologo /MD /W3 /GX /Zi /Od /I "." /D "NDebug_TS" /D ZEND_DEBUG=0 /D _WIN32_WINNT=0x400 /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "ZEND_WIN32" /D "WIN32" /D "_MBCS" /FR /FD /c |
|||
# SUBTRACT CPP /YX |
|||
# ADD BASE RSC /l 0x40d /d "NDebug_TS" |
|||
# ADD RSC /l 0x40d /d "NDebug_TS" |
|||
BSC32=bscmake.exe |
|||
# ADD BASE BSC32 /nologo |
|||
# ADD BSC32 /nologo |
|||
LIB32=link.exe -lib |
|||
# ADD BASE LIB32 /nologo |
|||
# ADD LIB32 /nologo |
|||
|
|||
!ENDIF |
|||
|
|||
# Begin Target |
|||
|
|||
# Name "ZendTS - Win32 Release_TS" |
|||
# Name "ZendTS - Win32 Debug_TS" |
|||
# Name "ZendTS - Win32 Release_TS_inline" |
|||
# Name "ZendTS - Win32 Release_TSDbg" |
|||
# Begin Group "Source Files" |
|||
|
|||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_alloc.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_API.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_builtin_functions.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_compile.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_constants.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_default_classes.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_dynamic_array.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_exceptions.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_execute.c |
|||
# ADD CPP /I "..\TSRM" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_execute_API.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_extensions.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_hash.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_highlight.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_indent.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_parser.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_scanner.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_interfaces.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_iterators.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_parser.c" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_scanner.c" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_list.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_llist.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_object_handlers.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects_API.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_opcode.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_operators.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ptr_stack.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_qsort.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_sprintf.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stack.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stream.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_strtod.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ts_hash.c |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_variables.c |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Header Files" |
|||
|
|||
# PROP Default_Filter "h;hpp;hxx;hm;inl" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\FlexLexer.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_alloc.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_API.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_builtin_functions.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_compile.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_config.w32.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_constants.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_default_classes.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_dynamic_array.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_errors.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_exceptions.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_execute.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_extensions.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_fast_cache.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_globals.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_globals_macros.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_hash.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_highlight.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_indent.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_parser.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_scanner.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_interfaces.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_istdiostream.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_iterators.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_parser.h" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_scanner.h" |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_list.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_llist.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_modules.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_object_handlers.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_objects_API.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_operators.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ptr_stack.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_qsort.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stack.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_stream.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_strtod.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ts_hash.h |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_variables.h |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Parsers" |
|||
|
|||
# PROP Default_Filter "y" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_parser.y |
|||
|
|||
!IF "$(CFG)" == "ZendTS - Win32 Release_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=.\zend_ini_parser.y |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_ini_parser.c -v -d -p ini_ zend_ini_parser.y |
|||
|
|||
"$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_ini_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Debug_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=.\zend_ini_parser.y |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_ini_parser.c -v -d -p ini_ zend_ini_parser.y |
|||
|
|||
"$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_ini_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TS_inline" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=.\zend_ini_parser.y |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_ini_parser.c -v -d -p ini_ zend_ini_parser.y |
|||
|
|||
"$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_ini_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TSDbg" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=.\zend_ini_parser.y |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_ini_parser.c -v -d -p ini_ zend_ini_parser.y |
|||
|
|||
"$(InputDir)\zend_ini_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_ini_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_parser.y" |
|||
|
|||
!IF "$(CFG)" == "ZendTS - Win32 Release_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=".\zend_language_parser.y" |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_language_parser.c -v -d -p zend zend_language_parser.y |
|||
|
|||
"$(InputDir)\zend_language_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_language_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Debug_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=".\zend_language_parser.y" |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_language_parser.c -v -d -p zend zend_language_parser.y |
|||
|
|||
"$(InputDir)\zend_language_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_language_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TS_inline" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=".\zend_language_parser.y" |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_language_parser.c -v -d -p zend zend_language_parser.y |
|||
|
|||
"$(InputDir)\zend_language_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_language_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TSDbg" |
|||
|
|||
# Begin Custom Build |
|||
InputDir=. |
|||
InputPath=".\zend_language_parser.y" |
|||
|
|||
BuildCmds= \ |
|||
bison --output=zend_language_parser.c -v -d -p zend zend_language_parser.y |
|||
|
|||
"$(InputDir)\zend_language_parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
|
|||
"$(InputDir)\zend_language_parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
$(BuildCmds) |
|||
# End Custom Build |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Scanners" |
|||
|
|||
# PROP Default_Filter "l" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\flex.skl |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend_ini_scanner.l |
|||
|
|||
!IF "$(CFG)" == "ZendTS - Win32 Release_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=.\zend_ini_scanner.l |
|||
|
|||
"zend_ini_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.c zend_ini_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Debug_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=.\zend_ini_scanner.l |
|||
|
|||
"zend_ini_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.c zend_ini_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TS_inline" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=.\zend_ini_scanner.l |
|||
|
|||
"zend_ini_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.c zend_ini_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TSDbg" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=.\zend_ini_scanner.l |
|||
|
|||
"zend_ini_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pini_ -ozend_ini_scanner.c zend_ini_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=".\zend_language_scanner.l" |
|||
|
|||
!IF "$(CFG)" == "ZendTS - Win32 Release_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=".\zend_language_scanner.l" |
|||
|
|||
"zend_language_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pzend -ozend_language_scanner.c zend_language_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Debug_TS" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=".\zend_language_scanner.l" |
|||
|
|||
"zend_language_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pzend -ozend_language_scanner.c zend_language_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TS_inline" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=".\zend_language_scanner.l" |
|||
|
|||
"zend_language_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pzend -ozend_language_scanner.c zend_language_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ELSEIF "$(CFG)" == "ZendTS - Win32 Release_TSDbg" |
|||
|
|||
# Begin Custom Build |
|||
InputPath=".\zend_language_scanner.l" |
|||
|
|||
"zend_language_scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" |
|||
flex -B -i -Sflex.skl -Pzend -ozend_language_scanner.c zend_language_scanner.l |
|||
|
|||
# End Custom Build |
|||
|
|||
!ENDIF |
|||
|
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Text Files" |
|||
|
|||
# PROP Default_Filter "" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\LICENSE |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\ZEND_BUGS |
|||
# End Source File |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\ZEND_CHANGES |
|||
# End Source File |
|||
# End Group |
|||
# Begin Group "Resources" |
|||
|
|||
# PROP Default_Filter "" |
|||
# Begin Source File |
|||
|
|||
SOURCE=.\zend.ico |
|||
# End Source File |
|||
# End Group |
|||
# End Target |
|||
# End Project |
|||
@ -1,121 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| Zend Engine | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1998-2008 Zend Technologies Ltd. (http://www.zend.com) | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.00 of the Zend license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.zend.com/license/2_00.txt. | |
|||
| If you did not receive a copy of the Zend license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@zend.com so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: Andi Gutmans <andi@zend.com> | |
|||
| Zeev Suraski <zeev@zend.com> | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
/* $Id$ */ |
|||
|
|||
#define ZEND_API |
|||
#define ZEND_DLEXPORT |
|||
#define ZEND_DLIMPORT |
|||
|
|||
@TOP@ |
|||
|
|||
#undef uint |
|||
#undef ulong |
|||
|
|||
/* Define if you want to enable memory limit support */ |
|||
#define MEMORY_LIMIT 0 |
|||
|
|||
@BOTTOM@ |
|||
|
|||
#ifndef ZEND_ACCONFIG_H_NO_C_PROTOS |
|||
|
|||
#ifdef HAVE_STDLIB_H |
|||
# include <stdlib.h> |
|||
#endif |
|||
|
|||
#ifdef HAVE_SYS_TYPES_H |
|||
# include <sys/types.h> |
|||
#endif |
|||
|
|||
#ifdef HAVE_SYS_SELECT_H |
|||
#include <sys/select.h> |
|||
#endif |
|||
|
|||
#ifdef HAVE_IEEEFP_H |
|||
# include <ieeefp.h> |
|||
#endif |
|||
|
|||
#ifdef HAVE_STRING_H |
|||
# include <string.h> |
|||
#else |
|||
# include <strings.h> |
|||
#endif |
|||
|
|||
#if ZEND_BROKEN_SPRINTF |
|||
int zend_sprintf(char *buffer, const char *format, ...); |
|||
#else |
|||
# define zend_sprintf sprintf |
|||
#endif |
|||
|
|||
#include <math.h> |
|||
|
|||
/* To enable the is_nan, is_infinite and is_finite PHP functions */ |
|||
#ifdef NETWARE |
|||
#define HAVE_ISNAN 1 |
|||
#define HAVE_ISINF 1 |
|||
#define HAVE_ISFINITE 1 |
|||
#endif |
|||
|
|||
#ifndef zend_isnan |
|||
#ifdef HAVE_ISNAN |
|||
#define zend_isnan(a) isnan(a) |
|||
#elif defined(HAVE_FPCLASS) |
|||
#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN)) |
|||
#else |
|||
#define zend_isnan(a) 0 |
|||
#endif |
|||
#endif |
|||
|
|||
#ifdef HAVE_ISINF |
|||
#define zend_isinf(a) isinf(a) |
|||
#elif defined(INFINITY) |
|||
/* Might not work, but is required by ISO C99 */ |
|||
#define zend_isinf(a) (((a)==INFINITY)?1:0) |
|||
#elif defined(HAVE_FPCLASS) |
|||
#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF)) |
|||
#else |
|||
#define zend_isinf(a) 0 |
|||
#endif |
|||
|
|||
#ifdef HAVE_FINITE |
|||
#define zend_finite(a) finite(a) |
|||
#elif defined(HAVE_ISFINITE) || defined(isfinite) |
|||
#define zend_finite(a) isfinite(a) |
|||
#elif defined(fpclassify) |
|||
#define zend_finite(a) ((fpclassify((a))!=FP_INFINITE&&fpclassify((a))!=FP_NAN)?1:0) |
|||
#else |
|||
#define zend_finite(a) (zend_isnan(a) ? 0 : zend_isinf(a) ? 0 : 1) |
|||
#endif |
|||
|
|||
#endif /* ifndef ZEND_ACCONFIG_H_NO_C_PROTOS */ |
|||
|
|||
#ifdef NETWARE |
|||
#ifdef USE_WINSOCK |
|||
#/*This detection against winsock is of no use*/ undef HAVE_SOCKLEN_T |
|||
#/*This detection against winsock is of no use*/ undef HAVE_SYS_SOCKET_H |
|||
#endif |
|||
#endif |
|||
|
|||
/* |
|||
* Local variables: |
|||
* tab-width: 4 |
|||
* c-basic-offset: 4 |
|||
* indent-tabs-mode: t |
|||
* End: |
|||
*/ |
|||
@ -1,107 +0,0 @@ |
|||
dnl $Id$ |
|||
dnl |
|||
dnl This file contains local autoconf functions. |
|||
|
|||
AC_DEFUN([LIBZEND_BISON_CHECK],[ |
|||
# we only support certain bison versions |
|||
bison_version_list="1.28 1.35 1.75 1.875 2.0 2.1 2.2 2.3 2.4" |
|||
|
|||
# for standalone build of Zend Engine |
|||
test -z "$SED" && SED=sed |
|||
|
|||
bison_version=none |
|||
if test "$YACC"; then |
|||
AC_CACHE_CHECK([for bison version], php_cv_bison_version, [ |
|||
bison_version_vars=`bison --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /' | tr -d a-z` |
|||
php_cv_bison_version=invalid |
|||
if test -n "$bison_version_vars"; then |
|||
set $bison_version_vars |
|||
bison_version="${1}.${2}" |
|||
for bison_check_version in $bison_version_list; do |
|||
if test "$bison_version" = "$bison_check_version"; then |
|||
php_cv_bison_version="$bison_check_version (ok)" |
|||
break |
|||
fi |
|||
done |
|||
fi |
|||
]) |
|||
fi |
|||
case $php_cv_bison_version in |
|||
""|invalid[)] |
|||
bison_msg="bison versions supported for regeneration of the Zend/PHP parsers: $bison_version_list (found: $bison_version)." |
|||
AC_MSG_WARN([$bison_msg]) |
|||
YACC="exit 0;" |
|||
;; |
|||
esac |
|||
]) |
|||
|
|||
AC_DEFUN([ZEND_FP_EXCEPT],[ |
|||
AC_CACHE_CHECK(whether fp_except is defined, ac_cv_type_fp_except,[ |
|||
AC_TRY_COMPILE([ |
|||
#include <floatingpoint.h> |
|||
],[ |
|||
fp_except x = (fp_except) 0; |
|||
],[ |
|||
ac_cv_type_fp_except=yes |
|||
],[ |
|||
ac_cv_type_fp_except=no |
|||
],[ |
|||
ac_cv_type_fp_except=no |
|||
])]) |
|||
if test "$ac_cv_type_fp_except" = "yes"; then |
|||
AC_DEFINE(HAVE_FP_EXCEPT, 1, [whether floatingpoint.h defines fp_except]) |
|||
fi |
|||
]) |
|||
|
|||
dnl |
|||
dnl Check for broken sprintf() |
|||
dnl |
|||
AC_DEFUN([AC_ZEND_BROKEN_SPRINTF],[ |
|||
AC_CACHE_CHECK(whether sprintf is broken, ac_cv_broken_sprintf,[ |
|||
AC_TRY_RUN([main() {char buf[20];exit(sprintf(buf,"testing 123")!=11); }],[ |
|||
ac_cv_broken_sprintf=no |
|||
],[ |
|||
ac_cv_broken_sprintf=yes |
|||
],[ |
|||
ac_cv_broken_sprintf=no |
|||
]) |
|||
]) |
|||
if test "$ac_cv_broken_sprintf" = "yes"; then |
|||
ac_result=1 |
|||
else |
|||
ac_result=0 |
|||
fi |
|||
AC_DEFINE_UNQUOTED(ZEND_BROKEN_SPRINTF, $ac_result, [Whether sprintf is broken]) |
|||
]) |
|||
|
|||
dnl |
|||
dnl AC_ZEND_C_BIGENDIAN |
|||
dnl Replacement macro for AC_C_BIGENDIAN |
|||
dnl |
|||
AC_DEFUN([AC_ZEND_C_BIGENDIAN], |
|||
[AC_CACHE_CHECK([whether byte ordering is bigendian], ac_cv_c_bigendian_php, |
|||
[ |
|||
ac_cv_c_bigendian_php=unknown |
|||
AC_TRY_RUN( |
|||
[ |
|||
int main(void) |
|||
{ |
|||
short one = 1; |
|||
char *cp = (char *)&one; |
|||
|
|||
if (*cp == 0) { |
|||
return(0); |
|||
} else { |
|||
return(1); |
|||
} |
|||
} |
|||
], [ac_cv_c_bigendian_php=yes], [ac_cv_c_bigendian_php=no], [ac_cv_c_bigendian_php=unknown]) |
|||
]) |
|||
if test $ac_cv_c_bigendian_php = yes; then |
|||
AC_DEFINE(WORDS_BIGENDIAN, [], [Define if processor uses big-endian word]) |
|||
fi |
|||
]) |
|||
|
|||
AC_DEFUN([AM_SET_LIBTOOL_VARIABLE],[ |
|||
LIBTOOL='$(SHELL) $(top_builddir)/libtool $1' |
|||
]) |
|||
@ -1,420 +0,0 @@ |
|||
<?php |
|||
date_default_timezone_set("UTC"); |
|||
|
|||
function simple() { |
|||
$a = 0; |
|||
for ($i = 0; $i < 1000000; $i++) |
|||
$a++; |
|||
|
|||
$thisisanotherlongname = 0; |
|||
for ($thisisalongname = 0; $thisisalongname < 1000000; $thisisalongname++) |
|||
$thisisanotherlongname++; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function simplecall() { |
|||
for ($i = 0; $i < 1000000; $i++) |
|||
strlen("hallo"); |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function hallo($a) { |
|||
} |
|||
|
|||
function simpleucall() { |
|||
for ($i = 0; $i < 1000000; $i++) |
|||
hallo("hallo"); |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function simpleudcall() { |
|||
for ($i = 0; $i < 1000000; $i++) |
|||
hallo2("hallo"); |
|||
} |
|||
|
|||
function hallo2($a) { |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function mandel() { |
|||
$w1=50; |
|||
$h1=150; |
|||
$recen=-.45; |
|||
$imcen=0.0; |
|||
$r=0.7; |
|||
$s=0; $rec=0; $imc=0; $re=0; $im=0; $re2=0; $im2=0; |
|||
$x=0; $y=0; $w2=0; $h2=0; $color=0; |
|||
$s=2*$r/$w1; |
|||
$w2=40; |
|||
$h2=12; |
|||
for ($y=0 ; $y<=$w1; $y=$y+1) { |
|||
$imc=$s*($y-$h2)+$imcen; |
|||
for ($x=0 ; $x<=$h1; $x=$x+1) { |
|||
$rec=$s*($x-$w2)+$recen; |
|||
$re=$rec; |
|||
$im=$imc; |
|||
$color=1000; |
|||
$re2=$re*$re; |
|||
$im2=$im*$im; |
|||
while( ((($re2+$im2)<1000000) && $color>0)) { |
|||
$im=$re*$im*2+$imc; |
|||
$re=$re2-$im2+$rec; |
|||
$re2=$re*$re; |
|||
$im2=$im*$im; |
|||
$color=$color-1; |
|||
} |
|||
if ( $color==0 ) { |
|||
print "_"; |
|||
} else { |
|||
print "#"; |
|||
} |
|||
} |
|||
print "<br>"; |
|||
flush(); |
|||
} |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function mandel2() { |
|||
$b = " .:,;!/>)|&IH%*#"; |
|||
//float r, i, z, Z, t, c, C;
|
|||
for ($y=30; printf("\n"), $C = $y*0.1 - 1.5, $y--;){ |
|||
for ($x=0; $c = $x*0.04 - 2, $z=0, $Z=0, $x++ < 75;){ |
|||
for ($r=$c, $i=$C, $k=0; $t = $z*$z - $Z*$Z + $r, $Z = 2*$z*$Z + $i, $z=$t, $k<5000; $k++) |
|||
if ($z*$z + $Z*$Z > 500000) break; |
|||
echo $b[$k%16]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function Ack($m, $n){ |
|||
if($m == 0) return $n+1; |
|||
if($n == 0) return Ack($m-1, 1); |
|||
return Ack($m - 1, Ack($m, ($n - 1))); |
|||
} |
|||
|
|||
function ackermann($n) { |
|||
$r = Ack(3,$n); |
|||
print "Ack(3,$n): $r\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function ary($n) { |
|||
for ($i=0; $i<$n; $i++) { |
|||
$X[$i] = $i; |
|||
} |
|||
for ($i=$n-1; $i>=0; $i--) { |
|||
$Y[$i] = $X[$i]; |
|||
} |
|||
$last = $n-1; |
|||
print "$Y[$last]\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function ary2($n) { |
|||
for ($i=0; $i<$n;) { |
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
|
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
$X[$i] = $i; ++$i; |
|||
} |
|||
for ($i=$n-1; $i>=0;) { |
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
|
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
$Y[$i] = $X[$i]; --$i; |
|||
} |
|||
$last = $n-1; |
|||
print "$Y[$last]\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function ary3($n) { |
|||
for ($i=0; $i<$n; $i++) { |
|||
$X[$i] = $i + 1; |
|||
$Y[$i] = 0; |
|||
} |
|||
for ($k=0; $k<1000; $k++) { |
|||
for ($i=$n-1; $i>=0; $i--) { |
|||
$Y[$i] += $X[$i]; |
|||
} |
|||
} |
|||
$last = $n-1; |
|||
print "$Y[0] $Y[$last]\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function fibo_r($n){ |
|||
return(($n < 2) ? 1 : fibo_r($n - 2) + fibo_r($n - 1)); |
|||
} |
|||
|
|||
function fibo($n) { |
|||
$r = fibo_r($n); |
|||
print "$r\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function hash1($n) { |
|||
for ($i = 1; $i <= $n; $i++) { |
|||
$X[dechex($i)] = $i; |
|||
} |
|||
$c = 0; |
|||
for ($i = $n; $i > 0; $i--) { |
|||
if ($X[dechex($i)]) { $c++; } |
|||
} |
|||
print "$c\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function hash2($n) { |
|||
for ($i = 0; $i < $n; $i++) { |
|||
$hash1["foo_$i"] = $i; |
|||
$hash2["foo_$i"] = 0; |
|||
} |
|||
for ($i = $n; $i > 0; $i--) { |
|||
foreach($hash1 as $key => $value) $hash2[$key] += $value; |
|||
} |
|||
$first = "foo_0"; |
|||
$last = "foo_".($n-1); |
|||
print "$hash1[$first] $hash1[$last] $hash2[$first] $hash2[$last]\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function gen_random ($n) { |
|||
global $LAST; |
|||
return( ($n * ($LAST = ($LAST * IA + IC) % IM)) / IM ); |
|||
} |
|||
|
|||
function heapsort_r($n, &$ra) { |
|||
$l = ($n >> 1) + 1; |
|||
$ir = $n; |
|||
|
|||
while (1) { |
|||
if ($l > 1) { |
|||
$rra = $ra[--$l]; |
|||
} else { |
|||
$rra = $ra[$ir]; |
|||
$ra[$ir] = $ra[1]; |
|||
if (--$ir == 1) { |
|||
$ra[1] = $rra; |
|||
return; |
|||
} |
|||
} |
|||
$i = $l; |
|||
$j = $l << 1; |
|||
while ($j <= $ir) { |
|||
if (($j < $ir) && ($ra[$j] < $ra[$j+1])) { |
|||
$j++; |
|||
} |
|||
if ($rra < $ra[$j]) { |
|||
$ra[$i] = $ra[$j]; |
|||
$j += ($i = $j); |
|||
} else { |
|||
$j = $ir + 1; |
|||
} |
|||
} |
|||
$ra[$i] = $rra; |
|||
} |
|||
} |
|||
|
|||
function heapsort($N) { |
|||
global $LAST; |
|||
|
|||
define("IM", 139968); |
|||
define("IA", 3877); |
|||
define("IC", 29573); |
|||
|
|||
$LAST = 42; |
|||
for ($i=1; $i<=$N; $i++) { |
|||
$ary[$i] = gen_random(1); |
|||
} |
|||
heapsort_r($N, $ary); |
|||
printf("%.10f\n", $ary[$N]); |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function mkmatrix ($rows, $cols) { |
|||
$count = 1; |
|||
$mx = array(); |
|||
for ($i=0; $i<$rows; $i++) { |
|||
for ($j=0; $j<$cols; $j++) { |
|||
$mx[$i][$j] = $count++; |
|||
} |
|||
} |
|||
return($mx); |
|||
} |
|||
|
|||
function mmult ($rows, $cols, $m1, $m2) { |
|||
$m3 = array(); |
|||
for ($i=0; $i<$rows; $i++) { |
|||
for ($j=0; $j<$cols; $j++) { |
|||
$x = 0; |
|||
for ($k=0; $k<$cols; $k++) { |
|||
$x += $m1[$i][$k] * $m2[$k][$j]; |
|||
} |
|||
$m3[$i][$j] = $x; |
|||
} |
|||
} |
|||
return($m3); |
|||
} |
|||
|
|||
function matrix($n) { |
|||
$SIZE = 30; |
|||
$m1 = mkmatrix($SIZE, $SIZE); |
|||
$m2 = mkmatrix($SIZE, $SIZE); |
|||
while ($n--) { |
|||
$mm = mmult($SIZE, $SIZE, $m1, $m2); |
|||
} |
|||
print "{$mm[0][0]} {$mm[2][3]} {$mm[3][2]} {$mm[4][4]}\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function nestedloop($n) { |
|||
$x = 0; |
|||
for ($a=0; $a<$n; $a++) |
|||
for ($b=0; $b<$n; $b++) |
|||
for ($c=0; $c<$n; $c++) |
|||
for ($d=0; $d<$n; $d++) |
|||
for ($e=0; $e<$n; $e++) |
|||
for ($f=0; $f<$n; $f++) |
|||
$x++; |
|||
print "$x\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function sieve($n) { |
|||
$count = 0; |
|||
while ($n-- > 0) { |
|||
$count = 0; |
|||
$flags = range (0,8192); |
|||
for ($i=2; $i<8193; $i++) { |
|||
if ($flags[$i] > 0) { |
|||
for ($k=$i+$i; $k <= 8192; $k+=$i) { |
|||
$flags[$k] = 0; |
|||
} |
|||
$count++; |
|||
} |
|||
} |
|||
} |
|||
print "Count: $count\n"; |
|||
} |
|||
|
|||
/****/ |
|||
|
|||
function strcat($n) { |
|||
$str = ""; |
|||
while ($n-- > 0) { |
|||
$str .= "hello\n"; |
|||
} |
|||
$len = strlen($str); |
|||
print "$len\n"; |
|||
} |
|||
|
|||
/*****/ |
|||
|
|||
function getmicrotime() |
|||
{ |
|||
$t = gettimeofday(); |
|||
return ($t['sec'] + $t['usec'] / 1000000); |
|||
} |
|||
|
|||
function start_test() |
|||
{ |
|||
ob_start(); |
|||
return getmicrotime(); |
|||
} |
|||
|
|||
function end_test($start, $name) |
|||
{ |
|||
global $total; |
|||
$end = getmicrotime(); |
|||
ob_end_clean(); |
|||
$total += $end-$start; |
|||
$num = number_format($end-$start,3); |
|||
$pad = str_repeat(" ", 24-strlen($name)-strlen($num)); |
|||
|
|||
echo $name.$pad.$num."\n"; |
|||
ob_start(); |
|||
return getmicrotime(); |
|||
} |
|||
|
|||
function total() |
|||
{ |
|||
global $total; |
|||
$pad = str_repeat("-", 24); |
|||
echo $pad."\n"; |
|||
$num = number_format($total,3); |
|||
$pad = str_repeat(" ", 24-strlen("Total")-strlen($num)); |
|||
echo "Total".$pad.$num."\n"; |
|||
} |
|||
|
|||
$t0 = $t = start_test(); |
|||
simple(); |
|||
$t = end_test($t, "simple"); |
|||
simplecall(); |
|||
$t = end_test($t, "simplecall"); |
|||
simpleucall(); |
|||
$t = end_test($t, "simpleucall"); |
|||
simpleudcall(); |
|||
$t = end_test($t, "simpleudcall"); |
|||
mandel(); |
|||
$t = end_test($t, "mandel"); |
|||
mandel2(); |
|||
$t = end_test($t, "mandel2"); |
|||
ackermann(7); |
|||
$t = end_test($t, "ackermann(7)"); |
|||
ary(50000); |
|||
$t = end_test($t, "ary(50000)"); |
|||
ary2(50000); |
|||
$t = end_test($t, "ary2(50000)"); |
|||
ary3(2000); |
|||
$t = end_test($t, "ary3(2000)"); |
|||
fibo(30); |
|||
$t = end_test($t, "fibo(30)"); |
|||
hash1(50000); |
|||
$t = end_test($t, "hash1(50000)"); |
|||
hash2(500); |
|||
$t = end_test($t, "hash2(500)"); |
|||
heapsort(20000); |
|||
$t = end_test($t, "heapsort(20000)"); |
|||
matrix(20); |
|||
$t = end_test($t, "matrix(20)"); |
|||
nestedloop(12); |
|||
$t = end_test($t, "nestedloop(12)"); |
|||
sieve(30); |
|||
$t = end_test($t, "sieve(30)"); |
|||
strcat(200000); |
|||
$t = end_test($t, "strcat(200000)"); |
|||
total($t0, "Total"); |
|||
?>
|
|||
@ -1,43 +0,0 @@ |
|||
# Makefile to generate build tools
|
|||
#
|
|||
# Standard usage:
|
|||
# make -f build.mk
|
|||
#
|
|||
# Written by Sascha Schumann
|
|||
#
|
|||
# $Id$
|
|||
|
|||
|
|||
LT_TARGETS = ltmain.sh ltconfig |
|||
|
|||
config_h_in = zend_config.h.in |
|||
|
|||
makefile_am_files = Makefile.am |
|||
makefile_in_files = $(makefile_am_files:.am=.in) |
|||
makefile_files = $(makefile_am_files:e.am=e) |
|||
|
|||
targets = $(makefile_in_files) $(LT_TARGETS) configure $(config_h_in) |
|||
|
|||
all: $(targets) |
|||
|
|||
clean: |
|||
rm -f $(targets) |
|||
|
|||
$(LT_TARGETS): |
|||
rm -f $(LT_TARGETS) |
|||
libtoolize --automake $(AMFLAGS) -f |
|||
|
|||
$(makefile_in_files): $(makefile_am_files) |
|||
automake -a -i $(AMFLAGS) $(makefile_files) |
|||
|
|||
aclocal.m4: configure.in acinclude.m4 |
|||
aclocal |
|||
|
|||
$(config_h_in): configure.in acconfig.h |
|||
# explicitly remove target since autoheader does not seem to work
|
|||
# correctly otherwise (timestamps are not updated)
|
|||
@rm -f $@ |
|||
autoheader |
|||
|
|||
configure: aclocal.m4 configure.in |
|||
autoconf |
|||
@ -1,33 +0,0 @@ |
|||
#!/bin/sh |
|||
|
|||
case "$1" in |
|||
--copy) |
|||
automake_flags=--copy |
|||
shift |
|||
;; |
|||
esac |
|||
|
|||
libtoolize --force --automake $automake_flags |
|||
|
|||
mv aclocal.m4 aclocal.m4.old 2>/dev/null |
|||
aclocal |
|||
if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then |
|||
echo "buildconf: keeping ${1}aclocal.m4" |
|||
mv aclocal.m4.old aclocal.m4 |
|||
else |
|||
echo "buildconf: created or modified ${1}aclocal.m4" |
|||
fi |
|||
|
|||
autoheader |
|||
|
|||
automake --add-missing --include-deps $automake_flags |
|||
|
|||
mv configure configure.old 2>/dev/null |
|||
autoconf |
|||
if cmp configure.old configure > /dev/null 2>&1; then |
|||
echo "buildconf: keeping ${1}configure" |
|||
mv configure.old configure |
|||
else |
|||
echo "buildconf: created or modified ${1}configure" |
|||
fi |
|||
|
|||
@ -1,51 +0,0 @@ |
|||
dnl $Id$ |
|||
dnl Process this file with autoconf to produce a configure script. |
|||
|
|||
AC_INIT(zend.c) |
|||
AM_INIT_AUTOMAKE(zend, 0.80A, nodefine) |
|||
AM_CONFIG_HEADER(zend_config.h) |
|||
AM_SANITY_CHECK |
|||
AM_MAINTAINER_MODE |
|||
AC_PROG_CC |
|||
AM_PROG_LEX |
|||
AM_PROG_CC_STDC |
|||
ZEND_VERSION=$VERSION |
|||
AC_ZEND_C_BIGENDIAN |
|||
|
|||
dnl We want this one before the checks, so the checks can modify CFLAGS. |
|||
test -z "$CFLAGS" && auto_cflags=1 |
|||
|
|||
AC_CHECK_SIZEOF(long, 8) |
|||
AC_CHECK_SIZEOF(int, 4) |
|||
|
|||
sinclude(Zend.m4) |
|||
|
|||
LIBZEND_BASIC_CHECKS |
|||
LIBZEND_LIBDL_CHECKS |
|||
LIBZEND_DLSYM_CHECK |
|||
|
|||
AM_PROG_LIBTOOL |
|||
if test "$enable_debug" != "yes"; then |
|||
AM_SET_LIBTOOL_VARIABLE([--silent]) |
|||
fi |
|||
|
|||
dnl |
|||
dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary |
|||
dnl and source packages. This should be harmless on other OSs. |
|||
dnl |
|||
if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then |
|||
CFLAGS="$CFLAGS -I/usr/pkg/include" |
|||
LDFLAGS="$LDFLAGS -L/usr/pkg/lib" |
|||
fi |
|||
|
|||
LIBZEND_ENABLE_DEBUG |
|||
LIBZEND_OTHER_CHECKS |
|||
|
|||
ZEND_EXTRA_LIBS="$LIBS" |
|||
LIBS="" |
|||
AC_SUBST(ZEND_EXTRA_LIBS) |
|||
AC_OUTPUT(Makefile) |
|||
|
|||
# Local Variables: |
|||
# tab-width: 4 |
|||
# End: |
|||
1648
Zend/flex.skl
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,19 +0,0 @@ |
|||
/* |
|||
+----------------------------------------------------------------------+ |
|||
| Zend Engine | |
|||
+----------------------------------------------------------------------+ |
|||
| Copyright (c) 1998-2006 Zend Technologies Ltd. (http://www.zend.com) | |
|||
+----------------------------------------------------------------------+ |
|||
| This source file is subject to version 2.00 of the Zend license, | |
|||
| that is bundled with this package in the file LICENSE, and is | |
|||
| available through the world-wide-web at the following url: | |
|||
| http://www.zend.com/license/2_00.txt. | |
|||
| If you did not receive a copy of the Zend license and are unable to | |
|||
| obtain it through the world-wide-web, please send a note to | |
|||
| license@zend.com so we can mail you a copy immediately. | |
|||
+----------------------------------------------------------------------+ |
|||
| Authors: | |
|||
+----------------------------------------------------------------------+ |
|||
*/ |
|||
|
|||
/* $Id$ */ |
|||
@ -1,54 +0,0 @@ |
|||
--TEST-- |
|||
func_num_args() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
function test1() { |
|||
var_dump(func_num_args()); |
|||
} |
|||
|
|||
function test2($a) { |
|||
var_dump(func_num_args()); |
|||
} |
|||
|
|||
function test3($a, $b) { |
|||
var_dump(func_num_args()); |
|||
} |
|||
|
|||
test1(); |
|||
test2(1); |
|||
test2(); |
|||
test3(1,2); |
|||
|
|||
call_user_func("test1"); |
|||
call_user_func("test3", 1); |
|||
call_user_func("test3", 1, 2); |
|||
|
|||
class test { |
|||
static function test1($a) { |
|||
var_dump(func_num_args()); |
|||
} |
|||
} |
|||
|
|||
test::test1(1); |
|||
var_dump(func_num_args()); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
int(0) |
|||
int(1) |
|||
|
|||
Warning: Missing argument 1 for test2(), called in %s on line %d |
|||
int(0) |
|||
int(2) |
|||
int(0) |
|||
|
|||
Warning: Missing argument 2 for test3() in %s on line %d |
|||
int(1) |
|||
int(2) |
|||
int(1) |
|||
|
|||
Warning: func_num_args(): Called from the global scope - no function context in %s on line %d |
|||
int(-1) |
|||
Done |
|||
@ -1,108 +0,0 @@ |
|||
--TEST-- |
|||
func_get_arg() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
function test1() { |
|||
var_dump(func_get_arg(-10)); |
|||
var_dump(func_get_arg(0)); |
|||
var_dump(func_get_arg(1)); |
|||
} |
|||
|
|||
function test2($a) { |
|||
var_dump(func_get_arg(0)); |
|||
var_dump(func_get_arg(1)); |
|||
} |
|||
|
|||
function test3($a, $b) { |
|||
var_dump(func_get_arg(0)); |
|||
var_dump(func_get_arg(1)); |
|||
var_dump(func_get_arg(2)); |
|||
} |
|||
|
|||
test1(); |
|||
test1(10); |
|||
test2(1); |
|||
test2(); |
|||
test3(1,2); |
|||
|
|||
call_user_func("test1"); |
|||
call_user_func("test3", 1); |
|||
call_user_func("test3", 1, 2); |
|||
|
|||
class test { |
|||
static function test1($a) { |
|||
var_dump(func_get_arg(0)); |
|||
var_dump(func_get_arg(1)); |
|||
} |
|||
} |
|||
|
|||
test::test1(1); |
|||
var_dump(func_get_arg(1)); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: func_get_arg(): The argument number should be >= 0 in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Argument 0 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): The argument number should be >= 0 in %s on line %d |
|||
bool(false) |
|||
int(10) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
int(1) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: Missing argument 1 for test2(), called in %s on line %d and defined in %s on line %d |
|||
|
|||
Warning: func_get_arg(): Argument 0 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
int(1) |
|||
int(2) |
|||
|
|||
Warning: func_get_arg(): Argument 2 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): The argument number should be >= 0 in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Argument 0 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: Missing argument 2 for test3() in %s on line %d |
|||
int(1) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Argument 2 not passed to function in %s on line %d |
|||
bool(false) |
|||
int(1) |
|||
int(2) |
|||
|
|||
Warning: func_get_arg(): Argument 2 not passed to function in %s on line %d |
|||
bool(false) |
|||
int(1) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Called from the global scope - no function context in %s on line %d |
|||
bool(false) |
|||
Done |
|||
@ -1,81 +0,0 @@ |
|||
--TEST-- |
|||
func_get_args() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
function test1() { |
|||
var_dump(func_get_args()); |
|||
} |
|||
|
|||
function test2($a) { |
|||
var_dump(func_get_args()); |
|||
} |
|||
|
|||
function test3($a, $b) { |
|||
var_dump(func_get_args()); |
|||
} |
|||
|
|||
test1(); |
|||
test1(10); |
|||
test2(1); |
|||
test2(); |
|||
test3(1,2); |
|||
|
|||
call_user_func("test1"); |
|||
call_user_func("test3", 1); |
|||
call_user_func("test3", 1, 2); |
|||
|
|||
class test { |
|||
static function test1($a) { |
|||
var_dump(func_get_args()); |
|||
} |
|||
} |
|||
|
|||
test::test1(1); |
|||
var_dump(func_get_args()); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
array(0) { |
|||
} |
|||
array(1) { |
|||
[0]=> |
|||
int(10) |
|||
} |
|||
array(1) { |
|||
[0]=> |
|||
int(1) |
|||
} |
|||
|
|||
Warning: Missing argument 1 for test2(), called in %s on line %d and defined in %s on line %d |
|||
array(0) { |
|||
} |
|||
array(2) { |
|||
[0]=> |
|||
int(1) |
|||
[1]=> |
|||
int(2) |
|||
} |
|||
array(0) { |
|||
} |
|||
|
|||
Warning: Missing argument 2 for test3() in %s on line %d |
|||
array(1) { |
|||
[0]=> |
|||
int(1) |
|||
} |
|||
array(2) { |
|||
[0]=> |
|||
int(1) |
|||
[1]=> |
|||
int(2) |
|||
} |
|||
array(1) { |
|||
[0]=> |
|||
int(1) |
|||
} |
|||
|
|||
Warning: func_get_args(): Called from the global scope - no function context in %s on line %d |
|||
bool(false) |
|||
Done |
|||
@ -1,25 +0,0 @@ |
|||
--TEST-- |
|||
strncmp() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(strncmp("", "")); |
|||
var_dump(strncmp("", "", 100)); |
|||
var_dump(strncmp("aef", "dfsgbdf", -1)); |
|||
var_dump(strncmp("fghjkl", "qwer", 0)); |
|||
var_dump(strncmp("qwerty", "qwerty123", 6)); |
|||
var_dump(strncmp("qwerty", "qwerty123", 7)); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for strncmp() in %s on line %d |
|||
NULL |
|||
int(0) |
|||
|
|||
Warning: Length must be greater than or equal to 0 in %s on line %d |
|||
bool(false) |
|||
int(0) |
|||
int(0) |
|||
int(-1) |
|||
Done |
|||
@ -1,27 +0,0 @@ |
|||
--TEST-- |
|||
strcasecmp() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(strcasecmp("")); |
|||
var_dump(strcasecmp("", "")); |
|||
var_dump(strcasecmp("aef", "dfsgbdf")); |
|||
var_dump(strcasecmp("qwe", "qwer")); |
|||
var_dump(strcasecmp("qwerty", "QweRty")); |
|||
var_dump(strcasecmp("qwErtY", "qwerty")); |
|||
var_dump(strcasecmp("q123", "Q123")); |
|||
var_dump(strcasecmp("01", "01")); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for strcasecmp() in %s on line %d |
|||
NULL |
|||
int(0) |
|||
int(-3) |
|||
int(-1) |
|||
int(0) |
|||
int(0) |
|||
int(0) |
|||
int(0) |
|||
Done |
|||
@ -1,31 +0,0 @@ |
|||
--TEST-- |
|||
strncasecmp() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(strncasecmp("")); |
|||
var_dump(strncasecmp("", "", -1)); |
|||
var_dump(strncasecmp("aef", "dfsgbdf", 0)); |
|||
var_dump(strncasecmp("aef", "dfsgbdf", 10)); |
|||
var_dump(strncasecmp("qwe", "qwer", 3)); |
|||
var_dump(strncasecmp("qwerty", "QweRty", 6)); |
|||
var_dump(strncasecmp("qwErtY", "qwer", 7)); |
|||
var_dump(strncasecmp("q123", "Q123", 3)); |
|||
var_dump(strncasecmp("01", "01", 1000)); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for strncasecmp() in %s on line %d |
|||
NULL |
|||
|
|||
Warning: Length must be greater than or equal to 0 in %s on line %d |
|||
bool(false) |
|||
int(0) |
|||
int(-3) |
|||
int(0) |
|||
int(0) |
|||
int(2) |
|||
int(0) |
|||
int(0) |
|||
Done |
|||
@ -1,63 +0,0 @@ |
|||
--TEST-- |
|||
each() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(each()); |
|||
$var = 1; |
|||
var_dump(each($var)); |
|||
$var = "string"; |
|||
var_dump(each($var)); |
|||
$var = array(1,2,3); |
|||
var_dump(each($var)); |
|||
$var = array("a"=>1,"b"=>2,"c"=>3); |
|||
var_dump(each($var)); |
|||
|
|||
$a = array(1); |
|||
$a [] =&$a[0]; |
|||
|
|||
var_dump(each($a)); |
|||
|
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for each() in %s on line %d |
|||
NULL |
|||
|
|||
Warning: Variable passed to each() is not an array or object in %s on line %d |
|||
NULL |
|||
|
|||
Warning: Variable passed to each() is not an array or object in %s on line %d |
|||
NULL |
|||
array(4) { |
|||
[1]=> |
|||
int(1) |
|||
["value"]=> |
|||
int(1) |
|||
[0]=> |
|||
int(0) |
|||
["key"]=> |
|||
int(0) |
|||
} |
|||
array(4) { |
|||
[1]=> |
|||
int(1) |
|||
["value"]=> |
|||
int(1) |
|||
[0]=> |
|||
string(1) "a" |
|||
["key"]=> |
|||
string(1) "a" |
|||
} |
|||
array(4) { |
|||
[1]=> |
|||
int(1) |
|||
["value"]=> |
|||
int(1) |
|||
[0]=> |
|||
int(0) |
|||
["key"]=> |
|||
int(0) |
|||
} |
|||
Done |
|||
@ -1,53 +0,0 @@ |
|||
--TEST-- |
|||
define() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(define()); |
|||
var_dump(define("TRUE")); |
|||
var_dump(define("TRUE", 1)); |
|||
var_dump(define("TRUE", 1, array(1))); |
|||
|
|||
var_dump(define(array(1,2,3,4,5), 1)); |
|||
var_dump(define(" ", 1)); |
|||
var_dump(define("[[[", 2)); |
|||
var_dump(define("test const", 3)); |
|||
var_dump(define("test const", 3)); |
|||
var_dump(define("test", array(1))); |
|||
var_dump(define("test1", new stdclass)); |
|||
|
|||
var_dump(constant(" ")); |
|||
var_dump(constant("[[[")); |
|||
var_dump(constant("test const")); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: define() expects at least 2 parameters, 0 given in %s on line %d |
|||
NULL |
|||
|
|||
Warning: define() expects at least 2 parameters, 1 given in %s on line %d |
|||
NULL |
|||
bool(true) |
|||
|
|||
Warning: define() expects parameter 3 to be boolean, array given in %s on line %d |
|||
NULL |
|||
|
|||
Warning: define() expects parameter 1 to be string, array given in %s on line %d |
|||
NULL |
|||
bool(true) |
|||
bool(true) |
|||
bool(true) |
|||
|
|||
Notice: Constant test const already defined in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: Constants may only evaluate to scalar values in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: Constants may only evaluate to scalar values in %s on line %d |
|||
bool(false) |
|||
int(1) |
|||
int(2) |
|||
int(3) |
|||
Done |
|||
@ -1,46 +0,0 @@ |
|||
--TEST-- |
|||
get_class() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo { |
|||
function bar () { |
|||
var_dump(get_class()); |
|||
} |
|||
} |
|||
|
|||
class foo2 extends foo { |
|||
} |
|||
|
|||
foo::bar(); |
|||
foo2::bar(); |
|||
|
|||
$f1 = new foo; |
|||
$f2 = new foo2; |
|||
|
|||
$f1->bar(); |
|||
$f2->bar(); |
|||
|
|||
var_dump(get_class()); |
|||
var_dump(get_class("qwerty")); |
|||
|
|||
var_dump(get_class($f1)); |
|||
var_dump(get_class($f2)); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Strict Standards: Non-static method foo::bar() should not be called statically in %s on line %d |
|||
string(3) "foo" |
|||
|
|||
Strict Standards: Non-static method foo::bar() should not be called statically in %s on line %d |
|||
string(3) "foo" |
|||
string(3) "foo" |
|||
string(3) "foo" |
|||
|
|||
Warning: get_class() called without object from outside a class in %s on line %d |
|||
bool(false) |
|||
bool(false) |
|||
string(3) "foo" |
|||
string(4) "foo2" |
|||
Done |
|||
@ -1,59 +0,0 @@ |
|||
--TEST-- |
|||
get_parent_class() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
interface i { |
|||
function test(); |
|||
} |
|||
|
|||
class foo implements i { |
|||
function test() { |
|||
var_dump(get_parent_class()); |
|||
} |
|||
} |
|||
|
|||
class bar extends foo { |
|||
function test_bar() { |
|||
var_dump(get_parent_class()); |
|||
} |
|||
} |
|||
|
|||
$bar = new bar; |
|||
$foo = new foo; |
|||
|
|||
$foo->test(); |
|||
$bar->test(); |
|||
$bar->test_bar(); |
|||
|
|||
var_dump(get_parent_class($bar)); |
|||
var_dump(get_parent_class($foo)); |
|||
var_dump(get_parent_class("bar")); |
|||
var_dump(get_parent_class("foo")); |
|||
var_dump(get_parent_class("i")); |
|||
|
|||
var_dump(get_parent_class("")); |
|||
var_dump(get_parent_class("[[[[")); |
|||
var_dump(get_parent_class(" ")); |
|||
var_dump(get_parent_class(new stdclass)); |
|||
var_dump(get_parent_class(array())); |
|||
var_dump(get_parent_class(1)); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
bool(false) |
|||
bool(false) |
|||
string(3) "foo" |
|||
string(3) "foo" |
|||
bool(false) |
|||
string(3) "foo" |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
Done |
|||
@ -1,89 +0,0 @@ |
|||
--TEST-- |
|||
property_exists() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo { |
|||
public $pp1 = 1; |
|||
private $pp2 = 2; |
|||
protected $pp3 = 3; |
|||
|
|||
function bar() { |
|||
var_dump(property_exists("foo","pp1")); |
|||
var_dump(property_exists("foo","pp2")); |
|||
var_dump(property_exists("foo","pp3")); |
|||
} |
|||
} |
|||
|
|||
class bar extends foo { |
|||
function test() { |
|||
var_dump(property_exists("foo","pp1")); |
|||
var_dump(property_exists("foo","pp2")); |
|||
var_dump(property_exists("foo","pp3")); |
|||
} |
|||
} |
|||
|
|||
var_dump(property_exists()); |
|||
var_dump(property_exists("")); |
|||
var_dump(property_exists("foo","pp1")); |
|||
var_dump(property_exists("foo","pp2")); |
|||
var_dump(property_exists("foo","pp3")); |
|||
var_dump(property_exists("foo","nonexistent")); |
|||
var_dump(property_exists("fo","nonexistent")); |
|||
var_dump(property_exists("foo","")); |
|||
var_dump(property_exists("","test")); |
|||
var_dump(property_exists("","")); |
|||
|
|||
$foo = new foo; |
|||
|
|||
var_dump(property_exists($foo,"pp1")); |
|||
var_dump(property_exists($foo,"pp2")); |
|||
var_dump(property_exists($foo,"pp3")); |
|||
var_dump(property_exists($foo,"nonexistent")); |
|||
var_dump(property_exists($foo,"")); |
|||
var_dump(property_exists(array(),"test")); |
|||
var_dump(property_exists(1,"test")); |
|||
var_dump(property_exists(true,"test")); |
|||
|
|||
$foo->bar(); |
|||
|
|||
$bar = new bar; |
|||
$bar->test(); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for property_exists() in %s on line %d |
|||
NULL |
|||
|
|||
Warning: Wrong parameter count for property_exists() in %s on line %d |
|||
NULL |
|||
bool(true) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(true) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
bool(false) |
|||
|
|||
Warning: First parameter must either be an object or the name of an existing class in %s on line %d |
|||
NULL |
|||
|
|||
Warning: First parameter must either be an object or the name of an existing class in %s on line %d |
|||
NULL |
|||
|
|||
Warning: First parameter must either be an object or the name of an existing class in %s on line %d |
|||
NULL |
|||
bool(true) |
|||
bool(true) |
|||
bool(true) |
|||
bool(true) |
|||
bool(false) |
|||
bool(true) |
|||
Done |
|||
@ -1,34 +0,0 @@ |
|||
--TEST-- |
|||
class_exists() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo { |
|||
} |
|||
|
|||
var_dump(class_exists()); |
|||
var_dump(class_exists("qwerty")); |
|||
var_dump(class_exists("")); |
|||
var_dump(class_exists(array())); |
|||
var_dump(class_exists("test", false)); |
|||
var_dump(class_exists("foo", false)); |
|||
var_dump(class_exists("foo")); |
|||
var_dump(class_exists("stdClass", false)); |
|||
var_dump(class_exists("stdClass")); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: class_exists() expects at least 1 parameter, 0 given in %s on line %d |
|||
NULL |
|||
bool(false) |
|||
bool(false) |
|||
|
|||
Warning: class_exists() expects parameter 1 to be string, array given in %s on line %d |
|||
NULL |
|||
bool(false) |
|||
bool(true) |
|||
bool(true) |
|||
bool(true) |
|||
bool(true) |
|||
Done |
|||
@ -1,34 +0,0 @@ |
|||
--TEST-- |
|||
interface_exists() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
interface foo { |
|||
} |
|||
|
|||
var_dump(interface_exists()); |
|||
var_dump(interface_exists("qwerty")); |
|||
var_dump(interface_exists("")); |
|||
var_dump(interface_exists(array())); |
|||
var_dump(interface_exists("test", false)); |
|||
var_dump(interface_exists("foo", false)); |
|||
var_dump(interface_exists("foo")); |
|||
var_dump(interface_exists("stdClass", false)); |
|||
var_dump(interface_exists("stdClass")); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: interface_exists() expects at least 1 parameter, 0 given in %s on line %d |
|||
NULL |
|||
bool(false) |
|||
bool(false) |
|||
|
|||
Warning: interface_exists() expects parameter 1 to be string, array given in %s on line %d |
|||
NULL |
|||
bool(false) |
|||
bool(true) |
|||
bool(true) |
|||
bool(false) |
|||
bool(false) |
|||
Done |
|||
@ -1,3 +0,0 @@ |
|||
<?php |
|||
/* dummy file for 014.phpt */ |
|||
?> |
|||
@ -1,52 +0,0 @@ |
|||
--TEST-- |
|||
get_included_files() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(get_included_files()); |
|||
|
|||
include(dirname(__FILE__)."/014.inc"); |
|||
var_dump(get_included_files()); |
|||
|
|||
var_dump(get_included_files(1,1)); |
|||
|
|||
include_once(dirname(__FILE__)."/014.inc"); |
|||
var_dump(get_included_files()); |
|||
|
|||
var_dump(get_included_files(1)); |
|||
|
|||
include(dirname(__FILE__)."/014.inc"); |
|||
var_dump(get_included_files()); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
array(1) { |
|||
[0]=> |
|||
string(%d) "%s" |
|||
} |
|||
array(2) { |
|||
[0]=> |
|||
string(%d) "%s" |
|||
[1]=> |
|||
string(%d) "%s" |
|||
} |
|||
|
|||
Warning: Wrong parameter count for get_included_files() in %s on line %d |
|||
NULL |
|||
array(2) { |
|||
[0]=> |
|||
string(%d) "%s" |
|||
[1]=> |
|||
string(%d) "%s" |
|||
} |
|||
|
|||
Warning: Wrong parameter count for get_included_files() in %s on line %d |
|||
NULL |
|||
array(2) { |
|||
[0]=> |
|||
string(%d) "%s" |
|||
[1]=> |
|||
string(%d) "%s" |
|||
} |
|||
Done |
|||
@ -1,35 +0,0 @@ |
|||
--TEST-- |
|||
trigger_error() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(trigger_error()); |
|||
var_dump(trigger_error("error")); |
|||
var_dump(trigger_error(array())); |
|||
var_dump(trigger_error("error", -1)); |
|||
var_dump(trigger_error("error", 0)); |
|||
var_dump(trigger_error("error", E_USER_WARNING)); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for trigger_error() in %s on line %d |
|||
NULL |
|||
|
|||
Notice: error in %s on line %d |
|||
bool(true) |
|||
|
|||
Notice: Array to string conversion in %s on line %d |
|||
|
|||
Notice: Array in %s on line %d |
|||
bool(true) |
|||
|
|||
Warning: Invalid error type specified in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: Invalid error type specified in %s on line %d |
|||
bool(false) |
|||
|
|||
Warning: error in %s on line %d |
|||
bool(true) |
|||
Done |
|||
@ -1,12 +0,0 @@ |
|||
--TEST-- |
|||
isset() with object properties when operating on non-object |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$foo = NULL; |
|||
isset($foo->bar->bar); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECT-- |
|||
Done |
|||
@ -1,86 +0,0 @@ |
|||
--TEST-- |
|||
builtin functions tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(get_resource_type()); |
|||
var_dump(get_resource_type("")); |
|||
$fp = fopen(__FILE__, "r"); |
|||
var_dump(get_resource_type($fp)); |
|||
fclose($fp); |
|||
var_dump(get_resource_type($fp)); |
|||
|
|||
var_dump(gettype(get_loaded_extensions())); |
|||
var_dump(count(get_loaded_extensions())); |
|||
var_dump(gettype(get_loaded_extensions(true))); |
|||
var_dump(count(get_loaded_extensions(true))); |
|||
var_dump(get_loaded_extensions(true, true)); |
|||
|
|||
define("USER_CONSTANT", "test"); |
|||
|
|||
var_dump(get_defined_constants(true, true)); |
|||
var_dump(gettype(get_defined_constants(true))); |
|||
var_dump(gettype(get_defined_constants())); |
|||
var_dump(count(get_defined_constants())); |
|||
|
|||
function test () { |
|||
} |
|||
|
|||
var_dump(get_defined_functions(true)); |
|||
var_dump(gettype(get_defined_functions())); |
|||
var_dump(count(get_defined_functions())); |
|||
|
|||
var_dump(get_declared_interfaces(true)); |
|||
var_dump(gettype(get_declared_interfaces())); |
|||
var_dump(count(get_declared_interfaces())); |
|||
|
|||
var_dump(get_extension_funcs()); |
|||
var_dump(get_extension_funcs(true)); |
|||
var_dump(gettype(get_extension_funcs("standard"))); |
|||
var_dump(count(get_extension_funcs("standard"))); |
|||
var_dump(gettype(get_extension_funcs("zend"))); |
|||
var_dump(count(get_extension_funcs("zend"))); |
|||
|
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for get_resource_type() in %s on line %d |
|||
NULL |
|||
|
|||
Warning: Supplied argument is not a valid resource handle in %s on line %d |
|||
bool(false) |
|||
string(6) "stream" |
|||
string(7) "Unknown" |
|||
string(5) "array" |
|||
int(%d) |
|||
string(5) "array" |
|||
int(%d) |
|||
|
|||
Warning: get_loaded_extensions() expects at most 1 parameter, 2 given in %s on line %d |
|||
NULL |
|||
|
|||
Warning: Wrong parameter count for get_defined_constants() in %s on line %d |
|||
NULL |
|||
string(5) "array" |
|||
string(5) "array" |
|||
int(%d) |
|||
|
|||
Warning: Wrong parameter count for get_defined_functions() in %s on line %d |
|||
NULL |
|||
string(5) "array" |
|||
int(%d) |
|||
|
|||
Warning: Wrong parameter count for get_declared_interfaces() in %s on line %d |
|||
NULL |
|||
string(5) "array" |
|||
int(%d) |
|||
|
|||
Warning: Wrong parameter count for get_extension_funcs() in %s on line %d |
|||
NULL |
|||
bool(false) |
|||
string(5) "array" |
|||
int(%d) |
|||
string(5) "array" |
|||
int(%d) |
|||
Done |
|||
@ -1,36 +0,0 @@ |
|||
--TEST-- |
|||
constant() tests |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(constant()); |
|||
var_dump(constant("", "")); |
|||
var_dump(constant("")); |
|||
|
|||
var_dump(constant(array())); |
|||
|
|||
define("TEST_CONST", 1); |
|||
var_dump(constant("TEST_CONST")); |
|||
|
|||
define("TEST_CONST2", "test"); |
|||
var_dump(constant("TEST_CONST2")); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Warning: Wrong parameter count for constant() in %s on line %d |
|||
NULL |
|||
|
|||
Warning: Wrong parameter count for constant() in %s on line %d |
|||
NULL |
|||
|
|||
Warning: constant(): Couldn't find constant in %s on line %d |
|||
NULL |
|||
|
|||
Notice: Array to string conversion in %s on line %d |
|||
|
|||
Warning: constant(): Couldn't find constant Array in %s on line %d |
|||
NULL |
|||
int(1) |
|||
string(4) "test" |
|||
Done |
|||
1332
Zend/tests/019.phpt
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,31 +0,0 @@ |
|||
--TEST-- |
|||
func_get_arg() invalid usage |
|||
--FILE-- |
|||
<?php |
|||
|
|||
var_dump(func_get_arg(1,2,3)); |
|||
var_dump(func_get_arg(1)); |
|||
var_dump(func_get_arg()); |
|||
|
|||
function bar() { |
|||
var_dump(func_get_arg(1)); |
|||
} |
|||
|
|||
function foo() { |
|||
bar(func_get_arg(1)); |
|||
} |
|||
|
|||
foo(1,2); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Called from the global scope - no function context in %s on line %d |
|||
bool(false) |
|||
bool(false) |
|||
|
|||
Warning: func_get_arg(): Argument 1 not passed to function in %s on line %d |
|||
bool(false) |
|||
Done |
|||
@ -1,14 +0,0 @@ |
|||
--TEST-- |
|||
Test for abstract static classes |
|||
--FILE-- |
|||
<?php |
|||
abstract class TestClass |
|||
{ |
|||
abstract static public function getName(); |
|||
} |
|||
?> |
|||
===DONE=== |
|||
--EXPECTF-- |
|||
|
|||
Strict Standards: Static function TestClass::getName() should not be abstract in %sabstract-static.php on line %d |
|||
===DONE=== |
|||
@ -1,73 +0,0 @@ |
|||
--TEST-- |
|||
adding arrays |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$a = array(1,2,3); |
|||
$b = array("str", "here"); |
|||
|
|||
$c = $a + $b; |
|||
var_dump($c); |
|||
|
|||
$a = array(1,2,3); |
|||
$b = array(1,2,4); |
|||
|
|||
$c = $a + $b; |
|||
var_dump($c); |
|||
|
|||
$a = array("a"=>"aaa",2,3); |
|||
$b = array(1,2,"a"=>"bbbbbb"); |
|||
|
|||
$c = $a + $b; |
|||
var_dump($c); |
|||
|
|||
$a += $b; |
|||
var_dump($c); |
|||
|
|||
$a += $a; |
|||
var_dump($c); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
array(3) { |
|||
[0]=> |
|||
int(1) |
|||
[1]=> |
|||
int(2) |
|||
[2]=> |
|||
int(3) |
|||
} |
|||
array(3) { |
|||
[0]=> |
|||
int(1) |
|||
[1]=> |
|||
int(2) |
|||
[2]=> |
|||
int(3) |
|||
} |
|||
array(3) { |
|||
["a"]=> |
|||
string(3) "aaa" |
|||
[0]=> |
|||
int(2) |
|||
[1]=> |
|||
int(3) |
|||
} |
|||
array(3) { |
|||
["a"]=> |
|||
string(3) "aaa" |
|||
[0]=> |
|||
int(2) |
|||
[1]=> |
|||
int(3) |
|||
} |
|||
array(3) { |
|||
["a"]=> |
|||
string(3) "aaa" |
|||
[0]=> |
|||
int(2) |
|||
[1]=> |
|||
int(3) |
|||
} |
|||
Done |
|||
@ -1,19 +0,0 @@ |
|||
--TEST-- |
|||
adding objects to arrays |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$a = array(1,2,3); |
|||
|
|||
$o = new stdclass; |
|||
$o->prop = "value"; |
|||
|
|||
$c = $a + $o; |
|||
var_dump($c); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Notice: Object of class stdClass could not be converted to int in %s on line %d |
|||
|
|||
Fatal error: Unsupported operand types in %s on line %d |
|||
@ -1,19 +0,0 @@ |
|||
--TEST-- |
|||
adding arrays to objects |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$a = array(1,2,3); |
|||
|
|||
$o = new stdclass; |
|||
$o->prop = "value"; |
|||
|
|||
$c = $o + $a; |
|||
var_dump($c); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Notice: Object of class stdClass could not be converted to int in %s on line %d |
|||
|
|||
Fatal error: Unsupported operand types in %s on line %d |
|||
@ -1,14 +0,0 @@ |
|||
--TEST-- |
|||
adding numbers to arrays |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$a = array(1,2,3); |
|||
|
|||
$c = $a + 5; |
|||
var_dump($c); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: Unsupported operand types in %s on line %d |
|||
@ -1,22 +0,0 @@ |
|||
--TEST-- |
|||
adding integers to doubles |
|||
--INI-- |
|||
precision=14 |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$i = 75636; |
|||
$d = 2834681123.123123; |
|||
|
|||
$c = $i + $d; |
|||
var_dump($c); |
|||
|
|||
$c = $d + $i; |
|||
var_dump($c); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
float(2834756759.1231) |
|||
float(2834756759.1231) |
|||
Done |
|||
@ -1,49 +0,0 @@ |
|||
--TEST-- |
|||
adding numbers to strings |
|||
--INI-- |
|||
precision=14 |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$i = 75636; |
|||
$s1 = "this is a string"; |
|||
$s2 = "876222numeric"; |
|||
$s3 = "48474874"; |
|||
$s4 = "25.68"; |
|||
|
|||
$c = $i + $s1; |
|||
var_dump($c); |
|||
|
|||
$c = $i + $s2; |
|||
var_dump($c); |
|||
|
|||
$c = $i + $s3; |
|||
var_dump($c); |
|||
|
|||
$c = $i + $s4; |
|||
var_dump($c); |
|||
|
|||
$c = $s1 + $i; |
|||
var_dump($c); |
|||
|
|||
$c = $s2 + $i; |
|||
var_dump($c); |
|||
|
|||
$c = $s3 + $i; |
|||
var_dump($c); |
|||
|
|||
$c = $s4 + $i; |
|||
var_dump($c); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
int(75636) |
|||
int(951858) |
|||
int(48550510) |
|||
float(75661.68) |
|||
int(75636) |
|||
int(951858) |
|||
int(48550510) |
|||
float(75661.68) |
|||
Done |
|||
@ -1,16 +0,0 @@ |
|||
--TEST-- |
|||
adding strings to arrays |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$a = array(1,2,3); |
|||
|
|||
$s1 = "some string"; |
|||
|
|||
$c = $a + $s1; |
|||
var_dump($c); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: Unsupported operand types in %s on line %d |
|||
@ -1,39 +0,0 @@ |
|||
--TEST-- |
|||
bitwise AND and strings |
|||
--FILE-- |
|||
<?php |
|||
|
|||
$s = "123"; |
|||
$s1 = "234"; |
|||
|
|||
var_dump($s & $s1); |
|||
|
|||
$s = "test"; |
|||
$s1 = "some"; |
|||
|
|||
var_dump($s & $s1); |
|||
|
|||
$s = "test long"; |
|||
$s1 = "some"; |
|||
|
|||
var_dump($s & $s1); |
|||
|
|||
$s = "test"; |
|||
$s1 = "some long"; |
|||
|
|||
var_dump($s & $s1); |
|||
|
|||
$s = "test"; |
|||
$s &= "some long"; |
|||
|
|||
var_dump($s); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECTF-- |
|||
string(3) "020" |
|||
string(4) "pead" |
|||
string(4) "pead" |
|||
string(4) "pead" |
|||
string(4) "pead" |
|||
Done |
|||
@ -1,16 +0,0 @@ |
|||
--TEST-- |
|||
Tests that array manipulation code is correctly dealing with copy on write and splitting on reference |
|||
--FILE-- |
|||
<?php |
|||
$a=array(); |
|||
$b=1; |
|||
$c=&$b; |
|||
$a[]=$b; |
|||
$b=2; |
|||
var_dump ($a); |
|||
?> |
|||
--EXPECT-- |
|||
array(1) { |
|||
[0]=> |
|||
int(1) |
|||
} |
|||
@ -1,15 +0,0 @@ |
|||
--TEST-- |
|||
Array type hint |
|||
--FILE-- |
|||
<?php |
|||
function foo(array $a) { |
|||
echo count($a)."\n"; |
|||
} |
|||
|
|||
foo(array(1,2,3)); |
|||
foo(123); |
|||
?> |
|||
--EXPECTF-- |
|||
3 |
|||
|
|||
Catchable fatal error: Argument 1 passed to foo() must be an array, integer given, called in %sarray_type_hint_001.php on line 7 and defined in %sarray_type_hint_001.php on line 2 |
|||
@ -1,16 +0,0 @@ |
|||
--TEST-- |
|||
Tests that array unshift code is correctly dealing with copy on write and splitting on reference |
|||
--FILE-- |
|||
<?php |
|||
$a=array(); |
|||
$b=1; |
|||
$c=&$b; |
|||
array_unshift ($a,$b); |
|||
$b=2; |
|||
var_dump ($a); |
|||
?> |
|||
--EXPECT-- |
|||
array(1) { |
|||
[0]=> |
|||
int(1) |
|||
} |
|||
@ -1,22 +0,0 @@ |
|||
--TEST-- |
|||
Bug #19859 (__call() does not catch call_user_func_array() calls) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); ?> |
|||
--FILE-- |
|||
<?php |
|||
class test |
|||
{ |
|||
function __call($method,$args) |
|||
{ |
|||
print "test::__call invoked for method '$method'\n"; |
|||
} |
|||
} |
|||
$x = new test; |
|||
$x->fake(1); |
|||
call_user_func_array(array($x,'fake'),array(1)); |
|||
call_user_func(array($x,'fake'),2); |
|||
?> |
|||
--EXPECT-- |
|||
test::__call invoked for method 'fake' |
|||
test::__call invoked for method 'fake' |
|||
test::__call invoked for method 'fake' |
|||
@ -1,43 +0,0 @@ |
|||
--TEST-- |
|||
Bug #20240 (order of destructor calls) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); ?> |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class test |
|||
{ |
|||
public $member; |
|||
|
|||
function test() { |
|||
$this->member = 1; |
|||
register_shutdown_function(array($this, 'destructor')); |
|||
} |
|||
|
|||
function destructor() { |
|||
print __METHOD__ . "\n"; |
|||
} |
|||
|
|||
function __destruct() { |
|||
print __METHOD__ . "\n"; |
|||
} |
|||
|
|||
function add() { |
|||
$this->member += 1; |
|||
print $this->member."\n"; |
|||
} |
|||
} |
|||
|
|||
$t = new test(); |
|||
|
|||
$t->add(); |
|||
$t->add(); |
|||
|
|||
echo "Done\n"; |
|||
?> |
|||
--EXPECT-- |
|||
2 |
|||
3 |
|||
Done |
|||
test::destructor |
|||
test::__destruct |
|||
@ -1,26 +0,0 @@ |
|||
--TEST-- |
|||
Bug #20242 (Method call in front of class definition) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '>=')) die('skip ZendEngine 2 does not support this'); ?> |
|||
--FILE-- |
|||
<?php |
|||
|
|||
// THIS IS A WON'T FIX FOR ZE2 |
|||
|
|||
test::show_static(); |
|||
|
|||
$t = new test; |
|||
$t->show_method(); |
|||
|
|||
class test { |
|||
static function show_static() { |
|||
echo "static\n"; |
|||
} |
|||
function show_method() { |
|||
echo "method\n"; |
|||
} |
|||
} |
|||
?> |
|||
--EXPECT-- |
|||
static |
|||
method |
|||
@ -1,37 +0,0 @@ |
|||
--TEST-- |
|||
Bug #21478 (Zend/zend_alloc.c :: shutdown_memory_manager produces segfault) |
|||
--SKIPIF-- |
|||
<?php |
|||
if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); |
|||
if (!function_exists('stream_filter_register')) die('skip stream_filter_register() not available'); |
|||
?> |
|||
--FILE-- |
|||
<?php |
|||
class debugfilter extends php_user_filter { |
|||
function filter($in, $out, &$consumed, $closing) { |
|||
while ($bucket = stream_bucket_make_writeable($in)) { |
|||
$bucket->data = strtoupper($bucket->data); |
|||
stream_bucket_append($out, $bucket); |
|||
$consumed += strlen($bucket->data); |
|||
} |
|||
return PSFS_PASS_ON; |
|||
} |
|||
} |
|||
|
|||
stream_filter_register("myfilter","debugfilter"); |
|||
|
|||
$fp = fopen(dirname(__FILE__)."/test.txt","w"); |
|||
stream_filter_append($fp, "myfilter"); |
|||
stream_filter_append($fp, "myfilter"); |
|||
stream_filter_append($fp, "myfilter"); |
|||
fwrite($fp, "This is a test.\n"); |
|||
print "Done.\n"; |
|||
fclose($fp); |
|||
// Uncommenting the following 'print' line causes the segfault to stop occuring |
|||
// print "2\n"; |
|||
readfile(dirname(__FILE__)."/test.txt"); |
|||
unlink(dirname(__FILE__)."/test.txt"); |
|||
?> |
|||
--EXPECT-- |
|||
Done. |
|||
THIS IS A TEST. |
|||
@ -1,36 +0,0 @@ |
|||
--TEST-- |
|||
Bug #21888 (protected property and protected method of the same name) |
|||
--SKIPIF-- |
|||
<?php |
|||
if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); |
|||
?> |
|||
--FILE-- |
|||
<?php |
|||
class mom { |
|||
|
|||
protected $prot = "protected property\n"; |
|||
|
|||
protected function prot() { |
|||
print "protected method\n"; |
|||
} |
|||
} |
|||
|
|||
class child extends mom { |
|||
|
|||
public function callMom() { |
|||
$this->prot(); |
|||
} |
|||
|
|||
public function viewMom() { |
|||
print $this->prot; |
|||
} |
|||
|
|||
} |
|||
|
|||
$c = new child(); |
|||
$c->callMom(); |
|||
$c->viewMom(); |
|||
?> |
|||
--EXPECT-- |
|||
protected method |
|||
protected property |
|||
@ -1,31 +0,0 @@ |
|||
--TEST-- |
|||
Bug #22725 (A derived class can call a parent's protected method that calls a private method) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?> |
|||
--FILE-- |
|||
<?php |
|||
class Foo { |
|||
private function aPrivateMethod() { |
|||
echo "Foo::aPrivateMethod() called.\n"; |
|||
} |
|||
|
|||
protected function aProtectedMethod() { |
|||
echo "Foo::aProtectedMethod() called.\n"; |
|||
$this->aPrivateMethod(); |
|||
} |
|||
} |
|||
|
|||
class Bar extends Foo { |
|||
public function aPublicMethod() { |
|||
echo "Bar::aPublicMethod() called.\n"; |
|||
$this->aProtectedMethod(); |
|||
} |
|||
} |
|||
|
|||
$o = new Bar; |
|||
$o->aPublicMethod(); |
|||
?> |
|||
--EXPECT-- |
|||
Bar::aPublicMethod() called. |
|||
Foo::aProtectedMethod() called. |
|||
Foo::aPrivateMethod() called. |
|||
@ -1,34 +0,0 @@ |
|||
--TEST-- |
|||
Bug #22836 (returning references to NULL) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); ?> |
|||
--FILE-- |
|||
<?php |
|||
function &f() |
|||
{ |
|||
$x = "foo"; |
|||
var_dump($x); |
|||
print "'$x'\n"; |
|||
return ($a); |
|||
} |
|||
for ($i = 0; $i < 8; $i++) { |
|||
$h =& f(); |
|||
} |
|||
?> |
|||
--EXPECTF-- |
|||
string(3) "foo" |
|||
'foo' |
|||
string(3) "foo" |
|||
'foo' |
|||
string(3) "foo" |
|||
'foo' |
|||
string(3) "foo" |
|||
'foo' |
|||
string(3) "foo" |
|||
'foo' |
|||
string(3) "foo" |
|||
'foo' |
|||
string(3) "foo" |
|||
'foo' |
|||
string(3) "foo" |
|||
'foo' |
|||
@ -1,12 +0,0 @@ |
|||
--TEST-- |
|||
Bug #23104 (Hash position not reset for constant arrays) |
|||
--FILE-- |
|||
<?php |
|||
function foo($bar = array("a", "b", "c")) |
|||
{ |
|||
var_dump(current($bar)); |
|||
} |
|||
foo(); |
|||
?> |
|||
--EXPECT-- |
|||
string(1) "a" |
|||
@ -1,24 +0,0 @@ |
|||
--TEST-- |
|||
Bug #24436 (isset()/empty() produce errors with non-existent variables in classes) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); ?> |
|||
--INI-- |
|||
error_reporting=2047 |
|||
--FILE-- |
|||
<?php |
|||
class test { |
|||
function __construct() { |
|||
if (empty($this->test[0][0])) { print "test1\n";} |
|||
if (!isset($this->test[0][0])) { print "test2\n";} |
|||
if (empty($this->test)) { print "test1\n";} |
|||
if (!isset($this->test)) { print "test2\n";} |
|||
} |
|||
} |
|||
|
|||
$test1 = new test(); |
|||
?> |
|||
--EXPECT-- |
|||
test1 |
|||
test2 |
|||
test1 |
|||
test2 |
|||
@ -1,30 +0,0 @@ |
|||
--TEST-- |
|||
Bug #24635 (crash on dtor calling other functions) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); ?> |
|||
--FILE-- |
|||
<?php |
|||
class SiteClass { |
|||
function __construct() { $this->page = new PageClass(); } |
|||
} |
|||
class PageClass { |
|||
function Display() { |
|||
$section = new SectionClass("PageClass::Display"); |
|||
} |
|||
} |
|||
class SectionClass { |
|||
function __construct($comment) { |
|||
$this->Comment = $comment; |
|||
} |
|||
function __destruct() { |
|||
out($this->Comment); // this line doesn't crash PHP |
|||
out("\n<!-- End Section: " . $this->Comment . "-->"); // this line |
|||
} |
|||
} |
|||
function out($code) { return; } |
|||
$site = new SiteClass(); |
|||
$site->page->Display(); |
|||
echo "OK\n"; |
|||
?> |
|||
--EXPECT-- |
|||
OK |
|||
@ -1,13 +0,0 @@ |
|||
--TEST-- |
|||
Bug #24699 (Memory Leak with per-class constants) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 is needed'); ?> |
|||
--FILE-- |
|||
<?php |
|||
class TEST { const FOO = SEEK_CUR; }; |
|||
class TEST2 { const FOO = 1; }; |
|||
class TEST3 { const FOO = PHP_VERSION; }; |
|||
print TEST::FOO."\n"; |
|||
?> |
|||
--EXPECT-- |
|||
1 |
|||
@ -1,9 +0,0 @@ |
|||
--TEST-- |
|||
Bug #24773 (unset() of integers treated as arrays causes a crash) |
|||
--FILE-- |
|||
<?php |
|||
$array = 'test'; |
|||
unset($array["lvl1"]["lvl2"]["b"]); |
|||
?> |
|||
--EXPECTF-- |
|||
Fatal error: Cannot unset string offsets in %s on line %d |
|||
@ -1,28 +0,0 @@ |
|||
--TEST-- |
|||
Bug #24884 (calling $this->__clone(); crashes php) |
|||
--SKIPIF-- |
|||
<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?> |
|||
--FILE-- |
|||
<?php |
|||
class Test { |
|||
function __copy() |
|||
{ |
|||
$string = PHP_VERSION; |
|||
$version = $string[0]; |
|||
if($string < 5) |
|||
{ |
|||
return $this; |
|||
} |
|||
else |
|||
{ |
|||
return clone $this; |
|||
} |
|||
} |
|||
} |
|||
$test = new Test(); |
|||
$test2 = $test->__copy(); |
|||
var_dump($test2); |
|||
?> |
|||
--EXPECTF-- |
|||
object(Test)#%d (0) { |
|||
} |
|||
@ -1,19 +0,0 @@ |
|||
--TEST-- |
|||
Bug #26010 (private / protected variables get exposed by get_object_vars()) |
|||
--FILE-- |
|||
<?php |
|||
class foo { |
|||
private $private = 'private'; |
|||
protected $protected = 'protected'; |
|||
public $public = 'public'; |
|||
} |
|||
$data = new foo(); |
|||
$obj_vars = get_object_vars($data); |
|||
var_dump($obj_vars); |
|||
?> |
|||
--EXPECT-- |
|||
array(1) { |
|||
["public"]=> |
|||
string(6) "public" |
|||
} |
|||
|
|||
@ -1,9 +0,0 @@ |
|||
--TEST-- |
|||
Bug #26077 (Memory leaks when creating an instance of an object) |
|||
--FILE-- |
|||
<?php |
|||
class foo {} new foo(); |
|||
?> |
|||
===DONE=== |
|||
--EXPECT-- |
|||
===DONE=== |
|||
@ -1,74 +0,0 @@ |
|||
--TEST-- |
|||
Bug #26166 (__toString() crash when no values returned) |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class Foo |
|||
{ |
|||
function __toString() |
|||
{ |
|||
return "Hello World!\n"; |
|||
} |
|||
} |
|||
|
|||
class Bar |
|||
{ |
|||
private $obj; |
|||
|
|||
function __construct() |
|||
{ |
|||
$this->obj = new Foo(); |
|||
} |
|||
|
|||
function __toString() |
|||
{ |
|||
return $this->obj->__toString(); |
|||
} |
|||
} |
|||
|
|||
$o = new Bar; |
|||
echo $o; |
|||
|
|||
echo "===NONE===\n"; |
|||
|
|||
function my_error_handler($errno, $errstr, $errfile, $errline) { |
|||
var_dump($errstr); |
|||
} |
|||
|
|||
set_error_handler('my_error_handler'); |
|||
|
|||
class None |
|||
{ |
|||
function __toString() { |
|||
} |
|||
} |
|||
|
|||
$o = new None; |
|||
echo $o; |
|||
|
|||
echo "===THROW===\n"; |
|||
|
|||
class Error |
|||
{ |
|||
function __toString() { |
|||
throw new Exception("This is an error!"); |
|||
} |
|||
} |
|||
|
|||
$o = new Error; |
|||
try { |
|||
echo $o; |
|||
} |
|||
catch (Exception $e) { |
|||
echo "Got the exception\n"; |
|||
} |
|||
|
|||
?> |
|||
===DONE=== |
|||
--EXPECTF-- |
|||
Hello World! |
|||
===NONE=== |
|||
string(52) "Method None::__toString() must return a string value" |
|||
===THROW=== |
|||
|
|||
Fatal error: Method Error::__toString() must not throw an exception in %sbug26166.php on line %d |
|||
@ -1,29 +0,0 @@ |
|||
--TEST-- |
|||
Bug #26229 (getIterator() segfaults when it returns arrays or scalars) |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class array_iterator implements IteratorAggregate { |
|||
public function getIterator() { |
|||
return array('foo', 'bar'); |
|||
} |
|||
} |
|||
|
|||
$obj = new array_iterator; |
|||
|
|||
try |
|||
{ |
|||
foreach ($obj as $property => $value) |
|||
{ |
|||
var_dump($value); |
|||
} |
|||
} |
|||
catch(Exception $e) |
|||
{ |
|||
echo $e->getMessage() . "\n"; |
|||
} |
|||
?> |
|||
===DONE=== |
|||
--EXPECTF-- |
|||
Objects returned by array_iterator::getIterator() must be traversable or implement interface Iterator |
|||
===DONE=== |
|||
@ -1,13 +0,0 @@ |
|||
--TEST-- |
|||
Bug #26281 (switch() crash when condition is a string offset) |
|||
--FILE-- |
|||
<?php |
|||
$x = 'abc'; |
|||
switch ($x[0]) { |
|||
case 'a': |
|||
echo "no crash\n"; |
|||
break; |
|||
} |
|||
?> |
|||
--EXPECT-- |
|||
no crash |
|||
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue