char __cdecl JavaToObjCCallHandler(DCCallback* callback, DCArgs* args, DCValue* result, void* userdata) { JavaToObjCCallInfo* info = (JavaToObjCCallInfo*)userdata; CallTempStruct* call; jobject instance = initCallHandler(args, &call, NULL, &info->fInfo); JNIEnv* env = call->env; BEGIN_TRY(env, call); call->pCallIOs = info->fInfo.fCallIOs; void* targetId = info->fNativeClass ? JLONG_TO_PTR(info->fNativeClass) : getNativeObjectPointer(env, instance, NULL); void* callback = //objc_msgSend_stret;// objc_msgSend; #if defined(DC__Arch_Intel_x86) switch (info->fInfo.fReturnType) { case eDoubleValue: case eFloatValue: callback = objc_msgSend_fpret; break; } #endif dcMode(call->vm, info->fInfo.fDCMode); dcArgPointer(call->vm, targetId); dcArgPointer(call->vm, info->fSelector); followArgs(call, args, info->fInfo.nParams, info->fInfo.fParamTypes, JNI_FALSE, JNI_TRUE)// TODO isVarArgs ?? && followCall(call, info->fInfo.fReturnType, result, callback, JNI_FALSE, JNI_FALSE); cleanupCallHandler(call); END_TRY_BASE(info->fInfo.fEnv, call, cleanupCallHandler(call););
jboolean callFunction(CallTempStruct* call, CommonCallbackInfo* info, DCArgs* args, DCValue* result, void* callback, CallFlags flags) { return followArgs(call, args, info->nParams, info->fParamTypes, flags) && followCall(call, info->fReturnType, result, callback, flags); }
void JavaToVirtualMethodCallHandler_Sub(CallTempStruct* call, VirtualMethodCallInfo* info, jobject instance, DCArgs* args, DCValue* result) { void* callbackFn; void* thisPtr; int nParams = info->fInfo.nParams; ValueType *pParamTypes = info->fInfo.fParamTypes; dcMode(call->vm, info->fInfo.fDCMode); //dcReset(call->vm); if (info->fHasThisPtrArg) { if (nParams == 0 || *pParamTypes != eSizeTValue) { throwException(call->env, "A C++ method must be bound with a method having a first argument of type long !"); return; } thisPtr = dcbArgPointer(args); if (!thisPtr) { throwException(call->env, "Calling a method on a NULL C++ class pointer !"); return; } nParams--; pParamTypes++; } else { thisPtr = getNativeObjectPointer(call->env, instance, info->fClass); if (!thisPtr) { throwException(call->env, "Failed to get the pointer to the target C++ instance of the method invocation !"); return; } //nParams--; //pParamTypes++; } callbackFn = getNthVirtualMethodFromThis(call->env, thisPtr, info->fVirtualTableOffset, info->fVirtualIndex); if (!callbackFn) { throwException(call->env, "Virtual method pointer found in virtual table is NULL !"); return; } dcArgPointer(call->vm, thisPtr); followArgs(call, args, nParams, pParamTypes, NO_FLAGS) && followCall(call, info->fInfo.fReturnType, result, callbackFn, NO_FLAGS); }
char __cdecl CToJavaCallHandler(DCCallback* callback, DCArgs* args, DCValue* result, void* userdata) { CallTempStruct* call; jthrowable exc; NativeToJavaCallbackCallInfo* info = (NativeToJavaCallbackCallInfo*)userdata; JNIEnv *env = GetEnv(); initCallHandler(NULL, &call, env); BEGIN_TRY(env, call); call->pCallIOs = info->fInfo.fCallIOs; dcMode(call->vm, JNI_CALL_MODE); if (!info->fCallbackInstance) { throwException(env, "Trying to call a null callback instance !"); cleanupCallHandler(call); return info->fInfo.fDCReturnType; } if (0) { float value = dcbArgFloat(args); float ret = (*call->env)->CallFloatMethod(call->env, info->fCallbackInstance, info->fMethod, value); result->f = ret; } else { dcArgPointer(call->vm, (DCpointer)call->env); dcArgPointer(call->vm, info->fCallbackInstance); dcArgPointer(call->vm, info->fMethod); if (info->fIsGenericCallback) { followArgsGenericJavaCallback(call, args, info->fInfo.nParams, info->fInfo.fParamTypes) && followCallGenericJavaCallback(call, info->fInfo.fReturnType, result, (void*)(*env)->CallObjectMethod); } else { followArgs(call, args, info->fInfo.nParams, info->fInfo.fParamTypes, JNI_TRUE, JNI_TRUE) && followCall(call, info->fInfo.fReturnType, result, info->fJNICallFunction, JNI_TRUE, JNI_FALSE); } exc = (*env)->ExceptionOccurred(env); if (exc) { (*env)->ExceptionDescribe(env); printStackTrace(env, exc); //(*env)->ExceptionClear(env); } } cleanupCallHandler(call); END_TRY_BASE(info->fInfo.fEnv, call, cleanupCallHandler(call););
char __cdecl JavaToFunctionCallHandler(DCCallback* callback, DCArgs* args, DCValue* result, void* userdata) { FunctionCallInfo* info = (FunctionCallInfo*)userdata; CallTempStruct* call; JNIEnv* env; initCallHandler(args, &call, NULL); env = call->env; BEGIN_TRY(env, call); call->pCallIOs = info->fInfo.fCallIOs; if (info->fCheckLastError) clearLastError(info->fInfo.fEnv); dcMode(call->vm, info->fInfo.fDCMode); followArgs(call, args, info->fInfo.nParams, info->fInfo.fParamTypes, JNI_FALSE, JNI_FALSE) && followCall(call, info->fInfo.fReturnType, result, info->fForwardedSymbol, JNI_FALSE, JNI_FALSE); cleanupCallHandler(call); END_TRY_BASE(info->fInfo.fEnv, call, cleanupCallHandler(call););