}
zend_compile_expr(&arg_node, args->child[0]);
- zend_emit_op_tmp(result, ZEND_STRLEN, &arg_node, NULL);
+ if (arg_node.op_type == IS_CONST && Z_TYPE(arg_node.u.constant) == IS_STRING) {
+ result->op_type = IS_CONST;
+ ZVAL_LONG(&result->u.constant, Z_STRLEN(arg_node.u.constant));
+ zval_dtor(&arg_node.u.constant);
+ } else {
+ zend_emit_op_tmp(result, ZEND_STRLEN, &arg_node, NULL);
+ }
return SUCCESS;
}
/* }}} */
}
/* }}} */
+static inline void zend_ct_eval_unary_op(zval *result, uint32_t opcode, zval *op) /* {{{ */
+{
+ unary_op_type fn = get_unary_op(opcode);
+ fn(result, op);
+}
+/* }}} */
+
static inline void zend_ct_eval_unary_pm(zval *result, zend_ast_kind kind, zval *op) /* {{{ */
{
binary_op_type fn = kind == ZEND_AST_UNARY_PLUS
znode expr_node;
zend_compile_expr(&expr_node, expr_ast);
+ if (expr_node.op_type == IS_CONST) {
+ result->op_type = IS_CONST;
+ zend_ct_eval_unary_op(&result->u.constant, opcode,
+ &expr_node.u.constant);
+ zval_ptr_dtor(&expr_node.u.constant);
+ return;
+ }
+
zend_emit_op_tmp(result, opcode, &expr_node, NULL);
}
/* }}} */
zend_compile_expr(&right_node, right_ast);
- opline_bool = zend_emit_op(NULL, ZEND_BOOL, &right_node, NULL);
- SET_NODE(opline_bool->result, result);
+ if (right_node.op_type == IS_CONST) {
+ result->op_type = IS_CONST;
+ ZVAL_BOOL(&result->u.constant, zend_is_true(&right_node.u.constant));
+ zval_ptr_dtor(&right_node.u.constant);
+ } else {
+ opline_bool = zend_emit_op(NULL, ZEND_BOOL, &right_node, NULL);
+ SET_NODE(opline_bool->result, result);
+ }
zend_update_jump_target_to_next(opnum_jmpz);
}