ExternalLibraryFunction.st
changeset 24046 6cf8161ea948
parent 23834 3edb64074d7b
child 24048 1839f4b8eb2e
--- a/ExternalLibraryFunction.st	Wed Apr 03 16:15:40 2019 +0200
+++ b/ExternalLibraryFunction.st	Wed Apr 03 18:17:17 2019 +0200
@@ -187,19 +187,19 @@
 
 example
 "
-                                                                [exBegin]
-        |f|
-
-        f := ExternalLibraryFunction new.
-        f beCallTypeWINAPI.
-
-        f name:'MessageBeep'
-          module:'user32.dll'
-          returnType:#boolean
-          argumentTypes:#(uint).
-
-        f invokeWith:1.
-                                                                [exEnd]
+								[exBegin]
+	|f|
+
+	f := ExternalLibraryFunction new.
+	f beCallTypeWINAPI.
+
+	f name:'MessageBeep'
+	  module:'user32.dll'
+	  returnType:#boolean
+	  argumentTypes:#(uint).
+
+	f invokeWith:1.
+								[exEnd]
 
   Synchronous vs. Asynchronous calls:
 
@@ -210,38 +210,38 @@
     Therefore, the following will block all ST/X activity for 10 seconds
     (try interacting with the launcher while the Sleep is performing):
 
-                                                                [exBegin]
-        |f|
-
-        f := ExternalLibraryFunction new.
-        f beCallTypeWINAPI.
-
-        f name:'Sleep'
-          module:'kernel32.dll'
-          returnType:#void
-          argumentTypes:#(uint).
-
-        f invokeWith:10000.
-                                                                [exEnd]
+								[exBegin]
+	|f|
+
+	f := ExternalLibraryFunction new.
+	f beCallTypeWINAPI.
+
+	f name:'Sleep'
+	  module:'kernel32.dll'
+	  returnType:#void
+	  argumentTypes:#(uint).
+
+	f invokeWith:10000.
+								[exEnd]
 
     if you know what you do and you do not pass any possibly moving objects (such as strings) as argument,
     the call can be made asynchronous. In that case, ONLY the calling thread will be blocked; all other smalltalk
     threads will continue to execute.
     (try interacting now with the launcher while the Sleep is performing):
-                                                                [exBegin]
-        |f|
-
-        f := ExternalLibraryFunction new.
-        f beCallTypeWINAPI.
-        f beAsync.
-
-        f name:'Sleep'
-          module:'kernel32.dll'
-          returnType:#void
-          argumentTypes:#(uint).
-
-        f invokeWith:10000.
-                                                                [exEnd]
+								[exBegin]
+	|f|
+
+	f := ExternalLibraryFunction new.
+	f beCallTypeWINAPI.
+	f beAsync.
+
+	f name:'Sleep'
+	  module:'kernel32.dll'
+	  returnType:#void
+	  argumentTypes:#(uint).
+
+	f invokeWith:10000.
+								[exEnd]
 
 "
 ! !
@@ -250,9 +250,9 @@
 
 name:functionName module:moduleName callType:callTypeSymbol returnType:returnType argumentTypes:argTypes
     ^ self new
-        name:functionName module:moduleName
-        returnType:returnType argumentTypes:argTypes;
-        callType:callTypeSymbol
+	name:functionName module:moduleName
+	returnType:returnType argumentTypes:argTypes;
+	callType:callTypeSymbol
 
     "Created: / 04-03-2019 / 11:00:57 / Claus Gittinger"
 !
@@ -275,9 +275,9 @@
     oldPath := self dllPath.
     oldPath isNil ifTrue:[ oldPath := OrderedCollection new ].
     (oldPath includes:aDirectoryPathName) ifFalse:[
-        newPath := oldPath asOrderedCollection.
-        newPath add:aDirectoryPathName.
-        self dllPath:newPath
+	newPath := oldPath asOrderedCollection.
+	newPath add:aDirectoryPathName.
+	self dllPath:newPath
     ]
 
     "
@@ -294,13 +294,13 @@
     try := [:dir | dir asFilename exists ifTrue:[path add:dir]].
 
     OperatingSystem isUNIXlike ifTrue:[
-        #( 
-            '/lib'
-            '/usr/lib'
-            '/usr/local/lib'
-            '/opt/lib'
-            '/opt/local/lib'
-        ) do:try
+	#(
+	    '/lib'
+	    '/usr/lib'
+	    '/usr/local/lib'
+	    '/opt/lib'
+	    '/opt/local/lib'
+	) do:try
     ].
     ^ path
 
@@ -334,15 +334,15 @@
 dllMapping:aDictionary
     "allows for dll's to be replaced,
      for example, if you want to use the mozilla sqlite dll
-        C:\Program Files\Mozilla Firefox\mozsqlite3.dll
+	C:\Program Files\Mozilla Firefox\mozsqlite3.dll
      for the sqlite3, execute:
-        ExternalLibraryFunction
-            dllMapping at:'sqlite3'
-            put: 'C:\Program Files\Mozilla Firefox\mozsqlite3.dll'
+	ExternalLibraryFunction
+	    dllMapping at:'sqlite3'
+	    put: 'C:\Program Files\Mozilla Firefox\mozsqlite3.dll'
      for mingw:
-        ExternalLibraryFunction
-            dllMapping at:'sqlite3'
-            put:'C:\mingw64\opt\bin\libsqlite3-0.dll'
+	ExternalLibraryFunction
+	    dllMapping at:'sqlite3'
+	    put:'C:\mingw64\opt\bin\libsqlite3-0.dll'
     "
 
     DllMapping := aDictionary
@@ -397,9 +397,9 @@
 
 flushModuleHandlesForWhich:aBlock
     self allInstancesDo:[:fn |
-        (aBlock value:fn) ifTrue:[
-            fn setModuleHandle:nil.
-        ]
+	(aBlock value:fn) ifTrue:[
+	    fn setModuleHandle:nil.
+	]
     ].
 
     "
@@ -413,7 +413,7 @@
     "using inline access to corresponding c--defines to avoid duplicate places of knowledge"
 
     DLLPATH isNil ifTrue:[
-        DLLPATH := self defaultDLLPath.
+	DLLPATH := self defaultDLLPath.
     ].
 %{
 #ifndef __SCHTEAM__
@@ -449,7 +449,7 @@
 
     oldPath := self dllPath.
     oldPath notNil ifTrue:[
-        self dllPath:(oldPath copyWithout:aDirectoryPathName)
+	self dllPath:(oldPath copyWithout:aDirectoryPathName)
     ].
 
     "
@@ -506,24 +506,24 @@
 
 invokeSelectors
     ^ #(
-        #'invoke'
-        #'invokeWith:'
-        #'invokeWith:with:'
-        #'invokeWith:with:with:'
-        #'invokeWith:with:with:with:'
-        #'invokeWithArguments:'
-        #'invokeCPPVirtualOn:'
-        #'invokeCPPVirtualOn:with:'
-        #'invokeCPPVirtualOn:with:with:'
-        #'invokeCPPVirtualOn:with:with:with:'
-        #'invokeCPPVirtualOn:with:with:with:with:'
-        #'invokeCPPVirtualOn:withArguments:'
-        #'invokeObjCOn:'
-        #'invokeObjCOn:with:'
-        #'invokeObjCOn:with:with:'
-        #'invokeObjCOn:with:with:with:'
-        #'invokeObjCOn:with:with:with:with:'
-        #'invokeObjCOn:withArguments:'
+	#'invoke'
+	#'invokeWith:'
+	#'invokeWith:with:'
+	#'invokeWith:with:with:'
+	#'invokeWith:with:with:with:'
+	#'invokeWithArguments:'
+	#'invokeCPPVirtualOn:'
+	#'invokeCPPVirtualOn:with:'
+	#'invokeCPPVirtualOn:with:with:'
+	#'invokeCPPVirtualOn:with:with:with:'
+	#'invokeCPPVirtualOn:with:with:with:with:'
+	#'invokeCPPVirtualOn:withArguments:'
+	#'invokeObjCOn:'
+	#'invokeObjCOn:with:'
+	#'invokeObjCOn:with:with:'
+	#'invokeObjCOn:with:with:with:'
+	#'invokeObjCOn:with:with:with:with:'
+	#'invokeObjCOn:withArguments:'
     )
 
     "Created: / 04-03-2019 / 09:35:51 / Claus Gittinger"
@@ -547,10 +547,10 @@
 
 ffiTypeSymbolForType:aType
     "map aType to one of the ffi-supported ones:
-        sint8, sint16, sint32, sint64
-        uint8, uint16, uint32, uint64
-        long ulong int uint
-        bool float double void pointer handle
+	sint8, sint16, sint32, sint64
+	uint8, uint16, uint32, uint64
+	long ulong int uint
+	bool float double void pointer handle
     "
 
     aType == #sint8           ifTrue:[^ aType ].
@@ -630,17 +630,17 @@
     aType == #SIZE_T          ifTrue:[^ ExternalBytes sizeofPointer == 8 ifTrue:[#uint64] ifFalse:[#uint32]].
 
     (aType isString or:[aType isSymbol]) ifFalse:[
-        CType isNil ifTrue:[
-            self error:'unknown type'.
-        ].
-        ^ aType typeSymbol.
+	CType isNil ifTrue:[
+	    self error:'unknown type'.
+	].
+	^ aType typeSymbol.
     ].
 
     (aType endsWith:'*') ifTrue:[
-        ^ #pointer.
+	^ #pointer.
     ].
     (aType endsWith:'Pointer') ifTrue:[
-        ^ #pointer.
+	^ #pointer.
     ].
     ^ aType
 
@@ -769,25 +769,25 @@
 
 callType:aSymbol
     (aSymbol sameAs:'api') ifTrue:[
-        self beCallTypeAPI.
-        ^ self.
+	self beCallTypeAPI.
+	^ self.
     ].
     (aSymbol sameAs:'ole') ifTrue:[
-        self beCallTypeOLE.
-        ^ self.
+	self beCallTypeOLE.
+	^ self.
     ].
     (aSymbol sameAs:'c') ifTrue:[
-        self beCallTypeC.
-        ^ self.
+	self beCallTypeC.
+	^ self.
     ].
     (aSymbol sameAs:'objc') ifTrue:[
-        self beObjectiveC.
-        ^ self.
+	self beObjectiveC.
+	^ self.
     ].
     (aSymbol sameAs:'virtualCPP') ifTrue:[
-        self beCallTypeC.
-        self beVirtualCPP.
-        ^ self.
+	self beCallTypeC.
+	self beVirtualCPP.
+	^ self.
     ].
     self error:'unknown calltype'
 
