summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/print.c2
-rw-r--r--libguile/procprop.c17
-rw-r--r--libguile/programs.c33
-rw-r--r--libguile/programs.h3
-rw-r--r--module/system/vm/program.scm12
-rw-r--r--test-suite/tests/rtl.test10
6 files changed, 60 insertions, 17 deletions
diff --git a/libguile/print.c b/libguile/print.c
index f912a3586..50f5a3e68 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 472a1cabd..480970266 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 eb5972ab3..d3569159a 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 732594cd2..fa4613571 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 187509313..fdfc9a8aa 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 d3923b450..8429512c5 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))))))