From: Dmitry Stogov Date: Wed, 9 Jan 2013 13:36:44 +0000 (+0400) Subject: Merge branch 'PHP-5.3' into PHP-5.4 X-Git-Tag: php-5.5.0alpha3~2^2^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=625000ab442dd4c1bfc6975a4a979f2c5f60a78d;p=php Merge branch 'PHP-5.3' into PHP-5.4 * PHP-5.3: Fixed compilator bug that might cause jump depended on unitialized value --- 625000ab442dd4c1bfc6975a4a979f2c5f60a78d diff --cc Zend/zend_compile.c index 9acdc5b35a,8382b48e4a..8f4f9c47b8 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@@ -4912,28 -3527,12 +4913,28 @@@ void zend_do_end_class_declaration(cons } } - ce->line_end = zend_get_compiled_lineno(TSRMLS_C); + ce->info.user.line_end = zend_get_compiled_lineno(TSRMLS_C); + + /* Check for traits and proceed like with interfaces. + * The only difference will be a combined handling of them in the end. + * Thus, we need another opcode here. */ + if (ce->num_traits > 0) { + zend_op *opline; + + ce->traits = NULL; + ce->num_traits = 0; + ce->ce_flags |= ZEND_ACC_IMPLEMENT_TRAITS; + + /* opcode generation: */ + opline = get_next_op(CG(active_op_array) TSRMLS_CC); + opline->opcode = ZEND_BIND_TRAITS; + SET_NODE(opline->op1, &CG(implementing_class)); + } if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) - && ((parent_token->op_type != IS_UNUSED) || (ce->num_interfaces > 0))) { + && (parent_token || (ce->num_interfaces > 0))) { zend_verify_abstract_class(ce TSRMLS_CC); - if (ce->num_interfaces) { + if (ce->num_interfaces && !(ce->ce_flags & ZEND_ACC_IMPLEMENT_TRAITS)) { do_verify_abstract_class(TSRMLS_C); } }