@@ -914,7 +914,7 @@
     "call the function with no arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
     ^ self invokeFFIwithArguments:nil forInstance:nil
 
@@ -923,9 +923,9 @@
 
 invokeCPPVirtualOn:anInstance
     "call a CPP virtual function with no arguments"
-    
+
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
     ^ self invokeFFIwithArguments:nil forInstance:anInstance
 
@@ -936,11 +936,11 @@
     "call a CPP virtual function with 1 argument"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
-    ^ self 
-        invokeFFIwithArguments:(Array with:arg) 
-        forInstance:anInstance
+    ^ self
+	invokeFFIwithArguments:(Array with:arg)
+	forInstance:anInstance
 
     "Modified (comment): / 04-03-2019 / 09:39:34 / Claus Gittinger"
 !
@@ -949,11 +949,11 @@
     "call a CPP virtual function with 2 arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
-    ^ self 
-        invokeFFIwithArguments:(Array with:arg1 with:arg2) 
-        forInstance:anInstance
+    ^ self
+	invokeFFIwithArguments:(Array with:arg1 with:arg2)
+	forInstance:anInstance
 
     "Modified (comment): / 04-03-2019 / 09:39:38 / Claus Gittinger"
 !
@@ -962,11 +962,11 @@
     "call a CPP virtual function with 3 arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
-    ^ self 
-        invokeFFIwithArguments:(Array with:arg1 with:arg2 with:arg3) 
-        forInstance:anInstance
+    ^ self
+	invokeFFIwithArguments:(Array with:arg1 with:arg2 with:arg3)
+	forInstance:anInstance
 
     "Modified (comment): / 04-03-2019 / 09:39:43 / Claus Gittinger"
 !
@@ -975,11 +975,11 @@
     "call a CPP virtual function with 4 arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
-    ^ self 
-        invokeFFIwithArguments:(Array with:arg1 with:arg2 with:arg3 with:arg4) 
-        forInstance:anInstance
+    ^ self
+	invokeFFIwithArguments:(Array with:arg1 with:arg2 with:arg3 with:arg4)
+	forInstance:anInstance
 
     "Modified (comment): / 04-03-2019 / 09:39:48 / Claus Gittinger"
 !
@@ -988,11 +988,11 @@
     "call a CPP virtual function with up to maxArgs (15) arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
-    ^ self 
-        invokeFFIwithArguments:args 
-        forInstance:anInstance
+    ^ self
+	invokeFFIwithArguments:args
+	forInstance:anInstance
 
     "Modified (comment): / 04-03-2019 / 09:39:57 / Claus Gittinger"
 !
@@ -1001,7 +1001,7 @@
     "call an ObjC method with no arguments"
 
     self hasCode ifFalse:[
-        self prepareObjCInvoke.
+	self prepareObjCInvoke.
     ].
     ^ self invokeFFIwithArguments:nil forInstance:anInstance
 
@@ -1012,7 +1012,7 @@
     "call an ObjC method with up to maxArgs (15) arguments"
 
     self hasCode ifFalse:[
-        self prepareObjCInvoke.
+	self prepareObjCInvoke.
     ].
     ^ self invokeFFIwithArguments:args forInstance:anInstance
 
@@ -1023,7 +1023,7 @@
     "call the function with 1 argument"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
     ^ self invokeFFIwithArguments:(Array with:arg) forInstance:nil
 
@@ -1034,7 +1034,7 @@
     "call the function with 2 arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
     ^ self invokeFFIwithArguments:(Array with:arg1 with:arg2) forInstance:nil
 
@@ -1045,7 +1045,7 @@
     "call the function with 3 arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
     ^ self invokeFFIwithArguments:(Array with:arg1 with:arg2 with:arg3) forInstance:nil
 
@@ -1056,7 +1056,7 @@
     "call the function with 4 arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
     ^ self invokeFFIwithArguments:(Array with:arg1 with:arg2 with:arg3 with:arg4) forInstance:nil
 
@@ -1067,7 +1067,7 @@
     "call the function with up to maxArgs (15) arguments"
 
     self hasCode ifFalse:[
-        self prepareInvoke.
+	self prepareInvoke.
     ].
     ^ self invokeFFIwithArguments:argArray forInstance:nil
 
@@ -1080,26 +1080,26 @@
 printOn:aStream
     aStream nextPut:$<.
     self isCallTypeAPI ifTrue:[
-        'API: ' printOn:aStream.
+	'API: ' printOn:aStream.
     ] ifFalse:[
-        self isCallTypeOLE ifTrue:[
-            'OLE: ' printOn:aStream.
-        ] ifFalse:[
-            self isCallTypeC ifTrue:[
-                'C: ' printOn:aStream.
-            ] ifFalse:[
-                self isObjectiveC ifTrue:[
-                    'ObjC: #' printOn:aStream.
-                ] ifFalse:[    
-                    aStream nextPutAll:'Error: unknown call type '.
-                ].
-            ].
-        ].
+	self isCallTypeOLE ifTrue:[
+	    'OLE: ' printOn:aStream.
+	] ifFalse:[
+	    self isCallTypeC ifTrue:[
+		'C: ' printOn:aStream.
+	    ] ifFalse:[
+		self isObjectiveC ifTrue:[
+		    'ObjC: #' printOn:aStream.
+		] ifFalse:[
+		    aStream nextPutAll:'Error: unknown call type '.
+		].
+	    ].
+	].
     ].
     name printOn:aStream.
     moduleName notNil ifTrue:[
-        aStream nextPutAll:' module:'.
-        moduleName printOn:aStream.
+	aStream nextPutAll:' module:'.
+	moduleName printOn:aStream.
     ].
     aStream nextPut:$>.
 
@@ -1125,16 +1125,16 @@
 
 convertArgument:arg
     "a chance to convert arguments to one of the primitive (native) types."
-    
+
     CDatum notNil ifTrue:[
-        arg isCDatum ifTrue:[
-            arg offset == 0 ifTrue:[
-                ^ (arg data)
-            ].
-            arg data isExternalBytes ifTrue:[
-                ^ ExternalAddress newAddress:(arg data address + arg offset).
-            ].    
-        ].
+	arg isCDatum ifTrue:[
+	    arg offset == 0 ifTrue:[
+		^ (arg data)
+	    ].
+	    arg data isExternalBytes ifTrue:[
+		^ ExternalAddress newAddress:(arg data address + arg offset).
+	    ].
+	].
     ].
     ^ arg.
 
@@ -1148,50 +1148,50 @@
     |handle moduleNameUsed functionName|
 
     name isNumber ifTrue:[
-        self isCPPFunction ifTrue:[
-            "/ no need to load a dll.
-            ^ self
-        ]
+	self isCPPFunction ifTrue:[
+	    "/ no need to load a dll.
+	    ^ self
+	]
     ].
     self isObjectiveC ifTrue:[
-        "/ no need for a library - we will get the receiver
-        ^ self.
+	"/ no need for a library - we will get the receiver
+	^ self.
     ].
-    
+
     "/ in some other smalltalks, there is no moduleName in the ffi-spec;
     "/ instead, the class provides the libraryName...
     (moduleNameUsed := moduleName) isNil ifTrue:[
-        owningClass notNil ifTrue:[
-            moduleNameUsed := owningClass theNonMetaclass perform:#libraryName ifNotUnderstood:nil.
-        ].
-        moduleNameUsed isNil ifTrue:[
-            self error:'Missing shared library name'.
-        ].
-        moduleNameUsed := moduleNameUsed asSymbol.
+	owningClass notNil ifTrue:[
+	    moduleNameUsed := owningClass theNonMetaclass perform:#libraryName ifNotUnderstood:nil.
+	].
+	moduleNameUsed isNil ifTrue:[
+	    self error:'Missing shared library name'.
+	].
+	moduleNameUsed := moduleNameUsed asSymbol.
     ].
     moduleHandle isNil ifTrue:[
-        "/ speedup. in 95% of all calls, the same moduleName is resolved here
-        (LastModuleHandleHolder isNil
-        or:[ (handle := LastModuleHandleHolder at:1) isNil
-        or:[ handle == -1
-        or:[ LastModuleHandleName ~= moduleNameUsed ]]]) ifTrue:[
-
-            handle := self loadLibrary:moduleNameUsed.
-            LastModuleHandleHolder := WeakArray with:handle.
-            LastModuleHandleName := moduleNameUsed.
-        ].
-        self assert:(handle isInteger not).
-        moduleHandle := handle.
+	"/ speedup. in 95% of all calls, the same moduleName is resolved here
+	(LastModuleHandleHolder isNil
+	or:[ (handle := LastModuleHandleHolder at:1) isNil
+	or:[ handle == -1
+	or:[ LastModuleHandleName ~= moduleNameUsed ]]]) ifTrue:[
+
+	    handle := self loadLibrary:moduleNameUsed.
+	    LastModuleHandleHolder := WeakArray with:handle.
+	    LastModuleHandleName := moduleNameUsed.
+	].
+	self assert:(handle isInteger not).
+	moduleHandle := handle.
     ].
     name isNumber ifFalse:[
-        functionName := name.
-        (moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
-            (moduleHandle getFunctionAddress:('_', functionName) into:self) isNil ifTrue:[
-                moduleHandle := nil.
-                LastModuleHandleHolder := LastModuleHandleName := nil.
-                ObjectFileLoader::ObjectFileLoadError raiseRequestErrorString:'Missing function: "', name, '" in shared library: "', moduleNameUsed, '"'.
-            ].
-        ].
+	functionName := name.
+	(moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
+	    (moduleHandle getFunctionAddress:('_', functionName) into:self) isNil ifTrue:[
+		moduleHandle := nil.
+		LastModuleHandleHolder := LastModuleHandleName := nil.
+		ObjectFileLoader::ObjectFileLoadError raiseRequestErrorString:'Missing function: "', name, '" in shared library: "', moduleNameUsed, '"'.
+	    ].
+	].
     ].
 
     "Modified: / 04-08-2017 / 20:10:41 / cg"
