guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/6] RTL programs print with their name


From: Andy Wingo
Subject: [PATCH 5/6] RTL programs print with their name
Date: Mon, 27 May 2013 07:42:35 +0200

* libguile/print.c (iprin1): Use scm_i_program_print for RTL programs
  too.

* libguile/procprop.c (scm_procedure_name): For RTL programs, call
  scm_i_rtl_program_name if there is no override.

* libguile/programs.h:
* libguile/programs.c (scm_i_rtl_program_name): New helper, dispatches
  to (system vm program).
  (scm_i_program_print): For RTL programs, the fallback prints the code
  pointer too.

* module/system/vm/program.scm (rtl-program-name): Use the debug info to
  get an RTL program name.
  (write-program): Work with RTL programs too.

* test-suite/tests/rtl.test ("procedure name"): Add test.
---
 libguile/print.c             |    2 --
 libguile/procprop.c          |   17 ++++++++++++++++-
 libguile/programs.c          |   33 +++++++++++++++++++++++----------
 libguile/programs.h          |    3 +--
 module/system/vm/program.scm |   12 ++++++++++--
 test-suite/tests/rtl.test    |   10 ++++++++++
 6 files changed, 60 insertions(+), 17 deletions(-)

diff --git a/libguile/print.c b/libguile/print.c
index f912a35..50f5a3e 100644
--- a/libguile/print.c
+++ b/libguile/print.c
@@ -657,8 +657,6 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate)
          scm_i_variable_print (exp, port, pstate);
          break;
        case scm_tc7_rtl_program:
-         scm_i_rtl_program_print (exp, port, pstate);
-         break;
        case scm_tc7_program:
          scm_i_program_print (exp, port, pstate);
          break;
diff --git a/libguile/procprop.c b/libguile/procprop.c
index 472a1ca..4809702 100644
--- a/libguile/procprop.c
+++ b/libguile/procprop.c
@@ -223,10 +223,25 @@ SCM_DEFINE (scm_procedure_name, "procedure-name", 1, 0, 0,
            "Return the name of the procedure @var{proc}")
 #define FUNC_NAME s_scm_procedure_name
 {
+  SCM props, ret;
+
   SCM_VALIDATE_PROC (1, proc);
+
   while (SCM_STRUCTP (proc) && SCM_STRUCT_APPLICABLE_P (proc))
     proc = SCM_STRUCT_PROCEDURE (proc);
-  return scm_procedure_property (proc, scm_sym_name);
+
+  props = scm_weak_table_refq (overrides, proc, SCM_BOOL_F);
+
+  if (scm_is_pair (props))
+    ret = scm_assq_ref (props, scm_sym_name);
+  else if (SCM_RTL_PROGRAM_P (proc))
+    ret = scm_i_rtl_program_name (proc);
+  else if (SCM_PROGRAM_P (proc))
+    ret = scm_assq_ref (scm_i_program_properties (proc), scm_sym_name);
+  else
+    ret = SCM_BOOL_F;
+  
+  return ret;
 }
 #undef FUNC_NAME
 
diff --git a/libguile/programs.c b/libguile/programs.c
index eb5972a..d356915 100644
--- a/libguile/programs.c
+++ b/libguile/programs.c
@@ -111,14 +111,16 @@ SCM_DEFINE (scm_rtl_program_code, "rtl-program-code", 1, 
0, 0,
 }
 #undef FUNC_NAME
 
-void
-scm_i_rtl_program_print (SCM program, SCM port, scm_print_state *pstate)
+SCM
+scm_i_rtl_program_name (SCM program)
 {
-  scm_puts_unlocked ("#<rtl-program ", port);
-  scm_uintprint (SCM_UNPACK (program), 16, port);
-  scm_putc_unlocked (' ', port);
-  scm_uintprint ((scm_t_uintptr) SCM_RTL_PROGRAM_CODE (program), 16, port);
-  scm_putc_unlocked ('>', port);
+  static SCM rtl_program_name = SCM_BOOL_F;
+
+  if (scm_is_false (rtl_program_name) && scm_module_system_booted_p)
+    rtl_program_name =
+        scm_c_private_variable ("system vm program", "rtl-program-name");
+
+  return scm_call_1 (scm_variable_ref (rtl_program_name), program);
 }
 
 void
