diff options
Diffstat (limited to 'Zend/zend_compile.c')
| -rw-r--r-- | Zend/zend_compile.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 988a42b496..78c42f333d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -514,7 +514,7 @@ void zend_do_free(znode *op1 TSRMLS_DC) /* {{{ */ opline->result_type |= EXT_TYPE_UNUSED; } } else { - while (opline>CG(active_op_array)->opcodes) { + while (opline >= CG(active_op_array)->opcodes) { if (opline->opcode == ZEND_FETCH_LIST && opline->op1_type == IS_VAR && opline->op1.var == op1->u.op.var) { @@ -1107,7 +1107,7 @@ ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_le } /* }}} */ -static int zend_strnlen(const char* s, size_t maxlen) /* {{{ */ +static size_t zend_strnlen(const char* s, size_t maxlen) /* {{{ */ { size_t len = 0; while (*s++ && maxlen--) len++; @@ -2937,10 +2937,23 @@ void zend_compile_new(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ zend_op *opline; uint32_t opnum; - zend_compile_class_ref(&class_node, class_ast TSRMLS_CC); + if (zend_is_const_default_class_ref(class_ast)) { + class_node.op_type = IS_CONST; + ZVAL_STR(&class_node.u.constant, zend_resolve_class_name_ast(class_ast TSRMLS_CC)); + } else { + zend_compile_class_ref(&class_node, class_ast TSRMLS_CC); + } opnum = get_next_op_number(CG(active_op_array)); - zend_emit_op(result, ZEND_NEW, &class_node, NULL TSRMLS_CC); + opline = zend_emit_op(result, ZEND_NEW, NULL, NULL TSRMLS_CC); + + if (class_node.op_type == IS_CONST) { + opline->op1_type = IS_CONST; + opline->op1.constant = zend_add_class_name_literal( + CG(active_op_array), Z_STR(class_node.u.constant) TSRMLS_CC); + } else { + SET_NODE(opline->op1, &class_node); + } zend_compile_call_common(&ctor_result, args_ast, NULL TSRMLS_CC); zend_do_free(&ctor_result TSRMLS_CC); @@ -3805,7 +3818,7 @@ void zend_compile_params(zend_ast *ast TSRMLS_DC) /* {{{ */ arg_info = &arg_infos[i]; arg_info->name = estrndup(name->val, name->len); - arg_info->name_len = name->len; + arg_info->name_len = (uint32_t)name->len; arg_info->pass_by_reference = is_ref; arg_info->is_variadic = is_variadic; arg_info->type_hint = 0; @@ -3849,7 +3862,7 @@ void zend_compile_params(zend_ast *ast TSRMLS_DC) /* {{{ */ arg_info->type_hint = IS_OBJECT; arg_info->class_name = estrndup(class_name->val, class_name->len); - arg_info->class_name_len = class_name->len; + arg_info->class_name_len = (uint32_t)class_name->len; zend_string_release(class_name); @@ -5415,7 +5428,8 @@ void zend_compile_instanceof(znode *result, zend_ast *ast TSRMLS_DC) /* {{{ */ class_node.op_type = IS_CONST; ZVAL_STR(&class_node.u.constant, zend_resolve_class_name_ast(class_ast TSRMLS_CC)); } else { - zend_compile_class_ref(&class_node, class_ast TSRMLS_CC); + opline = zend_compile_class_ref(&class_node, class_ast TSRMLS_CC); + opline->extended_value |= ZEND_FETCH_CLASS_NO_AUTOLOAD; } opline = zend_emit_op_tmp(result, ZEND_INSTANCEOF, &obj_node, NULL TSRMLS_CC); |
