diff options
author | Matthias Benkard <mulk@minimulk.mst-plus> | 2008-08-16 22:51:22 +0200 |
---|---|---|
committer | Matthias Benkard <mulk@minimulk.mst-plus> | 2008-08-16 22:51:22 +0200 |
commit | 5cd4de577c08637cb5d78d1c3376b1ff80e74065 (patch) | |
tree | c9e0e279f0c95b5f7fc5c691821344cb2e5d3ce4 /MLKCompiledClosure.m | |
parent | d858e84c0778dc1851b3a0e324caaf0bef05f274 (diff) | |
parent | 3f11cb6b3ddd03d3211dd355cbac23884fa5a6e3 (diff) |
Merge branch 'master' of http://matthias.benkard.de/code/mulklisp
Diffstat (limited to 'MLKCompiledClosure.m')
-rw-r--r-- | MLKCompiledClosure.m | 34 |
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 |