@@ -147,9 +149,20 @@ scm_i_program_print (SCM program, SCM port, 
scm_print_state *pstate)
     }
   else if (scm_is_false (write_program) || print_error)
     {
-      scm_puts_unlocked ("#<program ", port);
-      scm_uintprint (SCM_UNPACK (program), 16, port);
-      scm_putc_unlocked ('>', port);
+      if (SCM_RTL_PROGRAM_P (program))
+        {
+          scm_puts_unlocked ("#<rtl-program ", port);
+          scm_uintprint (SCM_UNPACK (program), 16, port);
+          scm_putc_unlocked (' ', port);
+          scm_uintprint ((scm_t_uintptr) SCM_RTL_PROGRAM_CODE (program), 16, 
port);
+          scm_putc_unlocked ('>', port);
+        }
+      else
+        {
+          scm_puts_unlocked ("#<program ", port);
+          scm_uintprint (SCM_UNPACK (program), 16, port);
+          scm_putc_unlocked ('>', port);
+        }
     }
   else
     {
diff --git a/libguile/programs.h b/libguile/programs.h
index 732594c..fa46135 100644
--- a/libguile/programs.h
+++ b/libguile/programs.h
@@ -44,8 +44,7 @@ SCM_INTERNAL SCM scm_make_rtl_program (SCM bytevector, SCM 
byte_offset, SCM free
 SCM_INTERNAL SCM scm_rtl_program_p (SCM obj);
 SCM_INTERNAL SCM scm_rtl_program_code (SCM program);
 
-SCM_INTERNAL void scm_i_rtl_program_print (SCM program, SCM port,
-                                           scm_print_state *pstate);
+SCM_INTERNAL SCM scm_i_rtl_program_name (SCM program);
 
 /*
  * Programs
diff --git a/module/system/vm/program.scm b/module/system/vm/program.scm
index 1875093..fdfc9a8 100644
--- a/module/system/vm/program.scm
+++ b/module/system/vm/program.scm
@@ -22,6 +22,7 @@
   #:use-module (system base pmatch)
   #:use-module (system vm instruction)
   #:use-module (system vm objcode)
+  #:use-module (system vm debug)
   #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
@@ -53,6 +54,13 @@
 (load-extension (string-append "libguile-" (effective-version))
                 "scm_init_programs")
 
+;; This procedure is called by programs.c.
+(define (rtl-program-name program)
+  (unless (rtl-program? program)
+    (error "shouldn't get here"))
+  (and=> (find-program-debug-info (rtl-program-code program))
+         program-debug-info-name))
+
 (define (make-binding name boxed? index start end)
   (list name boxed? index start end))
 (define (binding:name b) (list-ref b 0))
@@ -271,7 +279,7 @@
 (define (write-program prog port)
   (format port "#<procedure ~a~a>"
           (or (procedure-name prog)
-              (and=> (program-source prog 0)
+              (and=> (and (program? prog) (program-source prog 0))
                      (lambda (s)
                        (format #f "~a at ~a:~a:~a"
                                (number->string (object-address prog) 16)
@@ -279,7 +287,7 @@
                                    (if s "<current input>" "<unknown port>"))
                                (source:line-for-user s) (source:column s))))
               (number->string (object-address prog) 16))
-          (let ((arities (program-arities prog)))
+          (let ((arities (and (program? prog) (program-arities prog))))
             (if (or (not arities) (null? arities))
                 ""
                 (string-append
diff --git a/test-suite/tests/rtl.test b/test-suite/tests/rtl.test
index d3923b4..8429512 100644
--- a/test-suite/tests/rtl.test
+++ b/test-suite/tests/rtl.test
@@ -268,3 +268,13 @@
              (lambda (pdi)
                (equal? (program-debug-info-addr pdi)
                        (rtl-program-code return-3)))))))
+
+(with-test-prefix "procedure name"
+  (pass-if-equal 'foo
+      (procedure-name
+       (assemble-program
+        '((begin-program foo)
+          (assert-nargs-ee/locals 0 1)
+          (load-constant 0 42)
+          (return 0)
+          (end-program))))))
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]