diff --git a/ice-9/ChangeLog b/ice-9/ChangeLog index 4fe94abc5..221158537 100644 --- a/ice-9/ChangeLog +++ b/ice-9/ChangeLog @@ -1,3 +1,12 @@ +2007-08-08 Ludovic Courtès + + * boot-9.scm (%record-type-check): Renamed to + `%record-type-error'. + (record-accessor): Directly use `struct-vtable' and + `struct-ref', thereby avoiding indirections and procedure-call + overhead. + (record-modifier): Likewise. + 2007-06-13 Ludovic Courtès * boot-9.scm (module-make-local-var!): Simplified. No need to diff --git a/ice-9/boot-9.scm b/ice-9/boot-9.scm index 9e34fd7c2..b3296b4cc 100644 --- a/ice-9/boot-9.scm +++ b/ice-9/boot-9.scm @@ -429,7 +429,7 @@ (define (record-predicate rtd) (lambda (obj) (and (struct? obj) (eq? rtd (struct-vtable obj))))) -(define (%record-type-check rtd obj) ;; private helper +(define (%record-type-error rtd obj) ;; private helper (or (eq? rtd (record-type-descriptor obj)) (scm-error 'wrong-type-arg "%record-type-check" "Wrong type record (want `~S'): ~S" @@ -441,8 +441,9 @@ (if (not pos) (error 'no-such-field field-name)) (local-eval `(lambda (obj) - (%record-type-check ',rtd obj) - (struct-ref obj ,pos)) + (if (eq? (struct-vtable obj) ,rtd) + (struct-ref obj ,pos) + (%record-type-error ,rtd obj))) the-root-environment))) (define (record-modifier rtd field-name) @@ -450,8 +451,9 @@ (if (not pos) (error 'no-such-field field-name)) (local-eval `(lambda (obj val) - (%record-type-check ',rtd obj) - (struct-set! obj ,pos val)) + (if (eq? (struct-vtable obj) ,rtd) + (struct-set! obj ,pos val) + (%record-type-error ,rtd obj))) the-root-environment))) diff --git a/test-suite/ChangeLog b/test-suite/ChangeLog index 43b32890a..9810d7ae1 100644 --- a/test-suite/ChangeLog +++ b/test-suite/ChangeLog @@ -1,3 +1,10 @@ +2007-08-08 Ludovic Courtès + + * tests/srfi-9.test (exception:not-a-record): Removed. + (accessor)[get-x on number, get-y on number]: Expect + `exception:wrong-type-arg' instead of `exception:not-a-record'. + (modifier)[set-y! on number]: Likewise + 2007-07-25 Ludovic Courtès * tests/srfi-17.test (%some-variable): New. diff --git a/test-suite/tests/srfi-9.test b/test-suite/tests/srfi-9.test index 18fa19328..c212ea6aa 100644 --- a/test-suite/tests/srfi-9.test +++ b/test-suite/tests/srfi-9.test @@ -1,7 +1,7 @@ ;;;; srfi-9.test --- Test suite for Guile's SRFI-9 functions. -*- scheme -*- ;;;; Martin Grabmueller, 2001-05-10 ;;;; -;;;; Copyright (C) 2001, 2006 Free Software Foundation, Inc. +;;;; Copyright (C) 2001, 2006, 2007 Free Software Foundation, Inc. ;;;; ;;;; 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 @@ -23,10 +23,6 @@ #:use-module (srfi srfi-9)) -(define exception:not-a-record - (cons 'misc-error "^not-a-record")) - - (define-record-type :foo (make-foo x) foo? (x get-x) (y get-y set-y!)) @@ -61,9 +57,9 @@ (pass-if "get-y" (= 2 (get-y f))) - (pass-if-exception "get-x on number" exception:not-a-record + (pass-if-exception "get-x on number" exception:wrong-type-arg (get-x 999)) - (pass-if-exception "get-y on number" exception:not-a-record + (pass-if-exception "get-y on number" exception:wrong-type-arg (get-y 999)) ;; prior to guile 1.6.9 and 1.8.1 this wan't enforced @@ -78,7 +74,7 @@ (set-y! f #t) (eq? #t (get-y f))) - (pass-if-exception "set-y! on number" exception:not-a-record + (pass-if-exception "set-y! on number" exception:wrong-type-arg (set-y! 999 #t)) ;; prior to guile 1.6.9 and 1.8.1 this wan't enforced