diff --git a/collects/scheme/private/class-internal.ss b/collects/scheme/private/class-internal.ss index 26611adb16..9d1dc06670 100644 --- a/collects/scheme/private/class-internal.ss +++ b/collects/scheme/private/class-internal.ss @@ -211,6 +211,9 @@ (define-values (prop:unwrap object-unwrapper) (let-values ([(prop:unwrap pred acc) (make-struct-type-property 'prop:unwrap)]) + ;; Instead of using the accessor if it has prop:unwrap, just use the unwrapper + ;; from wrapper-object directly, since we know it must be a wrapped object. + ;; (The accessor will just give us that anyway.) (values prop:unwrap (λ (o) (if (pred o) (wrapper-object-wrapped o) o))))) ;;-------------------------------------------------------------------- diff --git a/src/mzscheme/utils/xcglue.c b/src/mzscheme/utils/xcglue.c index 2454fe7777..f170640f23 100644 --- a/src/mzscheme/utils/xcglue.c +++ b/src/mzscheme/utils/xcglue.c @@ -463,7 +463,7 @@ int objscheme_is_a(Scheme_Object *o, Scheme_Object *c) Scheme_Object *objscheme_unwrap(Scheme_Object *obj, Scheme_Object *c) { Scheme_Object *s[1], *unwrapper, *unwrap_prop; - Scheme_Class *cls = (Scheme_Class *)cls; + Scheme_Class *cls = (Scheme_Class *)c; if (!obj || !cls) return NULL; @@ -471,6 +471,7 @@ Scheme_Object *objscheme_unwrap(Scheme_Object *obj, Scheme_Object *c) unwrap_prop = cls->unwrap_property; if(!unwrap_prop) return obj; + unwrapper = scheme_struct_type_property_ref(unwrap_prop, (Scheme_Object *)obj); if (!unwrapper) return obj;