@@ -1210,18 +1210,18 @@
     |handle nameString filename dllPaths hasSuffix|
 
     ObjectFileLoader isNil ifTrue:[
-        "no libcomp loaded"
-        ^ self primitiveFailed:'libcomp:ObjectFileLoader is not available'.
+	"no libcomp loaded"
+	^ self primitiveFailed:'libcomp:ObjectFileLoader is not available'.
     ].
 
     (ObjectFileLoader notNil and:[ObjectFileLoader canLoadObjectFiles]) ifFalse:[
-        ObjectFileLoader::ObjectFileLoadError raiseErrorString:('ObjectFileLoader cannot load dll/module: "%1"' bindWith:nameString)e.
-        ^ nil.
+	ObjectFileLoader::ObjectFileLoadError raiseErrorString:('ObjectFileLoader cannot load dll/module: "%1"' bindWith:nameString)e.
+	^ nil.
     ].
 
     filename := dllName.
     DllMapping notNil ifTrue:[
-        filename := DllMapping at:filename ifAbsent:[ filename ]
+	filename := DllMapping at:filename ifAbsent:[ filename ]
     ].
 
     filename := filename asFilename.
@@ -1229,49 +1229,49 @@
     "try to load, maybe the system knows where to find the dll"
     handle := ObjectFileLoader loadDynamicObject:filename.
     handle notNil ifTrue:[
-        ^ handle
+	^ handle
     ].
 
     nameString := filename name.
     hasSuffix := filename suffix notEmpty.
 
     filename isAbsolute ifTrue:[
-        hasSuffix ifFalse:[
-            "/ try again with the OS-specific dll-extension
-            ObjectFileLoader sharedLibrarySuffixes do:[:eachPossibleSuffix |
-                handle := ObjectFileLoader loadDynamicObject:(filename withSuffix:eachPossibleSuffix).
-                handle notNil ifTrue:[
-                    ^ handle
-                ].
-            ].    
-        ].
+	hasSuffix ifFalse:[
+	    "/ try again with the OS-specific dll-extension
+	    ObjectFileLoader sharedLibrarySuffixes do:[:eachPossibleSuffix |
+		handle := ObjectFileLoader loadDynamicObject:(filename withSuffix:eachPossibleSuffix).
+		handle notNil ifTrue:[
+		    ^ handle
+		].
+	    ].
+	].
     ] ifFalse:[
-        "First ask the class defining the ExternalFunction for the location of the dlls ..."
-        dllPaths := #().
-        owningClass notNil ifTrue:[
-            dllPaths := owningClass dllPath.
-        ].
-        ".. then ask the system .. and the settings"
-        dllPaths := dllPaths, self class dllPath, UserPreferences current dllPath.
-
-        dllPaths do:[:eachDirectory |
-            |libraryName|
-
-            libraryName := eachDirectory asFilename construct:nameString.
-            hasSuffix ifTrue:[
-                handle := ObjectFileLoader loadDynamicObject:libraryName.
-                handle notNil ifTrue:[
-                    ^ handle
-                ].
-            ] ifFalse:[        
-                ObjectFileLoader sharedLibrarySuffixes do:[:eachPossibleSuffix |
-                    handle := ObjectFileLoader loadDynamicObject:(libraryName withSuffix:eachPossibleSuffix).
-                    handle notNil ifTrue:[
-                        ^ handle
-                    ].
-                ].    
-            ].
-        ].
+	"First ask the class defining the ExternalFunction for the location of the dlls ..."
+	dllPaths := #().
+	owningClass notNil ifTrue:[
+	    dllPaths := owningClass dllPath.
+	].
+	".. then ask the system .. and the settings"
+	dllPaths := dllPaths, self class dllPath, UserPreferences current dllPath.
+
+	dllPaths do:[:eachDirectory |
+	    |libraryName|
+
+	    libraryName := eachDirectory asFilename construct:nameString.
+	    hasSuffix ifTrue:[
+		handle := ObjectFileLoader loadDynamicObject:libraryName.
+		handle notNil ifTrue:[
+		    ^ handle
+		].
+	    ] ifFalse:[
+		ObjectFileLoader sharedLibrarySuffixes do:[:eachPossibleSuffix |
+		    handle := ObjectFileLoader loadDynamicObject:(libraryName withSuffix:eachPossibleSuffix).
+		    handle notNil ifTrue:[
+			^ handle
+		    ].
+		].
+	    ].
+	].
     ].
 
 
@@ -1284,7 +1284,7 @@
     "/ eg: self class dllMapping at:'libtesseract' put:('/opt/local/lib/libtesseract.dylib').
     "/ see also the settings dialog for external libraries.
     ObjectFileLoader::ObjectFileLoadError
-        raiseErrorString:('Cannot find or load dll/module: "%1" (check dllPath settings)' bindWith:nameString).
+	raiseErrorString:('Cannot find or load dll/module: "%1" (check dllPath settings)' bindWith:nameString).
     ^ nil
 
     "Modified: / 13-02-2017 / 01:14:05 / cg"
@@ -1311,10 +1311,10 @@
 !ExternalLibraryFunction methodsFor:'private-accessing'!
 
 name:functionNameOrVirtualIndex module:aModuleName returnType:aReturnType argumentTypes:argTypes
-    flags := 0.    
+    flags := 0.
     name := functionNameOrVirtualIndex.
     functionNameOrVirtualIndex isNumber ifTrue:[
-        self beVirtualCPP.
+	self beVirtualCPP.
     ].
     moduleName := aModuleName.
     returnType := aReturnType.
@@ -1358,7 +1358,7 @@
     "Modified: / 01-08-2006 / 13:55:35 / cg"
 !
 
-invokeFFIwithArguments:argumentsOrNilIn forInstance:aReceiverOrNil
+invokeFFIwithArguments:argumentsOrNilArg forInstance:aReceiverOrNil
     "basic invoke mechanism. Calls the function represented by the receiver with argumentsOrNil.
      For cplusplus, aReceiverOrNil is required to be an externalStructure like object;
      for objectiveC, it must be an ObjectiveC object"
@@ -1367,43 +1367,43 @@
      virtual objectiveC async unlimitedStack callTypeNumber returnValueClass argValueClass
      oldReturnType oldArgumentTypes mustFreeRetVal alreadyFreed argumentsOrNil|
 
-    argumentsOrNil := argumentsOrNilIn. 
+    argumentsOrNil := argumentsOrNilArg.
     argTypeSymbols := argumentTypes.
     returnTypeSymbol := returnType.
 
     virtual := self isVirtualCPP.
     objectiveC := self isObjectiveC.
     (virtual "or:[self isNonVirtualCPP]") ifTrue:[
-        aReceiverOrNil isNil ifTrue:[
-            "/ must have a c++ object instance
-            self primitiveFailed.
-        ].
-
-        "/ and it must be a kind of ExternalStructure !!
-        (aReceiverOrNil isKindOf:ExternalStructure) ifFalse:[
-            self primitiveFailed.
-        ].
-        virtual ifTrue:[
-            vtOffset := name.
-            (vtOffset between:0 and:10000) ifFalse:[
-                self primitiveFailed.
-            ]
-        ].
+	aReceiverOrNil isNil ifTrue:[
+	    "/ must have a c++ object instance
+	    self primitiveFailed.
+	].
+
+	"/ and it must be a kind of ExternalStructure !!
+	(aReceiverOrNil isKindOf:ExternalStructure) ifFalse:[
+	    self primitiveFailed.
+	].
+	virtual ifTrue:[
+	    vtOffset := name.
+	    (vtOffset between:0 and:10000) ifFalse:[
+		self primitiveFailed.
+	    ]
+	].
     ] ifFalse:[
-        objectiveC ifTrue:[
-            aReceiverOrNil isNil ifTrue:[
-                "/ must have an objective-c object instance
-                self primitiveFailed.
-            ].
-            (aReceiverOrNil isObjectiveCObject) ifFalse:[
-                self primitiveFailed
-            ]
-        ] ifFalse:[
-            aReceiverOrNil notNil ifTrue:[
-                "/ must NOT have a c++/objectiveC object instance
-                self primitiveFailed.
-            ]
-        ].
+	objectiveC ifTrue:[
+	    aReceiverOrNil isNil ifTrue:[
+		"/ must have an objective-c object instance
+		self primitiveFailed.
+	    ].
+	    (aReceiverOrNil isObjectiveCObject) ifFalse:[
+		self primitiveFailed
+	    ]
+	] ifFalse:[
+	    aReceiverOrNil notNil ifTrue:[
+		"/ must NOT have a c++/objectiveC object instance
+		self primitiveFailed.
+	    ]
+	].
     ].
     async := self isAsync.
     unlimitedStack := self isUnlimitedStack.
@@ -1412,9 +1412,9 @@
     alreadyFreed := false.
 
     argumentsOrNil size ~~ 0 ifTrue:[
-        argumentsOrNil := argumentsOrNil collect:[:arg | self convertArgument:arg]
+	argumentsOrNil := argumentsOrNil collect:[:arg | self convertArgument:arg]
     ].
