summaryrefslogtreecommitdiff
path: root/MLKCompiledClosure.m
diff options
context:
space:
mode:
authorMatthias Benkard <mulk@minimulk.mst-plus>2008-08-16 22:51:22 +0200
committerMatthias Benkard <mulk@minimulk.mst-plus>2008-08-16 22:51:22 +0200
commit5cd4de577c08637cb5d78d1c3376b1ff80e74065 (patch)
treec9e0e279f0c95b5f7fc5c691821344cb2e5d3ce4 /MLKCompiledClosure.m
parentd858e84c0778dc1851b3a0e324caaf0bef05f274 (diff)
parent3f11cb6b3ddd03d3211dd355cbac23884fa5a6e3 (diff)
Merge branch 'master' of http://matthias.benkard.de/code/mulklisp
Diffstat (limited to 'MLKCompiledClosure.m')
-rw-r--r--MLKCompiledClosure.m34
1 files changed, 21 insertions, 13 deletions
diff --git a/MLKCompiledClosure.m b/MLKCompiledClosure.m
index 5dbf6dd..73f308b 100644
--- a/MLKCompiledClosure.m
+++ b/MLKCompiledClosure.m
@@ -38,10 +38,7 @@
_data = data;
_dataLength = dataLength;
- _ownPointer = YES;
-
- _code = malloc (sizeof (id (*)()));
- *_code = code;
+ _code = code;
for (i = 0; i < _dataLength; i++)
{
@@ -75,7 +72,7 @@
for (i = 1; i < argc - 1; i++)
{
arg_types[i] = &ffi_type_pointer;
- argpointers[i-1] = denullify([arguments objectAtIndex:i]);
+ argpointers[i-1] = denullify([arguments objectAtIndex:(i-1)]);
argv[i] = &argpointers[i-1];
}
@@ -89,9 +86,15 @@
format:@"FFI type is invalid (this is probably a bug)."];
}
- ffi_call (&cif, FFI_FN (*_code), &return_value, (void**)argv);
+// NSLog (@"Calling %p (argc = %d)", _code, argc);
+// for (i = 0; i < argc; i++)
+// {
+// NSLog (@"Argument %d: %p", i, *((void**)argv[i]));
+// }
+
+ ffi_call (&cif, FFI_FN (_code), &return_value, (void**)argv);
- // FIXME
+ // FIXME: multiple values
return [NSArray arrayWithObject:nullify(return_value)];
}
@@ -105,22 +108,27 @@
return [NSString stringWithFormat:@"<Compiled closure @%p>", self];
}
+-(id (*)()) code
+{
+ return _code;
+}
+
+-(void *) closureData
+{
+ return _data;
+}
+
-(void) dealloc
{
int i;
[super dealloc];
- // FIXME: Decrease refcount of *_code. Note: When releasing *_code,
- // also release _code regardless of whether we own it.
-
+ // FIXME: Decrease refcount of _code.
for (i = 0; i < _dataLength; i++)
{
LRELEASE (_data[i]);
}
free (_data);
-
- if (_ownPointer)
- free (_code);
}
@end