mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-08-18 20:57:46 -04:00
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:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user