From 58582ab4d97b1ab50680c4ec7648a62ab82d498d Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 9 Mar 2009 20:22:56 -0500 Subject: [PATCH] Fix memory management for CFArrays --- basis/cocoa/plists/plists-tests.factor | 30 ++++++++++++++++++++++ basis/core-foundation/arrays/arrays.factor | 9 +++---- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/basis/cocoa/plists/plists-tests.factor b/basis/cocoa/plists/plists-tests.factor index beb766561f..4f74cd850a 100644 --- a/basis/cocoa/plists/plists-tests.factor +++ b/basis/cocoa/plists/plists-tests.factor @@ -7,4 +7,34 @@ assocs cocoa.enumeration ; [ V{ } ] [ H{ } >cf &CFRelease [ ] NSFastEnumeration-map ] unit-test [ V{ "A" } ] [ { "A" } >cf &CFRelease plist> ] unit-test [ H{ { "A" "B" } } ] [ "B" "A" associate >cf &CFRelease plist> ] unit-test + [ H{ { "A" "B" } } ] [ "B" "A" associate >cf &CFRelease plist> ] unit-test + + [ t ] [ + { + H{ { "DeviceUsagePage" 1 } { "DeviceUsage" 4 } } + H{ { "DeviceUsagePage" 1 } { "DeviceUsage" 5 } } + H{ { "DeviceUsagePage" 1 } { "DeviceUsage" 6 } } + } [ >cf &CFRelease ] [ >cf &CFRelease ] bi + [ plist> ] bi@ = + ] unit-test + + [ t ] [ + { "DeviceUsagePage" 1 } + [ >cf &CFRelease ] [ >cf &CFRelease ] bi + [ plist> ] bi@ = + ] unit-test + + [ V{ "DeviceUsagePage" "Yes" } ] [ + { "DeviceUsagePage" "Yes" } + >cf &CFRelease plist> + ] unit-test + + [ V{ 2.0 1.0 } ] [ + { 2.0 1.0 } + >cf &CFRelease plist> + ] unit-test + + [ 3.5 ] [ + 3.5 >cf &CFRelease plist> + ] unit-test ] with-destructors \ No newline at end of file diff --git a/basis/core-foundation/arrays/arrays.factor b/basis/core-foundation/arrays/arrays.factor index 3708059f2b..1205352fcb 100644 --- a/basis/core-foundation/arrays/arrays.factor +++ b/basis/core-foundation/arrays/arrays.factor @@ -1,6 +1,6 @@ -! Copyright (C) 2008 Slava Pestov. +! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: alien.syntax kernel sequences ; +USING: alien.syntax kernel sequences fry ; IN: core-foundation.arrays TYPEDEF: void* CFArrayRef @@ -17,6 +17,5 @@ FUNCTION: CFIndex CFArrayGetCount ( CFArrayRef array ) ; dup CFArrayGetCount [ CFArrayGetValueAtIndex ] with map ; : ( seq -- alien ) - [ f swap length f CFArrayCreateMutable ] keep - [ length ] keep - [ [ dupd ] dip CFArraySetValueAtIndex ] 2each ; + f over length &: kCFTypeArrayCallBacks CFArrayCreateMutable + [ '[ [ _ ] 2dip swap CFArraySetValueAtIndex ] each-index ] keep ;