Fixes to be blocks runtime. Make sure that objects are not prematurely deallocated if referenced by multiple blocks.

main
theraven 15 years ago
parent 9b70b22eee
commit 9967d85d60

@ -306,12 +306,14 @@ void _Block_object_assign(void *destAddr, const void *object, const int flags)
fprintf(stderr, "BLOCK_FIELD_IS_BLOCK: %d\n", (flags & BLOCK_FIELD_IS_BLOCK) == BLOCK_FIELD_IS_BLOCK); fprintf(stderr, "BLOCK_FIELD_IS_BLOCK: %d\n", (flags & BLOCK_FIELD_IS_BLOCK) == BLOCK_FIELD_IS_BLOCK);
fprintf(stderr, "BLOCK_FIELD_IS_BYREF: %d\n", (flags & BLOCK_FIELD_IS_BYREF) == BLOCK_FIELD_IS_BYREF); fprintf(stderr, "BLOCK_FIELD_IS_BYREF: %d\n", (flags & BLOCK_FIELD_IS_BYREF) == BLOCK_FIELD_IS_BYREF);
fprintf(stderr, "BLOCK_FIELD_IS_WEAK: %d\n", (flags & BLOCK_FIELD_IS_WEAK) == BLOCK_FIELD_IS_WEAK); fprintf(stderr, "BLOCK_FIELD_IS_WEAK: %d\n", (flags & BLOCK_FIELD_IS_WEAK) == BLOCK_FIELD_IS_WEAK);
if(flags & BLOCK_FIELD_IS_BYREF) if (IS_SET(flags, BLOCK_FIELD_IS_BYREF))
{ {
struct block_byref_obj *src = (struct block_byref_obj *)object; struct block_byref_obj *src = (struct block_byref_obj *)object;
struct block_byref_obj **dst = destAddr; struct block_byref_obj **dst = destAddr;
fprintf(stderr, "Copy dispose? %d\n", (src->flags & BLOCK_HAS_COPY_DISPOSE) == BLOCK_HAS_COPY_DISPOSE); fprintf(stderr, "Copy dispose? %d\n", (src->flags & BLOCK_HAS_COPY_DISPOSE) == BLOCK_HAS_COPY_DISPOSE);
fprintf(stderr, "Retain Count? %x %x\n", src->flags & BLOCK_REFCOUNT_MASK, BLOCK_REFCOUNT_MASK); fprintf(stderr, "Retain Count? %x %x\n", src->flags & BLOCK_REFCOUNT_MASK, BLOCK_REFCOUNT_MASK);
fprintf(stderr, "Forwarding: %p -> %p\n", src, src->forwarding);
src = src->forwarding;
if ((src->flags & BLOCK_REFCOUNT_MASK) == 0) if ((src->flags & BLOCK_REFCOUNT_MASK) == 0)
{ {
@ -352,16 +354,17 @@ void _Block_object_assign(void *destAddr, const void *object, const int flags)
fprintf(stderr, "Flags for block: %p: %d (refcount %x)\n", *dst, (*dst)->flags, (*dst)->flags & BLOCK_REFCOUNT_MASK); fprintf(stderr, "Flags for block: %p: %d (refcount %x)\n", *dst, (*dst)->flags, (*dst)->flags & BLOCK_REFCOUNT_MASK);
} }
} }
else if((flags & BLOCK_FIELD_IS_BLOCK) == BLOCK_FIELD_IS_BLOCK) else if (IS_SET(flags, BLOCK_FIELD_IS_BLOCK))
{ {
struct block_literal *src = (struct block_literal*)object; struct block_literal *src = (struct block_literal*)object;
struct block_literal **dst = destAddr; struct block_literal **dst = destAddr;
*dst = Block_copy(src); *dst = Block_copy(src);
} }
else if ((flags & BLOCK_FIELD_IS_OBJECT) == BLOCK_FIELD_IS_OBJECT) else if (IS_SET(flags, BLOCK_FIELD_IS_OBJECT) &&
!IS_SET(flags, BLOCK_BYREF_CALLER))
{ {
fprintf(stderr, "-retain\n"); fprintf(stderr, "[%p -retain]\n", object);
id src = (id)object; id src = (id)object;
void **dst = destAddr; void **dst = destAddr;
*dst = src; *dst = src;
@ -392,7 +395,7 @@ void _Block_object_dispose(const void *object, const int flags)
} }
//else //else
{ {
if(flags & BLOCK_FIELD_IS_BYREF) if (IS_SET(flags, BLOCK_FIELD_IS_BYREF))
{ {
struct block_byref_obj *src = struct block_byref_obj *src =
(struct block_byref_obj*)object; (struct block_byref_obj*)object;
@ -405,8 +408,10 @@ void _Block_object_dispose(const void *object, const int flags)
{ {
if (0 != src->byref_dispose) if (0 != src->byref_dispose)
{ {
fprintf(stderr, "Calling byref dispose\n");
src->byref_dispose(src); src->byref_dispose(src);
} }
fprintf(stderr, "Freeing %p\n", src);
gc->free(src); gc->free(src);
} }
} }
@ -432,16 +437,18 @@ void _Block_object_dispose(const void *object, const int flags)
} }
} }
} }
else if ((flags & BLOCK_FIELD_IS_BLOCK) == BLOCK_FIELD_IS_BLOCK) else if (IS_SET(flags, BLOCK_FIELD_IS_BLOCK))
{ {
struct block_literal *src = (struct block_literal*)object; struct block_literal *src = (struct block_literal*)object;
Block_release(src); Block_release(src);
} }
else if((flags & BLOCK_FIELD_IS_OBJECT) == BLOCK_FIELD_IS_OBJECT) else if (IS_SET(flags, BLOCK_FIELD_IS_OBJECT) &&
!IS_SET(flags, BLOCK_BYREF_CALLER))
{ {
id src = (id)object; id src = (id)object;
if (!isGCEnabled) if (!isGCEnabled)
{ {
fprintf(stderr, "Sending release message to %p\n", src);
[src release]; [src release];
} }
} }

Loading…
Cancel
Save