Compiles with 5.2, but doesn't work.
This commit is contained in:
@@ -3,27 +3,6 @@
|
||||
#include <iostream>
|
||||
#include <cassert>
|
||||
|
||||
extern "C" {
|
||||
void *lj_alloc_create();
|
||||
void *lj_alloc_f(void *, void *, size_t, size_t);
|
||||
lua_State *lj_state_newstate(lua_Alloc f, void *ud);
|
||||
}
|
||||
|
||||
static void *lsnap_create() {
|
||||
return lj_alloc_create();
|
||||
}
|
||||
static lua_State *lsnap_newstate(lua_Alloc f, void *ud) {
|
||||
return lj_state_newstate(f, ud);
|
||||
}
|
||||
static void *lsnap_malloc(void *mptr, size_t nsize) {
|
||||
return lj_alloc_f(mptr, 0, 0, nsize);
|
||||
}
|
||||
static void *lsnap_realloc(void *mptr, void *ptr, size_t osize, size_t nsize) {
|
||||
return lj_alloc_f(mptr, ptr, osize, nsize);
|
||||
}
|
||||
static void *lsnap_free(void *mptr, size_t osize, void *ptr) {
|
||||
return lj_alloc_f(mptr, ptr, osize, 0);
|
||||
}
|
||||
|
||||
struct BlockHeader {
|
||||
BlockHeader *prev_;
|
||||
@@ -50,7 +29,6 @@ class LuaSnapData {
|
||||
public:
|
||||
lua_State *state_;
|
||||
bool have_snapshot_;
|
||||
void *lj_mstate_;
|
||||
BlockHeader sentinel_;
|
||||
|
||||
LuaSnapData();
|
||||
@@ -74,9 +52,8 @@ LuaSnapData::LuaSnapData() {
|
||||
sentinel_.size_ = 0;
|
||||
sentinel_.in_use_ = false;
|
||||
sentinel_.snapshot_ = 0;
|
||||
lj_mstate_ = lsnap_create();
|
||||
have_snapshot_ = false;
|
||||
state_ = lsnap_newstate(lsd_alloc_f, (void*)this);
|
||||
state_ = lua_newstate(lsd_alloc_f, (void*)this);
|
||||
}
|
||||
|
||||
LuaSnapData::~LuaSnapData() {
|
||||
@@ -106,7 +83,7 @@ void LuaSnapData::rollback() {
|
||||
} else {
|
||||
assert(blk->in_use_);
|
||||
unlink(blk);
|
||||
lsnap_free(lj_mstate_, blocksize(blk->size_), blk);
|
||||
free(blk);
|
||||
}
|
||||
blk = next;
|
||||
}
|
||||
@@ -137,13 +114,13 @@ void *LuaSnapData::allocf(void *ptr, size_t osize, size_t nsize) {
|
||||
assert(blk->in_use_);
|
||||
if (blk->snapshot_ == nullptr) {
|
||||
unlink(blk);
|
||||
lsnap_free(lj_mstate_, blocksize(blk->size_), blk);
|
||||
free(blk);
|
||||
} else {
|
||||
blk->in_use_ = false;
|
||||
}
|
||||
return nullptr;
|
||||
} else if (ptr == NULL) {
|
||||
BlockHeader *blk = (BlockHeader*)lsnap_malloc(lj_mstate_, blocksize(nsize));
|
||||
BlockHeader *blk = (BlockHeader*)malloc(blocksize(nsize));
|
||||
link(blk);
|
||||
blk->size_ = nsize;
|
||||
blk->in_use_ = true;
|
||||
@@ -155,12 +132,12 @@ void *LuaSnapData::allocf(void *ptr, size_t osize, size_t nsize) {
|
||||
assert(blk->in_use_);
|
||||
if (blk->snapshot_ == nullptr) {
|
||||
unlink(blk);
|
||||
blk = (BlockHeader*)lsnap_realloc(lj_mstate_, blk, blocksize(blk->size_), blocksize(nsize));
|
||||
blk = (BlockHeader*)realloc(blk, blocksize(nsize));
|
||||
blk->size_ = nsize;
|
||||
link(blk);
|
||||
return header_to_pointer(blk);
|
||||
} else {
|
||||
BlockHeader *nblk = (BlockHeader*)lsnap_malloc(lj_mstate_, blocksize(nsize));
|
||||
BlockHeader *nblk = (BlockHeader*)malloc(blocksize(nsize));
|
||||
memcpy(nblk, blk, (blk->size_ < nsize) ? blk->size_ : nsize);
|
||||
blk->in_use_ = false;
|
||||
link(nblk);
|
||||
|
||||
Reference in New Issue
Block a user