ExternalLibraryFunction.st
changeset 24051 f531b38415db
parent 24050 f39b5494bc52
child 24052 d9fb5cb43b52
--- a/ExternalLibraryFunction.st	Wed Apr 10 06:08:33 2019 +0200
+++ b/ExternalLibraryFunction.st	Wed Apr 10 09:31:03 2019 +0200
@@ -99,6 +99,7 @@
 # define TYPE_FLOAT     __get_ffi_type_float()
 # define TYPE_DOUBLE    __get_ffi_type_double()
 # define TYPE_VOID      __get_ffi_type_void()
+# define TYPE_STRUCT    FFI_TYPE_STRUCT // __get_ffi_type_struct()
 
 #else /* NO FFI */
 
@@ -629,6 +630,10 @@
     "/ care for 64bit machines
     aType == #SIZE_T          ifTrue:[^ ExternalBytes sizeofPointer == 8 ifTrue:[#uint64] ifFalse:[#uint32]].
 
+    aType isArray ifTrue:[
+	^ aType collect:[:each | self ffiTypeSymbolForType:each]
+    ].
+
     (aType isString or:[aType isSymbol]) ifFalse:[
 	CType isNil ifTrue:[
 	    self error:'unknown type'.
@@ -1374,36 +1379,36 @@
     virtual := self isVirtualCPP.
     objectiveC := self isObjectiveC.
     (virtual "or:[self isNonVirtualCPP]") ifTrue:[
-        aReceiverOrNil isNil ifTrue:[
-            "/ must have a c++ object instance
-            self primitiveFailed.
-        ].
-
-        "/ and it must be a kind of ExternalStructure !!
-        (aReceiverOrNil isKindOf:ExternalStructure) ifFalse:[
-            self primitiveFailed.
-        ].
-        virtual ifTrue:[
-            vtOffset := name.
-            (vtOffset between:0 and:10000) ifFalse:[
-                self primitiveFailed.
-            ]
-        ].
+	aReceiverOrNil isNil ifTrue:[
+	    "/ must have a c++ object instance
+	    self primitiveFailed.
+	].
+
+	"/ and it must be a kind of ExternalStructure !!
+	(aReceiverOrNil isKindOf:ExternalStructure) ifFalse:[
+	    self primitiveFailed.
+	].
+	virtual ifTrue:[
+	    vtOffset := name.
+	    (vtOffset between:0 and:10000) ifFalse:[
+		self primitiveFailed.
+	    ]
+	].
     ] ifFalse:[
-        objectiveC ifTrue:[
-            aReceiverOrNil isNil ifTrue:[
-                "/ must have an objective-c object instance
-                self primitiveFailed.
-            ].
-            (aReceiverOrNil isObjectiveCObject) ifFalse:[
-                self primitiveFailed
-            ]
-        ] ifFalse:[
-            aReceiverOrNil notNil ifTrue:[
-                "/ must NOT have a c++/objectiveC object instance
-                self primitiveFailed.
-            ]
-        ].
+	objectiveC ifTrue:[
+	    aReceiverOrNil isNil ifTrue:[
+		"/ must have an objective-c object instance
+		self primitiveFailed.
+	    ].
+	    (aReceiverOrNil isObjectiveCObject) ifFalse:[
+		self primitiveFailed
+	    ]
+	] ifFalse:[
+	    aReceiverOrNil notNil ifTrue:[
+		"/ must NOT have a c++/objectiveC object instance
+		self primitiveFailed.
+	    ]
+	].
     ].
     async := self isAsync.
     unlimitedStack := self isUnlimitedStack.
@@ -1412,7 +1417,7 @@
     alreadyFreed := false.
 
     argumentsOrNil size ~~ 0 ifTrue:[
-        argumentsOrNil := argumentsOrNil collect:[:arg | self convertArgument:arg]
+	argumentsOrNil := argumentsOrNil collect:[:arg | self convertArgument:arg]
     ].
 
     "/ Transcript show:name; show:' async:'; showCR:async.
@@ -1461,14 +1466,14 @@
     int numStructArgs = 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];
@@ -1485,29 +1490,29 @@
 
 #   define __FAIL__(fcode) \
     { \
-        failureCode = fcode; failureArgNr = __mkSmallInteger(i+1); goto getOutOfHere; \
+	failureCode = fcode; failureArgNr = __mkSmallInteger(i+1); goto getOutOfHere; \
     }
 
     if (argumentsOrNil == nil) {
-        __numArgs = 0;
+	__numArgs = 0;
     } else if (__isArrayLike(argumentsOrNil)) {
-        __numArgs = __arraySize(argumentsOrNil);
+	__numArgs = __arraySize(argumentsOrNil);
     } else {
-        __FAIL__(@symbol(BadArgumentVector))
+	__FAIL__(@symbol(BadArgumentVector))
     }
     if (argTypeSymbols == nil) {
-        __numArgsWanted = 0;
+	__numArgsWanted = 0;
     } else if (__isArrayLike(argTypeSymbols)) {
-        __numArgsWanted = __arraySize(argTypeSymbols);
+	__numArgsWanted = __arraySize(argTypeSymbols);
     } else {
-        __FAIL__(@symbol(BadArgumentTypeVector))
+	__FAIL__(@symbol(BadArgumentTypeVector))
     }
 
     if (__numArgs != __numArgsWanted) {
-        __FAIL__(@symbol(ArgumentCountMismatch))
+	__FAIL__(@symbol(ArgumentCountMismatch))
     }
     if (__numArgs > MAX_ARGS) {
-        __FAIL__(@symbol(TooManyArguments))
+	__FAIL__(@symbol(TooManyArguments))
     }
 
     /*
@@ -1516,537 +1521,542 @@
     __returnValuePointer = &__returnValue;
 
     if (returnTypeSymbol == @symbol(voidPointer)) {
-        returnTypeSymbol = @symbol(handle);
+	returnTypeSymbol = @symbol(handle);
     } else if (returnTypeSymbol == @symbol(hresult)) {
-        returnTypeSymbol = @symbol(uint32);
+	returnTypeSymbol = @symbol(uint32);
     }
 
     if (returnTypeSymbol == @symbol(int)) {
-        __returnType = TYPE_SINT;
+	__returnType = TYPE_SINT;
     } else if (returnTypeSymbol == @symbol(uint)) {
-        __returnType = TYPE_UINT;
+	__returnType = TYPE_UINT;
     } else if (returnTypeSymbol == @symbol(uint8)) {
-        __returnType = TYPE_UINT8;
+	__returnType = TYPE_UINT8;
     } else if (returnTypeSymbol == @symbol(uint16)) {
-        __returnType = TYPE_UINT16;
+	__returnType = TYPE_UINT16;
     } else if (returnTypeSymbol == @symbol(uint32)) {
-        __returnType = TYPE_UINT32;
+	__returnType = TYPE_UINT32;
     } else if (returnTypeSymbol == @symbol(uint64)) {
-        __returnType = TYPE_UINT64;
+	__returnType = TYPE_UINT64;
 
     } else if (returnTypeSymbol == @symbol(sint)) {
-        __returnType = TYPE_SINT;
+	__returnType = TYPE_SINT;
     } else if (returnTypeSymbol == @symbol(sint8)) {
-        __returnType = TYPE_SINT8;
+	__returnType = TYPE_SINT8;
     } else if (returnTypeSymbol == @symbol(sint16)) {
-        __returnType = TYPE_SINT16;
+	__returnType = TYPE_SINT16;
     } else if (returnTypeSymbol == @symbol(sint32)) {
-        __returnType = TYPE_SINT32;
+	__returnType = TYPE_SINT32;
     } else if (returnTypeSymbol == @symbol(sint64)) {
-        __returnType = TYPE_SINT64;
+	__returnType = TYPE_SINT64;
 
     } else if (returnTypeSymbol == @symbol(long)) {
-        if (sizeof(long) == 4) {
-           returnTypeSymbol = @symbol(sint32);
-           __returnType = TYPE_SINT32;
-        } else if (sizeof(long) == 8) {
-           returnTypeSymbol = @symbol(sint64);
-           __returnType = TYPE_SINT64;
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (sizeof(long) == 4) {
+	   returnTypeSymbol = @symbol(sint32);
+	   __returnType = TYPE_SINT32;
+	} else if (sizeof(long) == 8) {
+	   returnTypeSymbol = @symbol(sint64);
+	   __returnType = TYPE_SINT64;
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
 
     } else if (returnTypeSymbol == @symbol(ulong)) {
-        if (sizeof(long) == 4) {
-           returnTypeSymbol = @symbol(uint32);
-           __returnType = TYPE_UINT32;
-        }else if (sizeof(long) == 8) {
-           returnTypeSymbol = @symbol(uint64);
-           __returnType = TYPE_UINT64;
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (sizeof(long) == 4) {
+	   returnTypeSymbol = @symbol(uint32);
+	   __returnType = TYPE_UINT32;
+	}else if (sizeof(long) == 8) {
+	   returnTypeSymbol = @symbol(uint64);
+	   __returnType = TYPE_UINT64;
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
 
     } else if (returnTypeSymbol == @symbol(bool)) {
-        __returnType = TYPE_UINT;
+	__returnType = TYPE_UINT;
 
     } else if (returnTypeSymbol == @symbol(float)) {
-        __returnType = TYPE_FLOAT;
+	__returnType = TYPE_FLOAT;
     } else if (returnTypeSymbol == @symbol(double)) {
-        __returnType = TYPE_DOUBLE;
+	__returnType = TYPE_DOUBLE;
 
     } else if (returnTypeSymbol == @symbol(void)) {
-        __returnType = TYPE_VOID;
-        __returnValuePointer = NULL;
+	__returnType = TYPE_VOID;
+	__returnValuePointer = NULL;
     } else if ((returnTypeSymbol == @symbol(pointer))
-               || (returnTypeSymbol == @symbol(handle))
-               || (returnTypeSymbol == @symbol(charPointer))
-               || (returnTypeSymbol == @symbol(bytePointer))
-               || (returnTypeSymbol == @symbol(floatPointer))
-               || (returnTypeSymbol == @symbol(doublePointer))
-               || (returnTypeSymbol == @symbol(intPointer))
-               || (returnTypeSymbol == @symbol(shortPointer))
-               || (returnTypeSymbol == @symbol(wcharPointer))) {
-        __returnType = TYPE_POINTER;
+	       || (returnTypeSymbol == @symbol(handle))
+	       || (returnTypeSymbol == @symbol(charPointer))
+	       || (returnTypeSymbol == @symbol(bytePointer))
+	       || (returnTypeSymbol == @symbol(floatPointer))
+	       || (returnTypeSymbol == @symbol(doublePointer))
+	       || (returnTypeSymbol == @symbol(intPointer))
+	       || (returnTypeSymbol == @symbol(shortPointer))
+	       || (returnTypeSymbol == @symbol(wcharPointer))) {
+	__returnType = TYPE_POINTER;
     } else {
-        if (__isSymbol(returnTypeSymbol)
-         && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
-            if (! __isBehaviorLike(returnValueClass)) {
-                __FAIL__(@symbol(NonBehaviorReturnType))
-            }
-            if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
-                __FAIL__(@symbol(NonExternalAddressReturnType))
-            }
-            __returnType = TYPE_POINTER;
-            returnTypeSymbol = @symbol(pointer);
-        } else {
-            __FAIL__(@symbol(UnknownReturnType))
-        }
+	if (__isSymbol(returnTypeSymbol)
+	 && ((returnValueClass = __GLOBAL_GET(returnTypeSymbol)) != nil)) {
+	    if (! __isBehaviorLike(returnValueClass)) {
+		__FAIL__(@symbol(NonBehaviorReturnType))
+	    }
+	    if (! __qIsSubclassOfExternalAddress(returnValueClass)) {
+		__FAIL__(@symbol(NonExternalAddressReturnType))
+	    }
+	    __returnType = TYPE_POINTER;
+	    returnTypeSymbol = @symbol(pointer);
+	} else {
+	    __FAIL__(@symbol(UnknownReturnType))
+	}
     }
 
     /*
      * validate the c++ object
      */
     if (aReceiverOrNil != nil) {
-        struct cPlusPlusInstance {
-            void **vTable;
-        };
-        struct cPlusPlusInstance *inst;
-
-        if (__isExternalAddressLike(aReceiverOrNil)) {
-            inst = (void *)(__externalAddressVal(aReceiverOrNil));
-        } else if (__isExternalBytesLike(aReceiverOrNil)) {
-            inst = (void *)(__externalBytesVal(aReceiverOrNil));
-        } else {
-            __FAIL__(@symbol(InvalidInstance))
-        }
-        if (inst == NULL) {
-            __FAIL__(@symbol(BadReceiver))
-        }
-        __argValues[0].pointerVal = inst;
-        __argValuePointersIncludingThis[0] = &(__argValues[0]);
-        __argTypes[0] = TYPE_POINTER;
-
-        __argValuePointers = &__argValuePointersIncludingThis[1];
-        __argTypes = &__argTypesIncludingThis[1];
-        __argValues = &__argValuesIncludingThis[1];
-        __numArgsIncludingThis = __numArgs + 1;
-
-        if (virtual == true) {
-            if (! __isSmallInteger(vtOffset)) {
-                __FAIL__(@symbol(InvalidVTableIndex))
-            }
-            codeAddress = inst->vTable[__intVal(vtOffset)];
-            DEBUGCODE_IF( @global(Verbose), {
-                printf("virtual %"_ld_" codeAddress: %p\n", (INT)(__intVal(vtOffset)), codeAddress);
-            })
-        }
+	struct cPlusPlusInstance {
+	    void **vTable;
+	};
+	struct cPlusPlusInstance *inst;
+
+	if (__isExternalAddressLike(aReceiverOrNil)) {
+	    inst = (void *)(__externalAddressVal(aReceiverOrNil));
+	} else if (__isExternalBytesLike(aReceiverOrNil)) {
+	    inst = (void *)(__externalBytesVal(aReceiverOrNil));
+	} else {
+	    __FAIL__(@symbol(InvalidInstance))
+	}
+	if (inst == NULL) {
+	    __FAIL__(@symbol(BadReceiver))
+	}
+	__argValues[0].pointerVal = inst;
+	__argValuePointersIncludingThis[0] = &(__argValues[0]);
+	__argTypes[0] = TYPE_POINTER;
+
+	__argValuePointers = &__argValuePointersIncludingThis[1];
+	__argTypes = &__argTypesIncludingThis[1];
+	__argValues = &__argValuesIncludingThis[1];
+	__numArgsIncludingThis = __numArgs + 1;
+
+	if (virtual == true) {
+	    if (! __isSmallInteger(vtOffset)) {
+		__FAIL__(@symbol(InvalidVTableIndex))
+	    }
+	    codeAddress = inst->vTable[__intVal(vtOffset)];
+	    DEBUGCODE_IF( @global(Verbose), {
+		printf("virtual %"_ld_" codeAddress: %p\n", (INT)(__intVal(vtOffset)), codeAddress);
+	    })
+	}
     } else {
-        __numArgsIncludingThis = __numArgs;
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("codeAddress: %p\n", codeAddress);
-        })
+	__numArgsIncludingThis = __numArgs;
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("codeAddress: %p\n", codeAddress);
+	})
     }
 
     if (codeAddress == NULL) {
-        __FAIL__(@symbol(BadCodeAddress))
+	__FAIL__(@symbol(BadCodeAddress))
     }
 
     /*
      * validate all arg types, map each to an ffi_type, and setup arg-buffers
      */
     for (i=0; i<__numArgs; i++) {
-        void *argValuePtr;
-        OBJ typeSymbol;
-        OBJ arg;
-
-        failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
-
-        typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
-        arg = __ArrayInstPtr(argumentsOrNil)->a_element[i];
-
-        if (typeSymbol == @symbol(handle)) {
-            typeSymbol = @symbol(pointer);
-        } else if (typeSymbol == @symbol(voidPointer)) {
-            typeSymbol = @symbol(pointer);
-        } else if (returnTypeSymbol == @symbol(hresult)) {
-            typeSymbol = @symbol(uint32);
-        }
-
-        if (typeSymbol == @symbol(long)) {
-            if (sizeof(long) == sizeof(int)) {
-                typeSymbol = @symbol(sint);
-            } else {
-                if (sizeof(long) == 4) {
-                    typeSymbol = @symbol(sint32);
-                } else if (sizeof(long) == 8) {
-                    typeSymbol = @symbol(sint64);
-                }
-            }
-        }
-        if (typeSymbol == @symbol(ulong)) {
-            if (sizeof(unsigned long) == sizeof(unsigned int)) {
-                typeSymbol = @symbol(uint);
-            } else {
-                if (sizeof(long) == 4) {
-                    typeSymbol = @symbol(uint32);
-                } else if (sizeof(long) == 8) {
-                    typeSymbol = @symbol(uint64);
-                }
-            }
-        }
-
-        if (typeSymbol == @symbol(int) || typeSymbol == @symbol(sint)) {
-            thisType = TYPE_SINT;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __signedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d sint value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint)) {
-            thisType = TYPE_UINT;
-
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d uint value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint8)) {
-            thisType = TYPE_UINT8;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(sint8)) {
-            thisType = TYPE_SINT8;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint16)) {
-            thisType = TYPE_UINT16;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(sint16)) {
-            thisType = TYPE_SINT16;
-            if (! __isSmallInteger(arg)) {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            __argValues[i].iVal = __intVal(arg);
-            if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint32)) {
-            thisType = TYPE_UINT32;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
+	void *argValuePtr;
+	OBJ typeSymbol;
+	OBJ arg;
+
+	failureInfo = __mkSmallInteger(i+1);   /* in case there is one */
+
+	typeSymbol = __ArrayInstPtr(argTypeSymbols)->a_element[i];
+	arg = __ArrayInstPtr(argumentsOrNil)->a_element[i];
+
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("arg%d type:\n", i+1); __dumpObject__(typeSymbol, __LINE__, __FILE__);
+	    printf("arg%d Value:\n", i+1); __dumpObject__(arg, __LINE__, __FILE__);
+	})
+
+	if (typeSymbol == @symbol(handle)) {
+	    typeSymbol = @symbol(pointer);
+	} else if (typeSymbol == @symbol(voidPointer)) {
+	    typeSymbol = @symbol(pointer);
+	} else if (returnTypeSymbol == @symbol(hresult)) {
+	    typeSymbol = @symbol(uint32);
+	}
+
+	if (typeSymbol == @symbol(long)) {
+	    if (sizeof(long) == sizeof(int)) {
+		typeSymbol = @symbol(sint);
+	    } else {
+		if (sizeof(long) == 4) {
+		    typeSymbol = @symbol(sint32);
+		} else if (sizeof(long) == 8) {
+		    typeSymbol = @symbol(sint64);
+		}
+	    }
+	}
+	if (typeSymbol == @symbol(ulong)) {
+	    if (sizeof(unsigned long) == sizeof(unsigned int)) {
+		typeSymbol = @symbol(uint);
+	    } else {
+		if (sizeof(long) == 4) {
+		    typeSymbol = @symbol(uint32);
+		} else if (sizeof(long) == 8) {
+		    typeSymbol = @symbol(uint64);
+		}
+	    }
+	}
+
+	if (typeSymbol == @symbol(int) || typeSymbol == @symbol(sint)) {
+	    thisType = TYPE_SINT;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __signedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d sint value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint)) {
+	    thisType = TYPE_UINT;
+
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d uint value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint8)) {
+	    thisType = TYPE_UINT8;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((unsigned)(__argValues[i].iVal)) > 0xFF) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(sint8)) {
+	    thisType = TYPE_SINT8;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((__argValues[i].iVal) < -0x80) || ((__argValues[i].iVal) > 0x7F))  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint8 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint16)) {
+	    thisType = TYPE_UINT16;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((unsigned)(__argValues[i].iVal)) > 0xFFFF) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(sint16)) {
+	    thisType = TYPE_SINT16;
+	    if (! __isSmallInteger(arg)) {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    __argValues[i].iVal = __intVal(arg);
+	    if (((__argValues[i].iVal) < -0x8000) || ((__argValues[i].iVal) > 0x7FFF))  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint16 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint32)) {
+	    thisType = TYPE_UINT32;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
 # if __POINTER_SIZE__ == 8
-            if ((__argValues[i].iVal) < 0)  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
+	    if ((__argValues[i].iVal) < 0)  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d uint32 value out of range [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
 # endif
-            argValuePtr = &(__argValues[i].iVal);
-
-         } else if (typeSymbol == @symbol(sint32)) {
-            thisType = TYPE_SINT32;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __signedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d sint32 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	 } else if (typeSymbol == @symbol(sint32)) {
+	    thisType = TYPE_SINT32;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __signedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d sint32 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
 # if __POINTER_SIZE__ == 8
-            if (((__argValues[i].iVal) < -0x80000000LL) || ((__argValues[i].iVal) > 0x7FFFFFFFLL))  {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d sint32 value (%"_lx_") out of range [%d]\n", i+1, __argValues[i].iVal, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
+	    if (((__argValues[i].iVal) < -0x80000000LL) || ((__argValues[i].iVal) > 0x7FFFFFFFLL))  {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d sint32 value (%"_lx_") out of range [%d]\n", i+1, __argValues[i].iVal, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
 # endif
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(uint64)) {
-            thisType = TYPE_UINT64;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __unsignedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d uint64 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-         } else if (typeSymbol == @symbol(sint64)) {
-            thisType = TYPE_SINT64;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].iVal = __intVal(arg);
-            } else {
-                __argValues[i].iVal = __signedLongIntVal(arg);
-                if (__argValues[i].iVal == 0) {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d sint64 value out of range [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].iVal);
-
-        } else if (typeSymbol == @symbol(float)) {
-            thisType = TYPE_FLOAT;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].fVal = (float)(__intVal(arg));
-            } else if (__isFloat(arg)) {
-                __argValues[i].fVal = (float)(__floatVal(arg));
-            } else if (__isShortFloat(arg)) {
-                __argValues[i].fVal = (float)(__shortFloatVal(arg));
-            } else {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d non float value [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].fVal);
-        } else if (typeSymbol == @symbol(double)) {
-            thisType = TYPE_DOUBLE;
-            if (__isSmallInteger(arg)) {
-                __argValues[i].dVal = (double)(__intVal(arg));
-            } else if (__isFloat(arg)) {
-                __argValues[i].dVal = (double)(__floatVal(arg));
-            } else if (__isShortFloat(arg)) {
-                __argValues[i].dVal = (double)(__shortFloatVal(arg));
-            } else {
-                DEBUGCODE_IF( @global(Verbose), {
-                    printf("invalidArgument: arg%d non double value [%d]\n", i+1, __LINE__);
-                })
-                __FAIL__(@symbol(InvalidArgument))
-            }
-            argValuePtr = &(__argValues[i].dVal);
-
-        } else if (typeSymbol == @symbol(void)) {
-            thisType = TYPE_VOID;
-            argValuePtr = &null;
-
-        } else if (typeSymbol == @symbol(charPointer)) {
-            thisType = TYPE_POINTER;
-            if (__isStringLike(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__stringVal(arg));
-            } else if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non charPointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(wcharPointer)) {
-            thisType = TYPE_POINTER;
-            if (__isUnicode16String(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__unicode16StringVal(arg));
-            } else if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non wcharPointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(floatPointer)) {
-            thisType = TYPE_POINTER;
-            if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isFloats(arg)) {
-                char *p = (char *)(__FloatArrayInstPtr(arg)->f_element);
-                int nInstBytes;
-                OBJ cls;
-
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                p = p + nInstBytes;
-                __argValues[i].pointerVal = p;
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non floatPointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(doublePointer)) {
-            thisType = TYPE_POINTER;
-            if (__isBytes(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isDoubles(arg)) {
-                char *p = (char *)(__DoubleArrayInstPtr(arg)->d_element);
-                int nInstBytes;
-                OBJ cls;
-
-                if (async == true) goto badArgForAsyncCall;
-                cls = __qClass(arg);
-                nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
-                p = p + nInstBytes;
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(uint64)) {
+	    thisType = TYPE_UINT64;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __unsignedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d uint64 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	 } else if (typeSymbol == @symbol(sint64)) {
+	    thisType = TYPE_SINT64;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].iVal = __intVal(arg);
+	    } else {
+		__argValues[i].iVal = __signedLongIntVal(arg);
+		if (__argValues[i].iVal == 0) {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d sint64 value out of range [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].iVal);
+
+	} else if (typeSymbol == @symbol(float)) {
+	    thisType = TYPE_FLOAT;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].fVal = (float)(__intVal(arg));
+	    } else if (__isFloat(arg)) {
+		__argValues[i].fVal = (float)(__floatVal(arg));
+	    } else if (__isShortFloat(arg)) {
+		__argValues[i].fVal = (float)(__shortFloatVal(arg));
+	    } else {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d non float value [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].fVal);
+	} else if (typeSymbol == @symbol(double)) {
+	    thisType = TYPE_DOUBLE;
+	    if (__isSmallInteger(arg)) {
+		__argValues[i].dVal = (double)(__intVal(arg));
+	    } else if (__isFloat(arg)) {
+		__argValues[i].dVal = (double)(__floatVal(arg));
+	    } else if (__isShortFloat(arg)) {
+		__argValues[i].dVal = (double)(__shortFloatVal(arg));
+	    } else {
+		DEBUGCODE_IF( @global(Verbose), {
+		    printf("invalidArgument: arg%d non double value [%d]\n", i+1, __LINE__);
+		})
+		__FAIL__(@symbol(InvalidArgument))
+	    }
+	    argValuePtr = &(__argValues[i].dVal);
+
+	} else if (typeSymbol == @symbol(void)) {
+	    thisType = TYPE_VOID;
+	    argValuePtr = &null;
+
+	} else if (typeSymbol == @symbol(charPointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isStringLike(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__stringVal(arg));
+	    } else if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non charPointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(wcharPointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isUnicode16String(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__unicode16StringVal(arg));
+	    } else if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non wcharPointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(floatPointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isFloats(arg)) {
+		char *p = (char *)(__FloatArrayInstPtr(arg)->f_element);
+		int nInstBytes;
+		OBJ cls;
+
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		p = p + nInstBytes;
+		__argValues[i].pointerVal = p;
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non floatPointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(doublePointer)) {
+	    thisType = TYPE_POINTER;
+	    if (__isBytes(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isDoubles(arg)) {
+		char *p = (char *)(__DoubleArrayInstPtr(arg)->d_element);
+		int nInstBytes;
+		OBJ cls;
+
+		if (async == true) goto badArgForAsyncCall;
+		cls = __qClass(arg);
+		nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+		p = p + nInstBytes;
 # ifdef __NEED_DOUBLE_ALIGN
-                if ((INT)(__DoubleArrayInstPtr(arg)->d_element) & (__DOUBLE_ALIGN-1)) {
-                    int delta = __DOUBLE_ALIGN - ((INT)p & (__DOUBLE_ALIGN-1));
-
-                    p += delta;
-                }
+		if ((INT)(__DoubleArrayInstPtr(arg)->d_element) & (__DOUBLE_ALIGN-1)) {
+		    int delta = __DOUBLE_ALIGN - ((INT)p & (__DOUBLE_ALIGN-1));
+
+		    p += delta;
+		}
 # endif
-                __argValues[i].pointerVal = p;
-            } else {
-                if (arg == nil) {
-                    __argValues[i].pointerVal = (void *)0;
-                } else {
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("invalidArgument: arg%d non doublePointer value [%d]\n", i+1, __LINE__);
-                    })
-                    __FAIL__(@symbol(InvalidArgument))
-                }
-            }
-            argValuePtr = &(__argValues[i].pointerVal);;
-
-        } else if (typeSymbol == @symbol(pointer)) {
+		__argValues[i].pointerVal = p;
+	    } else {
+		if (arg == nil) {
+		    __argValues[i].pointerVal = (void *)0;
+		} else {
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("invalidArgument: arg%d non doublePointer value [%d]\n", i+1, __LINE__);
+		    })
+		    __FAIL__(@symbol(InvalidArgument))
+		}
+	    }
+	    argValuePtr = &(__argValues[i].pointerVal);;
+
+	} else if (typeSymbol == @symbol(pointer)) {
     commonPointerTypeArg: ;
-            thisType = TYPE_POINTER;
-            if (arg == nil) {
-                __argValues[i].pointerVal = NULL;
-            } else if (__isExternalAddressLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
-            } else if (__isExternalBytesLike(arg)) {
-                __argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
-            } else if (__isByteArrayLike(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
-            } else if (__isWordArray(arg) || __isSignedWordArray(arg)
-                    || __isIntegerArray(arg) || __isSignedIntegerArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__integerArrayVal(arg));
-            } else if (__isFloatArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__FloatArrayInstPtr(arg)->f_element);
-            } else if (__isDoubleArray(arg)) {
-                if (async == true) goto badArgForAsyncCall;
-                __argValues[i].pointerVal = (void *)(__DoubleArrayInstPtr(arg)->d_element);
-            } else if (__isStringLike(arg)) {
-                if (async == true) {
+	    thisType = TYPE_POINTER;
+	    if (arg == nil) {
+		__argValues[i].pointerVal = NULL;
+	    } else if (__isExternalAddressLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalAddressVal(arg));
+	    } else if (__isExternalBytesLike(arg)) {
+		__argValues[i].pointerVal = (void *)(__externalBytesVal(arg));
+	    } else if (__isByteArrayLike(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__byteArrayVal(arg));
+	    } else if (__isWordArray(arg) || __isSignedWordArray(arg)
+		    || __isIntegerArray(arg) || __isSignedIntegerArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__integerArrayVal(arg));
+	    } else if (__isFloatArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__FloatArrayInstPtr(arg)->f_element);
+	    } else if (__isDoubleArray(arg)) {
+		if (async == true) goto badArgForAsyncCall;
+		__argValues[i].pointerVal = (void *)(__DoubleArrayInstPtr(arg)->d_element);
+	    } else if (__isStringLike(arg)) {
+		if (async == true) {
 badArgForAsyncCall: ;
 		    DEBUGCODE_IF( @global(Verbose), {
 			printf("invalidArgument: arg%d not allowed for async call [%d]\n", i+1, __LINE__);
@@ -2104,9 +2114,12 @@
 		if (__isArray(typeSymbol)) {
 		    // struct
 		    int numFields = __arraySize(typeSymbol);
-		    int i;
+		    int fi;
 		    ffi_type **fieldTypes;
 
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("struct arg%d\n", i+1);
+		    })
 		    if (numStructArgs >= MAX_NUM_STRUCT_ARGS) {
 			__FAIL__(@symbol(TooManyStructArguments))
 		    }
@@ -2114,25 +2127,26 @@
 			__FAIL__(@symbol(TooManyStructFields))
 		    }
 		    fieldTypes = &(structTypeFields[numStructArgs][0]);
-
-		    structTypes[numStructArgs].size = 0;
-		    structTypes[numStructArgs].alignment = 0;
-		    structTypes[numStructArgs].elements = fieldTypes;
-		    for (i=0; i<numFields; i++) {
-			OBJ fieldTypeSymbol = __arrayVal(typeSymbol)[i];
+		    thisType = &(structTypes[numStructArgs]);
+
+		    thisType->size = 0;
+		    thisType->alignment = 0;
+		    thisType->elements = fieldTypes;
+		    thisType->type = TYPE_STRUCT;
+		    for (fi=0; fi<numFields; fi++) {
+			OBJ fieldTypeSymbol = __arrayVal(typeSymbol)[fi];
 
 			if (fieldTypeSymbol == @symbol(float)) {
-			    fieldTypes[i] = TYPE_FLOAT;
+			    fieldTypes[fi] = TYPE_FLOAT;
 			} else if (fieldTypeSymbol == @symbol(double)) {
-			    fieldTypes[i] = TYPE_DOUBLE;
+			    fieldTypes[fi] = TYPE_DOUBLE;
 			} else if (fieldTypeSymbol == @symbol(int)) {
-			    fieldTypes[i] = TYPE_SINT;
+			    fieldTypes[fi] = TYPE_SINT;
 			} else {
 			    __FAIL__(@symbol(UnsupportedFieldType))
 			}
 		    }
-		    fieldTypes[i] = NULL;
-		    thisType = &(structTypes[numStructArgs]);
+		    fieldTypes[fi] = NULL;
 		    numStructArgs++;
 		    // arg must be either a byteArray or externalBytes pointing to the struct
 		    // i.e. a CDatum's underlying storage
@@ -2181,19 +2195,19 @@
 
     if (callTypeNumber == @global(CALLTYPE_API)) {
 #  ifdef __MINGW64__
-        __callType = FFI_DEFAULT_ABI;
+	__callType = FFI_DEFAULT_ABI;
 #  else
 #   ifdef CALLTYPE_API
-        __callType = CALLTYPE_API;
+	__callType = CALLTYPE_API;
 #   else
 #    ifdef CALLTYPE_FFI_STDCALL
-        __callType = CALLTYPE_FFI_STDCALL;
+	__callType = CALLTYPE_FFI_STDCALL;
 #    else
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("STDCALL\n");
-        })
-        failureCode = @symbol(FFICallTypeNotSupported);
-        goto getOutOfHere;
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("STDCALL\n");
+	})
+	failureCode = @symbol(FFICallTypeNotSupported);
+	goto getOutOfHere;
 #    endif
 #   endif
 #  endif
