]> granicus.if.org Git - php/commitdiff
Fixed hack. now we may store numbers not as pointers.
authorDmitry Stogov <dmitry@zend.com>
Thu, 15 May 2014 10:00:49 +0000 (14:00 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 15 May 2014 10:00:49 +0000 (14:00 +0400)
ext/opcache/Optimizer/compact_literals.c
ext/opcache/Optimizer/zend_optimizer.c

index 8c562f887ae9cfb96a98c0e0d92a8283bd2d333f..80a75f5808df4285952809addb4f5e21f93f5f3e 100644 (file)
@@ -90,7 +90,8 @@ static void optimizer_literal_class_info(literal_info   *info,
 static void optimizer_compact_literals(zend_op_array *op_array TSRMLS_DC)
 {
        zend_op *opline, *end;
-       int i, j, n, pos, *map, cache_slots;
+       int i, j, n, *map, cache_slots;
+       zval zv, *pos;
        literal_info *info;
        int l_null = -1;
        int l_false = -1;
@@ -323,11 +324,12 @@ static void optimizer_compact_literals(zend_op_array *op_array TSRMLS_DC)
                                        map[i] = l_true;
                                        break;
                                case IS_LONG:
-                                       if ((pos = (int)zend_hash_index_find_ptr(&hash, Z_LVAL(op_array->literals[i]))) != 0) {
-                                               map[i] = pos - 1;
+                                       if ((pos = zend_hash_index_find(&hash, Z_LVAL(op_array->literals[i]))) != 0) {
+                                               map[i] = Z_LVAL_P(pos);
                                        } else {
                                                map[i] = j;
-                                               zend_hash_index_update_ptr(&hash, Z_LVAL(op_array->literals[i]), (void*)j + 1);
+                                               ZVAL_LONG(&zv, j);
+                                               zend_hash_index_update(&hash, Z_LVAL(op_array->literals[i]), &zv);
                                                if (i != j) {
                                                        op_array->literals[j] = op_array->literals[i];
                                                        info[j] = info[i];
@@ -336,11 +338,12 @@ static void optimizer_compact_literals(zend_op_array *op_array TSRMLS_DC)
                                        }
                                        break;
                                case IS_DOUBLE:
-                                       if ((pos = (int)zend_hash_str_find_ptr(&hash, (char*)&Z_DVAL(op_array->literals[i]), sizeof(double))) != 0) {
-                                               map[i] = pos - 1;
+                                       if ((pos = zend_hash_str_find(&hash, (char*)&Z_DVAL(op_array->literals[i]), sizeof(double))) != 0) {
+                                               map[i] = Z_LVAL_P(pos);
                                        } else {
                                                map[i] = j;
-                                               zend_hash_str_add_ptr(&hash, (char*)&Z_DVAL(op_array->literals[i]), sizeof(double), (void*)j + 1);
+                                               ZVAL_LONG(&zv, j);
+                                               zend_hash_str_add(&hash, (char*)&Z_DVAL(op_array->literals[i]), sizeof(double), &zv);
                                                if (i != j) {
                                                        op_array->literals[j] = op_array->literals[i];
                                                        info[j] = info[i];
@@ -372,12 +375,12 @@ static void optimizer_compact_literals(zend_op_array *op_array TSRMLS_DC)
                                                key->h += info[i].flags;
                                        }
                                        if ((info[i].flags & LITERAL_MAY_MERGE) &&
-                                               (pos = (int)zend_hash_find_ptr(&hash, key)) != 0 &&
-                                               Z_TYPE(op_array->literals[i]) == Z_TYPE(op_array->literals[pos-1]) &&
-                                               info[i].flags == info[pos-1].flags) {
+                                               (pos = zend_hash_find(&hash, key)) != 0 &&
+                                               Z_TYPE(op_array->literals[i]) == Z_TYPE(op_array->literals[Z_LVAL_P(pos)]) &&
+                                               info[i].flags == info[Z_LVAL_P(pos)].flags) {
 
                                                STR_RELEASE(key);
-                                               map[i] = pos - 1;
+                                               map[i] = Z_LVAL_P(pos);
                                                zval_dtor(&op_array->literals[i]);
                                                n = LITERAL_NUM_RELATED(info[i].flags);
                                                while (n > 1) {
@@ -388,7 +391,8 @@ static void optimizer_compact_literals(zend_op_array *op_array TSRMLS_DC)
                                        } else {
                                                map[i] = j;
                                                if (info[i].flags & LITERAL_MAY_MERGE) {
-                                                       zend_hash_add_ptr(&hash, key, (void*)j + 1);
+                                                       ZVAL_LONG(&zv, j);
+                                                       zend_hash_add(&hash, key, &zv);
                                                        STR_RELEASE(key);
                                                }
                                                if (i != j) {
index 2b6b07ca82a259a38025b20d353892d9c9ac5a44..602a63ec0b92f079bc934d51f1c0f11cedb1b522 100644 (file)
@@ -69,7 +69,7 @@ static int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name)
                    (op_array->vars[i]->h == hash_value &&
                     op_array->vars[i]->len == name->len &&
                     memcmp(op_array->vars[i]->val, name->val, name->len) == 0)) {
-                       return (int)EX_VAR_NUM_2(NULL, i);
+                       return (int)(zend_intptr_t)EX_VAR_NUM_2(NULL, i);
                }
                i++;
        }
@@ -100,7 +100,7 @@ static int zend_optimizer_lookup_cv(zend_op_array *op_array, zend_string* name)
                }
        }
        
-       return (int)EX_VAR_NUM_2(NULL, i);
+       return (int)(zend_intptr_t)EX_VAR_NUM_2(NULL, i);
 }
 #endif