-    
+
     "/ Transcript show:name; show:' async:'; showCR:async.
 
 %{  /* STACK: 100000 */
@@ -1457,14 +1457,14 @@
     int __numFloatOrDoubleArgs = 0;
 
     union u {
-        INT iVal;
-        float fVal;
-        double dVal;
-        void *pointerVal;
+	INT iVal;
+	float fVal;
+	double dVal;
+	void *pointerVal;
 # if 0 && defined(HAS_LONGLONG)
-        long long longLongVal;
+	long long longLongVal;
 # else
-        __int64__ longLongVal;
+	__int64__ longLongVal;
 # endif
     };
     union u __argValuesIncludingThis[MAX_ARGS+1];
@@ -1481,29 +1481,29 @@
 
 #   define __FAIL__(fcode) \
     { \
-        failureCode = fcode; failureArgNr = __mkSmallInteger(i+1); goto getOutOfHere; \
+	failureCode = fcode; failureArgNr = __mkSmallInteger(i+1); goto getOutOfHere; \
     }
 
     if (argumentsOrNil == nil) {
-        __numArgs = 0;
+	__numArgs = 0;
     } else if (__isArrayLike(argumentsOrNil)) {
-        __numArgs = __arraySize(argumentsOrNil);
+	__numArgs = __arraySize(argumentsOrNil);
     } else {
-        __FAIL__(@symbol(BadArgumentVector))
+	__FAIL__(@symbol(BadArgumentVector))
     }
     if (argTypeSymbols == nil) {
-        __numArgsWanted = 0;
+	__numArgsWanted = 0;
     } else if (__isArrayLike(argTypeSymbols)) {
-        __numArgsWanted = __arraySize(argTypeSymbols);
+	__numArgsWanted = __arraySize(argTypeSymbols);
     } else {
-        __FAIL__(@symbol(BadArgumentTypeVector))
+	__FAIL__(@symbol(BadArgumentTypeVector))
     }
 
     if (__numArgs != __numArgsWanted) {
-        __FAIL__(@symbol(ArgumentCountMismatch))
+	__FAIL__(@symbol(ArgumentCountMismatch))
     }
     if (__numArgs > MAX_ARGS) {
-        __FAIL__(@symbol(TooManyArguments))
+	__FAIL__(@symbol(TooManyArguments))
     }
 
     /*
@@ -1512,615 +1512,639 @@
     __returnValuePointer = &__returnValue;
 
     if (returnTypeSymbol == @symbol(voidPointer)) {
-        returnTypeSymbol = @symbol(handle);
+	returnTypeSymbol = @symbol(handle);
     } else if (returnTypeSymbol == @symbol(hresult)) {
-        returnTypeSymbol = @symbol(uint32);
+	returnTypeSymbol = @symbol(uint32);
     }
 
     if (returnTypeSymbol == @symbol(int)) {
-        __returnType = TYPE_SINT;
+	__returnType = TYPE_SINT;
     } else if (returnTypeSymbol == @symbol(uint)) {
-        __returnType = TYPE_UINT;
+	__returnType = TYPE_UINT;
     } else if (returnTypeSymbol == @symbol(uint8)) {
-        __returnType = TYPE_UINT8;
+	__returnType = TYPE_UINT8;
     } else if (returnTypeSymbol == @symbol(uint16)) {
-        __returnType = TYPE_UINT16;
+	__returnType = TYPE_UINT16;
     } else if (returnTypeSymbol == @symbol(uint32)) {
-        __returnType = TYPE_UINT32;
+	__returnType = TYPE_UINT32;
     } else if (returnTypeSymbol == @symbol(uint64)) {
-        __returnType = TYPE_UINT64;
+	__returnType = TYPE_UINT64;
 
     } else if (returnTypeSymbol == @symbol(sint)) {
-        __returnType = TYPE_SINT;
+	__returnType = TYPE_SINT;
     } else if (returnTypeSymbol == @symbol(sint8)) {
-        __returnType = TYPE_SINT8;
+	__returnType = TYPE_SINT8;
     } else if (returnTypeSymbol == @symbol(sint16)) {
-        __returnType = TYPE_SINT16;
+	__returnType = TYPE_SINT16;
     } else if (returnTypeSymbol == @symbol(sint32)) {
-        __returnType = TYPE_SINT32;
+	__returnType = TYPE_SINT32;
     } else if (returnTypeSymbol == @symbol(sint64)) {
-        __returnType = TYPE_SINT64;
+	__returnType = TYPE_SINT64;
 
     } else if (returnTypeSymbol == @symbol(long)) {
-        if (sizeof(long) == 4) {
-           returnTypeSymbol = @symbol(sint32);
-           __returnType = TYPE_SINT32;
-        } else if (sizeof(long) == 8) {
-           returnTypeSymbol = @symbol(sint64);
-           __returnType = TYPE_SINT64;
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (sizeof(long) == 4) {
+	   returnTypeSymbol = @symbol(sint32);
+	   __returnType = TYPE_SINT32;
+	} else if (sizeof(long) == 8) {
+	   returnTypeSymbol = @symbol(sint64);
+	   __returnType = TYPE_SINT64;
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
 
     } else if (returnTypeSymbol == @symbol(ulong)) {
-        if (sizeof(long) == 4) {
-           returnTypeSymbol = @symbol(uint32);
-           __returnType = TYPE_UINT32;
-        }else if (sizeof(long) == 8) {
-           returnTypeSymbol = @symbol(uint64);
-           __returnType = TYPE_UINT64;
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (sizeof(long) == 4) {
+	   returnTypeSymbol = @symbol(uint32);
+	   __returnType = TYPE_UINT32;
+	}else if (sizeof(long) == 8) {
+	   returnTypeSymbol = @symbol(uint64);
+	   __returnType = TYPE_UINT64;
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
 
     } else if (returnTypeSymbol == @symbol(bool)) {
-        __returnType = TYPE_UINT;
+	__returnType = TYPE_UINT;
 
     } else if (returnTypeSymbol == @symbol(float)) {
-        __returnType = TYPE_FLOAT;
+	__returnType = TYPE_FLOAT;
     } else if (returnTypeSymbol == @symbol(double)) {
-        __returnType = TYPE_DOUBLE;
+	__returnType = TYPE_DOUBLE;
 
     } else if (returnTypeSymbol == @symbol(void)) {
-        __returnType = TYPE_VOID;
-        __returnValuePointer = NULL;
+	__returnType = TYPE_VOID;
+	__returnValuePointer = NULL;
     } else if ((returnTypeSymbol == @symbol(pointer))
-               || (returnTypeSymbol == @symbol(handle))
-               || (returnTypeSymbol == @symbol(charPointer))
-               || (returnTypeSymbol == @symbol(bytePointer))
-               || (returnTypeSymbol == @symbol(floatPointer))
-               || (returnTypeSymbol == @symbol(doublePointer))
-               || (returnTypeSymbol == @symbol(intPointer))
-               || (returnTypeSymbol == @symbol(shortPointer))
-               || (returnTypeSymbol == @symbol(wcharPointer))) {
-        __returnType = TYPE_POINTER;
+	       || (returnTypeSymbol == @symbol(handle))
+	       || (returnTypeSymbol == @symbol(charPointer))
+	       || (returnTypeSymbol == @symbol(bytePointer))
+	       || (returnTypeSymbol == @symbol(floatPointer))
+	       || (returnTypeSymbol == @symbol(doublePointer))
+	       || (returnTypeSymbol == @symbol(intPointer))
+	       || (returnTypeSymbol == @symbol(shortPointer))
+	       || (returnTypeSymbol == @symbol(wcharPointer))) {
+	__returnType = TYPE_POINTER;
     } else {
-        if (__isSymbol(returnTypeSymbol)
-         && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
-            if (! __isBehaviorLike(returnValueClass)) {
-                __FAIL__(@symbol(NonBehaviorReturnType))
-            }
-            if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
-                __FAIL__(@symbol(NonExternalAddressReturnType))
-            }
-            __returnType = TYPE_POINTER;
-            returnTypeSymbol = @symbol(pointer);
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (__isSymbol(returnTypeSymbol)
+	 && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
+	    if (! __isBehaviorLike(returnValueClass)) {
+		__FAIL__(@symbol(NonBehaviorReturnType))
+	    }
+	    if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
+		__FAIL__(@symbol(NonExternalAddressReturnType))
+	    }
+	    __returnType = TYPE_POINTER;
+	    returnTypeSymbol = @symbol(pointer);
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
     }
 
     /*
      * validate the c++ object
      */
     if (aReceiverOrNil != nil) {
-        struct cPlusPlusInstance {
-            void **vTable;
-        };
-        struct cPlusPlusInstance *inst;
-
-        if (__isExternalAddressLike(aReceiverOrNil)) {
-            inst = (void *)(__externalAddressVal(aReceiverOrNil));
-        } else if (__isExternalBytesLike(aReceiverOrNil)) {
-            inst = (void *)(__externalBytesVal(aReceiverOrNil));
-        } else {
-            __FAIL__(@symbol(InvalidInstance))
-        }
-        __argValues[0].pointerVal = inst;
-        __argValuePointersIncludingThis[0] = &(__argValues[0]);
-        __argTypes[0] = TYPE_POINTER;
-
-        __argValuePointers = &__argValuePointersIncludingThis[1];
-        __argTypes = &__argTypesIncludingThis[1];
-        __argValues = &__argValuesIncludingThis[1];
-        __numArgsIncludingThis = __numArgs + 1;
-
-        if (virtual == true) {
-            if (! __isSmallInteger(vtOffset)) {
-                __FAIL__(@symbol(InvalidVTableIndex))
-            }
-            codeAddress = inst->vTable[__intVal(vtOffset)];
-            DEBUGCODE_IF( @global(Verbose), {
-                printf("virtual %"_ld_" codeAddress: %"_lx_"\n", (INT)(__intVal(vtOffset)), (INT)codeAddress);
-            })
-        }
+	struct cPlusPlusInstance {
+	    void **vTable;
+	};
+	struct cPlusPlusInstance *inst;
+
+	if (__isExternalAddressLike(aReceiverOrNil)) {
+	    inst = (void *)(__externalAddressVal(aReceiverOrNil));
+	} else if (__isExternalBytesLike(aReceiverOrNil)) {
+	    inst = (void *)(__externalBytesVal(aReceiverOrNil));
+	} else {
+	    __FAIL__(@symbol(InvalidInstance))
+	}
+	if (inst == NULL) {
+	    __FAIL__(@symbol(BadReceiver))
+	}
+	__argValues[0].pointerVal = inst;
+	__argValuePointersIncludingThis[0] = &(__argValues[0]);
+	__argTypes[0] = TYPE_POINTER;
+
+	__argValuePointers = &__argValuePointersIncludingThis[1];
+	__argTypes = &__argTypesIncludingThis[1];
+	__argValues = &__argValuesIncludingThis[1];
+	__numArgsIncludingThis = __numArgs + 1;
+
+	if (virtual == true) {
+	    if (! __isSmallInteger(vtOffset)) {
+		__FAIL__(@symbol(InvalidVTableIndex))
+	    }
+	    codeAddress = inst->vTable[__intVal(vtOffset)];
+	    DEBUGCODE_IF( @global(Verbose), {
+		printf("virtual %"_ld_" codeAddress: %p\n", (INT)(__intVal(vtOffset)), codeAddress);
+	    })
+	}
     } else {
-        __numArgsIncludingThis = __numArgs;
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("codeAddress: %"_lx_"\n", (INT)codeAddress);
-        })
+	__numArgsIncludingThis = __numArgs;
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("codeAddress: %p\n", codeAddress);
+	})
+    }
+
+    if (codeAddress == NULL) {
+	__FAIL__(@symbol(BadCodeAddress))
     }
 
     /*
      * validate all arg types, map each to an ffi_type, and setup arg-buffers
      */
     for (i=0; i<__numArgs; i++) {
-        void *argValuePtr;
-        OBJ typeSymbol;
-        OBJ arg;
-
-        failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
-
-        typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
-        arg = __ArrayInstPtr(argumentsOrNil)->a_element[i];
-
-        if (typeSymbol == @symbol(handle)) {
-            typeSymbol = @symbol(pointer);
-        } else if (typeSymbol == @symbol(voidPointer)) {
-            typeSymbol = @symbol(pointer);
-        } else if (returnTypeSymbol == @symbol(hresult)) {
-            typeSymbol = @symbol(uint32);
-        }
-
-        if (typeSymbol == @symbol(long)) {
-            if (sizeof(long) == sizeof(int)) {
-                typeSymbol = @symbol(sint);
-            } else {
-                if (sizeof(long) == 4) {
-                    typeSymbol = @symbol(sint32);
-                } else if (sizeof(long) == 8) {
-                    typeSymbol = @symbol(sint64);
-                }
-            }
-        }
-        if (typeSymbol == @symbol(ulong)) {
-            if (sizeof(unsigned long) == sizeof(unsigned int)) {
-                typeSymbol = @symbol(uint);
-            } else {
-                if (sizeof(long) == 4) {
-                    typeSymbol = @symbol(uint32);
-                } else if (sizeof(long) == 8) {
-                    typeSymbol = @symbol(uint64);
-                }
-            }
-        }
-
-        if (typeSymbol == @symbol(int) || typeSymbol == @symbol(sint)) {
-            thisType = TYPE_SINT;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __signedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d sint value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint)) {
-            thisType = TYPE_UINT;
-
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d uint value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint8)) {
-            thisType = TYPE_UINT8;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(sint8)) {
-            thisType = TYPE_SINT8;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint16)) {
-            thisType = TYPE_UINT16;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(sint16)) {
-            thisType = TYPE_SINT16;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint32)) {
-            thisType = TYPE_UINT32;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
+	void *argValuePtr;
+	OBJ typeSymbol;
+	OBJ arg;
+
+	failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
+
+	typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
+	arg = __ArrayInstPtr(argumentsOrNil)->a_element[i];
+
+	if (typeSymbol == @symbol(handle)) {
+	    typeSymbol = @symbol(pointer);
+	} else if (typeSymbol == @symbol(voidPointer)) {
+	    typeSymbol = @symbol(pointer);
+	} else if (returnTypeSymbol == @symbol(hresult)) {
+	    typeSymbol = @symbol(uint32);
+	}
+
+	if (typeSymbol == @symbol(long)) {
+	    if (sizeof(long) == sizeof(int)) {
+		typeSymbol = @symbol(sint);
+	    } else {
+		if (sizeof(long) == 4) {
+		    typeSymbol = @symbol(sint32);
+		} else if (sizeof(long) == 8) {
+		    typeSymbol = @symbol(sint64);
+		}
+	    }
+	}
+	if (typeSymbol == @symbol(ulong)) {
+	    if (sizeof(unsigned long) == sizeof(unsigned int)) {
+		typeSymbol = @symbol(uint);
+	    } else {
+		if (sizeof(long) == 4) {
+		    typeSymbol = @symbol(uint32);
+		} else if (sizeof(long) == 8) {
+		    typeSymbol = @symbol(uint64);
+		}
+	    }
+	}
+
+	if (typeSymbol == @symbol(int) || typeSymbol == @symbol(sint)) {
+	    thisType = TYPE_SINT;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __signedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d sint value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint)) {
+	    thisType = TYPE_UINT;
+
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d uint value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint8)) {
+	    thisType = TYPE_UINT8;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(sint8)) {
+	    thisType = TYPE_SINT8;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint16)) {
+	    thisType = TYPE_UINT16;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(sint16)) {
+	    thisType = TYPE_SINT16;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint32)) {
+	    thisType = TYPE_UINT32;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
 # if __POINTER_SIZE__ == 8
-            if ((__argValues[i].iVal) < 0)  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
+	    if ((__argValues[i].iVal) < 0)  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
 # endif
-            argValuePtr = &(__argValues[i].iVal);
-
-         } else if (typeSymbol == @symbol(sint32)) {
-            thisType = TYPE_SINT32;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __signedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d sint32 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	 } else if (typeSymbol == @symbol(sint32)) {
+	    thisType = TYPE_SINT32;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __signedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d sint32 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
 # if __POINTER_SIZE__ == 8
-            if (((__argValues[i].iVal) < -0x80000000LL) || ((__argValues[i].iVal) > 0x7FFFFFFFLL))  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint32 value (%"_lx_") out of range [%d]\n", i+1, __argValues[i].iVal, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
+	    if (((__argValues[i].iVal) < -0x80000000LL) || ((__argValues[i].iVal) > 0x7FFFFFFFLL))  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint32 value (%"_lx_") out of range [%d]\n", i+1, __argValues[i].iVal, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
 # endif
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint64)) {
-            thisType = TYPE_UINT64;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d uint64 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-         } else if (typeSymbol == @symbol(sint64)) {
-            thisType = TYPE_SINT64;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __signedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d sint64 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(float)) {
-            thisType = TYPE_FLOAT;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].fVal = (float)(__intVal(arg));
-            } else if (__isFloat(arg)) {
-                __argValues[i].fVal = (float)(__floatVal(arg));
-            } else if (__isShortFloat(arg)) {
-                __argValues[i].fVal = (float)(__shortFloatVal(arg));
-            } else {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d non float value [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].fVal);
-        } else if (typeSymbol == @symbol(double)) {
-            thisType = TYPE_DOUBLE;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].dVal = (double)(__intVal(arg));
-            } else if (__isFloat(arg)) {
-                __argValues[i].dVal = (double)(__floatVal(arg));
-            } else if (__isShortFloat(arg)) {
-                __argValues[i].dVal = (double)(__shortFloatVal(arg));
-            } else {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d non double value [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].dVal);
-
-        } else if (typeSymbol == @symbol(void)) {
-            thisType = TYPE_VOID;
-            argValuePtr = &null;
-
-        } else if (typeSymbol == @symbol(charPointer)) {
-            thisType = TYPE_POINTER;
-            if (__isStringLike(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__stringVal(arg));
-            } else if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non charPointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(wcharPointer)) {
-            thisType = TYPE_POINTER;
-            if (__isUnicode16String(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__unicode16StringVal(arg));
-            } else if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non wcharPointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(floatPointer)) {
-            thisType = TYPE_POINTER;
-            if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isFloats(arg)) {
-                char *p = (char *)(__FloatArrayInstPtr(arg)->f_element);
-                int nInstBytes;
-                OBJ cls;
-
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                p = p + nInstBytes;
-                __argValues[i].pointerVal = p;
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non floatPointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(doublePointer)) {
-            thisType = TYPE_POINTER;
-            if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isDoubles(arg)) {
-                char *p = (char *)(__DoubleArrayInstPtr(arg)->d_element);
-                int nInstBytes;
-                OBJ cls;
-
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                p = p + nInstBytes;
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint64)) {
+	    thisType = TYPE_UINT64;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d uint64 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	 } else if (typeSymbol == @symbol(sint64)) {
+	    thisType = TYPE_SINT64;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __signedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d sint64 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(float)) {
+	    thisType = TYPE_FLOAT;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].fVal = (float)(__intVal(arg));
+	    } else if (__isFloat(arg)) {
+		__argValues[i].fVal = (float)(__floatVal(arg));
+	    } else if (__isShortFloat(arg)) {
+		__argValues[i].fVal = (float)(__shortFloatVal(arg));
+	    } else {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d non float value [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].fVal);
+	} else if (typeSymbol == @symbol(double)) {
+	    thisType = TYPE_DOUBLE;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].dVal = (double)(__intVal(arg));
+	    } else if (__isFloat(arg)) {
+		__argValues[i].dVal = (double)(__floatVal(arg));
+	    } else if (__isShortFloat(arg)) {
+		__argValues[i].dVal = (double)(__shortFloatVal(arg));
+	    } else {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d non double value [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].dVal);
+
+	} else if (typeSymbol == @symbol(void)) {
+	    thisType = TYPE_VOID;
+	    argValuePtr = &null;
+
+	} else if (typeSymbol == @symbol(charPointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isStringLike(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__stringVal(arg));
+	    } else if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non charPointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(wcharPointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isUnicode16String(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__unicode16StringVal(arg));
+	    } else if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non wcharPointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(floatPointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isFloats(arg)) {
+		char *p = (char *)(__FloatArrayInstPtr(arg)->f_element);
+		int nInstBytes;
+		OBJ cls;
+
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		p = p + nInstBytes;
+		__argValues[i].pointerVal = p;
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non floatPointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(doublePointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isDoubles(arg)) {
+		char *p = (char *)(__DoubleArrayInstPtr(arg)->d_element);
+		int nInstBytes;
+		OBJ cls;
+
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		p = p + nInstBytes;
 # ifdef __NEED_DOUBLE_ALIGN
-                if ((INT)(__DoubleArrayInstPtr(arg)->d_element) & (__DOUBLE_ALIGN-1)) {
-                    int delta = __DOUBLE_ALIGN - ((INT)p & (__DOUBLE_ALIGN-1));
-
-                    p += delta;
-                }
+		if ((INT)(__DoubleArrayInstPtr(arg)->d_element) & (__DOUBLE_ALIGN-1)) {
+		    int delta = __DOUBLE_ALIGN - ((INT)p & (__DOUBLE_ALIGN-1));
+
+		    p += delta;
+		}
 # endif
-                __argValues[i].pointerVal = p;
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non doublePointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(pointer)) {
+		__argValues[i].pointerVal = p;
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non doublePointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(pointer)) {
     commonPointerTypeArg: ;
-            thisType = TYPE_POINTER;
-            if (arg == nil) {
-                __argValues[i].pointerVal = NULL;
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isByteArrayLike(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isWordArray(arg) || __isSignedWordArray(arg)
-                    || __isIntegerArray(arg) || __isSignedIntegerArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__integerArrayVal(arg));
-            } else if (__isFloatArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__FloatArrayInstPtr(arg)->f_element);
-            } else if (__isDoubleArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__DoubleArrayInstPtr(arg)->d_element);
-            } else if (__isStringLike(arg)) {
-                if (async == true) {
+	    thisType = TYPE_POINTER;
+	    if (arg == nil) {
+		__argValues[i].pointerVal = NULL;
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isByteArrayLike(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isWordArray(arg) || __isSignedWordArray(arg)
+		    || __isIntegerArray(arg) || __isSignedIntegerArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__integerArrayVal(arg));
+	    } else if (__isFloatArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__FloatArrayInstPtr(arg)->f_element);
+	    } else if (__isDoubleArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__DoubleArrayInstPtr(arg)->d_element);
+	    } else if (__isStringLike(arg)) {
+		if (async == true) {
 badArgForAsyncCall: ;
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d not allowed for async call [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(BadArgForAsyncCall))
-                }
-                __argValues[i].pointerVal = (void *)(__stringVal(arg));
-            } else if (__isBytes(arg) || __isWords(arg) || __isLongs(arg)) {
-                char *p = (char *)(__byteArrayVal(arg));
-                int nInstBytes;
-                OBJ cls;
-
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                __argValues[i].pointerVal = p + nInstBytes;
-            } else {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d non pointer value [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(bool)) {
-            thisType = TYPE_UINT;
-
-            if (arg == true) {
-                __argValues[i].iVal = 1;
-            } else if (arg == false) {
-                __argValues[i].iVal = 0;
-            } else if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non bool value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-        } else {
-            if (__isSymbol(typeSymbol)
-             && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
-                if (! __isBehaviorLike(argValueClass)) {
-                    __FAIL__(@symbol(NonBehaviorArgumentType))
-                }
-                if (! __qIsSubclassOfExternalAddress(argValueClass)) {
-                    __FAIL__(@symbol(NonExternalAddressArgumentType))
-                }
-                goto commonPointerTypeArg; /* sorry */
-            } else {
-                __FAIL__(@symbol(UnknownArgumentType))
-            }
-        }
-
-        __argTypes[i] = thisType;
-        __argValuePointers[i] = argValuePtr;
-
-        if ((thisType == TYPE_FLOAT) || (thisType == TYPE_DOUBLE)) {
-            __numFloatOrDoubleArgs++;
-        }
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("arg%d: %"_lx_" type:%"_lx_"\n", i+1, (INT)(__argValues[i].iVal), (INT)thisType);
-        })
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d not allowed for async call [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(BadArgForAsyncCall))
+		}
+		__argValues[i].pointerVal = (void *)(__stringVal(arg));
+	    } else if (__isBytes(arg) || __isWords(arg) || __isLongs(arg)) {
+		char *p = (char *)(__byteArrayVal(arg));
+		int nInstBytes;
+		OBJ cls;
+
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		__argValues[i].pointerVal = p + nInstBytes;
+	    } else {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d non pointer value [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(bool)) {
+	    thisType = TYPE_UINT;
+
+	    if (arg == true) {
+		__argValues[i].iVal = 1;
+	    } else if (arg == false) {
+		__argValues[i].iVal = 0;
+	    } else if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non bool value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+	} else {
+	    if (__isSymbol(typeSymbol)
+	     && ((argValueClass = __GLOBAL_GET(typeSymbol)) != nil)) {
+		if (! __isBehaviorLike(argValueClass)) {
+		    __FAIL__(@symbol(NonBehaviorArgumentType))
+		}
+		if (! __qIsSubclassOfExternalAddress(argValueClass)) {
+		    __FAIL__(@symbol(NonExternalAddressArgumentType))
+		}
+		goto commonPointerTypeArg; /* sorry */
+	    } else {
+		__FAIL__(@symbol(UnknownArgumentType))
+	    }
+	}
+
+	__argTypes[i] = thisType;
+	__argValuePointers[i] = argValuePtr;
+
+	if ((thisType == TYPE_FLOAT) || (thisType == TYPE_DOUBLE)) {
+	    __numFloatOrDoubleArgs++;
+	}
+	DEBUGCODE_IF( @global(Verbose), {
+	    char *typeString = "TYPE_OTHER";
+
+	    if (thisType == TYPE_POINTER) {
+		typeString = "TYPE_POINTER";
+	    } else if (thisType == TYPE_VOID) {
+		typeString = "TYPE_VOID";
+	    } else if (thisType == TYPE_FLOAT) {
+		typeString = "TYPE_FLOAT";
+	    } else if (thisType == TYPE_DOUBLE) {
+		typeString = "TYPE_DOUBLE";
+	    } else if (thisType == TYPE_UINT) {
+		typeString = "TYPE_UINT";
+	    } else if (thisType == TYPE_SINT) {
+		typeString = "TYPE_SINT";
+	    }
+	    printf("arg%d: %"_lx_" type:%"_lx_" (%s)\n",
+			i+1,
+			(INT)(__argValues[i].iVal), (INT)thisType, typeString);
+	})
     }
     failureInfo = nil;
 
     if (callTypeNumber == @global(CALLTYPE_API)) {
 #  ifdef __MINGW64__
-        __callType = FFI_DEFAULT_ABI;
+	__callType = FFI_DEFAULT_ABI;
 #  else
 #   ifdef CALLTYPE_API
-        __callType = CALLTYPE_API;
+	__callType = CALLTYPE_API;
 #   else
 #    ifdef CALLTYPE_FFI_STDCALL
-        __callType = CALLTYPE_FFI_STDCALL;
+	__callType = CALLTYPE_FFI_STDCALL;
 #    else
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("STDCALL\n");
-        })
-        failureCode = @symbol(FFICallTypeNotSupported);
-        goto getOutOfHere;
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("STDCALL\n");
+	})
+	failureCode = @symbol(FFICallTypeNotSupported);
+	goto getOutOfHere;
 #    endif
 #   endif
 #  endif
