 
             if typeChar == "f", let float = argument as? Float {
                 // Float type shouldn't be promoted to double if it is not variadic.
-                args[i] = [ Word(unsafeBitCast(float, UInt32.self)) ]
+                args[i] = [ UInt(unsafeBitCast(float, UInt32.self)) ]
             } else if let val = argument as? CVarArgType {
                 // Scalar(except float), pointer and Objective-C object types
-                args[i] = val.encode()
+                args[i] = val.encode().map{ UInt(bitPattern: $0) }
             } else if let obj: AnyObject = argument as? AnyObject {
                 // Pure swift object type
-                args[i] = [ unsafeBitCast(unsafeAddressOf(obj), Word.self) ]
+                args[i] = [ unsafeBitCast(unsafeAddressOf(obj), UInt.self) ]
             } else {
                 // Nil or unsupported type
                 assert(argument == nil, "Unsupported argument type '\(String(UTF8String: type))'")
                 var align: Int = 0
                 NSGetSizeAndAlignment(sig.getArgumentTypeAtIndex(i), nil, &align)
-                args[i] = [Word](count: align / sizeof(Word.self), repeatedValue: 0)
-            }
-            args[i].withUnsafeBufferPointer() {
+                args[i] = [UInt](count: align / sizeof(UInt), repeatedValue: 0)
+            }
+            args[i].withUnsafeBufferPointer {
                 inv.setArgument(UnsafeMutablePointer($0.baseAddress), atIndex: i + 2)
             }
         }

    // Type casting and conversion, reference:
    // https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html

    // Cast Word value to specified Objective-C type (not support 32-bit)
    private func bitCastWord(word: Word, toObjCType type: UnsafePointer<Int8>) -> Any? {
        switch Character(UnicodeScalar(UInt8(type[0]))) {
        case "c": return CChar(truncatingBitPattern: word)
        case "i": return CInt(truncatingBitPattern: word)
        case "s": return CShort(truncatingBitPattern: word)
        case "l": return Int32(truncatingBitPattern: word)
        case "q": return CLongLong(word)
        case "C": return CUnsignedChar(truncatingBitPattern: word)
        case "I": return CUnsignedInt(truncatingBitPattern: word)
        case "S": return CUnsignedShort(truncatingBitPattern: word)
        case "L": return UInt32(truncatingBitPattern: word)
        case "Q": return unsafeBitCast(word, CUnsignedLongLong.self)
        case "f": return unsafeBitCast(UInt32(truncatingBitPattern: word), CFloat.self)
        case "d": return unsafeBitCast(word, CDouble.self)
        case "B": return unsafeBitCast(UInt8(truncatingBitPattern: word), CBool.self)
        case "v": return unsafeBitCast(word, Void.self)
        case "*": return unsafeBitCast(word, UnsafePointer<CChar>.self)
        case "@": return word != 0 ? unsafeBitCast(word, AnyObject.self) : nil
        case "#": return unsafeBitCast(word, AnyClass.self)
        case ":": return unsafeBitCast(word, Selector.self)
        case "^", "?": return unsafeBitCast(word, COpaquePointer.self)
        default:  assertionFailure("Unknown Objective-C type encoding '\(String(UTF8String: type))'")
        }
        return Void()


        // Fetch the return value
        // TODO: Methods with 'ns_returns_retained' attribute cause leak of returned object.
        let buffer = UnsafeMutablePointer<UInt8>.alloc(sig.methodReturnLength)
        inv.getReturnValue(buffer)
        let result: Any? = bitCast(buffer, toObjCType: sig.methodReturnType)
        buffer.destroy()
        buffer.dealloc(sig.methodReturnLength)
        return result
    }

    public func call(selector: Selector, withArguments arguments: Any!...) -> Any! {
