ExternalLibraryFunction.st
branchjv
changeset 20344 152b525b5c63
parent 20343 0719a15ae26d
parent 20311 ada51bcdfb84
child 20398 8cb53f870d39
--- a/ExternalLibraryFunction.st	Thu Aug 25 11:28:17 2016 +0100
+++ b/ExternalLibraryFunction.st	Wed Aug 31 22:45:49 2016 +0100
@@ -1,3 +1,5 @@
+"{ Encoding: utf8 }"
+
 "
  COPYRIGHT (c) 2004 by eXept Software AG
 	      All Rights Reserved
@@ -76,11 +78,11 @@
    extern ffi_type *__get_ffi_type_double();
    extern ffi_type *__get_ffi_type_void();
    extern ffi_type *__get_ffi_type_pointer();
-   extern INTFUNC __get_ffi_prep_cif();
-   extern INTFUNC __get_ffi_call();
+   extern INTLFUNC __get_ffi_prep_cif();
+   extern INTLFUNC __get_ffi_call();
 #  ifdef _MINGW__
 #   define ffi_prep_cif (*(__get_ffi_prep_cif()))
-#   define ffi_call (*(__get_ffi_call()))
+#   define ffi_call     (*(__get_ffi_call()))
 #  endif
 # endif
 
@@ -227,7 +229,7 @@
   Synchronous vs. Asynchronous calls:
 
     by default, foreign function calls are synchronous, effectively blocking the whole ST/X system
