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 ("#', 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 ("#', port); + if (SCM_RTL_PROGRAM_P (program)) + { + scm_puts_unlocked ("#', port); + } + else + { + scm_puts_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 "#" (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 "" "")) (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))))))