[vala/wip/debug: 2/2] codegen: Add push_line and pop_line



commit d52abde8634949b30e46cf50c8b72d00299b98ab
Author: Luca Bruno <lucabru src gnome org>
Date:   Tue Jul 19 00:13:13 2011 +0200

    codegen: Add push_line and pop_line

 codegen/valaccodebasemodule.vala |   70 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index e553fbc..26f6941 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -63,6 +63,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 	List<EmitContext> emit_context_stack = new ArrayList<EmitContext> ();
 
+	public CCodeLineDirective? current_line = null;
+
+	List<CCodeLineDirective> line_directive_stack = new ArrayList<CCodeLineDirective> ();
+
 	public Symbol current_symbol { get { return emit_context.current_symbol; } }
 
 	public TryStatement current_try {
@@ -518,19 +522,44 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		if (emit_context_stack.size > 0) {
 			this.emit_context = emit_context_stack[emit_context_stack.size - 1];
 			emit_context_stack.remove_at (emit_context_stack.size - 1);
+			if (ccode != null) {
+				ccode.current_line = current_line;
+			}
 		} else {
 			this.emit_context = null;
 		}
 	}
 
+	public void push_line (SourceReference? source_reference) {
+		if (source_reference != null) {
+			current_line = new CCodeLineDirective (source_reference.file.filename, source_reference.first_line);
+		}
+		line_directive_stack.add (current_line);
+		if (ccode != null) {
+			ccode.current_line = current_line;
+		}
+	}
+
+	public void pop_line () {
+		current_line = line_directive_stack[line_directive_stack.size - 1];
+		line_directive_stack.remove_at (line_directive_stack.size - 1);
+		if (ccode != null) {
+			ccode.current_line = current_line;
+		}
+	}
+
 	public void push_function (CCodeFunction func) {
 		emit_context.ccode_stack.add (ccode);
 		emit_context.ccode = func;
+		ccode.current_line = current_line;
 	}
 
 	public void pop_function () {
 		emit_context.ccode = emit_context.ccode_stack[emit_context.ccode_stack.size - 1];
 		emit_context.ccode_stack.remove_at (emit_context.ccode_stack.size - 1);
+		if (ccode != null) {
+			ccode.current_line = current_line;
+		}
 	}
 
 	public bool add_symbol_declaration (CCodeFile decl_space, Symbol sym, string name) {
@@ -717,6 +746,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	}
 
 	public override void visit_enum (Enum en) {
+		push_line (en.source_reference);
+
 		en.accept_children (this);
 
 		if (en.comment != null) {
@@ -731,6 +762,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		if (!en.is_private_symbol ()) {
 			generate_enum_declaration (en, internal_header_file);
 		}
+
+		pop_line ();
 	}
 
 	public void visit_member (Symbol m) {
@@ -816,6 +849,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	}
 
 	public override void visit_constant (Constant c) {
+		push_line (c.source_reference);
+
 		if (c.parent_symbol is Block) {
 			// local constant
 
@@ -838,6 +873,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 			ccode.add_declaration (type_name, new CCodeVariableDeclarator ("%s%s".printf (c.get_cname (), arr), cinitializer), CCodeModifiers.STATIC);
 
+			pop_line ();
 			return;
 		}
 
@@ -849,6 +885,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		if (!c.is_private_symbol ()) {
 			generate_constant_declaration (c, internal_header_file);
 		}
+
+		pop_line ();
 	}
 
 	public void generate_field_declaration (Field f, CCodeFile decl_space) {
@@ -935,6 +973,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	}
 
 	public override void visit_field (Field f) {
+		push_line (f.source_reference);
+
 		visit_member (f);
 
 		check_type (f.variable_type);
@@ -1165,6 +1205,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 			pop_context ();
 		}
+
+		pop_line ();
 	}
 
 	public bool is_constant_ccode_expression (CCodeExpression cexpr) {
@@ -1356,6 +1398,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 	public override void visit_property_accessor (PropertyAccessor acc) {
 		push_context (new EmitContext (acc));
+		push_line (acc.source_reference);
 
 		var prop = (Property) acc.prop;
 
@@ -1400,6 +1443,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		}
 
 		if (acc.source_type == SourceFileType.FAST) {
+			pop_line ();
 			return;
 		}
 
@@ -1618,6 +1662,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 			cfile.add_function (function);
 		}
 
+		pop_line ();
 		pop_context ();
 	}
 
@@ -1983,7 +2028,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	}
 
 	public override void visit_declaration_statement (DeclarationStatement stmt) {
+		push_line (stmt.source_reference);
 		stmt.declaration.accept (this);
+		pop_line ();
 	}
 
 	public CCodeExpression get_variable_cexpression (string name) {
@@ -2032,6 +2079,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	}
 
 	public override void visit_local_variable (LocalVariable local) {
+		push_line (local.source_reference);
 		check_type (local.variable_type);
 
 		if (local.initializer != null) {
@@ -2108,6 +2156,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		}
 
 		local.active = true;
+
+		pop_line ();
 	}
 
 	/**
@@ -3098,6 +3148,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 			return;
 		}
 
+		push_line (stmt.source_reference);
+
 		/* free temporary objects and handle errors */
 
 		foreach (var value in temp_ref_values) {
@@ -3110,6 +3162,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		}
 
 		temp_ref_values.clear ();
+
+		pop_line ();
 	}
 
 	protected virtual void append_scope_free (Symbol sym, CodeNode? stop_at = null) {
@@ -3232,6 +3286,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	public override void visit_return_statement (ReturnStatement stmt) {
 		Symbol return_expression_symbol = null;
 
+		push_line (stmt.source_reference);
+
 		if (stmt.return_expression != null) {
 			// avoid unnecessary ref/unref pair
 			var local = stmt.return_expression.symbol_reference as LocalVariable;
@@ -3339,6 +3395,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 		// required for destructors
 		current_method_return = true;
+
+		pop_line ();
 	}
 
 	public string get_symbol_lock_name (string symname) {
@@ -3385,24 +3443,34 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 	}
 		
 	public override void visit_lock_statement (LockStatement stmt) {
+		push_line (stmt.source_reference);
+
 		var l = get_lock_expression (stmt, stmt.resource);
 
 		var fc = new CCodeFunctionCall (new CCodeIdentifier (((Method) mutex_type.scope.lookup ("lock")).get_cname ()));
 		fc.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, l));
 
 		ccode.add_expression (fc);
+
+		pop_line ();
 	}
 		
 	public override void visit_unlock_statement (UnlockStatement stmt) {
+		push_line (stmt.source_reference);
+
 		var l = get_lock_expression (stmt, stmt.resource);
 		
 		var fc = new CCodeFunctionCall (new CCodeIdentifier (((Method) mutex_type.scope.lookup ("unlock")).get_cname ()));
 		fc.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, l));
 		
 		ccode.add_expression (fc);
+
+		pop_line ();
 	}
 
 	public override void visit_delete_statement (DeleteStatement stmt) {
+		push_line (stmt.source_reference);
+
 		var pointer_type = (PointerType) stmt.expression.value_type;
 		DataType type = pointer_type;
 		if (pointer_type.base_type.data_type != null && pointer_type.base_type.data_type.is_reference_type ()) {
@@ -3412,6 +3480,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		var ccall = new CCodeFunctionCall (get_destroy_func_expression (type));
 		ccall.add_argument (get_cvalue (stmt.expression));
 		ccode.add_expression (ccall);
+
+		pop_line ();
 	}
 
 	public override void visit_expression (Expression expr) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]