[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] 46/61: slot-ref, slot-set! et al bypass "using-class" va
From: |
Andy Wingo |
Subject: |
[Guile-commits] 46/61: slot-ref, slot-set! et al bypass "using-class" variants |
Date: |
Thu, 22 Jan 2015 18:53:17 +0000 |
wingo pushed a commit to branch wip-goops-refactor
in repository guile.
commit 941e45bc8b98cc74a9cebfbe7fad02721ea9f619
Author: Andy Wingo <address@hidden>
Date: Fri Jan 16 12:55:48 2015 +0100
slot-ref, slot-set! et al bypass "using-class" variants
* module/oop/goops.scm (slot-ref, slot-set!, slot-bound?, slot-exists?):
Bypass slot-ref-using-class, slot-set-using-class!, and so on. Those
interfaces are public and have to check that the class is indeed a
class, they should check that the object is an instance of the class,
and so on, whereas if we get the class via class-of we know that the
invariant holds.
---
module/oop/goops.scm | 24 ++++++++++++++++++++----
1 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/module/oop/goops.scm b/module/oop/goops.scm
index 4464daa..1babb09 100644
--- a/module/oop/goops.scm
+++ b/module/oop/goops.scm
@@ -897,19 +897,35 @@ followed by its associated value. If @var{l} does not
hold a value for
(define (slot-ref obj slot-name)
"Return the value from @var{obj}'s slot with the nam var{slot_name}."
- (slot-ref-using-class (class-of obj) obj slot-name))
+ (unless (symbol? slot-name)
+ (scm-error 'wrong-type-arg #f "Not a symbol: ~S"
+ (list slot-name) #f))
+ (let* ((class (class-of obj))
+ (val (get-slot-value-using-name class obj slot-name)))
+ (if (unbound? val)
+ (slot-unbound class obj slot-name)
+ val)))
(define (slot-set! obj slot-name value)
"Set the slot named @var{slot_name} of @var{obj} to @var{value}."
- (slot-set-using-class! (class-of obj) obj slot-name value))
+ (unless (symbol? slot-name)
+ (scm-error 'wrong-type-arg #f "Not a symbol: ~S"
+ (list slot-name) #f))
+ (set-slot-value-using-name! (class-of obj) obj slot-name value))
(define (slot-bound? obj slot-name)
"Return the value from @var{obj}'s slot with the nam var{slot_name}."
- (slot-bound-using-class? (class-of obj) obj slot-name))
+ (unless (symbol? slot-name)
+ (scm-error 'wrong-type-arg #f "Not a symbol: ~S"
+ (list slot-name) #f))
+ (not (unbound? (get-slot-value-using-name (class-of obj) obj slot-name))))
(define (slot-exists? obj slot-name)
"Return @code{#t} if @var{obj} has a slot named @var{slot_name}."
- (slot-exists-using-class? (class-of obj) obj slot-name))
+ (unless (symbol? slot-name)
+ (scm-error 'wrong-type-arg #f "Not a symbol: ~S"
+ (list slot-name) #f))
+ (test-slot-existence (class-of obj) obj slot-name))
- [Guile-commits] 39/61: More GOOPS comments, (continued)
- [Guile-commits] 39/61: More GOOPS comments, Andy Wingo, 2015/01/22
- [Guile-commits] 42/61: Convert emit-linear-dispatch to use match, Andy Wingo, 2015/01/22
- [Guile-commits] 38/61: Commenting in goops.scm, Andy Wingo, 2015/01/22
- [Guile-commits] 43/61: `match' refactor in goops.scm, Andy Wingo, 2015/01/22
- [Guile-commits] 40/61: when and unless for one-armed ifs in goops.scm, Andy Wingo, 2015/01/22
- [Guile-commits] 44/61: GOOPS class slot indices defined as inline values, Andy Wingo, 2015/01/22
- [Guile-commits] 47/61: change-object-class refactor, Andy Wingo, 2015/01/22
- [Guile-commits] 45/61: Manipulate GOOPS vtable flags from Scheme, for speed, Andy Wingo, 2015/01/22
- [Guile-commits] 41/61: More GOOPS cleanups, Andy Wingo, 2015/01/22
- [Guile-commits] 48/61: GOOPS: Deprecate "using-class" procs like slot-ref-using-class, Andy Wingo, 2015/01/22
- [Guile-commits] 46/61: slot-ref, slot-set! et al bypass "using-class" variants,
Andy Wingo <=
- [Guile-commits] 50/61: Beginnings of <slot> slot definition class, Andy Wingo, 2015/01/22
- [Guile-commits] 52/61: Use a vtable bit to mark <slot> instances, Andy Wingo, 2015/01/22
- [Guile-commits] 56/61: Minor GOOPS cleanups, Andy Wingo, 2015/01/22
- [Guile-commits] 55/61: Optimize %initialize-object, Andy Wingo, 2015/01/22
- [Guile-commits] 49/61: The GOOPS "unbound" value is a unique pair, Andy Wingo, 2015/01/22
- [Guile-commits] 53/61: Inline helpers into slot-ref, slot-set!, etc, Andy Wingo, 2015/01/22
- [Guile-commits] 58/61: Update (oop goops save) for <slot> objects, Andy Wingo, 2015/01/22
- [Guile-commits] 60/61: Fast generic function dispatch without calling `compile' at runtime, Andy Wingo, 2015/01/22
- [Guile-commits] 57/61: Fix foreign objects for removal of getters-n-setters, Andy Wingo, 2015/01/22
- [Guile-commits] 54/61: Inline internal slot accessors, Andy Wingo, 2015/01/22