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 4526fcc5..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 @@ -6,13 +6,29 @@ namespace art { class Thread : public edxp::HookedObject { - struct ObjPtr { void *data; ObjPtr(ObjPtr const &) = delete; } ; - CREATE_FUNC_SYMBOL_ENTRY(ObjPtr, 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 ObjPtr{nullptr}; + return nullptr; } +#endif public: Thread(void *thiz) : HookedObject(thiz) {} @@ -24,7 +40,7 @@ namespace art { void *DecodeJObject(jobject obj) { if (thiz_ && DecodeJObjectSym) { - return DecodeJObject(thiz_, obj).data; + return DecodeJObject(thiz_, obj); } return nullptr; }