@@ -2129,64 +2153,64 @@
     // these calltypes are only supported on some systems; others report an error
     if (callTypeNumber == @global(CALLTYPE_V8)) {
 #  ifdef CALLTYPE_FFI_V8
-        __callType = CALLTYPE_FFI_V8;
+	__callType = CALLTYPE_FFI_V8;
 #  else
-        failureCode = @symbol(FFICallTypeNotSupported);
-        goto getOutOfHere;
+	failureCode = @symbol(FFICallTypeNotSupported);
+	goto getOutOfHere;
 #  endif
     }
 
     if (callTypeNumber == @global(CALLTYPE_V9)) {
 #  ifdef CALLTYPE_FFI_V9
-        __callType = CALLTYPE_FFI_V9;
+	__callType = CALLTYPE_FFI_V9;
 #  else
-        failureCode = @symbol(FFICallTypeNotSupported);
-        goto getOutOfHere;
+	failureCode = @symbol(FFICallTypeNotSupported);
+	goto getOutOfHere;
 #  endif
     }
 
     if (callTypeNumber == @global(CALLTYPE_UNIX64)) {
 #  ifdef CALLTYPE_FFI_UNIX64
-        __callType = CALLTYPE_FFI_UNIX64;
+	__callType = CALLTYPE_FFI_UNIX64;
 #  else
-        failureCode = @symbol(FFICallTypeNotSupported);
-        goto getOutOfHere;
+	failureCode = @symbol(FFICallTypeNotSupported);
+	goto getOutOfHere;
 #  endif
     }
 
 # ifdef HAVE_FFI
 #  ifdef VERBOSE
     if (@global(Verbose) == true) {
-        printf("prep: numargs=%d\n", __numArgsIncludingThis);
+	printf("prep: numargs=%d\n", __numArgsIncludingThis);
     }
 #  endif
 
     if (ffi_prep_cif(&__cif, __callType, __numArgsIncludingThis, __returnType, __argTypesIncludingThis) != FFI_OK) {
-        __FAIL__(@symbol(FFIPrepareFailed))
+	__FAIL__(@symbol(FFIPrepareFailed))
     }
     if (async == true) {
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("async call 0x%"_lx_"\n", (INT)codeAddress);
-        })
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("async call 0x%p\n", codeAddress);
+	})
 #  ifdef __win32__