-    (that is by purpose,because most C-code is not prepared for being interrupted, and also, normal
+    (that is by purpose,´because most C-code is not prepared for being interrupted, and also, normal
      code is not prepared for a garbage collector to move objects around, while another C thread might
      access the data...).
     Therefore, the following will block all ST/X activity for 10 seconds
@@ -323,15 +325,15 @@
 dllMappingAt:baseLibname put:aNameOrPath
     "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
-            dllMappingAt:'sqlite3'
-            put: 'C:\Program Files\Mozilla Firefox\mozsqlite3.dll'
+	ExternalLibraryFunction
+	    dllMappingAt:'sqlite3'
+	    put: 'C:\Program Files\Mozilla Firefox\mozsqlite3.dll'
      for mingw:
-        ExternalLibraryFunction
-            dllMappingAt:'sqlite3'
-            put:'C:\mingw64\opt\bin\libsqlite3-0.dll'
+	ExternalLibraryFunction
+	    dllMappingAt:'sqlite3'
+	    put:'C:\mingw64\opt\bin\libsqlite3-0.dll'
     "
 
     self dllMapping at:baseLibname put: aNameOrPath
@@ -354,25 +356,25 @@
 
     DLLPATH isNil ifTrue:[
 	DLLPATH := #('.').
+    ].
 %{
 #ifndef __SCHTEAM__
-	@global(FLAG_VIRTUAL) = __MKSMALLINT(__EXTL_FLAG_VIRTUAL);                  // a virtual c++ call
-	@global(FLAG_NONVIRTUAL) = __MKSMALLINT(__EXTL_FLAG_NONVIRTUAL);            // a non-virtual c++ call
-	@global(FLAG_OBJECTIVEC) = __MKSMALLINT(__EXTL_FLAG_OBJECTIVEC);            // an objectiveC message send
-	@global(FLAG_UNLIMITEDSTACK) = __MKSMALLINT(__EXTL_FLAG_UNLIMITEDSTACK);    // unlimitedstack under unix
-	@global(FLAG_ASYNC) = __MKSMALLINT(__EXTL_FLAG_ASYNC);                      // async under win32
-	@global(FLAG_RETVAL_IS_CONST) = __MKSMALLINT(__EXTL_FLAG_RETVAL_IS_CONST);  // retvalue is not to be registered for finalization
+    @global(FLAG_VIRTUAL) = __MKSMALLINT(__EXTL_FLAG_VIRTUAL);                  // a virtual c++ call
+    @global(FLAG_NONVIRTUAL) = __MKSMALLINT(__EXTL_FLAG_NONVIRTUAL);            // a non-virtual c++ call
+    @global(FLAG_OBJECTIVEC) = __MKSMALLINT(__EXTL_FLAG_OBJECTIVEC);            // an objectiveC message send
+    @global(FLAG_UNLIMITEDSTACK) = __MKSMALLINT(__EXTL_FLAG_UNLIMITEDSTACK);    // unlimitedstack under unix
+    @global(FLAG_ASYNC) = __MKSMALLINT(__EXTL_FLAG_ASYNC);                      // async under win32
+    @global(FLAG_RETVAL_IS_CONST) = __MKSMALLINT(__EXTL_FLAG_RETVAL_IS_CONST);  // retvalue is not to be registered for finalization
 
-	@global(CALLTYPE_API) = __MKSMALLINT(__EXTL_CALLTYPE_API);                  // WINAPI-call (win32 only)
-	@global(CALLTYPE_C) = __MKSMALLINT(__EXTL_CALLTYPE_C);                      // regular C-call (the default)
-	@global(CALLTYPE_V8) = __MKSMALLINT(__EXTL_CALLTYPE_V8);                    // v8 call (sparc only)
-	@global(CALLTYPE_V9) = __MKSMALLINT(__EXTL_CALLTYPE_V9);                    // v9 call (sparc only)
-	@global(CALLTYPE_UNIX64) = __MKSMALLINT(__EXTL_CALLTYPE_UNIX64);            // unix64 call (alpha only)
+    @global(CALLTYPE_API) = __MKSMALLINT(__EXTL_CALLTYPE_API);                  // WINAPI-call (win32 only)
+    @global(CALLTYPE_C) = __MKSMALLINT(__EXTL_CALLTYPE_C);                      // regular C-call (the default)
+    @global(CALLTYPE_V8) = __MKSMALLINT(__EXTL_CALLTYPE_V8);                    // v8 call (sparc only)
+    @global(CALLTYPE_V9) = __MKSMALLINT(__EXTL_CALLTYPE_V9);                    // v9 call (sparc only)
+    @global(CALLTYPE_UNIX64) = __MKSMALLINT(__EXTL_CALLTYPE_UNIX64);            // unix64 call (alpha only)
 
-	@global(CALLTYPE_MASK) = __MKSMALLINT(__EXTL_CALLTYPE_MASK);
+    @global(CALLTYPE_MASK) = __MKSMALLINT(__EXTL_CALLTYPE_MASK);
 #endif
-%}
-    ].
+%}.
 
     "
      self initialize
@@ -898,46 +900,47 @@
     |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
