#include <stdio.h>
#include <Block_private.h>
#include "test.h"
int AssignCalled = 0;
int DisposeCalled = 0;
void _Block_object_assign(void *destAddr __unused, const void *object __unused, const int isWeak __unused) {
AssignCalled = 1;
}
void _Block_object_dispose(const void *object __unused, const int isWeak __unused) {
DisposeCalled = 1;
}
struct MyStruct {
long isa;
long field;
};
typedef struct MyStruct *__attribute__((NSObject)) MyStruct_t;
int main() {
struct MyStruct X;
MyStruct_t xp = (MyStruct_t)&X;
xp->field = 10;
void (^myBlock)(void) = ^{ printf("field is %ld\n", xp->field); };
struct Block_layout *bl = (struct Block_layout *)(void *)myBlock;
if ((bl->flags & BLOCK_HAS_COPY_DISPOSE) != BLOCK_HAS_COPY_DISPOSE) {
fail("no copy dispose!!!!");
}
long destBuffer[256];
struct Block_descriptor_2 *desc2 =
(struct Block_descriptor_2 *)(bl->descriptor + 1);
desc2->copy(destBuffer, bl);
desc2->dispose(bl);
if (AssignCalled == 0) {
fail("did not call assign helper!");
}
if (DisposeCalled == 0) {
fail("did not call dispose helper");
}
succeed(__FILE__);
}