@@ -2202,64 +2216,62 @@
     // 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);
-    }
-#  endif
+    DEBUGCODE_IF( @global(Verbose), {
+	printf("prep: numargs=%d\n", __numArgsIncludingThis);
+    })
 
     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%p\n", codeAddress);
-        })
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("async call 0x%p\n", codeAddress);
+	})
 #  ifdef __win32__
-        __STX_C_CALL4( "ffi_call", ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	__STX_C_CALL4( "ffi_call", ffi_call, &__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
 #  else
-        __BEGIN_INTERRUPTABLE__
-        ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
-        __END_INTERRUPTABLE__
+	__BEGIN_INTERRUPTABLE__
+	ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	__END_INTERRUPTABLE__
 #  endif
     } else {
-        if (unlimitedStack == true) {
-            DEBUGCODE_IF( @global(Verbose), {
-                printf("UNLIMITEDSTACKCALL call 0x%p\n", codeAddress);
-            })
-            __UNLIMITEDSTACKCALL4__((OBJFUNC)ffi_call, (INT)(&__cif), (INT)codeAddress, (INT)__returnValuePointer, (INT)__argValuePointersIncludingThis);
-        } else {
-            DEBUGCODE_IF( @global(Verbose), {
-                printf("call 0x%p\n", codeAddress);
-            })
-            ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
-        }
+	if (unlimitedStack == true) {
+	    DEBUGCODE_IF( @global(Verbose), {
+		printf("UNLIMITEDSTACKCALL call 0x%p\n", codeAddress);
+	    })
+	    __UNLIMITEDSTACKCALL4__((OBJFUNC)ffi_call, (INT)(&__cif), (INT)codeAddress, (INT)__returnValuePointer, (INT)__argValuePointersIncludingThis);
+	} else {
+	    DEBUGCODE_IF( @global(Verbose), {
+		printf("call 0x%p\n", codeAddress);
+	    })
+	    ffi_call(&__cif, codeAddress, __returnValuePointer, __argValuePointersIncludingThis);
+	}
     }
 
 # else /* NO FFI */
@@ -2274,619 +2286,619 @@
     // pass down separately.
 
     {
-        VOIDPTRFUNC fi = (VOIDPTRFUNC)codeAddress;
-        DOUBLEFUNC fd = (DOUBLEFUNC)codeAddress;
-        int rI[MAX_ARGS], dI[MAX_ARGS];
-        int i;
-
-        // sort the float/double args into a separate arglist and pass them AFTER the regular args.
-        // This is possible, because all doubles are passed in floating-pnt registers,
-        // no matter where they are in the arglist.
-        int argI = 0, nonDoubleI = 0, doubleI = 0;
-
-        for (argI=0; argI<__numArgsIncludingThis; argI++) {
+	VOIDPTRFUNC fi = (VOIDPTRFUNC)codeAddress;
+	DOUBLEFUNC fd = (DOUBLEFUNC)codeAddress;
+	int rI[MAX_ARGS], dI[MAX_ARGS];
+	int i;
+
+	// sort the float/double args into a separate arglist and pass them AFTER the regular args.
+	// This is possible, because all doubles are passed in floating-pnt registers,
+	// no matter where they are in the arglist.
+	int argI = 0, nonDoubleI = 0, doubleI = 0;
+
+	for (argI=0; argI<__numArgsIncludingThis; argI++) {
 #  if defined(__x86_64__)
-            if ((__argTypesIncludingThis[argI] == TYPE_DOUBLE)
-             || (__argTypesIncludingThis[argI] == TYPE_FLOAT)) {
-                dI[doubleI++] = argI;
-            } else
+	    if ((__argTypesIncludingThis[argI] == TYPE_DOUBLE)
+	     || (__argTypesIncludingThis[argI] == TYPE_FLOAT)) {
+		dI[doubleI++] = argI;
+	    } else
 #  endif // __x86_64__
-            {
-                rI[nonDoubleI++] = argI;
-            }
-        }
-        for (i=doubleI; i<__numArgsIncludingThis; i++) dI[doubleI++] = 0;
-        for (i=nonDoubleI; i<__numArgsIncludingThis; i++) rI[nonDoubleI++] = 0;
-
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("call %p with %d args (%d regular, %d double)\n",
-                        codeAddress, __numArgsIncludingThis, nonDoubleI, doubleI);
-        })
-        if (doubleI == 0) {
-            // no double args
-            switch (__returnType) {
-                case TYPE_FLOAT:
-                case TYPE_DOUBLE:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("non-double arg; double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.dVal = (*fd)();
-                            break;
-                        case 1:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal );
-                            break;
-                        case 2:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
-                            break;
-                        case 3:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal );
-                            break;
-                        case 4:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal );
-                            break;
-                        case 5:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal );
-                            break;
-                        case 6:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
-                            break;
-                        case 7:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal );
-                            break;
-                        case 8:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
-                            break;
-                        case 9:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal );
-                            break;
-                        case 10:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal );
-                            break;
-                        case 11:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal );
-                            break;
-                        case 12:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
-                            break;
-                        case 13:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal );
-                            break;
-                        case 14:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
-                            break;
-                        case 15:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                        __argValues[rI[14]].pointerVal );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-                    break;
-
-                default:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("non-double arg; non-double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.pointerVal = (*fi)();
-                            break;
-                        case 1:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal );
-                            break;
-                        case 2:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
-                            break;
-                        case 3:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal );
-                            break;
-                        case 4:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal );
-                            break;
-                        case 5:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal );
-                            break;
-                        case 6:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
-                            break;
-                        case 7:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal );
-                            break;
-                        case 8:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
-                            break;
-                        case 9:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal );
-                            break;
-                        case 10:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal );
-                            break;
-                        case 11:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal );
-                            break;
-                        case 12:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
-                            break;
-                        case 13:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                             __argValues[rI[12]].pointerVal );
-                            break;
-                        case 14:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                             __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
-                            break;
-                        case 15:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
-                                                             __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                             __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
-                                                             __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                             __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal, __argValues[rI[14]].pointerVal );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-            }
-        } else {
-            // has double args
-            switch (__returnType) {
-                case TYPE_FLOAT:
-                case TYPE_DOUBLE:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("double arg(s); double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.dVal = (*fd)( );
-                            break;
-                        case 1:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal,
-                                                        __argValues[dI[0]].dVal );
-                            break;
-                        case 2:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal
-                                                      );
-                            break;
-                        case 3:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal
-                                                      );
-                            break;
-                        case 4:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal
-                                                      );
-                            break;
-                        case 5:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal
-                                                      );
-                            break;
-                        case 6:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal
-                                                      );
-                            break;
-                        case 7:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal
-                                                      );
-                            break;
-                        case 8:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal
-                                                      );
-                            break;
-                        case 9:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal
-                                                      );
-                            break;
-                        case 10:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal
-                                                      );
-                            break;
-                        case 11:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal
-                                                      );
-                            break;
-                        case 12:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal
-                                                      );
-                            break;
-                        case 13:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                        __argValues[dI[12]].dVal
-                                                      );
-                            break;
-                        case 14:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                        __argValues[dI[12]].dVal, __argValues[dI[13]].dVal
-                                                      );
-                            break;
-                        case 15:
-                            __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                        __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                        __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                        __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                        __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                        __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                        __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                        __argValues[rI[14]].pointerVal,
-                                                        __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                        __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                        __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                        __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                        __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                        __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                        __argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
-                                                        __argValues[dI[14]].dVal
-                                                      );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-                    break;
-
-                default:
-                    DEBUGCODE_IF( @global(Verbose), {
-                        printf("double arg(s); non-double retval\n");
-                    })
-                    switch (__numArgsIncludingThis) {
-                        case 0:
-                            __returnValue.pointerVal = (*fi)( );
-                            break;
-                        case 1:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal,
-                                                              __argValues[dI[0]].dVal );
-                            break;
-                        case 2:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal
-                                                            );
-                            break;
-                        case 3:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal
-                                                            );
-                            break;
-                        case 4:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal
-                                                            );
-                            break;
-                        case 5:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal
-                                                            );
-                            break;
-                        case 6:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal
-                                                            );
-                            break;
-                        case 7:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal
-                                                            );
-                            break;
-                        case 8:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal
-                                                            );
-                            break;
-                        case 9:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal
-                                                            );
-                            break;
-                        case 10:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal
-                                                            );
-                            break;
-                        case 11:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal
-                                                            );
-                            break;
-                        case 12:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal
-                                                            );
-                            break;
-                        case 13:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[rI[12]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                              __argValues[dI[12]].dVal
-                                                            );
-                            break;
-                        case 14:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                              __argValues[dI[12]].dVal, __argValues[dI[13]].dVal
-                                                            );
-                            break;
-                        case 15:
-                            __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
-                                                              __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
-                                                              __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
-                                                              __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
-                                                              __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
-                                                              __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
-                                                              __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
-                                                              __argValues[rI[14]].pointerVal,
-                                                              __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
-                                                              __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
-                                                              __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
-                                                              __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
-                                                              __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
-                                                              __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
-                                                              __argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
-                                                              __argValues[dI[14]].dVal
-                                                            );
-                            break;
-                        default:
-                            failureCode = @symbol(TooManyArguments);
-                            goto getOutOfHere;
-                    }
-            }
-        }
+	    {
+		rI[nonDoubleI++] = argI;
+	    }
+	}
+	for (i=doubleI; i<__numArgsIncludingThis; i++) dI[doubleI++] = 0;
+	for (i=nonDoubleI; i<__numArgsIncludingThis; i++) rI[nonDoubleI++] = 0;
+
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("call %p with %d args (%d regular, %d double)\n",
+			codeAddress, __numArgsIncludingThis, nonDoubleI, doubleI);
+	})
+	if (doubleI == 0) {
+	    // no double args
+	    switch (__returnType) {
+		case TYPE_FLOAT:
+		case TYPE_DOUBLE:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("non-double arg; double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.dVal = (*fd)();
+			    break;
+			case 1:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal );
+			    break;
+			case 2:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
+			    break;
+			case 3:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal );
+			    break;
+			case 4:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal );
+			    break;
+			case 5:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal );
+			    break;
+			case 6:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
+			    break;
+			case 7:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal );
+			    break;
+			case 8:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
+			    break;
+			case 9:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal );
+			    break;
+			case 10:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal );
+			    break;
+			case 11:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal );
+			    break;
+			case 12:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
+			    break;
+			case 13:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal );
+			    break;
+			case 14:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
+			    break;
+			case 15:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							__argValues[rI[14]].pointerVal );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+		    break;
+
+		default:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("non-double arg; non-double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.pointerVal = (*fi)();
+			    break;
+			case 1:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal );
+			    break;
+			case 2:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal );
+			    break;
+			case 3:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal );
+			    break;
+			case 4:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal );
+			    break;
+			case 5:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal );
+			    break;
+			case 6:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal );
+			    break;
+			case 7:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal );
+			    break;
+			case 8:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal );
+			    break;
+			case 9:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal );
+			    break;
+			case 10:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal );
+			    break;
+			case 11:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal );
+			    break;
+			case 12:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal );
+			    break;
+			case 13:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							     __argValues[rI[12]].pointerVal );
+			    break;
+			case 14:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							     __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal );
+			    break;
+			case 15:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal, __argValues[rI[2]].pointerVal,
+							     __argValues[rI[3]].pointerVal, __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							     __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal, __argValues[rI[8]].pointerVal,
+							     __argValues[rI[9]].pointerVal, __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							     __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal, __argValues[rI[14]].pointerVal );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+	    }
+	} else {
+	    // has double args
+	    switch (__returnType) {
+		case TYPE_FLOAT:
+		case TYPE_DOUBLE:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("double arg(s); double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.dVal = (*fd)( );
+			    break;
+			case 1:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal,
+							__argValues[dI[0]].dVal );
+			    break;
+			case 2:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal
+						      );
+			    break;
+			case 3:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal
+						      );
+			    break;
+			case 4:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal
+						      );
+			    break;
+			case 5:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal
+						      );
+			    break;
+			case 6:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal
+						      );
+			    break;
+			case 7:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal
+						      );
+			    break;
+			case 8:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal
+						      );
+			    break;
+			case 9:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal
+						      );
+			    break;
+			case 10:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal
+						      );
+			    break;
+			case 11:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal
+						      );
+			    break;
+			case 12:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal
+						      );
+			    break;
+			case 13:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							__argValues[dI[12]].dVal
+						      );
+			    break;
+			case 14:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							__argValues[dI[12]].dVal, __argValues[dI[13]].dVal
+						      );
+			    break;
+			case 15:
+			    __returnValue.dVal = (*fd)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							__argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							__argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							__argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							__argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							__argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							__argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							__argValues[rI[14]].pointerVal,
+							__argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							__argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							__argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							__argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							__argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							__argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							__argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
+							__argValues[dI[14]].dVal
+						      );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+		    break;
+
+		default:
+		    DEBUGCODE_IF( @global(Verbose), {
+			printf("double arg(s); non-double retval\n");
+		    })
+		    switch (__numArgsIncludingThis) {
+			case 0:
+			    __returnValue.pointerVal = (*fi)( );
+			    break;
+			case 1:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal,
+							      __argValues[dI[0]].dVal );
+			    break;
+			case 2:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal
+							    );
+			    break;
+			case 3:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal
+							    );
+			    break;
+			case 4:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal
+							    );
+			    break;
+			case 5:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal
+							    );
+			    break;
+			case 6:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal
+							    );
+			    break;
+			case 7:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal
+							    );
+			    break;
+			case 8:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal
+							    );
+			    break;
+			case 9:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal
+							    );
+			    break;
+			case 10:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal
+							    );
+			    break;
+			case 11:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal
+							    );
+			    break;
+			case 12:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal
+							    );
+			    break;
+			case 13:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[rI[12]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							      __argValues[dI[12]].dVal
+							    );
+			    break;
+			case 14:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							      __argValues[dI[12]].dVal, __argValues[dI[13]].dVal
+							    );
+			    break;
+			case 15:
+			    __returnValue.pointerVal = (*fi)( __argValues[rI[0]].pointerVal, __argValues[rI[1]].pointerVal,
+							      __argValues[rI[2]].pointerVal, __argValues[rI[3]].pointerVal,
+							      __argValues[rI[4]].pointerVal, __argValues[rI[5]].pointerVal,
+							      __argValues[rI[6]].pointerVal, __argValues[rI[7]].pointerVal,
+							      __argValues[rI[8]].pointerVal, __argValues[rI[9]].pointerVal,
+							      __argValues[rI[10]].pointerVal, __argValues[rI[11]].pointerVal,
+							      __argValues[rI[12]].pointerVal, __argValues[rI[13]].pointerVal,
+							      __argValues[rI[14]].pointerVal,
+							      __argValues[dI[0]].dVal, __argValues[dI[1]].dVal,
+							      __argValues[dI[2]].dVal, __argValues[dI[3]].dVal,
+							      __argValues[dI[4]].dVal, __argValues[dI[5]].dVal,
+							      __argValues[dI[6]].dVal, __argValues[dI[7]].dVal,
+							      __argValues[dI[8]].dVal, __argValues[dI[9]].dVal,
+							      __argValues[dI[10]].dVal, __argValues[dI[11]].dVal,
+							      __argValues[dI[12]].dVal, __argValues[dI[13]].dVal,
+							      __argValues[dI[14]].dVal
+							    );
+			    break;
+			default:
+			    failureCode = @symbol(TooManyArguments);
+			    goto getOutOfHere;
+		    }
+	    }
+	}
     }
 # endif // alternative to FFI
 
     if (returnTypeSymbol == @symbol(void)) {
-        RETURN ( nil );
+	RETURN ( nil );
     }
 
     DEBUGCODE_IF( @global(Verbose), {
-        printf("retval is %"_ld_" (0x%"_lx_")\n", (INT)(__returnValue.iVal), (INT)(__returnValue.iVal));
+	printf("retval is %"_ld_" (0x%"_lx_")\n", (INT)(__returnValue.iVal), (INT)(__returnValue.iVal));
     })
 
     if ((returnTypeSymbol == @symbol(int))
@@ -2894,142 +2906,142 @@
      || (returnTypeSymbol == @symbol(sint8))
      || (returnTypeSymbol == @symbol(sint16))
      || (returnTypeSymbol == @symbol(sint32))) {
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return int: %"_lx_"\n", (INT)(__returnValue.iVal));
-        })
-        RETURN ( __MKINT(__returnValue.iVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return int: %"_lx_"\n", (INT)(__returnValue.iVal));
+	})
+	RETURN ( __MKINT(__returnValue.iVal) );
     }
     if ((returnTypeSymbol == @symbol(uint))
      || (returnTypeSymbol == @symbol(uint8))
      || (returnTypeSymbol == @symbol(uint16))
      || (returnTypeSymbol == @symbol(uint32))) {
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return uint: %"_lx_"\n", (INT)(__returnValue.iVal));
-        })
-        RETURN ( __MKUINT(__returnValue.iVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return uint: %"_lx_"\n", (INT)(__returnValue.iVal));
+	})
+	RETURN ( __MKUINT(__returnValue.iVal) );
     }
     if (returnTypeSymbol == @symbol(bool)) {
-        RETURN ( __returnValue.iVal ? true : false );
+	RETURN ( __returnValue.iVal ? true : false );
     }
     if (returnTypeSymbol == @symbol(float)) {
-        RETURN ( __MKFLOAT(__returnValue.fVal ));
+	RETURN ( __MKFLOAT(__returnValue.fVal ));
     }
     if (returnTypeSymbol == @symbol(double)) {
-        RETURN ( __MKFLOAT(__returnValue.dVal ));
+	RETURN ( __MKFLOAT(__returnValue.dVal ));
     }
     if (returnTypeSymbol == @symbol(char)) {
-        RETURN ( __MKCHARACTER(__returnValue.iVal & 0xFF) );
+	RETURN ( __MKCHARACTER(__returnValue.iVal & 0xFF) );
     }
     if (returnTypeSymbol == @symbol(wchar)) {
-        RETURN ( __MKUCHARACTER(__returnValue.iVal & 0xFFFF) );
+	RETURN ( __MKUCHARACTER(__returnValue.iVal & 0xFFFF) );
     }
     if (returnTypeSymbol == @symbol(sint64)) {
 # if (__POINTER_SIZE__ == 8)
 
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return sint64: %"_lx_"\n", (INT)(__returnValue.longLongVal));
-        })
-        RETURN ( __MKINT(__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return sint64: %"_lx_"\n", (INT)(__returnValue.longLongVal));
+	})
+	RETURN ( __MKINT(__returnValue.longLongVal) );
 # else
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
-        })
-        RETURN ( __MKINT64(&__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
+	})
+	RETURN ( __MKINT64(&__returnValue.longLongVal) );
 # endif
     }
     if (returnTypeSymbol == @symbol(uint64)) {
 # if (__POINTER_SIZE__ == 8)
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return uint64: %"_lx_"\n", (unsigned INT)(__returnValue.longLongVal));
-        })
-        RETURN ( __MKUINT(__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return uint64: %"_lx_"\n", (unsigned INT)(__returnValue.longLongVal));
+	})
+	RETURN ( __MKUINT(__returnValue.longLongVal) );
 # else