+        ]
     ].
 
     "/ in some other smalltalks, there is no moduleName in the ffi-spec;
     "/ instead, the class provides the libraryName...
     (moduleNameUsed := moduleName) isNil ifTrue:[
-	owningClass isNil ifTrue:[
-	    self error:'Missing moduleName'.
-	].
-	moduleNameUsed := owningClass theNonMetaclass libraryName asSymbol.
+        owningClass isNil ifTrue:[
+            self error:'Missing moduleName'.
+        ].
+        moduleNameUsed := owningClass theNonMetaclass libraryName 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:[ LastModuleHandleName ~= moduleNameUsed ]]) ifTrue:[
+        "/ speedup. in 95% of all calls, the same moduleName is resolved here
+        (LastModuleHandleHolder isNil
+        or:[ (handle := LastModuleHandleHolder at:1) isNil
+        or:[ LastModuleHandleName ~= moduleNameUsed ]]) ifTrue:[
 
-	    handle := self loadLibrary:moduleNameUsed.
-	    handle isNil ifTrue:[
-		self error:('Cannot find or load dll/module: "%1"' bindWith: moduleNameUsed).
-	    ].
-	    LastModuleHandleHolder := WeakArray with:handle.
-	    LastModuleHandleName := moduleNameUsed.
-	].
-	moduleHandle := handle.
+            handle := self loadLibrary:moduleNameUsed.
+            (handle isNil or:[handle = -1]) ifTrue:[
+                self error:('Cannot find or load dll/module: "%1"' bindWith: moduleNameUsed).
+            ].
+            LastModuleHandleHolder := WeakArray with:handle.
+            LastModuleHandleName := moduleNameUsed.
+        ].
+        moduleHandle := handle.
     ].
     name isNumber ifFalse:[
-	functionName := name.
-	(moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
-	    (moduleHandle getFunctionAddress:('_', functionName) into:self) isNil ifTrue:[
-		moduleHandle := nil.
-		self error:'Missing function: ', name, ' in module: ', moduleNameUsed.
-	    ].
-	].
+        functionName := name.
+        (moduleHandle getFunctionAddress:functionName into:self) isNil ifTrue:[
+            (moduleHandle getFunctionAddress:('_', functionName) into:self) isNil ifTrue:[
+                moduleHandle := nil.
+                LastModuleHandleHolder := LastModuleHandleName := nil.
+                self error:'Missing function: ', name, ' in module: ', moduleNameUsed.
+            ].
+        ].
     ].
 
-    "Modified: / 10-04-2012 / 12:12:44 / cg"
+    "Modified: / 26-08-2016 / 17:43:34 / cg"
 !
 
 loadLibrary:dllName
@@ -1070,36 +1073,36 @@
     virtual := self isVirtualCPP.
     objectiveC := self isObjectiveC.
     (virtual "or:[self isNonVirtualCPP]") ifTrue:[
-	aReceiverOrNil isNil ifTrue:[
-	    "/ must have a c++ object instance
-	    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.
-	    ]
-	].
+        "/ 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.
@@ -1146,14 +1149,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];
@@ -1165,34 +1168,34 @@
     int __numArgs, __numArgsIncludingThis;
     static INT null = 0;
     int i = -1;
-    VOIDFUNC codeAddress = (VOIDFUNC)__INST(code_);
+    voidFUNC codeAddress = (voidFUNC)__INST(code_);
     int __numArgsWanted;
 
 #   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 (__isArray(argumentsOrNil)) {
