changeset 18237:e42d4f152766 gui-release

maint: Periodic merge of stable to gui-release.
author John W. Eaton <jwe@octave.org>
date Tue, 07 Jan 2014 16:07:21 -0500
parents 0eeab61e07d8 (current diff) f26d527c1a71 (diff)
children 8f256148d82b c7fe55478e11
files
diffstat 3 files changed, 45 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor-tab.cc	Tue Jan 07 21:50:34 2014 +0100
+++ b/libgui/src/m-editor/file-editor-tab.cc	Tue Jan 07 16:07:21 2014 -0500
@@ -51,6 +51,8 @@
 #include "file-editor-tab.h"
 #include "file-editor.h"
 
+#include "file-ops.h"
+
 #include "debug.h"
 #include "octave-qt-link.h"
 #include "version.h"
@@ -616,17 +618,40 @@
     bp_table::remove_all_breakpoints_in_file (info.function_name, true);
 }
 
+file_editor_tab::bp_info::bp_info (const QString& fname, int l)
+  : line (l), file (fname.toStdString ())
+{
+  QFileInfo file_info (fname);
+
+  QString q_dir = file_info.absolutePath ();
+  QString q_function_name = file_info.fileName ();
+
+  // We have to cut off the suffix, because octave appends it.
+  q_function_name.chop (file_info.suffix ().length () + 1);
+
+  dir = q_dir.toStdString ();
+  function_name = q_function_name.toStdString ();
+
+  // Is the last component of DIR @foo?  If so, strip it and prepend it
+  // to the name of the function.
+
+  size_t pos = dir.rfind (file_ops::dir_sep_chars ());
+
+  if (pos != std::string::npos && pos < dir.length () - 1)
+    {
+      if (dir[pos+1] == '@')
+        {
+          function_name = file_ops::concat (dir.substr (pos+1), function_name);
+
+          dir = dir.substr (0, pos);
+        }
+    }
+}
+
 void
 file_editor_tab::request_add_breakpoint (int line)
 {
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, line+1);
+  bp_info info (_file_name, line+1);
 
   octave_link::post_event
     (this, &file_editor_tab::add_breakpoint_callback, info);
@@ -635,14 +660,7 @@
 void
 file_editor_tab::request_remove_breakpoint (int line)
 {
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, line+1);
+  bp_info info (_file_name, line+1);
 
   octave_link::post_event
     (this, &file_editor_tab::remove_breakpoint_callback, info);
@@ -703,14 +721,7 @@
   if (ID != this)
     return;
 
-  QFileInfo file_info (_file_name);
-  QString dir = file_info.absolutePath ();
-  QString function_name = file_info.fileName ();
-
-  // We have to cut off the suffix, because octave appends it.
-  function_name.chop (file_info.suffix ().length () + 1);
-
-  bp_info info (_file_name, dir, function_name, 0);
+  bp_info info (_file_name);
 
   octave_link::post_event
     (this, &file_editor_tab::remove_all_breakpoints_callback, info);
--- a/libgui/src/m-editor/file-editor-tab.h	Tue Jan 07 21:50:34 2014 +0100
+++ b/libgui/src/m-editor/file-editor-tab.h	Tue Jan 07 16:07:21 2014 -0500
@@ -165,15 +165,12 @@
 
   struct bp_info
   {
-    bp_info (const QString& f, const QString& d, const QString& fn, int l)
-      : file (f.toStdString ()), dir (d.toStdString ()),
-        function_name (fn.toStdString ()), line (l)
-    { }
+    bp_info (const QString& fname, int l = 0);
 
+    int line;
     std::string file;
     std::string dir;
     std::string function_name;
-    int line;
   };
 
   bool valid_file_name (const QString& file=QString ());
--- a/libinterp/corefcn/debug.cc	Tue Jan 07 21:50:34 2014 +0100
+++ b/libinterp/corefcn/debug.cc	Tue Jan 07 16:07:21 2014 -0500
@@ -178,7 +178,14 @@
     dbg_fcn = octave_call_stack::caller_user_code ();
   else
     {
-      octave_value fcn = symbol_table::find_function (fname);
+      std::string name = fname;
+
+      size_t name_len = name.length ();
+
+      if (! name.empty () && name_len > 2 && name.substr (name_len-2) == ".m")
+        name = name.substr (0, name_len-2);
+
+      octave_value fcn = symbol_table::find_function (name);
 
       if (fcn.is_defined () && fcn.is_user_code ())
         dbg_fcn = fcn.user_code_value ();