LCOV - code coverage report
Current view: top level - src - ldump.c Coverage Total Hit
Test: Lua 5.2.4 Lines: 100.0 % 94 94
Test Date: 2024-04-28 10:23:12
Legend: Lines: hit not hit

            Line data    Source code
       1              : /*
       2              : ** $Id: ldump.c,v 2.17.1.1 2013/04/12 18:48:47 roberto Exp $
       3              : ** save precompiled Lua chunks
       4              : ** See Copyright Notice in lua.h
       5              : */
       6              : 
       7              : #include <stddef.h>
       8              : 
       9              : #define ldump_c
      10              : #define LUA_CORE
      11              : 
      12              : #include "lua.h"
      13              : 
      14              : #include "lobject.h"
      15              : #include "lstate.h"
      16              : #include "lundump.h"
      17              : 
      18              : typedef struct {
      19              :  lua_State* L;
      20              :  lua_Writer writer;
      21              :  void* data;
      22              :  int strip;
      23              :  int status;
      24              : } DumpState;
      25              : 
      26              : #define DumpMem(b,n,size,D)     DumpBlock(b,(n)*(size),D)
      27              : #define DumpVar(x,D)            DumpMem(&x,1,sizeof(x),D)
      28              : 
      29          574 : static void DumpBlock(const void* b, size_t size, DumpState* D)
      30              : {
      31          574 :  if (D->status==0)
      32              :  {
      33              :   lua_unlock(D->L);
      34          574 :   D->status=(*D->writer)(D->L,b,size,D->data);
      35              :   lua_lock(D->L);
      36              :  }
      37          574 : }
      38              : 
      39          147 : static void DumpChar(int y, DumpState* D)
      40              : {
      41          147 :  char x=(char)y;
      42          147 :  DumpVar(x,D);
      43          147 : }
      44              : 
      45          196 : static void DumpInt(int x, DumpState* D)
      46              : {
      47          196 :  DumpVar(x,D);
      48          196 : }
      49              : 
      50            7 : static void DumpNumber(lua_Number x, DumpState* D)
      51              : {
      52            7 :  DumpVar(x,D);
      53            7 : }
      54              : 
      55           36 : static void DumpVector(const void* b, int n, size_t size, DumpState* D)
      56              : {
      57           36 :  DumpInt(n,D);
      58           36 :  DumpMem(b,n,size,D);
      59           36 : }
      60              : 
      61           91 : static void DumpString(const TString* s, DumpState* D)
      62              : {
      63           91 :  if (s==NULL)
      64              :  {
      65            4 :   size_t size=0;
      66            4 :   DumpVar(size,D);
      67              :  }
      68              :  else
      69              :  {
      70           87 :   size_t size=s->tsv.len+1;          /* include trailing '\0' */
      71           87 :   DumpVar(size,D);
      72           87 :   DumpBlock(getstr(s),size*sizeof(char),D);
      73              :  }
      74           91 : }
      75              : 
      76              : #define DumpCode(f,D)    DumpVector(f->code,f->sizecode,sizeof(Instruction),D)
      77              : 
      78              : static void DumpFunction(const Proto* f, DumpState* D);
      79              : 
      80           18 : static void DumpConstants(const Proto* f, DumpState* D)
      81              : {
      82           18 :  int i,n=f->sizek;
      83           18 :  DumpInt(n,D);
      84           74 :  for (i=0; i<n; i++)
      85              :  {
      86           56 :   const TValue* o=&f->k[i];
      87           56 :   DumpChar(ttypenv(o),D);
      88           56 :   switch (ttypenv(o))
      89              :   {
      90            3 :    case LUA_TNIL:
      91            3 :         break;
      92            3 :    case LUA_TBOOLEAN:
      93            3 :         DumpChar(bvalue(o),D);
      94            3 :         break;
      95            7 :    case LUA_TNUMBER:
      96            7 :         DumpNumber(nvalue(o),D);
      97            7 :         break;
      98           43 :    case LUA_TSTRING:
      99           43 :         DumpString(rawtsvalue(o),D);
     100           43 :         break;
     101           56 :     default: lua_assert(0);
     102              :   }
     103              :  }
     104           18 :  n=f->sizep;
     105           18 :  DumpInt(n,D);
     106           26 :  for (i=0; i<n; i++) DumpFunction(f->p[i],D);
     107           18 : }
     108              : 
     109           18 : static void DumpUpvalues(const Proto* f, DumpState* D)
     110              : {
     111           18 :  int i,n=f->sizeupvalues;
     112           18 :  DumpInt(n,D);
     113           35 :  for (i=0; i<n; i++)
     114              :  {
     115           17 :   DumpChar(f->upvalues[i].instack,D);
     116           17 :   DumpChar(f->upvalues[i].idx,D);
     117              :  }
     118           18 : }
     119              : 
     120           18 : static void DumpDebug(const Proto* f, DumpState* D)
     121              : {
     122              :  int i,n;
     123           18 :  DumpString((D->strip) ? NULL : f->source,D);
     124           18 :  n= (D->strip) ? 0 : f->sizelineinfo;
     125           18 :  DumpVector(f->lineinfo,n,sizeof(int),D);
     126           18 :  n= (D->strip) ? 0 : f->sizelocvars;
     127           18 :  DumpInt(n,D);
     128           35 :  for (i=0; i<n; i++)
     129              :  {
     130           17 :   DumpString(f->locvars[i].varname,D);
     131           17 :   DumpInt(f->locvars[i].startpc,D);
     132           17 :   DumpInt(f->locvars[i].endpc,D);
     133              :  }
     134           18 :  n= (D->strip) ? 0 : f->sizeupvalues;
     135           18 :  DumpInt(n,D);
     136           31 :  for (i=0; i<n; i++) DumpString(f->upvalues[i].name,D);
     137           18 : }
     138              : 
     139           18 : static void DumpFunction(const Proto* f, DumpState* D)
     140              : {
     141           18 :  DumpInt(f->linedefined,D);
     142           18 :  DumpInt(f->lastlinedefined,D);
     143           18 :  DumpChar(f->numparams,D);
     144           18 :  DumpChar(f->is_vararg,D);
     145           18 :  DumpChar(f->maxstacksize,D);
     146           18 :  DumpCode(f,D);
     147           18 :  DumpConstants(f,D);
     148           18 :  DumpUpvalues(f,D);
     149           18 :  DumpDebug(f,D);
     150           18 : }
     151              : 
     152           10 : static void DumpHeader(DumpState* D)
     153              : {
     154              :  lu_byte h[LUAC_HEADERSIZE];
     155           10 :  luaU_header(h);
     156           10 :  DumpBlock(h,LUAC_HEADERSIZE,D);
     157           10 : }
     158              : 
     159              : /*
     160              : ** dump Lua function as precompiled chunk
     161              : */
     162           10 : int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)
     163              : {
     164              :  DumpState D;
     165           10 :  D.L=L;
     166           10 :  D.writer=w;
     167           10 :  D.data=data;
     168           10 :  D.strip=strip;
     169           10 :  D.status=0;
     170           10 :  DumpHeader(&D);
     171           10 :  DumpFunction(f,&D);
     172           10 :  return D.status;
     173              : }
        

Generated by: LCOV version 2.0-1