-	__numArgs = __arraySize(argumentsOrNil);
+        __numArgs = __arraySize(argumentsOrNil);
     } else {
-	__FAIL__(@symbol(BadArgumentVector))
+        __FAIL__(@symbol(BadArgumentVector))
     }
     if (argTypeSymbols == nil) {
-	__numArgsWanted = 0;
+        __numArgsWanted = 0;
     } else if (__isArray(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))
     }
 
     /*
@@ -1201,611 +1204,616 @@
     __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;
+        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;
+        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;
+        __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);
-	    })
-	}
+        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);
+            })
+        }
     } else {
-	__numArgsIncludingThis = __numArgs;
-	DEBUGCODE_IF( @global(Verbose), {
-	    printf("codeAddress: %"_lx_"\n", (INT)codeAddress);
-	})
+        __numArgsIncludingThis = __numArgs;
+        DEBUGCODE_IF( @global(Verbose), {
+            printf("codeAddress: %"_lx_"\n", (INT)codeAddress);
+        })
     }
 
     /*
      * 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;
+        void *argValuePtr;
+        OBJ typeSymbol;
+        OBJ arg;
 
-	failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
+        failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
 
-	typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
-	arg = __ArrayInstPtr(argumentsOrNil)->a_element[i];
+        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(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(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);
+        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;
+        } 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);
+            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(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(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(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(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))
-		}
-	    }
+        } 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);
+            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))
-		}
-	    }
+         } 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);
+            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(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(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(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(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(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(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;
+        } 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);;
+                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;
+        } 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;
+                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));
+                if ((INT)(__DoubleArrayInstPtr(arg)->d_element) & (__DOUBLE_ALIGN-1)) {
+                    int delta = __DOUBLE_ALIGN - ((INT)p & (__DOUBLE_ALIGN-1));
 
-		    p += delta;
-		}
+                    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);;
+                __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)) {
+        } 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;
+                    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);;
+                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;
+        } 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))
-	    }
-	}
+            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;
+        __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);
-	})
+        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);
+        })
     }
     failureInfo = nil;
 
     if (callTypeNumber == @global(CALLTYPE_API)) {
 #  ifdef __MINGW64__
-	__callType = FFI_DEFAULT_ABI;
+        __callType = FFI_DEFAULT_ABI;
 #  else
-#   ifdef CALLTYPE_FFI_STDCALL
-	__callType = CALLTYPE_FFI_STDCALL;
-	DEBUGCODE_IF( @global(Verbose), {
-	    printf("STDCALL\n");
-	})
-	failureCode = @symbol(FFICallTypeNotSupported);
-	goto getOutOfHere;
+#   ifdef CALLTYPE_API
+        __callType = CALLTYPE_API;
+#   else
+#    ifdef CALLTYPE_FFI_STDCALL
+        __callType = CALLTYPE_FFI_STDCALL;
+#    else
+        DEBUGCODE_IF( @global(Verbose), {
+            printf("STDCALL\n");
+        })
+        failureCode = @symbol(FFICallTypeNotSupported);
+        goto getOutOfHere;
+#    endif
 #   endif
 #  endif
     }
@@ -1813,64 +1821,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%"_lx_"\n", (INT)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%"_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);
+        }
     }
 
 # else /* NO FFI */
@@ -1885,615 +1893,615 @@
     // pass down separately.
 
     {
-	VOIDPTRFUNC fi = (VOIDPTRFUNC)codeAddress;
-	DOUBLEFUNC fd = (DOUBLEFUNC)codeAddress;
-	int rI[MAX_ARGS], dI[MAX_ARGS];
-	int i;
+        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;
+        // 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++) {
+        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;
+            {
+                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;
+        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("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;
-		    }
-	    }
-	}
+                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
 
     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))
@@ -2501,68 +2509,68 @@
      || (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 ));
+        RETURN ( __MKFLOAT(__returnValue.dVal ));
     }
     if (returnTypeSymbol == @symbol(void)) {
-	RETURN ( nil );
+        RETURN ( nil );
     }
     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) || returnTypeSymbol == @symbol(pointer)) {
         if (__returnValue.pointerVal == NULL) {
@@ -2579,67 +2587,67 @@
             }
         }
     } else if (returnTypeSymbol == @symbol(bytePointer)) {
-	returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
+        returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(charPointer)) {
-	returnValue = __MKSTRING(__returnValue.pointerVal);
+        returnValue = __MKSTRING(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(wcharPointer)) {
-	returnValue = __MKU16STRING(__returnValue.pointerVal);
+        returnValue = __MKU16STRING(__returnValue.pointerVal);
     } 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 forCPPInstance:aReceiverOrNil
-	].
-	(failureCode == #FFINotSupported) ifTrue:[
-	    self primitiveFailed:'FFI support missing in this build'.
-	].
+        (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 forCPPInstance:aReceiverOrNil
+        ].
+        (failureCode == #FFINotSupported) ifTrue:[
+            self primitiveFailed:'FFI support missing in this build'.
+        ].
 
-	self primitiveFailed.   "see failureCode and failureInfo for details"
-	^ nil
+        self primitiveFailed.   "see failureCode and failureInfo for details"
+        ^ nil
     ].
 
     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
 
     "Created: / 01-08-2006 / 13:56:23 / cg"
-    "Modified: / 31-03-2016 / 00:03:03 / cg"
+    "Modified: / 26-08-2016 / 15:36:35 / cg"
     "Modified: / 07-07-2015 / 22:21:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !