Index: trunk/processor/hashtable.m4
===================================================================
--- trunk/processor/hashtable.m4	(revision 930)
+++ trunk/processor/hashtable.m4	(revision 932)
@@ -5,5 +5,5 @@
 		dnl {{{ dasm
 		IFDASM(`
-			Bucket *b;
+			const Bucket *srcBucket;
 			zval *zv;
 			int bufsize = 2;
@@ -34,9 +34,9 @@
 
 			DISABLECHECK(`
-			for (b = src->pListHead; b != NULL; b = b->pListNext) {
+			for (srcBucket = src->pListHead; srcBucket != NULL; srcBucket = srcBucket->pListNext) {
 				ALLOC_INIT_ZVAL(zv);
 				array_init(zv);
-				FUNC_NAME (dasm, zv, (($2*)b->pData) TSRMLS_CC);
-				keysize = BUCKET_KEY_SIZE(b) + 2;
+				FUNC_NAME (dasm, zv, (($2*)srcBucket->pData) TSRMLS_CC);
+				keysize = BUCKET_KEY_SIZE(srcBucket) + 2;
 				if (keysize > bufsize) {
 					do {
@@ -45,9 +45,9 @@
 					buf = erealloc(buf, bufsize);
 				}
-				memcpy(buf, BUCKET_KEY_S(b), keysize);
+				memcpy(buf, BUCKET_KEY_S(srcBucket), keysize);
 				buf[keysize - 2] = buf[keysize - 1] = ""[0];
-				keysize = b->nKeyLength;
+				keysize = srcBucket->nKeyLength;
 #ifdef IS_UNICODE
-				if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
+				if (BUCKET_KEY_TYPE(srcBucket) == IS_UNICODE) {
 					if (buf[0] == ""[0] && buf[1] == ""[0]) {
 						keysize ++;
@@ -60,5 +60,5 @@
 					}
 				}
-				add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(b), ZSTR(buf), keysize, zv);
+				add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(srcBucket), ZSTR(buf), keysize, zv);
 			}
 			')
@@ -67,5 +67,6 @@
 		', `
 		dnl }}}
-		Bucket *b, *pnew = NULL, *prev = NULL;
+		Bucket *srcBucket;
+		Bucket *pnew = NULL, *prev = NULL;
 		zend_bool first = 1;
 		dnl only used for copy
@@ -94,7 +95,7 @@
 		DONE(arBuckets)
 		DISABLECHECK(`
-		for (b = src->pListHead; b != NULL; b = b->pListNext) {
+		for (srcBucket = src->pListHead; srcBucket != NULL; srcBucket = srcBucket->pListNext) {
 			ifelse($4, `', `', `
-				pushdef(`BUCKET', `b')
+				pushdef(`BUCKET', `srcBucket')
 				if ($4 == ZEND_HASH_APPLY_REMOVE) {
 					IFCOPY(`dst->nNumOfElements --;')
@@ -104,17 +105,22 @@
 			')
 
-			IFCALCCOPY(`bucketsize = BUCKET_SIZE(b);')
+			IFCALCCOPY(`bucketsize = BUCKET_SIZE(srcBucket);')
 			ALLOC(pnew, char, bucketsize, , Bucket)
 			IFCOPY(`
 #ifdef ZEND_ENGINE_2_4
-			memcpy(pnew, b, BUCKET_HEAD_SIZE(Bucket));
-			memcpy((char *) (pnew + 1), b->arKey, BUCKET_KEY_SIZE(b));
-			pnew->arKey = (const char *) (pnew + 1);
+			memcpy(pnew, srcBucket, BUCKET_HEAD_SIZE(Bucket));
+			if (BUCKET_KEY_SIZE(srcBucket)) {
+				memcpy((char *) (pnew + 1), srcBucket->arKey, BUCKET_KEY_SIZE(srcBucket));
+				pnew->arKey = (const char *) (pnew + 1);
+			}
+			else {
+				pnew->arKey = NULL;
+			}
 #else
-			memcpy(pnew, b, bucketsize);
-	#endif
+			memcpy(pnew, srcBucket, bucketsize);
+#endif
 			')
 			IFCOPY(`
-				n = b->h & src->nTableMask;
+				n = srcBucket->h & src->nTableMask;
 				/* pnew into hash node chain */
 				pnew->pLast = NULL;
@@ -128,14 +134,14 @@
 				INDENT()
 				fprintf(stderr, "$2:\"");
-				xc_dprint_str_len(BUCKET_KEY_S(b), BUCKET_KEY_SIZE(b));
-				fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(b), b->h);
+				xc_dprint_str_len(BUCKET_KEY_S(srcBucket), BUCKET_KEY_SIZE(srcBucket));
+				fprintf(stderr, "\" %d:h=%lu ", BUCKET_KEY_SIZE(srcBucket), srcBucket->h);
 			')
 			if (sizeof(void *) == sizeof($2)) {
 				IFCOPY(`pnew->pData = &pnew->pDataPtr;')
 				dnl no alloc
-				STRUCT_P_EX(`$2', pnew->pData, (($2*)b->pData), `', `$3', ` ')
+				STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3', ` ')
 			}
 			else {
-				STRUCT_P_EX(`$2', pnew->pData, (($2*)b->pData), `', `$3')
+				STRUCT_P_EX(`$2', pnew->pData, (($2*)srcBucket->pData), `', `$3')
 				IFCOPY(`pnew->pDataPtr = NULL;')
 			}
