]> granicus.if.org Git - php/commitdiff
approx correct linenos in errors
authorNikita Popov <nikic@php.net>
Sat, 12 Jul 2014 15:10:10 +0000 (17:10 +0200)
committerNikita Popov <nikic@php.net>
Sat, 12 Jul 2014 15:10:10 +0000 (17:10 +0200)
Zend/zend_ast.c
Zend/zend_compile.c

index a1ebf7727d43d979cd96b1562c26ce8b63a40c6a..5ef590d2e78ee626169fd646583af4088804ce6c 100644 (file)
@@ -48,19 +48,27 @@ ZEND_API zend_ast *zend_ast_create_zval_ex(zval *zv, zend_ast_attr attr)
 static zend_ast *zend_ast_create_from_va_list(
        zend_uint children, zend_ast_kind kind, zend_ast_attr attr, va_list va
 ) {
-       TSRMLS_FETCH();
+       /*TSRMLS_FETCH();*/
        zend_uint i;
-
-       zend_ast *ast = emalloc(sizeof(zend_ast) + (children - 1) * sizeof(zend_ast *));
+       zend_ast *ast;
+       
+       ast = emalloc(sizeof(zend_ast) + (children - 1) * sizeof(zend_ast *));
        ast->kind = kind;
        ast->attr = attr;
-       ast->lineno = CG(zend_lineno);
+       ast->lineno = 0;
        ast->children = children;
 
        for (i = 0; i < children; ++i) {
                ast->child[i] = va_arg(va, zend_ast *);
+               if (ast->lineno == 0 && ast->child[i] != NULL) {
+                       ast->lineno = ast->child[i]->lineno;
+               }
        }
 
+       /*if (ast->lineno == 0) {
+               ast->lineno = CG(zend_lineno);
+       }*/
+
        return ast;
 }
 
index 4f190d764a20a9d01107a876b6c257bfcbe17828..b1e5a8c617489e439862264307e50281c725b289 100644 (file)
@@ -8310,7 +8310,8 @@ void zend_compile_stmt(zend_ast *ast TSRMLS_DC) {
        }
 
        // TODO.AST
-       //CG(zend_lineno) = ast->lineno;
+       zend_uint orig_lineno = CG(zend_lineno);
+       CG(zend_lineno) = ast->lineno;
 
        switch (ast->kind) {
                case ZEND_AST_STMT_LIST:
@@ -8376,6 +8377,8 @@ void zend_compile_stmt(zend_ast *ast TSRMLS_DC) {
        if (Z_LVAL(CG(declarables).ticks) && !zend_is_unticked_stmt(ast)) {
                zend_emit_tick(TSRMLS_C);
        }
+
+       CG(zend_lineno) = orig_lineno;
 }
 
 void zend_compile_expr(znode *result, zend_ast *ast TSRMLS_DC) {