-        DEBUGCODE_IF( @global(Verbose), {
-            printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
-        })
-        RETURN ( __MKUINT64(&__returnValue.longLongVal) );
+	DEBUGCODE_IF( @global(Verbose), {
+	    printf("return sint64: %lx%08lx\n", __HI32(__returnValue.longLongVal), __LO32(__returnValue.longLongVal));
+	})
+	RETURN ( __MKUINT64(&__returnValue.longLongVal) );
 # endif
     }
 
     DEBUGCODE_IF( @global(Verbose), {
-        printf("return pointer: %"_lx_"\n", (INT)(__returnValue.pointerVal));
+	printf("return pointer: %"_lx_"\n", (INT)(__returnValue.pointerVal));
     })
     if (returnTypeSymbol == @symbol(handle)) {
-        returnValue = __MKEXTERNALADDRESS(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALADDRESS(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(pointer)) {
-        returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(bytePointer)) {
-        returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
+	returnValue = __MKEXTERNALBYTES(__returnValue.pointerVal);
     } else if (returnTypeSymbol == @symbol(charPointer)) {
-        returnValue = __MKSTRING(__returnValue.pointerVal);
-        if (mustFreeRetVal == true) {
-            free(__returnValue.pointerVal);
-            alreadyFreed = true;
-        }
+	returnValue = __MKSTRING(__returnValue.pointerVal);
+	if (mustFreeRetVal == true) {
+	    free(__returnValue.pointerVal);
+	    alreadyFreed = true;
+	}
     } else if (returnTypeSymbol == @symbol(wcharPointer)) {
-        returnValue = __MKU16STRING(__returnValue.pointerVal);
-        if (mustFreeRetVal == true) {
-            free(__returnValue.pointerVal);
-            alreadyFreed = true;
-        }
+	returnValue = __MKU16STRING(__returnValue.pointerVal);
+	if (mustFreeRetVal == true) {
+	    free(__returnValue.pointerVal);
+	    alreadyFreed = true;
+	}
     } else {
-        __FAIL__(@symbol(UnknownReturnType2))
+	__FAIL__(@symbol(UnknownReturnType2))
     }
 
 getOutOfHere: ;
 %}.
     failureCode notNil ifTrue:[
-        (failureCode == #UnknownReturnType or:[ failureCode == #UnknownArgumentType ]) ifTrue:[
-            oldReturnType := returnType.
-            oldArgumentTypes := argumentTypes.
-            self adjustTypes.
-            ((oldReturnType ~= returnType) or:[oldArgumentTypes ~= argumentTypes]) ifTrue:[
-                thisContext methodHome restart
-            ].
-        ].
-        (failureCode == #BadArgForAsyncCall) ifTrue:[
-            ^ self tryAgainWithAsyncSafeArguments:argumentsOrNil forInstance:aReceiverOrNil
-        ].
-        (failureCode == #FFINotSupported) ifTrue:[
-            ^ self primitiveFailed:'FFI support missing in this build'.
-        ].
-
-        (failureCode == #InvalidArgument) ifTrue:[
-            ^ self primitiveFailed:('cannot convert argument: #%1' bindWith:failureArgNr).
-        ] ifFalse:[
-            ^ self primitiveFailed.   "see failureCode and failureInfo for details"
-        ].
-        "/ ^ nil
+	(failureCode == #UnknownReturnType or:[ failureCode == #UnknownArgumentType ]) ifTrue:[
+	    oldReturnType := returnType.
+	    oldArgumentTypes := argumentTypes.
+	    self adjustTypes.
+	    ((oldReturnType ~= returnType) or:[oldArgumentTypes ~= argumentTypes]) ifTrue:[
+		thisContext methodHome restart
+	    ].
+	].
+	(failureCode == #BadArgForAsyncCall) ifTrue:[
+	    ^ self tryAgainWithAsyncSafeArguments:argumentsOrNil forInstance:aReceiverOrNil
+	].
+	(failureCode == #FFINotSupported) ifTrue:[
+	    ^ self primitiveFailed:'FFI support missing in this build'.
+	].
+
+	(failureCode == #InvalidArgument) ifTrue:[
+	    ^ self primitiveFailed:('cannot convert argument: #%1' bindWith:failureArgNr).
+	] ifFalse:[
+	    ^ self primitiveFailed.   "see failureCode and failureInfo for details"
+	].
+	"/ ^ nil
     ].
 
     (mustFreeRetVal and:[alreadyFreed not]) ifTrue:[
-        returnValue registerForFinalization.
+	returnValue registerForFinalization.
     ].
 
     returnType isSymbol ifTrue:[
-        returnValueClass notNil ifTrue:[
-            self isConstReturnValue ifTrue:[
-                returnValue changeClassTo:returnValueClass.
-                ^ returnValue
-            ].
-            ^ returnValueClass fromExternalAddress:returnValue.
-        ].
+	returnValueClass notNil ifTrue:[
+	    self isConstReturnValue ifTrue:[
+		returnValue changeClassTo:returnValueClass.
+		^ returnValue
+	    ].
+	    ^ returnValueClass fromExternalAddress:returnValue.
+	].
     ] ifFalse:[
-        returnType isCPointer ifTrue:[
-            returnType baseType isCStruct ifTrue:[
-                stClass := Smalltalk classNamed:returnType baseType name.
-                stClass notNil ifTrue:[
-                    self isConstReturnValue ifTrue:[
-                        returnValue changeClassTo:returnValueClass.
-                        ^ returnValue
-                    ].
-                    ^ stClass fromExternalAddress:returnValue.
-                ].
-            ].
-            returnType baseType isCChar ifTrue:[
-                ^ returnValue stringAt:1
-            ].
-        ].
+	returnType isCPointer ifTrue:[
+	    returnType baseType isCStruct ifTrue:[
+		stClass := Smalltalk classNamed:returnType baseType name.
+		stClass notNil ifTrue:[
+		    self isConstReturnValue ifTrue:[
+			returnValue changeClassTo:returnValueClass.
+			^ returnValue
+		    ].
+		    ^ stClass fromExternalAddress:returnValue.
+		].
+	    ].
+	    returnType baseType isCChar ifTrue:[
+		^ returnValue stringAt:1
+	    ].
+	].
     ].
 
     ^ returnValue