summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-04-12 18:29:09 +0000
committerZeev Suraski <zeev@php.net>1999-04-12 18:29:09 +0000
commit39a7f4c306675d3a03ff56f0a8c7f5e2183ab09a (patch)
treef91348978d003d8e668279dbab8bba7646965902 /Zend/zend_API.c
parentb06c5731fc2ac9ee11600096061e67b68a5b713e (diff)
downloadphp-git-39a7f4c306675d3a03ff56f0a8c7f5e2183ab09a.tar.gz
This patch is a go. Not fully optimized yet, but working properly.
Prepatch tagged as BEFORE_STACK_PATCH.
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c66
1 files changed, 39 insertions, 27 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 3dfea5f121..1b5040d6b0 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -31,21 +31,23 @@ static int module_count=0;
HashTable list_destructors, module_registry;
/* this function doesn't check for too many parameters */
-int getParameters(HashTable *ht, int param_count,...)
+int getParameters(int ht, int param_count,...)
{
+ void **p = EG(argument_stack).elements+EG(argument_stack).top-1;
+ int arg_count = (ulong) *p;
va_list ptr;
- zval **param, **tmp = NULL, *param_ptr;
- int i;
+ zval **param, *param_ptr;
+ ELS_FETCH();
+
+ if (param_count>arg_count) {
+ return FAILURE;
+ }
va_start(ptr, param_count);
- for (i = 0; i < param_count; i++) {
+ do {
param = va_arg(ptr, zval **);
- if (zend_hash_index_find(ht, i, (void **) &tmp) == FAILURE) {
- va_end(ptr);
- return FAILURE;
- }
- param_ptr = *tmp;
+ param_ptr = *(p-param_count);
if (!param_ptr->is_ref && param_ptr->refcount>1) {
zval *new_tmp;
@@ -55,25 +57,30 @@ int getParameters(HashTable *ht, int param_count,...)
new_tmp->refcount = 1;
new_tmp->is_ref = 0;
param_ptr = new_tmp;
- zend_hash_index_update(ht, i, &param_ptr, sizeof(zval *), NULL);
+ *(p-param_count) = param_ptr;
}
*param = param_ptr;
- }
+ } while (--param_count);
va_end(ptr);
+
return SUCCESS;
}
-int getParametersArray(HashTable *ht, int param_count, zval **argument_array)
+int getParametersArray(int ht, int param_count, zval **argument_array)
{
- int i;
- zval **tmp = NULL, *param_ptr;
+ void **p = EG(argument_stack).elements+EG(argument_stack).top-1;
+ int arg_count = (ulong) *p;
+ zval *param_ptr;
+ ELS_FETCH();
- for (i = 0; i < param_count; i++) {
- if (zend_hash_index_find(ht, i, (void **) &tmp) == FAILURE) {
- return FAILURE;
- }
- param_ptr = *tmp;
+ if (param_count>arg_count) {
+ return FAILURE;
+ }
+
+
+ do {
+ param_ptr = *(p-param_count);
if (!param_ptr->is_ref && param_ptr->refcount>1) {
zval *new_tmp;
@@ -83,10 +90,11 @@ int getParametersArray(HashTable *ht, int param_count, zval **argument_array)
new_tmp->refcount = 1;
new_tmp->is_ref = 0;
param_ptr = new_tmp;
- zend_hash_index_update(ht, i, &param_ptr, sizeof(zval *), NULL);
+ *(p-param_count) = param_ptr;
}
- argument_array[i] = param_ptr;
- }
+ *(argument_array++) = param_ptr;
+ } while (--param_count);
+
return SUCCESS;
}
@@ -106,14 +114,18 @@ int getThis(zval **this)
return SUCCESS;
}
-int ParameterPassedByReference(HashTable *ht, uint n)
+int ParameterPassedByReference(int ht, uint n)
{
- zval **tmp;
+ void **p = EG(argument_stack).elements+EG(argument_stack).top-1;
+ ulong arg_count = (ulong) *p;
+ zval *arg;
+ ELS_FETCH();
- if (zend_hash_index_find(ht, n-1, (void **) &tmp) == FAILURE) {
- return 0;
+ if (n>arg_count) {
+ return FAILURE;
}
- return (*tmp)->is_ref;
+ arg = (zval *) *(p-arg_count+n);
+ return arg->is_ref;
}