I noticed while debugging another issue that at some point I'd broken
the source locations that toyvm.c sets up into the .toy source files,
by using the filename, rather than the filesystem path.

Also fix a segfault due to fclose (NULL) when the .toy file is not
found.

Committed to trunk as r218540.

gcc/jit/ChangeLog:
        * docs/examples/tut04-toyvm/toyvm.c (toyvm_function_compile): Move
        logic for determine "funcname" to new function...
        (get_function_name): ...here, adding logic to skip any leading
        path from the filename.
        (toyvm_function_parse): Use the filename for fn_filename, rather
        than "name", so that the debugger can locate the source .toy
        file.
        (toyvm_function_parse): Don't fclose a NULL FILE *.
---
 gcc/jit/docs/examples/tut04-toyvm/toyvm.c | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/gcc/jit/docs/examples/tut04-toyvm/toyvm.c 
b/gcc/jit/docs/examples/tut04-toyvm/toyvm.c
index 07de507..0089ea7 100644
--- a/gcc/jit/docs/examples/tut04-toyvm/toyvm.c
+++ b/gcc/jit/docs/examples/tut04-toyvm/toyvm.c
@@ -121,6 +121,25 @@ add_unary_op (toyvm_function *fn, enum opcode opcode,
   add_op (fn, opcode, operand, linenum);
 }
 
+static char *
+get_function_name (const char *filename)
+{
+  /* Skip any path separators.  */
+  const char *pathsep = strrchr (filename, '/');
+  if (pathsep)
+    filename = pathsep + 1;
+
+  /* Copy filename to funcname.  */
+  char *funcname = (char *)malloc (strlen (filename) + 1);
+
+  strcpy (funcname, filename);
+
+  /* Convert "." to NIL terminator.  */
+  *(strchr (funcname, '.')) = '\0';
+
+  return funcname;
+}
+
 static toyvm_function *
 toyvm_function_parse (const char *filename, const char *name)
 {
@@ -149,7 +168,7 @@ toyvm_function_parse (const char *filename, const char 
*name)
       fprintf (stderr, "out of memory allocating toyvm_function\n");
       goto error;
     }
-  fn->fn_filename = name;
+  fn->fn_filename = filename;
 
   /* Read the lines of the file.  */
   while ((linelen = getline (&line, &bufsize, f)) != -1)
@@ -208,7 +227,8 @@ toyvm_function_parse (const char *filename, const char 
*name)
 
  error:
   free (line);
-  fclose (f);
+  if (f)
+    fclose (f);
   free (fn);
   return NULL;
 }
@@ -460,12 +480,7 @@ toyvm_function_compile (toyvm_function *fn)
 
   memset (&state, 0, sizeof (state));
 
-  /* Copy filename to funcname.  */
-  funcname = (char *)malloc (strlen (fn->fn_filename) + 1);
-  strcpy (funcname, fn->fn_filename);
-
-  /* Convert "." to NIL terminator.  */
-  *(strchr (funcname, '.')) = '\0';
+  funcname = get_function_name (fn->fn_filename);
 
   state.ctxt = gcc_jit_context_acquire ();
 
-- 
1.8.5.3

Reply via email to