rewrite SSM and clonefunction

This commit is contained in:
Cloud Wu
2019-04-16 21:16:13 +08:00
committed by 云风
parent 2d6d2c75a4
commit 2ceb642b5d
32 changed files with 934 additions and 645 deletions

View File

@@ -104,7 +104,7 @@ static TString *LoadString (LoadState *S) {
}
static void LoadCode (LoadState *S, SharedProto *f) {
static void LoadCode (LoadState *S, Proto *f) {
int n = LoadInt(S);
f->code = luaM_newvector(S->L, n, Instruction);
f->sizecode = n;
@@ -119,9 +119,7 @@ static void LoadConstants (LoadState *S, Proto *f) {
int i;
int n = LoadInt(S);
f->k = luaM_newvector(S->L, n, TValue);
f->sp->k = f->k;
f->sp->sizek = n;
f->sp->sharedk = 1;
f->sizek = n;
for (i = 0; i < n; i++)
setnilvalue(&f->k[i]);
for (i = 0; i < n; i++) {
@@ -141,8 +139,6 @@ static void LoadConstants (LoadState *S, Proto *f) {
setivalue(o, LoadInteger(S));
break;
case LUA_TSHRSTR:
f->sp->sharedk = 0;
//fall-through
case LUA_TLNGSTR:
setsvalue2n(S->L, o, LoadString(S));
break;
@@ -157,17 +153,17 @@ static void LoadProtos (LoadState *S, Proto *f) {
int i;
int n = LoadInt(S);
f->p = luaM_newvector(S->L, n, Proto *);
f->sp->sizep = n;
f->sizep = n;
for (i = 0; i < n; i++)
f->p[i] = NULL;
for (i = 0; i < n; i++) {
f->p[i] = luaF_newproto(S->L, NULL);
LoadFunction(S, f->p[i], f->sp->source);
f->p[i] = luaF_newproto(S->L);
LoadFunction(S, f->p[i], f->source);
}
}
static void LoadUpvalues (LoadState *S, SharedProto *f) {
static void LoadUpvalues (LoadState *S, Proto *f) {
int i, n;
n = LoadInt(S);
f->upvalues = luaM_newvector(S->L, n, Upvaldesc);
@@ -181,7 +177,7 @@ static void LoadUpvalues (LoadState *S, SharedProto *f) {
}
static void LoadDebug (LoadState *S, SharedProto *f) {
static void LoadDebug (LoadState *S, Proto *f) {
int i, n;
n = LoadInt(S);
f->lineinfo = luaM_newvector(S->L, n, int);
@@ -203,8 +199,7 @@ static void LoadDebug (LoadState *S, SharedProto *f) {
}
static void LoadFunction (LoadState *S, Proto *fp, TString *psource) {
SharedProto *f = fp->sp;
static void LoadFunction (LoadState *S, Proto *f, TString *psource) {
f->source = LoadString(S);
if (f->source == NULL) /* no source in dump? */
f->source = psource; /* reuse parent's source */
@@ -214,9 +209,9 @@ static void LoadFunction (LoadState *S, Proto *fp, TString *psource) {
f->is_vararg = LoadByte(S);
f->maxstacksize = LoadByte(S);
LoadCode(S, f);
LoadConstants(S, fp);
LoadConstants(S, f);
LoadUpvalues(S, f);
LoadProtos(S, fp);
LoadProtos(S, f);
LoadDebug(S, f);
}
@@ -275,9 +270,9 @@ LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {
cl = luaF_newLclosure(L, LoadByte(&S));
setclLvalue(L, L->top, cl);
luaD_inctop(L);
cl->p = luaF_newproto(L, NULL);
cl->p = luaF_newproto(L);
LoadFunction(&S, cl->p, NULL);
lua_assert(cl->nupvalues == cl->p->sp->sizeupvalues);
lua_assert(cl->nupvalues == cl->p->sizeupvalues);
luai_verifycode(L, buff, cl->p);
return cl;
}