]> granicus.if.org Git - php/commitdiff
Micro optimization
authorXinchen Hui <laruence@php.net>
Fri, 10 Jul 2015 08:39:21 +0000 (16:39 +0800)
committerXinchen Hui <laruence@php.net>
Fri, 10 Jul 2015 08:39:21 +0000 (16:39 +0800)
Zend/zend_types.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 7d7961cb102ab726cde848d437b5fbc7893df78e..c8fd149320826a6ce2b35fd753770e24dd944503 100644 (file)
@@ -477,6 +477,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
 #define Z_OPT_IMMUTABLE(zval)          ((Z_TYPE_INFO(zval) & (IS_TYPE_IMMUTABLE << Z_TYPE_FLAGS_SHIFT)) != 0)
 #define Z_OPT_IMMUTABLE_P(zval_p)      Z_OPT_IMMUTABLE(*(zval_p))
 
+#define Z_OPT_ISREF(zval)                      (Z_OPT_TYPE(zval) == IS_REFERENCE)
+#define Z_OPT_ISREF_P(zval_p)          Z_OPT_ISREF(*(zval_p))
+
 #define Z_ISREF(zval)                          (Z_TYPE(zval) == IS_REFERENCE)
 #define Z_ISREF_P(zval_p)                      Z_ISREF(*(zval_p))
 
@@ -871,6 +874,12 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
                }                                                                                               \
        } while (0)
 
+#define ZVAL_OPT_DEREF(z) do {                                                 \
+               if (UNEXPECTED(Z_OPT_ISREF_P(z))) {                             \
+                       (z) = Z_REFVAL_P(z);                                            \
+               }                                                                                               \
+       } while (0)
+
 #define ZVAL_MAKE_REF(zv) do {                                                 \
                zval *__zv = (zv);                                                              \
                if (!Z_ISREF_P(__zv)) {                                                 \
index b4eeeb43bb6a0c5bc7b2fcb20829e76b0b590815..13863d0dcb0a3ef32929be86ac8281a45a9ff4c4 100644 (file)
@@ -4207,7 +4207,7 @@ ZEND_VM_HANDLER(117, ZEND_SEND_VAR, VAR|CV, ANY)
        arg = ZEND_CALL_VAR(EX(call), opline->result.var);
 
        if (OP1_TYPE == IS_CV) {
-               ZVAL_DEREF(varptr);
+               ZVAL_OPT_DEREF(varptr);
                ZVAL_COPY(arg, varptr);
        } else /* if (OP1_TYPE == IS_VAR) */ {
                if (UNEXPECTED(Z_ISREF_P(varptr))) {
@@ -4328,7 +4328,7 @@ ZEND_VM_C_LABEL(send_var_by_ref):
        arg = ZEND_CALL_VAR(EX(call), opline->result.var);
 
        if (OP1_TYPE == IS_CV) {
-               ZVAL_DEREF(varptr);
+               ZVAL_OPT_DEREF(varptr);
                ZVAL_COPY(arg, varptr);
        } else /* if (OP1_TYPE == IS_VAR) */ {
                if (UNEXPECTED(Z_ISREF_P(varptr))) {
index a84fcda647d8ac9995e4cdab762f074d375de2ab..d2ea5a6afe376474b966e5e9f882c9b9f55bf177 100644 (file)
@@ -15138,7 +15138,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND
        arg = ZEND_CALL_VAR(EX(call), opline->result.var);
 
        if (IS_VAR == IS_CV) {
-               ZVAL_DEREF(varptr);
+               ZVAL_OPT_DEREF(varptr);
                ZVAL_COPY(arg, varptr);
        } else /* if (IS_VAR == IS_VAR) */ {
                if (UNEXPECTED(Z_ISREF_P(varptr))) {
@@ -15259,7 +15259,7 @@ send_var_by_ref:
        arg = ZEND_CALL_VAR(EX(call), opline->result.var);
 
        if (IS_VAR == IS_CV) {
-               ZVAL_DEREF(varptr);
+               ZVAL_OPT_DEREF(varptr);
                ZVAL_COPY(arg, varptr);
        } else /* if (IS_VAR == IS_VAR) */ {
                if (UNEXPECTED(Z_ISREF_P(varptr))) {
@@ -28537,7 +28537,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_
        arg = ZEND_CALL_VAR(EX(call), opline->result.var);
 
        if (IS_CV == IS_CV) {
-               ZVAL_DEREF(varptr);
+               ZVAL_OPT_DEREF(varptr);
                ZVAL_COPY(arg, varptr);
        } else /* if (IS_CV == IS_VAR) */ {
                if (UNEXPECTED(Z_ISREF_P(varptr))) {
@@ -28620,7 +28620,7 @@ send_var_by_ref:
        arg = ZEND_CALL_VAR(EX(call), opline->result.var);
 
        if (IS_CV == IS_CV) {
-               ZVAL_DEREF(varptr);
+               ZVAL_OPT_DEREF(varptr);
                ZVAL_COPY(arg, varptr);
        } else /* if (IS_CV == IS_VAR) */ {
                if (UNEXPECTED(Z_ISREF_P(varptr))) {