Improved handling of virtual inheritance. (#7)

* new system for handling vtables

* commented out non-matching JKRDisposer::~JKDisposer()

* removed artificial vtables and matched simple virtual-call functions

* better text on nonmatching functions

* reverted asmdiff.sh

* attempt 2

* Spelling

* banner and .gitignore for vtable artifacts

* move virtual function to the correct class

* remove unnecessary casts
This commit is contained in:
Jonathan Wase
2020-12-01 21:18:01 +01:00
committed by GitHub
parent eff77cbe26
commit 52bc3ed5b9
16 changed files with 910 additions and 221 deletions
@@ -3,16 +3,16 @@
#include "dolphin/types.h"
#include "JSystem/JSupport/JSUList/JSUList.h"
#include "JSystem/JKernel/JKRDisposer/JKRDisposer_vtable.h"
class JKRHeap;
class JKRDisposer {
public:
JKRDisposer();
~JKRDisposer();
virtual ~JKRDisposer();
virtual void callAllDisposer() = 0;
public:
_VTABLE_JKRDisposer* __vt;
JKRHeap* heap;
JSUPtrLink ptr_link;
};
@@ -1,14 +0,0 @@
#ifndef __JKRDISPOSER_VTABLE_H__
#define __JKRDISPOSER_VTABLE_H__
#include "dolphin/types.h"
class JKRDisposer;
struct _VTABLE_JKRDisposer {
void (*func0)(JKRDisposer*);
void (*_ct)(JKRDisposer*);
void (*_dt)(JKRDisposer*, int);
void (*func4)(JKRDisposer*);
};
#endif
+26 -11
View File
@@ -4,13 +4,11 @@
#include "dolphin/types.h"
#include "JSystem/JKernel/JKRDisposer/JKRDisposer.h"
#include "JSystem/JKernel/JKRHeap/JKRHeap_vtable.h"
typedef void (*JKRErrorHandler)(void*, unsigned long, int);
class JKRHeap {
class JKRHeap : JKRDisposer {
public:
JKRHeap(void*, u32, JKRHeap*, bool);
~JKRHeap();
virtual ~JKRHeap();
static bool initArena(char**, u32*, int);
JKRHeap* becomeSystemHeap();
@@ -23,7 +21,6 @@ class JKRHeap {
static void free(void* ptr, JKRHeap* heap);
void free(void* ptr);
void callAllDisposer();
void freeAll();
void freeTail();
@@ -56,12 +53,30 @@ class JKRHeap {
bool isSubHeap(JKRHeap* heap) const;
public:
union {
JKRDisposer __base;
_VTABLE_JKRHeap* __vt;
};
protected:
void callAllDisposer();
virtual void vt_func4() = 0;
virtual void vt_func5() = 0;
virtual void dump_sort();
virtual void vt_func7() = 0;
virtual void do_destroy() = 0;
virtual void* do_alloc(u32 size, int alignment) = 0;
virtual void do_free(void* ptr) = 0;
virtual void do_freeAll() = 0;
virtual void do_freeTail() = 0;
virtual void vt_func13() = 0;
virtual s32 do_resize(void* ptr, u32 size) = 0;
virtual s32 do_getSize(void* ptr) = 0;
virtual s32 do_getFreeSize() = 0;
virtual s32 do_getMaxFreeBlock() = 0;
virtual s32 do_getTotalFreeSize() = 0;
virtual u8 do_changeGroupID(u8 param_1);
virtual void do_getCurrent();
virtual void state_register();
virtual void state_compare();
virtual void state_dump();
public:
u8 mutex[24];
u32 begin;
u32 end;
@@ -75,7 +90,7 @@ class JKRHeap {
JSUPtrList disposable_list;
bool error_flag;
u8 field_0x69;
u8 field_0x6a[4];
u8 field_0x6a[2];
};
void* operator new(u32 size);
@@ -1,34 +0,0 @@
#ifndef __JKRHEAP_VTABLE_H__
#define __JKRHEAP_VTABLE_H__
#include "dolphin/types.h"
class JKRHeap;
struct _VTABLE_JKRHeap {
void (*func0)(JKRHeap*);
void (*_ct)(JKRHeap*);
void (*_dt)(JKRHeap*);
void (*callAllDisposer)(JKRHeap*);
void (*func4)(JKRHeap*);
void (*func5)(JKRHeap*);
void (*dump_sort)(JKRHeap*);
void (*func7)(JKRHeap*);
void (*do_destroy)(JKRHeap*);
void* (*do_alloc)(JKRHeap*,u32 size, int alignment);
void (*do_free)(JKRHeap*,void*ptr);
void (*do_freeAll)(JKRHeap*);
void (*do_freeTail)(JKRHeap*);
void (*func13)(JKRHeap*);
s32 (*do_resize)(JKRHeap*, void* ptr, u32 size);
s32 (*do_getSize)(JKRHeap*, void* ptr);
s32 (*do_getFreeSize)(JKRHeap*);
s32 (*do_getMaxFreeBlock)(JKRHeap*);
s32 (*do_getTotalFreeSize)(JKRHeap*);
u8 (*do_changeGroupID)(JKRHeap*, u8 param_1);
void (*do_getCurrent)(JKRHeap*);
void (*state_register)(JKRHeap*);
void (*state_compare)(JKRHeap*);
void (*state_dump)(JKRHeap*);
};
#endif
+16 -5
View File
@@ -6,11 +6,11 @@
class JSUPtrList;
class JSUPtrLink {
public:
JSUPtrLink(void*);
JSUPtrLink(void* owner);
~JSUPtrLink();
public:
void* unk0;
void* owner;
JSUPtrList* list;
JSUPtrLink* prev;
JSUPtrLink* next;
@@ -35,13 +35,24 @@ class JSUPtrList {
u32 length;
};
template <typename T>
class JSUList : JSUPtrList {
public:
JSUList() : JSUPtrList(true) {}
~JSUList() {};
JSUList() : JSUPtrList(true) {
}
~JSUList(){};
void append(T* value) {
list.append(&value->ptr_link);
}
void prepend(T* value) {
list.prepend(&value->ptr_link);
}
void remove(T* value) {
list.remove(&value->ptr_link);
}
};
#endif
+3 -6
View File
@@ -1,7 +1,3 @@
#include "JSystem/JKernel/JKRDisposer/JKRDisposer_vtable.h"
#include "JSystem/JKernel/JKRHeap/JKRHeap_vtable.h"
extern float lbl_80451D5C;
extern u8 lbl_80379234[0x64];
extern int lbl_804061C0;
@@ -85,8 +81,9 @@ extern u8 lbl_803BB498;
#define _SDA2_BASE_(dummy) 0
// func_802CE138
extern _VTABLE_JKRHeap lbl_803CBF70; // JKRHeap::__vt
extern void* lbl_803CBF70; // JKRHeap::__vt
class JKRHeap;
extern JKRHeap* lbl_80451370; // JKRHeap::sSystemHeap
extern JKRHeap* lbl_80451378; // JKRHeap::sRootHeap
extern JKRHeap* lbl_80451374; // JKRHeap::sCurrentHeap
@@ -112,4 +109,4 @@ extern u32 lbl_80000028;
extern char lbl_8039CAD8[12]; // "JKRHeap.cpp"
// func_802D147C
extern _VTABLE_JKRDisposer lbl_803CC0F0; // JKRDisposer::__vt
extern void* lbl_803CC0F0; // JKRDisposer::__vt