]> granicus.if.org Git - php/commitdiff
Fixed bug #30961 (Wrong linenumber in ReflectionClass getStartLine())
authorDmitry Stogov <dmitry@php.net>
Wed, 8 Jun 2005 06:48:39 +0000 (06:48 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 8 Jun 2005 06:48:39 +0000 (06:48 +0000)
NEWS
Zend/zend_compile.c
Zend/zend_language_parser.y
ext/reflection/tests/bug30961.phpt [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index 7f5ae40e13df62f62127afb5300807f2a0fe629e..f08cdd3b4a64b4bd734bb95c93952d2b0896a712 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -125,6 +125,8 @@ PHP                                                                        NEWS
   serializer). (Dmitry) 
 - Fixed bug #31465 (False warning in unpack() when working with *). (Ilia)
 - Fixed bug #31363 (broken non-blocking flock()). ian at snork dot net
+- Fixed bug #30961 (Wrong linenumber in ReflectionClass getStartLine()).
+  (Dmitry)
 - Fixed bug #30889 (Conflict between __get/__set and ++ operator). (Dmitry)
 - Fixed bug #30833 (array_count_values() modifying input array). (Tony)
 - Fixed bug #30819 (Better support for LDAP SASL bind). (Jani)
index a68b7cba221bf34db4468213c960b4738c4015aa..5d0eb4bcf9d489687782ab370dacb60a4ed86574 100644 (file)
@@ -2502,8 +2502,8 @@ void zend_do_begin_class_declaration(znode *class_token, znode *class_name, znod
 
        zend_initialize_class_data(new_class_entry, 1 TSRMLS_CC);
        new_class_entry->filename = zend_get_compiled_filename(TSRMLS_C);
-       new_class_entry->line_start = zend_get_compiled_lineno(TSRMLS_C);
-       new_class_entry->ce_flags |= class_token->u.constant.value.lval;
+       new_class_entry->line_start = class_token->u.opline_num;
+       new_class_entry->ce_flags |= class_token->u.EA.type;
 
        if (parent_class_name && parent_class_name->op_type != IS_UNUSED) {
                doing_inheritance = 1;
index afaa8d0cad9ff4761ae0afd04c3bb12c1f0b5b53..f26406b268632d3be27d1d6ca987e81f748f549a 100644 (file)
@@ -291,9 +291,9 @@ unticked_class_declaration_statement:
 
 
 class_entry_type:
-               T_CLASS                 {  $$.u.constant.value.lval = 0; }
-       |       T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; }
-       |       T_FINAL T_CLASS { $$.u.constant.value.lval = ZEND_ACC_FINAL_CLASS; }
+               T_CLASS                 { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = 0; }
+       |       T_ABSTRACT T_CLASS { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; }
+       |       T_FINAL T_CLASS { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = ZEND_ACC_FINAL_CLASS; }
 ;
 
 extends_from:
@@ -302,7 +302,7 @@ extends_from:
 ;
 
 interface_entry:
-       T_INTERFACE             { $$.u.constant.value.lval = ZEND_ACC_INTERFACE; }
+       T_INTERFACE             { $$.u.opline_num = CG(zend_lineno); $$.u.EA.type = ZEND_ACC_INTERFACE; }
 ;
 
 interface_extends_list:
diff --git a/ext/reflection/tests/bug30961.phpt b/ext/reflection/tests/bug30961.phpt
new file mode 100755 (executable)
index 0000000..7806747
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Bug #30961 (Wrong linenumber in ReflectionClass getStartLine())
+--FILE--
+<?
+    class a
+    {
+    }
+
+    class b extends a
+    {
+    }
+
+    $ref1 = new ReflectionClass('a');
+    $ref2 = new ReflectionClass('b');
+    echo $ref1->getStartLine() . "\n";
+    echo $ref2->getStartLine() . "\n";
+?>
+--EXPECT--
+2
+6