[vala: 2/2] codegen: Add push_line and pop_line for writing line directives
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala: 2/2] codegen: Add push_line and pop_line for writing line directives
- Date: Tue, 19 Jul 2011 07:52:17 +0000 (UTC)
commit e632b60f6771117308d396739e558c2b2643c33c
Author: Luca Bruno <lucabru src gnome org>
Date: Tue Jul 19 00:13:13 2011 +0200
codegen: Add push_line and pop_line for writing line directives
Fixes bug 635095.
codegen/valaccodebasemodule.vala | 64 +++++++++++++++++++++++++++++++-----
codegen/valaccodemethodmodule.vala | 7 ++++
codegen/valaccodestructmodule.vala | 2 +
codegen/valagobjectmodule.vala | 10 ++++++
codegen/valagtypemodule.vala | 22 +++++++++++--
5 files changed, 93 insertions(+), 12 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index e553fbc..f1a2299 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 {
@@ -512,25 +516,53 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
this.emit_context = emit_context;
+ if (ccode != null) {
+ ccode.current_line = current_line;
+ }
}
public void pop_context () {
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) {
+ line_directive_stack.add (current_line);
+ if (source_reference != null) {
+ current_line = new CCodeLineDirective (source_reference.file.filename, source_reference.first_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 +749,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 +765,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 +852,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
@@ -837,18 +875,18 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
var cinitializer = get_cvalue (c.value);
ccode.add_declaration (type_name, new CCodeVariableDeclarator ("%s%s".printf (c.get_cname (), arr), cinitializer), CCodeModifiers.STATIC);
+ } else {
+ generate_constant_declaration (c, cfile, true);
- return;
+ if (!c.is_internal_symbol ()) {
+ generate_constant_declaration (c, header_file);
+ }
+ if (!c.is_private_symbol ()) {
+ generate_constant_declaration (c, internal_header_file);
+ }
}
- generate_constant_declaration (c, cfile, true);
-
- if (!c.is_internal_symbol ()) {
- generate_constant_declaration (c, header_file);
- }
- 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,7 @@ 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 +1204,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
pop_context ();
}
+
+ pop_line ();
}
public bool is_constant_ccode_expression (CCodeExpression cexpr) {
@@ -1356,6 +1397,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 +1442,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
if (acc.source_type == SourceFileType.FAST) {
+ pop_line ();
return;
}
@@ -1618,6 +1661,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
cfile.add_function (function);
}
+ pop_line ();
pop_context ();
}
@@ -1938,7 +1982,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
foreach (Statement stmt in b.get_statements ()) {
+ push_line (stmt.source_reference);
stmt.emit (this);
+ pop_line ();
}
// free in reverse order
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index 9e4d8a9..4b756d5 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -255,6 +255,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
public override void visit_method (Method m) {
push_context (new EmitContext (m));
+ push_line (m.source_reference);
bool in_gobject_creation_method = false;
bool in_fundamental_creation_method = false;
@@ -720,6 +721,8 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
pop_function ();
cfile.add_function (cmain);
}
+
+ pop_line ();
}
public virtual CCodeParameter generate_parameter (Parameter param, CCodeFile decl_space, Map<int,CCodeParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
@@ -998,6 +1001,8 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
}
public override void visit_creation_method (CreationMethod m) {
+ push_line (m.source_reference);
+
bool visible = !m.is_private_symbol ();
visit_method (m);
@@ -1029,6 +1034,8 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
cfile.add_function (vfunc);
}
+
+ pop_line ();
}
}
diff --git a/codegen/valaccodestructmodule.vala b/codegen/valaccodestructmodule.vala
index 39aa95a..6f5439a 100644
--- a/codegen/valaccodestructmodule.vala
+++ b/codegen/valaccodestructmodule.vala
@@ -147,6 +147,7 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
public override void visit_struct (Struct st) {
push_context (new EmitContext (st));
+ push_line (st.source_reference);
var old_instance_finalize_context = instance_finalize_context;
instance_finalize_context = new EmitContext ();
@@ -180,6 +181,7 @@ public abstract class Vala.CCodeStructModule : CCodeBaseModule {
instance_finalize_context = old_instance_finalize_context;
+ pop_line ();
pop_context ();
}
diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala
index 7979aa7..8fe42c0 100644
--- a/codegen/valagobjectmodule.vala
+++ b/codegen/valagobjectmodule.vala
@@ -34,12 +34,14 @@ public class Vala.GObjectModule : GTypeModule {
return;
}
+ push_line (cl.source_reference);
if (class_has_readable_properties (cl) || cl.get_type_parameters ().size > 0) {
add_get_property_function (cl);
}
if (class_has_writable_properties (cl) || cl.get_type_parameters ().size > 0) {
add_set_property_function (cl);
}
+ pop_line ();
}
public override void generate_class_init (Class cl) {
@@ -398,6 +400,8 @@ public class Vala.GObjectModule : GTypeModule {
}
public override void visit_constructor (Constructor c) {
+ push_line (c.source_reference);
+
if (c.binding == MemberBinding.CLASS || c.binding == MemberBinding.STATIC) {
in_static_or_class_context = true;
} else {
@@ -510,6 +514,8 @@ public class Vala.GObjectModule : GTypeModule {
in_static_or_class_context = false;
in_constructor = false;
+
+ pop_line ();
}
public override string get_dynamic_property_getter_cname (DynamicProperty prop) {
@@ -716,6 +722,8 @@ public class Vala.GObjectModule : GTypeModule {
public override void visit_method_call (MethodCall expr) {
if (expr.call is MemberAccess) {
+ push_line (expr.source_reference);
+
var ma = expr.call as MemberAccess;
if (ma.inner != null && ma.inner.symbol_reference == gobject_type &&
(ma.member_name == "new" || ma.member_name == "newv")) {
@@ -758,6 +766,8 @@ public class Vala.GObjectModule : GTypeModule {
}
}
}
+
+ pop_line ();
}
base.visit_method_call (expr);
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 410d91f..cf2755e 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -525,6 +525,7 @@ public class Vala.GTypeModule : GErrorModule {
public override void visit_class (Class cl) {
push_context (new EmitContext (cl));
+ push_line (cl.source_reference);
var old_param_spec_struct = param_spec_struct;
var old_prop_enum = prop_enum;
@@ -604,7 +605,9 @@ public class Vala.GTypeModule : GErrorModule {
add_g_value_take_function (cl);
var ref_count = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "ref_count"), new CCodeConstant ("1"));
- instance_init_context.ccode.add_expression (ref_count);
+ push_context (instance_init_context);
+ ccode.add_expression (ref_count);
+ pop_context ();
}
@@ -711,6 +714,7 @@ public class Vala.GTypeModule : GErrorModule {
instance_init_context = old_instance_init_context;
instance_finalize_context = old_instance_finalize_context;
+ pop_line ();
pop_context ();
}
@@ -1645,7 +1649,9 @@ public class Vala.GTypeModule : GErrorModule {
ccast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (cl.get_lower_case_cname (null))));
var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (ccast, "finalize"));
ccall.add_argument (new CCodeIdentifier ("obj"));
- instance_finalize_context.ccode.add_expression (ccall);
+ push_context (instance_finalize_context);
+ ccode.add_expression (ccall);
+ pop_context ();
}
cfile.add_function_declaration (instance_finalize_context.ccode);
@@ -1653,7 +1659,9 @@ public class Vala.GTypeModule : GErrorModule {
var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_slice_free"));
ccall.add_argument (new CCodeIdentifier (cl.get_cname ()));
ccall.add_argument (new CCodeIdentifier ("self"));
- instance_finalize_context.ccode.add_expression (ccall);
+ push_context (instance_finalize_context);
+ ccode.add_expression (ccall);
+ pop_context ();
}
cfile.add_function (instance_finalize_context.ccode);
@@ -1954,6 +1962,7 @@ public class Vala.GTypeModule : GErrorModule {
public override void visit_interface (Interface iface) {
push_context (new EmitContext (iface));
+ push_line (iface.source_reference);
if (iface.get_cname().length < 3) {
iface.error = true;
@@ -1982,6 +1991,7 @@ public class Vala.GTypeModule : GErrorModule {
cfile.add_type_member_declaration (type_fun.get_source_declaration ());
cfile.add_type_member_definition (type_fun.get_definition ());
+ pop_line ();
pop_context ();
}
@@ -2063,9 +2073,11 @@ public class Vala.GTypeModule : GErrorModule {
base.visit_struct (st);
if (st.has_type_id) {
+ push_line (st.source_reference);
var type_fun = new StructRegisterFunction (st, context);
type_fun.init_from_type (false, false);
cfile.add_type_member_definition (type_fun.get_definition ());
+ pop_line ();
}
}
@@ -2073,9 +2085,11 @@ public class Vala.GTypeModule : GErrorModule {
base.visit_enum (en);
if (en.has_type_id) {
+ push_line (en.source_reference);
var type_fun = new EnumRegisterFunction (en, context);
type_fun.init_from_type (false, false);
cfile.add_type_member_definition (type_fun.get_definition ());
+ pop_line ();
}
}
@@ -2090,6 +2104,7 @@ public class Vala.GTypeModule : GErrorModule {
}
// to_string() on a gtype enum
+ push_line (expr.source_reference);
var temp_var = get_temp_variable (new CType ("GEnumValue*"), false, expr, false);
emit_temp_var (temp_var);
@@ -2102,6 +2117,7 @@ public class Vala.GTypeModule : GErrorModule {
ccode.add_assignment (get_variable_cexpression (temp_var.name), get_value);
var is_null_value = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression (temp_var.name), new CCodeIdentifier ("NULL"));
set_cvalue (expr, new CCodeConditionalExpression (is_null_value, new CCodeMemberAccess.pointer (get_variable_cexpression (temp_var.name), "value_name"), new CCodeIdentifier ("NULL")));
+ pop_line ();
}
public override void visit_property (Property prop) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]