[PATCH] Don't output #line 0 directives for prototypes.

From: Nick Bowler <nbowler_at_draconx.ca>
Date: Wed, 30 Mar 2011 21:25:28 -0400

It is not valid for the integer argument of a #line directive to be 0.
However, the generated C source will contain such a directive around the
prototypes of private functions that do not appear in the .gob file.
For example, the trivial

  class My:Test from G:Object {
  }

generates the invalid C code:

  #line 0 "my-test.gob"
  static void my_test_init (MyTest * o) G_GNUC_UNUSED;
  /* ... */
  #line 0 "my-test.gob"
  static void my_test_class_init (MyTestClass * c) G_GNUC_UNUSED;

Fix this up and add an assertion to out_addline_infile to catch future
problems of this nature.

---
Hopefully this is the right place to send patches!  The gob2 website
doesn't make any mention of where they should be sent.
 src/main.c |    6 ++++--
 src/out.c  |    2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/main.c b/src/main.c
index 5d2d4c9..cd8edef 100644
--- a/src/main.c
+++ b/src/main.c
@@ -578,7 +578,8 @@ put_priv_method_prot(const Method *m)
 	    m->cbuf)) {
 		/* add unique ID */
 		char *s = g_strdup_printf("___%x_", (guint)m->unique_id);
-		out_addline_infile(out, m->line_no);
+		if (m->line_no > 0)
+			out_addline_infile(out, m->line_no);
 		print_method(out, "static ", s, "", " ", "",
 			     no_gnu?";\n":" G_GNUC_UNUSED;\n",
 			     m, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
@@ -590,7 +591,8 @@ put_priv_method_prot(const Method *m)
 		  m->method == CONSTRUCTOR_METHOD ||
 		  m->method == DISPOSE_METHOD ||
 		  m->method == FINALIZE_METHOD) {
-		out_addline_infile(out, m->line_no);
+		if (m->line_no > 0)
+			out_addline_infile(out, m->line_no);
 		print_method(out, "static ", "", "", " ", "",
 			     no_gnu?";\n":" G_GNUC_UNUSED;\n",
 			     m, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE);
diff --git a/src/out.c b/src/out.c
index b6371f6..c93c933 100644
--- a/src/out.c
+++ b/src/out.c
@@ -54,6 +54,8 @@ out_printf(FILE *fp, const char *format,...)
 void
 out_addline_infile(FILE *fp, int line)
 {
+	g_return_if_fail(line > 0);
+
 	if(no_lines || no_write)
 		return;
 
-- 
1.7.4.1
Received on Wed Mar 30 2011 - 20:25:44 CDT

This archive was generated by hypermail 2.2.0 : Sun Apr 17 2011 - 21:05:02 CDT