-        __STX_C_CALL4( "ffi_call", ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	__STX_C_CALL4( "ffi_call", ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
 #  else
-        __BEGIN_INTERRUPTABLE__
-        ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
-        __END_INTERRUPTABLE__
+	__BEGIN_INTERRUPTABLE__
+	ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	__END_INTERRUPTABLE__
 #  endif
     } else {
-        if (unlimitedStack == true) {
-            DEBUGCODE_IF( @global(Verbose), {
-                printf("UNLIMITEDSTACKCALL call 0x%"_lx_"\n", (INT)codeAddress);
-            })
-            __UNLIMITEDSTACKCALL4__((OBJFUNC)ffi_call, (INT)(&__cif), (INT)codeAddress, (INT)__returnValuePointer, (INT)__argValuePointersIncludingThis);
-        } else {
-            DEBUGCODE_IF( @global(Verbose), {
-                printf("call 0x%"_lx_"\n", (INT)codeAddress);
-            })
-            ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
-        }
+	if (unlimitedStack == true) {
+	    DEBUGCODE_IF( @global(Verbose), {
+		printf("UNLIMITEDSTACKCALL call 0x%p\n", codeAddress);
+	    })
+	    __UNLIMITEDSTACKCALL4__((OBJFUNC)ffi_call, (INT)(&__cif), (INT)codeAddress, (INT)__returnValuePointer, (INT)__argValuePointersIncludingThis);
+	} else {
+	    DEBUGCODE_IF( @global(Verbose), {
+		printf("call 0x%p\n", codeAddress);
+	    })
+	    ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	}
     }
 
 # else /* NO FFI */
@@ -2201,615 +2225,619 @@
     // pass down separately.
 
     {
-        VOIDPTRFUNC fi = (VOIDPTRFUNC)codeAddress;
-        DOUBLEFUNC fd = (DOUBLEFUNC)codeAddress;
-        int rI[MAX_ARGS], dI[MAX_ARGS];
-        int i;
-
-        // sort the float/double args into a separate arglist and pass them AFTER the regular args.
-        // This is possible, because all doubles are passed in floating-pnt registers,
-        // no matter where they are in the arglist.
-        int argI = 0, nonDoubleI = 0, doubleI = 0;
-
-        for (argI=0; argI<__numArgsIncludingThis; argI++) {
+	VOIDPTRFUNC fi = (VOIDPTRFUNC)codeAddress;
+	DOUBLEFUNC fd = (DOUBLEFUNC)codeAddress;
+	int rI[MAX_ARGS], dI[MAX_ARGS];
+	int i;
+
+	// sort the float/double args into a separate arglist and pass them AFTER the regular args.
+	// This is possible, because all doubles are passed in floating-pnt registers,
+	// no matter where they are in the arglist.
+	int argI = 0, nonDoubleI = 0, doubleI = 0;
+
+	for (argI=0; argI<__numArgsIncludingThis; argI++) {
 #  if defined(__x86_64__)
-            if ((__argTypesIncludingThis[argI] == TYPE_DOUBLE)
-             || (__argTypesIncludingThis[argI] == TYPE_FLOAT)) {
-                dI[doubleI++] = argI;
-            } else
+	    if ((__argTypesIncludingThis[argI] == TYPE_DOUBLE)
+	     || (__argTypesIncludingThis[argI] == TYPE_FLOAT)) {
+		dI[doubleI++] = argI;
+	    } else
 #  endif // __x86_64__
-            {
-                rI[nonDoubleI++] = argI;
-            }
-        }
-        for (i=doubleI; i<__numArgsIncludingThis; i++) dI[doubleI++] = 0;
-        for (i=nonDoubleI; i<__numArgsIncludingThis; i++) rI[nonDoubleI++] = 0;
-
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("call %p with %d args (%d regular, %d double)\n", codeAddress, __numArgsIncludingThis,
-                                                                     nonDoubleI, doubleI);
-        })
-        if (doubleI == 0) {
-            // no double args
-            switch (__returnType) {
-                case TYPE_FLOAT:
-                case TYPE_DOUBLE:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("non-double arg; double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.dVal = (*fd)();
-                            break;
-                        case 1:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal );
-                            break;
-                        case 2:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
-                            break;
-                        case 3:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal );
-                            break;
-                        case 4:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal );
-                            break;
-                        case 5:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal );
-                            break;
-                        case 6:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
-                            break;
-                        case 7:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal );
-                            break;
-                        case 8:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
-                            break;
-                        case 9:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal );
-                            break;
-                        case 10:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal );
-                            break;
-                        case 11:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal );
-                            break;
-                        case 12:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
-                            break;
-                        case 13:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal );
-                            break;
-                        case 14:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
-                            break;
-                        case 15:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                        __argValues[rI[14]].pointerVal );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-                    break;
-
-                default:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("non-double arg; non-double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.pointerVal = (*fi)();
-                            break;
-                        case 1:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal );
-                            break;
-                        case 2:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
-                            break;
-                        case 3:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal );
-                            break;
-                        case 4:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal );
-                            break;
-                        case 5:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal );
-                            break;
-                        case 6:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
-                            break;
-                        case 7:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal );
-                            break;
-                        case 8:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
-                            break;
-                        case 9:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal );
-                            break;
-                        case 10:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal );
-                            break;
-                        case 11:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal );
-                            break;
-                        case 12:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
-                            break;
-                        case 13:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                             __argValues[rI[12]].pointerVal );
-                            break;
-                        case 14:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                             __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
-                            break;
-                        case 15:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                             __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal, __argValues[rI[14]].pointerVal );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-            }
-        } else {
-            // has double args
-            switch (__returnType) {
-                case TYPE_FLOAT:
-                case TYPE_DOUBLE:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("double arg(s); double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.dVal = (*fd)( );
-                            break;
-                        case 1:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal,
-                                                        __argValues[dI[0]].dVal );
-                            break;
-                        case 2:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal
-                                                      );
-                            break;
-                        case 3:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal
-                                                      );
-                            break;
-                        case 4:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal
-                                                      );
-                            break;
-                        case 5:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal
-                                                      );
-                            break;
-                        case 6:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal
-                                                      );
-                            break;
-                        case 7:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal
-                                                      );
-                            break;
-                        case 8:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal
-                                                      );
-                            break;
-                        case 9:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal
-                                                      );
-                            break;
-                        case 10:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal
-                                                      );
-                            break;
-                        case 11:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal
-                                                      );
-                            break;
-                        case 12:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal
-                                                      );
-                            break;
-                        case 13:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                        __argValues[dI[12]].dVal
-                                                      );
-                            break;
-                        case 14:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                        __argValues[dI[12]].dVal, __argValues[dI[13]].dVal
-                                                      );
-                            break;
-                        case 15:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                        __argValues[rI[14]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                        __argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
-                                                        __argValues[dI[14]].dVal
-                                                      );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-                    break;
-
-                default:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("double arg(s); non-double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.pointerVal = (*fi)( );
-                            break;
-                        case 1:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal,
-                                                              __argValues[dI[0]].dVal );
-                            break;
-                        case 2:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal
-                                                            );
-                            break;
-                        case 3:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal
-                                                            );
-                            break;
-                        case 4:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal
-                                                            );
-                            break;
-                        case 5:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal
-                                                            );
-                            break;
-                        case 6:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal
-                                                            );
-                            break;
-                        case 7:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal
-                                                            );
-                            break;
-                        case 8:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal
-                                                            );
-                            break;
-                        case 9:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal
-                                                            );
-                            break;
-                        case 10:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal
-                                                            );
-                            break;
-                        case 11:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal
-                                                            );
-                            break;
-                        case 12:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal
-                                                            );
-                            break;
-                        case 13:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[rI[12]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                              __argValues[dI[12]].dVal
-                                                            );
-                            break;
-                        case 14:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                              __argValues[dI[12]].dVal, __argValues[dI[13]].dVal
-                                                            );
-                            break;
-                        case 15:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                              __argValues[rI[14]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                              __argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
-                                                              __argValues[dI[14]].dVal
-                                                            );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-            }
-        }
+	    {
+		rI[nonDoubleI++] = argI;
+	    }
+	}
+	for (i=doubleI; i<__numArgsIncludingThis; i++) dI[doubleI++] = 0;
+	for (i=nonDoubleI; i<__numArgsIncludingThis; i++) rI[nonDoubleI++] = 0;
+
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("call %p with %d args (%d regular, %d double)\n",
+			codeAddress, __numArgsIncludingThis, nonDoubleI, doubleI);
+	})
+	if (doubleI == 0) {
+	    // no double args
+	    switch (__returnType) {
+		case TYPE_FLOAT:
+		case TYPE_DOUBLE:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("non-double arg; double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.dVal = (*fd)();
+			    break;
+			case 1:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal );
+			    break;
+			case 2:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
+			    break;
+			case 3:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal );
+			    break;
+			case 4:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal );
+			    break;
+			case 5:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal );
+			    break;
+			case 6:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
+			    break;
+			case 7:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal );
+			    break;
+			case 8:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
+			    break;
+			case 9:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal );
+			    break;
+			case 10:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal );
+			    break;
+			case 11:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal );
+			    break;
+			case 12:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
+			    break;
+			case 13:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal );
+			    break;
+			case 14:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
+			    break;
+			case 15:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							__argValues[rI[14]].pointerVal );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+		    break;
+
+		default:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("non-double arg; non-double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.pointerVal = (*fi)();
+			    break;
+			case 1:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal );
+			    break;
+			case 2:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
+			    break;
+			case 3:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal );
+			    break;
+			case 4:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal );
+			    break;
+			case 5:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal );
+			    break;
+			case 6:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
+			    break;
+			case 7:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal );
+			    break;
+			case 8:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
+			    break;
+			case 9:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal );
+			    break;
+			case 10:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal );
+			    break;
+			case 11:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal );
+			    break;
+			case 12:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
+			    break;
+			case 13:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							     __argValues[rI[12]].pointerVal );
+			    break;
+			case 14:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							     __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
+			    break;
+			case 15:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							     __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal, __argValues[rI[14]].pointerVal );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+	    }
+	} else {
+	    // has double args
+	    switch (__returnType) {
+		case TYPE_FLOAT:
+		case TYPE_DOUBLE:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("double arg(s); double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.dVal = (*fd)( );
+			    break;
+			case 1:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal,
+							__argValues[dI[0]].dVal );
+			    break;
+			case 2:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal
+						      );
+			    break;
+			case 3:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal
+						      );
+			    break;
+			case 4:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal
+						      );
+			    break;
+			case 5:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal
+						      );
+			    break;
+			case 6:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal
+						      );
+			    break;
+			case 7:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal
+						      );
+			    break;
+			case 8:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal
+						      );
+			    break;
+			case 9:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal
+						      );
+			    break;
+			case 10:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal
+						      );
+			    break;
+			case 11:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal
+						      );
+			    break;
+			case 12:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal
+						      );
+			    break;
+			case 13:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							__argValues[dI[12]].dVal
+						      );
+			    break;
+			case 14:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							__argValues[dI[12]].dVal, __argValues[dI[13]].dVal
+						      );
+			    break;
+			case 15:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							__argValues[rI[14]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							__argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
+							__argValues[dI[14]].dVal
+						      );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+		    break;
+
+		default:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("double arg(s); non-double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.pointerVal = (*fi)( );
+			    break;
+			case 1:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal,
+							      __argValues[dI[0]].dVal );
+			    break;
+			case 2:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal
+							    );
+			    break;
+			case 3:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal
+							    );
+			    break;
+			case 4:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal
+							    );
+			    break;
+			case 5:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal
+							    );
+			    break;
+			case 6:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal
+							    );
+			    break;
+			case 7:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal
+							    );
+			    break;
+			case 8:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal
+							    );
+			    break;
+			case 9:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal
+							    );
+			    break;
+			case 10:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal
+							    );
+			    break;
+			case 11:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal
+							    );
+			    break;
+			case 12:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal
+							    );
+			    break;
+			case 13:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[rI[12]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							      __argValues[dI[12]].dVal
+							    );
+			    break;
+			case 14:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							      __argValues[dI[12]].dVal, __argValues[dI[13]].dVal
+							    );
+			    break;
+			case 15:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							      __argValues[rI[14]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							      __argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
+							      __argValues[dI[14]].dVal
+							    );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+	    }
+	}
     }
 # endif // alternative to FFI
 
