summaryrefslogtreecommitdiff
path: root/module/system/vm/frame.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/system/vm/frame.scm')
-rw-r--r--module/system/vm/frame.scm83
1 files changed, 83 insertions, 0 deletions
diff --git a/module/system/vm/frame.scm b/module/system/vm/frame.scm
new file mode 100644
index 000000000..29a612b44
--- /dev/null
+++ b/module/system/vm/frame.scm
@@ -0,0 +1,83 @@
+;;; Guile VM frame functions
+
+;;; Copyright (C) 2001 Free Software Foundation, Inc.
+;;; Copyright (C) 2005 Ludovic Courtès <ludovic.courtes@laas.fr>
+;;;
+;;; This program is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program; if not, write to the Free Software
+;;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+;;; Code:
+
+(define-module (system vm frame)
+ :use-module ((system vm core) :renamer (symbol-prefix-proc 'vm:))
+ :export (frame-number frame-address
+ vm-current-frame-chain vm-last-frame-chain
+ print-frame print-frame-call))
+
+
+;;;
+;;; Frame chain
+;;;
+
+(define frame-number (make-object-property))
+(define frame-address (make-object-property))
+
+(define (vm-current-frame-chain vm)
+ (make-frame-chain (vm:vm-this-frame vm) (vm:vm:ip vm)))
+
+(define (vm-last-frame-chain vm)
+ (make-frame-chain (vm:vm-last-frame vm) (vm:vm:ip vm)))
+
+(define (make-frame-chain frame addr)
+ (let* ((link (vm:frame-dynamic-link frame))
+ (chain (if (eq? link #t)
+ '()
+ (cons frame (make-frame-chain
+ link (vm:frame-return-address frame))))))
+ (set! (frame-number frame) (length chain))
+ (set! (frame-address frame)
+ (- addr (program-base (vm:frame-program frame))))
+ chain))
+
+
+;;;
+;;; Pretty printing
+;;;
+
+(define (print-frame frame)
+ (format #t "#~A " (vm:frame-number frame))
+ (print-frame-call frame)
+ (newline))
+
+(define (print-frame-call frame)
+ (define (abbrev x)
+ (cond ((list? x) (if (> (length x) 3)
+ (list (abbrev (car x)) (abbrev (cadr x)) '...)
+ (map abbrev x)))
+ ((pair? x) (cons (abbrev (car x)) (abbrev (cdr x))))
+ ((vector? x) (case (vector-length x)
+ ((0) x)
+ ((1) (vector (abbrev (vector-ref x 0))))
+ (else (vector (abbrev (vector-ref x 0)) '...))))
+ (else x)))
+ (write (abbrev (cons (program-name frame)
+ (vm:frame-arguments frame)))))
+
+(define (program-name frame)
+ (let ((prog (vm:frame-program frame))
+ (link (vm:frame-dynamic-link frame)))
+ (or (object-property prog 'name)
+ (vm:frame-object-name link (1- (vm:frame-address link)) prog)
+ (hash-fold (lambda (s v d) (if (eq? prog (variable-ref v)) s d))
+ prog (module-obarray (current-module))))))