Prevent an args-out-of-range error during login/out
[riece] / lisp / server.rb
index 4ff4261..e18c527 100644 (file)
@@ -19,8 +19,8 @@
 
 # You should have received a copy of the GNU General Public License
 # along with GNU Emacs; see the file COPYING.  If not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
 
 require 'thread'
 require 'stringio'
@@ -98,28 +98,13 @@ class Server
     send_line("S name #{name}\r\n")
     send_line("OK\r\n")
     Thread.current[:rubyserv_name] = name
-    out, log = @out, @log
-    env = Module.new
-    env.module_eval do
-      @out, @log = out, log
-
-      def send_line(line)
-       @out.puts(line)
-       @log.puts(line) if @log
-      end
-      module_function :send_line
-
-      def output(s)
-       send_line("# output #{Thread.current[:rubyserv_name]} #{s}\r\n")
-      end
-      module_function :output
-    end
     begin
       Thread.current[:rubyserv_error] = false
-      Thread.current[:rubyserv_response] = eval(r, env.module_eval {binding()})
+      Thread.current[:rubyserv_response] = eval(r, exec_env.empty_binding)
     rescue Exception => e
       Thread.current[:rubyserv_error] = true
-      Thread.current[:rubyserv_response] = e.to_s.sub(/\A.*?\n/, '')
+      Thread.current[:rubyserv_response] =
+        e.to_s.sub(/\A.*?\n#{Regexp.quote(__FILE__)}:\d+: /o, '')
     end
     send_line("# exit #{name}\r\n")
   end
@@ -186,6 +171,23 @@ class Server
     @out.puts(line)
     @log.puts(line) if @log
   end
+
+  def exec_env
+    env = Object.new
+    def env.empty_binding
+      binding
+    end
+    out, log = @out, @log
+    env.instance_eval {@out, @log = out, log}
+    def env.send_line(line)
+      @out.puts(line)
+      @log.puts(line) if @log
+    end
+    def env.output(s)
+      send_line("# output #{Thread.current[:rubyserv_name]} #{s}\r\n")
+    end
+    env
+  end
 end
 
 if $0 == __FILE__
@@ -202,7 +204,7 @@ End
     opts.on('-e', '--err ERRFILE', 'Send stderr to ERRFILE.') do |errfile|
       opt_errfile = errfile
     end
-    opts.on('-e', '--log LOGFILE', 'Send stdlog to LOGFILE.') do |logfile|
+    opts.on('-l', '--log LOGFILE', 'Send log to LOGFILE.') do |logfile|
       opt_logfile = logfile
     end
     opts.on_tail('--help', '-h', 'Show this message.') do