+    if (returnTypeSymbol == @symbol(void)) {
+	RETURN ( nil );
+    }
+
     DEBUGCODE_IF( @global(Verbose), {
-        printf("retval is %"_ld_" (0x%"_lx_")\n", (INT)(__returnValue.iVal), (INT)(__returnValue.iVal));
+	printf("retval is %"_ld_" (0x%"_lx_")\n", (INT)(__returnValue.iVal), (INT)(__returnValue.iVal));
     })
 
     if ((returnTypeSymbol == @symbol(int))
@@ -2817,145 +2845,142 @@
      || (returnTypeSymbol == @symbol(sint8))
      || (returnTypeSymbol == @symbol(sint16))
      || (returnTypeSymbol == @symbol(sint32))) {
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return int: %"_lx_"\n", (INT)(__returnValue.iVal));
-        })
-        RETURN ( __MKINT(__returnValue.iVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return int: %"_lx_"\n", (INT)(__returnValue.iVal));
+	})
+	RETURN ( __MKINT(__returnValue.iVal) );
     }
     if ((returnTypeSymbol == @symbol(uint))
      || (returnTypeSymbol == @symbol(uint8))
      || (returnTypeSymbol == @symbol(uint16))
      || (returnTypeSymbol == @symbol(uint32))) {
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return uint: %"_lx_"\n", (INT)(__returnValue.iVal));
-        })
-        RETURN ( __MKUINT(__returnValue.iVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return uint: %"_lx_"\n", (INT)(__returnValue.iVal));
+	})
+	RETURN ( __MKUINT(__returnValue.iVal) );
     }
     if (returnTypeSymbol == @symbol(bool)) {
-        RETURN ( __returnValue.iVal ? true : false );
+	RETURN ( __returnValue.iVal ? true : false );
     }
     if (returnTypeSymbol == @symbol(float)) {
-        RETURN ( __MKFLOAT(__returnValue.fVal ));
+	RETURN ( __MKFLOAT(__returnValue.fVal ));
     }
     if (returnTypeSymbol == @symbol(double)) {
-        RETURN ( __MKFLOAT(__returnValue.dVal ));
-    }
-    if (returnTypeSymbol == @symbol(void)) {
-        RETURN ( nil );
+	RETURN ( __MKFLOAT(__returnValue.dVal ));
     }
     if (returnTypeSymbol == @symbol(char)) {
-        RETURN ( __MKCHARACTER(__returnValue.iVal & 0xFF) );
+	RETURN ( __MKCHARACTER(__returnValue.iVal & 0xFF) );
     }
     if (returnTypeSymbol == @symbol(wchar)) {
-        RETURN ( __MKUCHARACTER(__returnValue.iVal & 0xFFFF) );
+	RETURN ( __MKUCHARACTER(__returnValue.iVal & 0xFFFF) );
     }
     if (returnTypeSymbol == @symbol(sint64)) {
 # if (__POINTER_SIZE__ == 8)
 
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return sint64: %"_lx_"\n", (INT)(__returnValue.longLongVal));
-        })
-        RETURN ( __MKINT(__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return sint64: %"_lx_"\n", (INT)(__returnValue.longLongVal));
+	})
+	RETURN ( __MKINT(__returnValue.longLongVal) );
 # else
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
-        })
-        RETURN ( __MKINT64(&__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
+	})
+	RETURN ( __MKINT64(&__returnValue.longLongVal) );
 # endif
     }
     if (returnTypeSymbol == @symbol(uint64)) {
 # if (__POINTER_SIZE__ == 8)
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return uint64: %"_lx_"\n", (unsigned INT)(__returnValue.longLongVal));
-        })
-        RETURN ( __MKUINT(__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return uint64: %"_lx_"\n", (unsigned INT)(__returnValue.longLongVal));
+	})
+	RETURN ( __MKUINT(__returnValue.longLongVal) );
 # else
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
-        })
-        RETURN ( __MKUINT64(&__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
+	})
+	RETURN ( __MKUINT64(&__returnValue.longLongVal) );
 # endif
     }
 
     DEBUGCODE_IF( @global(Verbose), {
-        printf("return pointer: %"_lx_"\n", (INT)(__returnValue.pointerVal));
+	printf("return pointer: %"_lx_"\n", (INT)(__returnValue.pointerVal));
     })
     if (returnTypeSymbol == @symbol(handle)) {
-        returnValue = __MKEXTERNALADDRESS(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALADDRESS(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(pointer)) {
-        returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(bytePointer)) {
-        returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(charPointer)) {
-        returnValue = __MKSTRING(__returnValue.pointerVal);
-        if (mustFreeRetVal == true) {
-            free(__returnValue.pointerVal);
-            alreadyFreed = true;
-        }
+	returnValue = __MKSTRING(__returnValue.pointerVal);
+	if (mustFreeRetVal == true) {
+	    free(__returnValue.pointerVal);
+	    alreadyFreed = true;
+	}
     } else if (returnTypeSymbol == @symbol(wcharPointer)) {
-        returnValue = __MKU16STRING(__returnValue.pointerVal);
-        if (mustFreeRetVal == true) {
-            free(__returnValue.pointerVal);
-            alreadyFreed = true;
-        }
+	returnValue = __MKU16STRING(__returnValue.pointerVal);
+	if (mustFreeRetVal == true) {
+	    free(__returnValue.pointerVal);
+	    alreadyFreed = true;
+	}
     } else {
-        __FAIL__(@symbol(UnknownReturnType2))
+	__FAIL__(@symbol(UnknownReturnType2))
     }
 
 getOutOfHere: ;
 %}.
     failureCode notNil ifTrue:[
-        (failureCode == #UnknownReturnType or:[ failureCode == #UnknownArgumentType ]) ifTrue:[
-            oldReturnType := returnType.
-            oldArgumentTypes := argumentTypes.
-            self adjustTypes.
-            ((oldReturnType ~= returnType) or:[oldArgumentTypes ~= argumentTypes]) ifTrue:[
-                thisContext restart
-            ].
-        ].
-        (failureCode == #BadArgForAsyncCall) ifTrue:[
-            ^ self tryAgainWithAsyncSafeArguments:argumentsOrNil forInstance:aReceiverOrNil
-        ].
-        (failureCode == #FFINotSupported) ifTrue:[
-            ^ self primitiveFailed:'FFI support missing in this build'.
-        ].
-
-        (failureCode == #InvalidArgument) ifTrue:[
-            ^ self primitiveFailed:('cannot convert argument: #%1' bindWith:failureArgNr).
-        ] ifFalse:[        
-            ^ self primitiveFailed.   "see failureCode and failureInfo for details"
-        ].
-        "/ ^ nil
+	(failureCode == #UnknownReturnType or:[ failureCode == #UnknownArgumentType ]) ifTrue:[
+	    oldReturnType := returnType.
+	    oldArgumentTypes := argumentTypes.
+	    self adjustTypes.
+	    ((oldReturnType ~= returnType) or:[oldArgumentTypes ~= argumentTypes]) ifTrue:[
+		thisContext restart
+	    ].
+	].
+	(failureCode == #BadArgForAsyncCall) ifTrue:[
+	    ^ self tryAgainWithAsyncSafeArguments:argumentsOrNil forInstance:aReceiverOrNil
+	].
+	(failureCode == #FFINotSupported) ifTrue:[
+	    ^ self primitiveFailed:'FFI support missing in this build'.
+	].
+
+	(failureCode == #InvalidArgument) ifTrue:[
+	    ^ self primitiveFailed:('cannot convert argument: #%1' bindWith:failureArgNr).
+	] ifFalse:[
+	    ^ self primitiveFailed.   "see failureCode and failureInfo for details"
+	].
+	"/ ^ nil
     ].
 
     (mustFreeRetVal and:[alreadyFreed not]) ifTrue:[
-        returnValue registerForFinalization.
+	returnValue registerForFinalization.
     ].
 
     returnType isSymbol ifTrue:[
-        returnValueClass notNil ifTrue:[
-            self isConstReturnValue ifTrue:[
-                returnValue changeClassTo:returnValueClass.
-                ^ returnValue
-            ].
-            ^ returnValueClass fromExternalAddress:returnValue.
-        ].
+	returnValueClass notNil ifTrue:[
+	    self isConstReturnValue ifTrue:[
+		returnValue changeClassTo:returnValueClass.
+		^ returnValue
+	    ].
+	    ^ returnValueClass fromExternalAddress:returnValue.
+	].
     ] ifFalse:[
-        returnType isCPointer ifTrue:[
-            returnType baseType isCStruct ifTrue:[
-                stClass := Smalltalk classNamed:returnType baseType name.
-                stClass notNil ifTrue:[
-                    self isConstReturnValue ifTrue:[
-                        returnValue changeClassTo:returnValueClass.
-                        ^ returnValue
-                    ].
-                    ^ stClass fromExternalAddress:returnValue.
-                ].
-            ].
-            returnType baseType isCChar ifTrue:[
-                ^ returnValue stringAt:1
-            ].
-        ].
+	returnType isCPointer ifTrue:[
+	    returnType baseType isCStruct ifTrue:[
+		stClass := Smalltalk classNamed:returnType baseType name.
+		stClass notNil ifTrue:[
+		    self isConstReturnValue ifTrue:[
+			returnValue changeClassTo:returnValueClass.
+			^ returnValue
+		    ].
+		    ^ stClass fromExternalAddress:returnValue.
+		].
+	    ].
+	    returnType baseType isCChar ifTrue:[
+		^ returnValue stringAt:1
+	    ].
+	].
     ].
 
     ^ returnValue