[phc-internals] [phc commit] r659 - in trunk: . src/codegen
src/embed
codesite-noreply at google.com
codesite-noreply at google.com
Fri Sep 14 14:02:56 CEST 2007
Author: paul.biggar
Date: Fri Sep 14 05:02:23 2007
New Revision: 659
Modified:
trunk/libphc.cpp
trunk/src/codegen/Generate_C.cpp
trunk/src/embed/embed.cpp
trunk/src/embed/embed.h
Log:
Switch to using zend_hash_quick_* from zend_hash_* and zend_symtable_*. This saves about 15% of processing time. However, since this isnt as much as is expected, it looks like its going to be necessary to store zval*s which dont need to be in a hashtable, outside the hashtable.
Modified: trunk/libphc.cpp
==============================================================================
--- trunk/libphc.cpp (original)
+++ trunk/libphc.cpp Fri Sep 14 05:02:23 2007
@@ -274,7 +274,7 @@
void
zvp_clone (zval ** p_zvp, int *is_zvp_new TSRMLS_DC)
{
- zval* old = *p_zvp;
+ zval *old = *p_zvp;
zvp_clone_ex (p_zvp TSRMLS_CC);
@@ -338,8 +338,8 @@
// Separate the RHS (that is, make a copy *and update the hashtable*)
// See "Separation anxiety" in the PHP book
void
-separate_var (HashTable * st, char *name, int length, zval ** p_zvp,
- int *is_zvp_new TSRMLS_DC)
+separate_var (HashTable * st, char *name, int length, ulong hashval,
+ zval ** p_zvp, int *is_zvp_new TSRMLS_DC)
{
/* For a reference assignment, the LHS is always updated
* to point to the RHS (even if the LHS is currently
@@ -352,10 +352,10 @@
zvp_clone (p_zvp, is_zvp_new TSRMLS_CC);
(*p_zvp)->refcount++;
- int result = zend_hash_update (st,
- name, length,
- p_zvp,
- sizeof (zval *), NULL);
+ int result = zend_hash_quick_update (st,
+ name, length, hashval,
+ p_zvp,
+ sizeof (zval *), NULL);
assert (result == SUCCESS);
}
@@ -387,7 +387,8 @@
// See "Separation anxiety" in the PHP book
void
separate_array_entry (HashTable * st, char *var_name, int var_length,
- char *ind_name, int ind_length, zval ** p_zvp,
+ ulong hashval, char *ind_name, int ind_length,
+ ulong ind_hashval, zval ** p_zvp,
int *is_zvp_new TSRMLS_DC)
{
/* For a reference assignment, the LHS is always updated
@@ -409,24 +410,25 @@
zval *zvp = *p_zvp;
- int var_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_var) == SUCCESS);
- if (var_exists && *p_var != EG(uninitialized_zval_ptr)) // perhaps
+ int var_exists = (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_var) == SUCCESS);
+ if (var_exists && *p_var != EG (uninitialized_zval_ptr)) // perhaps
var = *p_var;
else
{
// if no var, create it and add it to the symbol table
ALLOC_INIT_ZVAL (var);
- zend_symtable_update (st, var_name, var_length,
- &var, sizeof (zval *), NULL);
+ zend_hash_quick_update (st, var_name, var_length, hashval,
+ &var, sizeof (zval *), NULL);
}
// if its not an array, make it an array
HashTable *ht = extract_ht (var TSRMLS_CC);
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists =
+ (zend_hash_quick_find (st, ind_name, ind_length, ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (ind_exists)
ind = *p_ind;
else
@@ -444,15 +446,15 @@
/* Write P_RHS into the symbol table as a variable named VAR_NAME */
void
-write_var (HashTable * st, char *var_name, int var_length, zval ** p_rhs,
- int *is_rhs_new TSRMLS_DC)
+write_var (HashTable * st, char *var_name, int var_length, ulong hashval,
+ zval ** p_rhs, int *is_rhs_new TSRMLS_DC)
{
zval *lhs = NULL;
zval **p_lhs = &lhs;
zval *rhs = *p_rhs;
- int lhs_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_lhs) == SUCCESS);
+ int lhs_exists = (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_lhs) == SUCCESS);
if (lhs_exists)
lhs = *p_lhs;
@@ -467,9 +469,9 @@
rhs->refcount++;
- int result = zend_hash_update (st, var_name, var_length,
- &rhs,
- sizeof (zval *), NULL);
+ int result = zend_hash_quick_update (st, var_name, var_length, hashval,
+ &rhs,
+ sizeof (zval *), NULL);
assert (result == SUCCESS);
}
else
@@ -483,12 +485,12 @@
* it. If the variable doent exist, a new one is created and *IS_NEW is set.
* */
zval *
-read_var (HashTable * st, char *var_name, int var_length,
+read_var (HashTable * st, char *var_name, int var_length, ulong hashval,
int *is_new TSRMLS_DC)
{
zval **p_zvp;
- if (zend_symtable_find
- (st, var_name, var_length, (void **) &p_zvp) == SUCCESS)
+ if (zend_hash_quick_find
+ (st, var_name, var_length, hashval, (void **) &p_zvp) == SUCCESS)
{
*is_new = 0;
return *p_zvp;
@@ -510,13 +512,13 @@
* doent exist, a new one is created and *IS_NEW is set.
* */
zval *
-read_var_var (HashTable * st, char *var_name, int var_length,
+read_var_var (HashTable * st, char *var_name, int var_length, ulong hashval,
int *is_new TSRMLS_DC)
{
zval **p_zvp;
zval **p_result;
- if (zend_symtable_find
- (st, var_name, var_length, (void **) &p_zvp) != SUCCESS)
+ if (zend_hash_quick_find
+ (st, var_name, var_length, hashval, (void **) &p_zvp) != SUCCESS)
{
return EG (uninitialized_zval_ptr);
}
@@ -531,8 +533,9 @@
}
zval *
-read_array (HashTable * st, char *var_name, int var_length, char *ind_name,
- int ind_length, int *is_new TSRMLS_DC)
+read_array (HashTable * st, char *var_name, int var_length, ulong hashval,
+ char *ind_name, int ind_length, ulong ind_hashval,
+ int *is_new TSRMLS_DC)
{
zval *var = NULL;
zval **p_var = &var;
@@ -543,8 +546,8 @@
zval *result = NULL;
zval **p_result = &ind;
- int var_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_var) == SUCCESS);
if (!var_exists)
{
return EG (uninitialized_zval_ptr);
@@ -562,8 +565,9 @@
HashTable *ht = extract_ht (var TSRMLS_CC);
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists =
+ (zend_hash_quick_find (st, ind_name, ind_length, ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (ind_exists)
ind = *p_ind;
else
@@ -590,8 +594,9 @@
}
zval *
-read_var_array (HashTable * st, char *var_name, int var_length,
- char *ind_name, int ind_length, int *is_new TSRMLS_DC)
+read_var_array (HashTable * st, char *var_name, int var_length, ulong hashval,
+ char *ind_name, int ind_length, ulong ind_hashval,
+ int *is_new TSRMLS_DC)
{
zval *var = NULL;
zval **p_var = &var;
@@ -606,8 +611,8 @@
zval **p_result = &ind;
// read the reflector
- if (zend_symtable_find (st, var_name, var_length,
- (void **) &p_refl) != SUCCESS)
+ if (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_refl) != SUCCESS)
{
return EG (uninitialized_zval_ptr);
}
@@ -632,8 +637,9 @@
HashTable *ht = extract_ht (var TSRMLS_CC);
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists =
+ (zend_hash_quick_find (st, ind_name, ind_length, ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (ind_exists)
ind = *p_ind;
else
@@ -661,8 +667,9 @@
/* Write P_RHS into the symbol table as a variable named VAR_NAME */
void
-write_array (HashTable * st, char *var_name, int var_length, char *ind_name,
- int ind_length, zval ** p_rhs, int *is_rhs_new TSRMLS_DC)
+write_array (HashTable * st, char *var_name, int var_length, ulong hashval,
+ char *ind_name, int ind_length, ulong ind_hashval, zval ** p_rhs,
+ int *is_rhs_new TSRMLS_DC)
{
zval *var = NULL;
zval **p_var = &var;
@@ -675,8 +682,8 @@
zval *rhs = *p_rhs;
- int var_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_var) == SUCCESS);
if (var_exists && *p_var != EG (uninitialized_zval_ptr))
{
// Note that we delibrately use separate_var, and not separate_array.
@@ -684,7 +691,8 @@
var = *p_var;
// if we use p_var instead of &var, zend_hash_update throws
// an error and returns failure.
- separate_var (st, var_name, var_length, &var, &is_var_new TSRMLS_CC);
+ separate_var (st, var_name, var_length, hashval, &var,
+ &is_var_new TSRMLS_CC);
if (is_var_new)
zval_ptr_dtor (p_var);
}
@@ -692,8 +700,8 @@
{
// if no var, create it and add it to the symbol table
ALLOC_INIT_ZVAL (var);
- zend_symtable_update (st, var_name, var_length,
- &var, sizeof (zval *), NULL);
+ zend_hash_quick_update (st, var_name, var_length, hashval,
+ &var, sizeof (zval *), NULL);
}
// TODO this makes it an array
@@ -701,8 +709,9 @@
HashTable *ht = extract_ht (var TSRMLS_CC);
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists =
+ (zend_hash_quick_find (st, ind_name, ind_length, ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (ind_exists)
ind = *p_ind;
else
@@ -743,23 +752,24 @@
/* Write P_RHS into the symbol table as a variable named VAR_NAME */
void
-push_var (HashTable * st, char *var_name, int var_length, zval ** p_rhs,
- int *is_rhs_new TSRMLS_DC)
+push_var (HashTable * st, char *var_name, int var_length, ulong hashval,
+ zval ** p_rhs, int *is_rhs_new TSRMLS_DC)
{
zval *var = NULL;
zval **p_var = &var;
zval *rhs = *p_rhs;
- int var_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_var) == SUCCESS);
if (var_exists && *p_var != EG (uninitialized_zval_ptr))
{
int is_var_new = 0;
var = *p_var;
// if we use p_var instead of &var, zend_has_update throws
// an error and returns failure.
- separate_var (st, var_name, var_length, &var, &is_var_new TSRMLS_CC);
+ separate_var (st, var_name, var_length, hashval, &var,
+ &is_var_new TSRMLS_CC);
if (is_var_new)
zval_ptr_dtor (p_var);
}
@@ -767,8 +777,8 @@
{
// if no var, create it and add it to the symbol table
ALLOC_INIT_ZVAL (var);
- zend_symtable_update (st, var_name, var_length,
- &var, sizeof (zval *), NULL);
+ zend_hash_quick_update (st, var_name, var_length, hashval,
+ &var, sizeof (zval *), NULL);
}
if (Z_TYPE_P (var) == IS_STRING)
@@ -788,22 +798,24 @@
void
push_var_reference (HashTable * st, char *var_name, int var_length,
- zval ** p_rhs, int *is_rhs_new TSRMLS_DC)
+ ulong hashval, zval ** p_rhs, int *is_rhs_new TSRMLS_DC)
{
zval *var = NULL;
zval **p_var = &var;
zval *rhs = *p_rhs;
- int var_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, var_name, var_length,
+ hashval,
+ (void **) &p_var) == SUCCESS);
if (var_exists && *p_var != EG (uninitialized_zval_ptr))
{
int is_var_new = 0;
var = *p_var;
// if we use p_var instead of &var, zend_has_update throws
// an error and returns failure.
- separate_var (st, var_name, var_length, &var, &is_var_new TSRMLS_CC);
+ separate_var (st, var_name, var_length, hashval, &var,
+ &is_var_new TSRMLS_CC);
if (is_var_new)
zval_ptr_dtor (p_var);
}
@@ -811,8 +823,8 @@
{
// if no var, create it and add it to the symbol table
ALLOC_INIT_ZVAL (var);
- zend_symtable_update (st, var_name, var_length,
- &var, sizeof (zval *), NULL);
+ zend_hash_quick_update (st, var_name, var_length, hashval,
+ &var, sizeof (zval *), NULL);
}
if (Z_TYPE_P (var) == IS_STRING)
@@ -836,14 +848,14 @@
* set, separate it, and write it back as VAR_NAME2,
* which should be its original name */
void
-write_var_reference (HashTable * st, char *name, int length, zval ** p_zvp,
- int *is_zvp_new TSRMLS_DC)
+write_var_reference (HashTable * st, char *name, int length, ulong hashval,
+ zval ** p_zvp, int *is_zvp_new TSRMLS_DC)
{
// Change-on-write
(*p_zvp)->is_ref = 1;
(*p_zvp)->refcount++;
- int result = zend_hash_update (st, name, length, p_zvp,
- sizeof (zval *), NULL);
+ int result = zend_hash_quick_update (st, name, length, hashval, p_zvp,
+ sizeof (zval *), NULL);
assert (result == SUCCESS);
}
@@ -853,7 +865,8 @@
* which should be its original name */
void // TODO change function and update
write_array_reference (HashTable * st, char *var_name, int var_length,
- char *ind_name, int ind_length, zval ** p_zvp,
+ ulong hashval, char *ind_name, int ind_length,
+ ulong ind_hashval, zval ** p_zvp,
int *is_zvp_new TSRMLS_DC)
{
// Change-on-write
@@ -868,8 +881,8 @@
zval *zvp = *p_zvp;
- int var_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_var) == SUCCESS);
if (var_exists)
// if (var_exists && *p_var != EG(uninitialized_zval_ptr)) // perhaps
var = *p_var;
@@ -877,8 +890,8 @@
{
// if no var, create it and add it to the symbol table
ALLOC_INIT_ZVAL (var);
- zend_symtable_update (st, var_name, var_length,
- &var, sizeof (zval *), NULL);
+ zend_hash_quick_update (st, var_name, var_length, hashval,
+ &var, sizeof (zval *), NULL);
}
if (Z_TYPE_P (var) == IS_STRING)
@@ -891,8 +904,9 @@
HashTable *ht = extract_ht (var TSRMLS_CC);
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists =
+ (zend_hash_quick_find (st, ind_name, ind_length, ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (ind_exists)
ind = *p_ind;
else
@@ -908,23 +922,29 @@
zval **
fetch_var_arg_by_ref (HashTable * st, char *name, int name_length,
- int *is_arg_new TSRMLS_DC)
+ ulong hashval, int *is_arg_new TSRMLS_DC)
{
zval **p_arg = NULL;
- if (zend_symtable_find (st, name, name_length, (void **) &p_arg) != SUCCESS)
+ if (zend_hash_quick_find (st, name, name_length, hashval, (void **) &p_arg)
+ != SUCCESS)
{
- // we want to pass a reference into the symbol table, so we create a value, save it, find it, then return it.
+ // we want to pass a reference into the symbol table, so we
+ // create a value, save it, find it, then return it.
+
+ // TODO we dont need to update, we can just overwrite
zval *arg;
ALLOC_INIT_ZVAL (arg);
arg->is_ref = 1;
- int result = zend_hash_update (st,
- name, name_length,
- &arg,
- sizeof (zval *), NULL);
+ int result = zend_hash_quick_update (st,
+ name, name_length, hashval,
+ &arg,
+ sizeof (zval *), NULL);
assert (result == SUCCESS);
/* Set p_arg to point into the symbol table. */
- result = zend_hash_find (st, name, name_length, (void **) &p_arg);
+ result =
+ zend_hash_quick_find (st, name, name_length, hashval,
+ (void **) &p_arg);
assert (result == SUCCESS);
return p_arg;
}
@@ -954,11 +974,12 @@
/* Dont pass-by-ref */
zval *
-fetch_var_arg (HashTable * st, char *name, int name_length,
+fetch_var_arg (HashTable * st, char *name, int name_length, ulong hashval,
int *is_arg_new TSRMLS_DC)
{
zval **p_arg;
- if (zend_symtable_find (st, name, name_length, (void **) &p_arg) != SUCCESS)
+ if (zend_hash_quick_find (st, name, name_length, hashval, (void **) &p_arg)
+ != SUCCESS)
{
// we only do this for variables to be passed to function calls
p_arg = &EG (uninitialized_zval_ptr);
@@ -993,15 +1014,15 @@
zval **
fetch_array_arg_by_ref (HashTable * st, char *name, int name_length,
- char *ind_name, int ind_length,
- int *is_arg_new TSRMLS_DC)
+ ulong hashval, char *ind_name, int ind_length,
+ ulong ind_hashval, int *is_arg_new TSRMLS_DC)
{
zval **p_var;
zval **p_ind;
zval **p_arg;
- int var_exists = (zend_symtable_find (st, name, name_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, name, name_length, hashval,
+ (void **) &p_var) == SUCCESS);
if (!var_exists || *p_var == EG (uninitialized_zval_ptr))
{
// We want to create a new array, which the passed var
@@ -1009,14 +1030,16 @@
// written back after creation.
zval *var;
ALLOC_INIT_ZVAL (var);
- int result = zend_hash_update (st,
- name, name_length,
- &var,
- sizeof (zval *), NULL);
+ int result = zend_hash_quick_update (st,
+ name, name_length, hashval,
+ &var,
+ sizeof (zval *), NULL);
assert (result == SUCCESS);
/* Set p_var to point into the symbol table. */
- result = zend_hash_find (st, name, name_length, (void **) &p_var);
+ result =
+ zend_hash_quick_find (st, name, name_length, hashval,
+ (void **) &p_var);
assert (result == SUCCESS);
}
else
@@ -1038,8 +1061,9 @@
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists = (zend_hash_quick_find (st, ind_name, ind_length,
+ ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (!ind_exists)
p_ind = &EG (uninitialized_zval_ptr);
@@ -1081,15 +1105,16 @@
/* Dont pass-by-ref */
zval *
-fetch_array_arg (HashTable * st, char *name, int name_length, char *ind_name,
- int ind_length, int *is_arg_new TSRMLS_DC)
+fetch_array_arg (HashTable * st, char *name, int name_length, ulong hashval,
+ char *ind_name, int ind_length, ulong ind_hashval,
+ int *is_arg_new TSRMLS_DC)
{
zval **p_var;
zval **p_ind;
zval **p_arg;
- int var_exists = (zend_symtable_find (st, name, name_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, name, name_length, hashval,
+ (void **) &p_var) == SUCCESS);
if (!var_exists || *p_var == EG (uninitialized_zval_ptr))
{
return EG (uninitialized_zval_ptr);
@@ -1109,8 +1134,9 @@
HashTable *ht = extract_ht (*p_var TSRMLS_CC);
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists =
+ (zend_hash_quick_find (st, ind_name, ind_length, ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (!ind_exists)
p_ind = &EG (uninitialized_zval_ptr);
@@ -1192,15 +1218,15 @@
}
void
-unset_array (HashTable * st, char *var_name, int var_length, char *ind_name,
- int ind_length TSRMLS_DC)
+unset_array (HashTable * st, char *var_name, int var_length, ulong hashval,
+ char *ind_name, int ind_length, ulong ind_hashval TSRMLS_DC)
{
zval **p_var;
zval **p_ind;
- int var_exists = (zend_symtable_find (st, var_name, var_length,
- (void **) &p_var) == SUCCESS);
+ int var_exists = (zend_hash_quick_find (st, var_name, var_length, hashval,
+ (void **) &p_var) == SUCCESS);
if (!var_exists)
return;
@@ -1220,8 +1246,9 @@
HashTable *ht = extract_ht (*p_var TSRMLS_CC);
// find the index
- int ind_exists = (zend_symtable_find (st, ind_name, ind_length,
- (void **) &p_ind) == SUCCESS);
+ int ind_exists =
+ (zend_hash_quick_find (st, ind_name, ind_length, ind_hashval,
+ (void **) &p_ind) == SUCCESS);
if (!ind_exists)
{
// do not remove these curlies, as this expands to 2 statements
@@ -1271,11 +1298,11 @@
}
void
-phc_exit (char *arg_name, int arg_length TSRMLS_DC)
+phc_exit (char *arg_name, int arg_length, ulong hashval TSRMLS_DC)
{
int is_arg_new = 0;
zval *arg = read_var (EG (active_symbol_table), arg_name, arg_length,
- &is_arg_new TSRMLS_CC);
+ hashval, &is_arg_new TSRMLS_CC);
if (Z_TYPE_P (arg) == IS_LONG)
EG (exit_status) = Z_LVAL_P (arg);
else
Modified: trunk/src/codegen/Generate_C.cpp
==============================================================================
--- trunk/src/codegen/Generate_C.cpp (original)
+++ trunk/src/codegen/Generate_C.cpp Fri Sep 14 05:02:23 2007
@@ -25,6 +25,7 @@
#include <fstream>
#include "Generate_C.h"
+#include "embed/embed.h"
#include "process_ast/XML_unparser.h"
#include "lib/List.h"
#include "process_ast/PHP_unparser.h"
@@ -105,6 +106,20 @@
return "&EG(symbol_table)";
}
+string get_hash (Token_variable_name* name)
+{
+ // the "u" at the end of the constant makes it unsigned, which
+ // stops gcc warning us about it.
+ stringstream ss;
+ ss << PHP::get_hash (name->value) << "u";
+ return ss.str ();
+}
+
+unsigned long get_hash (String* name)
+{
+ return PHP::get_hash (name);
+}
+
void declare (string var)
{
cout
@@ -144,8 +159,10 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *index << "\", "
<< index->size () + 1 << ", "
+ << get_hash (index) << ", "
<< "&" << zvp << ", "
<< "&is_" << zvp << "_new TSRMLS_CC);\n";
}
@@ -157,6 +174,7 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "&" << zvp << ", "
<< "&is_" << zvp << "_new TSRMLS_CC);\n";
}
@@ -169,6 +187,7 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "&" << zvp << ", "
<< "&is_" << zvp << "_new TSRMLS_CC);\n";
}
@@ -217,8 +236,10 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *index << "\", "
<< index->size () + 1 << ", "
+ << get_hash (index) << ", "
<< "&" << zvp << ", "
<< "&is_" << zvp << "_new TSRMLS_CC);\n"
;
@@ -235,8 +256,10 @@
<< "separate_var ("
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
- << name->value->size () + 1 << ", "
- << "&" << zvp << ", &is_" << zvp << "_new TSRMLS_CC);\n";
+ << name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
+ << "&" << zvp << ", "
+ << "&is_" << zvp << "_new TSRMLS_CC);\n";
}
}
else
@@ -294,8 +317,10 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *index << "\", "
<< index->size () + 1 << ", "
+ << get_hash (index) << ", "
<< "&" << zvp << ", "
<< "&is_" << zvp << "_new TSRMLS_CC);\n"
;
@@ -307,6 +332,7 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "&" << zvp << ", &is_" << zvp << "_new TSRMLS_CC);\n";
}
}
@@ -318,8 +344,10 @@
<< "write_var_reference ("
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
- << name->value->size () + 1 << ", "
- << "&" << zvp << ", &is_" << zvp << "_new TSRMLS_CC);\n";
+ << name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
+ << "&" << zvp << ", "
+ << "&is_" << zvp << "_new TSRMLS_CC);\n";
}
}
else
@@ -361,9 +389,11 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *index << "\", "
<< index->size () + 1 << ", "
- << " &is_" << zvp << "_new TSRMLS_CC);\n"
+ << get_hash (index) << ", "
+ << "&is_" << zvp << "_new TSRMLS_CC);\n"
;
}
else
@@ -378,7 +408,8 @@
<< get_scope (scope) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
- << " &is_" << zvp << "_new TSRMLS_CC);\n"
+ << get_hash (name) << ", "
+ << "&is_" << zvp << "_new TSRMLS_CC);\n"
;
}
}
@@ -402,8 +433,10 @@
<< get_scope (scope) << ", "
<< "\"" << *name << "\", "
<< name->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *index << "\", "
<< index->size () + 1 << ", "
+ << get_hash (index) << ", "
<< " &is_" << zvp << "_new TSRMLS_CC);\n"
;
}
@@ -419,7 +452,8 @@
<< get_scope (scope) << ", "
<< "\"" << *name << "\", "
<< name->size () + 1 << ", "
- << " &is_" << zvp << "_new TSRMLS_CC);\n"
+ << get_hash (name) << ", "
+ << "&is_" << zvp << "_new TSRMLS_CC);\n"
;
}
}
@@ -632,10 +666,12 @@
cout
<< "params[" << index << "]->refcount++;\n"
- << "zend_hash_add(EG(active_symbol_table), "
- << "\"" << *(*i)->variable_name->value << "\", "
- << (*i)->variable_name->value->length() + 1
- << ", ¶ms[" << index << "], sizeof(zval*), NULL);\n"
+ << "zend_hash_quick_add(EG(active_symbol_table), "
+ << "\"" << *(*i)->variable_name->value << "\", "
+ << (*i)->variable_name->value->length() + 1 << ", "
+ << get_hash ((*i)->variable_name) << ", "
+ << "¶ms[" << index << "], "
+ << "sizeof(zval*), NULL);\n"
;
if ((*i)->expr)
@@ -1154,8 +1190,10 @@
cout
<< "// Exit ()\n"
<< "phc_exit (\""
- << *op << "\", "
- << op->length () + 1 << " TSRMLS_CC);\n";
+ << *op << "\", "
+ << op->length () + 1 << ", "
+ << get_hash (op)
+ << " TSRMLS_CC);\n";
}
protected:
@@ -1293,8 +1331,10 @@
<< get_scope (LOCAL) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *ind_name << "\", "
<< ind_name->size () + 1 << ", "
+ << get_hash (ind_name) << ", "
<< "&destruct[" << index << "] TSRMLS_CC);\n"
<< " args[" << index << "] = *args_ind[" << index << "];\n"
// if we pass &EG(uninitialized_zval_ptr), the
@@ -1312,8 +1352,10 @@
<< get_scope (LOCAL) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *ind_name << "\", "
<< ind_name->size () + 1 << ", "
+ << get_hash (ind_name) << ", "
<< "&destruct[" << index << "] TSRMLS_CC);\n"
<< " args_ind[" << index << "] = &args[" << index << "];\n"
<< "}\n"
@@ -1328,6 +1370,7 @@
<< get_scope (LOCAL) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "&destruct[" << index << "] TSRMLS_CC);\n"
<< " args[" << index << "] = *args_ind[" << index << "];\n"
// if we pass &EG(uninitialized_zval_ptr), the
@@ -1345,6 +1388,7 @@
<< get_scope (LOCAL) << ", "
<< "\"" << *name->value << "\", "
<< name->value->size () + 1 << ", "
+ << get_hash (name) << ", "
<< "&destruct[" << index << "] TSRMLS_CC);\n"
<< " args_ind[" << index << "] = &args[" << index << "];\n"
<< "}\n"
@@ -1578,7 +1622,9 @@
<< "unset_var ("
<< get_scope (LOCAL) << ", "
<< "\"" << *name->value << "\", "
- << name->value->length() + 1 << " TSRMLS_CC);\n"
+ << name->value->length() + 1
+ // no get_hash version
+ << " TSRMLS_CC);\n"
;
}
else
@@ -1591,8 +1637,11 @@
<< get_scope (LOCAL) << ", "
<< "\"" << *name->value << "\", "
<< name->value->length() + 1 << ", "
+ << get_hash (name) << ", "
<< "\"" << *ind << "\", "
- << ind->length() + 1 << " TSRMLS_CC);\n";
+ << ind->length() + 1 << ", "
+ << get_hash (ind)
+ << " TSRMLS_CC);\n";
}
}
else
Modified: trunk/src/embed/embed.cpp
==============================================================================
--- trunk/src/embed/embed.cpp (original)
+++ trunk/src/embed/embed.cpp Fri Sep 14 05:02:23 2007
@@ -62,6 +62,11 @@
}
+unsigned long PHP::get_hash (String* string)
+{
+ return zend_get_hash_value (const_cast <char*> (string->c_str ()), string->size () + 1);
+}
+
#else
#include <errno.h>
Modified: trunk/src/embed/embed.h
==============================================================================
--- trunk/src/embed/embed.h (original)
+++ trunk/src/embed/embed.h Fri Sep 14 05:02:23 2007
@@ -9,4 +9,5 @@
static void startup_php ();
static void shutdown_php ();
static AST_literal* convert_token (AST_literal* token);
+ static unsigned long get_hash (String* string);
};
More information about the phc-internals
mailing list