?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. /*
  2. ** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $
  3. ** print bytecodes
  4. ** See Copyright Notice in lua.h
  5. */
  6.  
  7. #include <ctype.h>
  8. #include <stdio.h>
  9.  
  10. #define luac_c
  11. #define LUA_CORE
  12.  
  13. #include "ldebug.h"
  14. #include "lobject.h"
  15. #include "lopcodes.h"
  16. #include "lundump.h"
  17.  
  18. #define PrintFunction   luaU_print
  19.  
  20. #define Sizeof(x)       ((int)sizeof(x))
  21. #define VOID(p)         ((const void*)(p))
  22.  
  23. static void PrintString(const TString* ts)
  24. {
  25.  const char* s=getstr(ts);
  26.  size_t i,n=ts->tsv.len;
  27.  putchar('"');
  28.  for (i=0; i<n; i++)
  29.  {
  30.   int c=s[i];
  31.   switch (c)
  32.   {
  33.    case '"': printf("\\\""); break;
  34.    case '\\': printf("\\\\"); break;
  35.    case '\a': printf("\\a"); break;
  36.    case '\b': printf("\\b"); break;
  37.    case '\f': printf("\\f"); break;
  38.    case '\n': printf("\\n"); break;
  39.    case '\r': printf("\\r"); break;
  40.    case '\t': printf("\\t"); break;
  41.    case '\v': printf("\\v"); break;
  42.    default:     if (isprint((unsigned char)c))
  43.                         putchar(c);
  44.                 else
  45.                         printf("\\%03u",(unsigned char)c);
  46.   }
  47.  }
  48.  putchar('"');
  49. }
  50.  
  51. static void PrintConstant(const Proto* f, int i)
  52. {
  53.  const TValue* o=&f->k[i];
  54.  switch (ttype(o))
  55.  {
  56.   case LUA_TNIL:
  57.         printf("nil");
  58.         break;
  59.   case LUA_TBOOLEAN:
  60.         printf(bvalue(o) ? "true" : "false");
  61.         break;
  62.   case LUA_TNUMBER:
  63.         printf(LUA_NUMBER_FMT,nvalue(o));
  64.         break;
  65.   case LUA_TSTRING:
  66.         PrintString(rawtsvalue(o));
  67.         break;
  68.   default:                              /* cannot happen */
  69.         printf("? type=%d",ttype(o));
  70.         break;
  71.  }
  72. }
  73.  
  74. static void PrintCode(const Proto* f)
  75. {
  76.  const Instruction* code=f->code;
  77.  int pc,n=f->sizecode;
  78.  for (pc=0; pc<n; pc++)
  79.  {
  80.   Instruction i=code[pc];
  81.   OpCode o=GET_OPCODE(i);
  82.   int a=GETARG_A(i);
  83.   int b=GETARG_B(i);
  84.   int c=GETARG_C(i);
  85.   int bx=GETARG_Bx(i);
  86.   int sbx=GETARG_sBx(i);
  87.   int line=getline(f,pc);
  88.   printf("\t%d\t",pc+1);
  89.   if (line>0) printf("[%d]\t",line); else printf("[-]\t");
  90.   printf("%-9s\t",luaP_opnames[o]);
  91.   switch (getOpMode(o))
  92.   {
  93.    case iABC:
  94.     printf("%d",a);
  95.     if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b);
  96.     if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c);
  97.     break;
  98.    case iABx:
  99.     if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx);
  100.     break;
  101.    case iAsBx:
  102.     if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx);
  103.     break;
  104.   }
  105.   switch (o)
  106.   {
  107.    case OP_LOADK:
  108.     printf("\t; "); PrintConstant(f,bx);
  109.     break;
  110.    case OP_GETUPVAL:
  111.    case OP_SETUPVAL:
  112.     printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-");
  113.     break;
  114.    case OP_GETGLOBAL:
  115.    case OP_SETGLOBAL:
  116.     printf("\t; %s",svalue(&f->k[bx]));
  117.     break;
  118.    case OP_GETTABLE:
  119.    case OP_SELF:
  120.     if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }
  121.     break;
  122.    case OP_SETTABLE:
  123.    case OP_ADD:
  124.    case OP_SUB:
  125.    case OP_MUL:
  126.    case OP_DIV:
  127.    case OP_POW:
  128.    case OP_EQ:
  129.    case OP_LT:
  130.    case OP_LE:
  131.     if (ISK(b) || ISK(c))
  132.     {
  133.      printf("\t; ");
  134.      if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");
  135.      printf(" ");
  136.      if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");
  137.     }
  138.     break;
  139.    case OP_JMP:
  140.    case OP_FORLOOP:
  141.    case OP_FORPREP:
  142.     printf("\t; to %d",sbx+pc+2);
  143.     break;
  144.    case OP_CLOSURE:
  145.     printf("\t; %p",VOID(f->p[bx]));
  146.     break;
  147.    case OP_SETLIST:
  148.     if (c==0) printf("\t; %d",(int)code[++pc]);
  149.     else printf("\t; %d",c);
  150.     break;
  151.    default:
  152.     break;
  153.   }
  154.   printf("\n");
  155.  }
  156. }
  157.  
  158. #define SS(x)   (x==1)?"":"s"
  159. #define S(x)    x,SS(x)
  160.  
  161. static void PrintHeader(const Proto* f)
  162. {
  163.  const char* s=getstr(f->source);
  164.  if (*s=='@' || *s=='=')
  165.   s++;
  166.  else if (*s==LUA_SIGNATURE[0])
  167.   s="(bstring)";
  168.  else
  169.   s="(string)";
  170.  printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n",
  171.         (f->linedefined==0)?"main":"function",s,
  172.         f->linedefined,f->lastlinedefined,
  173.         S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f));
  174.  printf("%d%s param%s, %d slot%s, %d upvalue%s, ",
  175.         f->numparams,f->is_vararg?"+":"",SS(f->numparams),
  176.         S(f->maxstacksize),S(f->nups));
  177.  printf("%d local%s, %d constant%s, %d function%s\n",
  178.         S(f->sizelocvars),S(f->sizek),S(f->sizep));
  179. }
  180.  
  181. static void PrintConstants(const Proto* f)
  182. {
  183.  int i,n=f->sizek;
  184.  printf("constants (%d) for %p:\n",n,VOID(f));
  185.  for (i=0; i<n; i++)
  186.  {
  187.   printf("\t%d\t",i+1);
  188.   PrintConstant(f,i);
  189.   printf("\n");
  190.  }
  191. }
  192.  
  193. static void PrintLocals(const Proto* f)
  194. {
  195.  int i,n=f->sizelocvars;
  196.  printf("locals (%d) for %p:\n",n,VOID(f));
  197.  for (i=0; i<n; i++)
  198.  {
  199.   printf("\t%d\t%s\t%d\t%d\n",
  200.   i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);
  201.  }
  202. }
  203.  
  204. static void PrintUpvalues(const Proto* f)
  205. {
  206.  int i,n=f->sizeupvalues;
  207.  printf("upvalues (%d) for %p:\n",n,VOID(f));
  208.  if (f->upvalues==NULL) return;
  209.  for (i=0; i<n; i++)
  210.  {
  211.   printf("\t%d\t%s\n",i,getstr(f->upvalues[i]));
  212.  }
  213. }
  214.  
  215. void PrintFunction(const Proto* f, int full)
  216. {
  217.  int i,n=f->sizep;
  218.  PrintHeader(f);
  219.  PrintCode(f);
  220.  if (full)
  221.  {
  222.   PrintConstants(f);
  223.   PrintLocals(f);
  224.   PrintUpvalues(f);
  225.  }
  226.  for (i=0; i<n; i++) PrintFunction(f->p[i],full);
  227. }
  228.