|
|
|
|
@ -77,7 +77,7 @@ struct psy_block_byref_obj {
|
|
|
|
|
struct psy_block_byref_obj *forwarding;
|
|
|
|
|
int flags; //refcount;
|
|
|
|
|
int size;
|
|
|
|
|
void (*byref_keep)(struct psy_block_byref_obj *dst, struct psy_block_byref_obj *src);
|
|
|
|
|
void (*byref_keep)(struct psy_block_byref_obj *dst, const struct psy_block_byref_obj *src);
|
|
|
|
|
void (*byref_dispose)(struct psy_block_byref_obj *);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -88,7 +88,7 @@ struct psy_block_byref_obj {
|
|
|
|
|
* the other choices which are mutually exclusive. Only in a Block copy helper
|
|
|
|
|
* will one see BLOCK_FIELD_IS_BYREF.
|
|
|
|
|
*/
|
|
|
|
|
void _Block_object_assign(void *destAddr, void *object, const int flags)
|
|
|
|
|
void _Block_object_assign(void *destAddr, const void *object, const int flags)
|
|
|
|
|
{
|
|
|
|
|
//printf("Copying %x to %x with flags %x\n", object, destAddr, flags);
|
|
|
|
|
// FIXME: Needs to be implemented
|
|
|
|
|
@ -99,7 +99,7 @@ void _Block_object_assign(void *destAddr, void *object, const int flags)
|
|
|
|
|
{
|
|
|
|
|
if(flags & BLOCK_FIELD_IS_BYREF)
|
|
|
|
|
{
|
|
|
|
|
struct psy_block_byref_obj *src = object;
|
|
|
|
|
const struct psy_block_byref_obj *src = object;
|
|
|
|
|
struct psy_block_byref_obj **dst = destAddr;
|
|
|
|
|
|
|
|
|
|
/* I followed Apple's specs saying byref's "flags" field should
|
|
|
|
|
@ -119,13 +119,13 @@ void _Block_object_assign(void *destAddr, void *object, const int flags)
|
|
|
|
|
src->byref_keep(*dst, src);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else *dst = src;
|
|
|
|
|
else *dst = (struct psy_block_byref_obj*)src;
|
|
|
|
|
|
|
|
|
|
(*dst)->flags++;
|
|
|
|
|
}
|
|
|
|
|
else if((flags & BLOCK_FIELD_IS_BLOCK) == BLOCK_FIELD_IS_BLOCK)
|
|
|
|
|
{
|
|
|
|
|
struct psy_block_literal *src = object;
|
|
|
|
|
struct psy_block_literal *src = (struct psy_block_literal*)object;
|
|
|
|
|
struct psy_block_literal **dst = destAddr;
|
|
|
|
|
|
|
|
|
|
*dst = Block_copy(src);
|
|
|
|
|
@ -145,7 +145,7 @@ void _Block_object_assign(void *destAddr, void *object, const int flags)
|
|
|
|
|
* The same flags used in the copy helper should be used for each call
|
|
|
|
|
* generated to this function:
|
|
|
|
|
*/
|
|
|
|
|
void _Block_object_dispose(void *object, const int flags)
|
|
|
|
|
void _Block_object_dispose(const void *object, const int flags)
|
|
|
|
|
{
|
|
|
|
|
// FIXME: Needs to be implemented
|
|
|
|
|
if(flags & BLOCK_FIELD_IS_WEAK)
|
|
|
|
|
@ -155,7 +155,8 @@ void _Block_object_dispose(void *object, const int flags)
|
|
|
|
|
{
|
|
|
|
|
if(flags & BLOCK_FIELD_IS_BYREF)
|
|
|
|
|
{
|
|
|
|
|
struct psy_block_byref_obj *src = object;
|
|
|
|
|
struct psy_block_byref_obj *src =
|
|
|
|
|
(struct psy_block_byref_obj*)object;
|
|
|
|
|
|
|
|
|
|
src->flags--;
|
|
|
|
|
if((src->flags & ~BLOCK_HAS_COPY_DISPOSE) == 0)
|
|
|
|
|
@ -168,7 +169,7 @@ void _Block_object_dispose(void *object, const int flags)
|
|
|
|
|
}
|
|
|
|
|
else if((flags & ~BLOCK_BYREF_CALLER) == BLOCK_FIELD_IS_BLOCK)
|
|
|
|
|
{
|
|
|
|
|
struct psy_block_literal *src = object;
|
|
|
|
|
struct psy_block_literal *src = (struct psy_block_literal*)object;
|
|
|
|
|
Block_release(src);
|
|
|
|
|
}
|
|
|
|
|
else if((flags & ~BLOCK_BYREF_CALLER) == BLOCK_FIELD_IS_OBJECT)
|
|
|
|
|
|