diff --git a/edxp-core/src/main/cpp/main/include/art/runtime/thread.h b/edxp-core/src/main/cpp/main/include/art/runtime/thread.h index 07931338..e407f85f 100644 --- a/edxp-core/src/main/cpp/main/include/art/runtime/thread.h +++ b/edxp-core/src/main/cpp/main/include/art/runtime/thread.h @@ -7,13 +7,28 @@ namespace art { class Thread : public edxp::HookedObject { - CREATE_FUNC_SYMBOL_ENTRY(void *, DecodeJObject, void *thiz, - jobject obj) { +#ifdef __i386__ + typedef void (*DecodeJObjectType)(void **, void *thiz, jobject obj); + inline static void (*DecodeJObjectSym)(void **, void *thiz, jobject obj); + static void *DecodeJObject(void *thiz, jobject obj) { + if (LIKELY(DecodeJObjectSym)) { + // Special call conversion + void *ret = nullptr; + DecodeJObjectSym(&ret, thiz, obj); + // Stack unbalanced since we faked return value as 1st param + __asm__("sub $0x4, %esp"); + return ret; + } else + return nullptr; + } +#else + CREATE_FUNC_SYMBOL_ENTRY(void *, DecodeJObject, void *thiz, jobject obj) { if (DecodeJObjectSym) return DecodeJObjectSym(thiz, obj); else return nullptr; } +#endif public: Thread(void *thiz) : HookedObject(thiz) {}