[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  
-					<< ", &params[" << 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) << ", "
+					<<		"&params[" << 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