add back the old host patches for lua to improve portability
[openwrt/svn-archive/archive.git] / package / lua / patches-host / 030-archindependent-bytecode.patch
diff --git a/package/lua/patches-host/030-archindependent-bytecode.patch b/package/lua/patches-host/030-archindependent-bytecode.patch
new file mode 100644 (file)
index 0000000..b27592f
--- /dev/null
@@ -0,0 +1,115 @@
+Index: lua-5.1.4/src/ldump.c
+===================================================================
+--- lua-5.1.4.orig/src/ldump.c 2008-08-24 16:48:20.000000000 +0200
++++ lua-5.1.4/src/ldump.c      2008-08-24 16:48:52.000000000 +0200
+@@ -67,12 +67,12 @@
+ {
+  if (s==NULL || getstr(s)==NULL)
+  {
+-  size_t size=0;
++  unsigned int size=0;
+   DumpVar(size,D);
+  }
+  else
+  {
+-  size_t size=s->tsv.len+1;           /* include trailing '\0' */
++  unsigned int size=s->tsv.len+1;             /* include trailing '\0' */
+   DumpVar(size,D);
+   DumpBlock(getstr(s),size,D);
+  }
+Index: lua-5.1.4/src/lundump.c
+===================================================================
+--- lua-5.1.4.orig/src/lundump.c       2008-08-24 16:48:20.000000000 +0200
++++ lua-5.1.4/src/lundump.c    2008-08-24 16:48:52.000000000 +0200
+@@ -25,6 +25,7 @@
+  ZIO* Z;
+  Mbuffer* b;
+  const char* name;
++ int swap;
+ } LoadState;
+ #ifdef LUAC_TRUST_BINARIES
+@@ -40,7 +41,6 @@
+ }
+ #endif
+-#define LoadMem(S,b,n,size)   LoadBlock(S,b,(n)*(size))
+ #define       LoadByte(S)             (lu_byte)LoadChar(S)
+ #define LoadVar(S,x)          LoadMem(S,&x,1,sizeof(x))
+ #define LoadVector(S,b,n,size)        LoadMem(S,b,n,size)
+@@ -51,6 +51,49 @@
+  IF (r!=0, "unexpected end");
+ }
++static void LoadMem (LoadState* S, void* b, int n, size_t size)
++{
++ LoadBlock(S,b,n*size);
++ if (S->swap)
++ {
++  char* p=(char*) b;
++  char c;
++  switch (size)
++  {
++   case 1:
++      break;
++   case 2:
++      while (n--)
++      {
++       c=p[0]; p[0]=p[1]; p[1]=c;
++       p+=2;
++      }
++      break;
++   case 4:
++      while (n--)
++      {
++       c=p[0]; p[0]=p[3]; p[3]=c;
++       c=p[1]; p[1]=p[2]; p[2]=c;
++       p+=4;
++      }
++      break;
++   case 8:
++      while (n--)
++      {
++       c=p[0]; p[0]=p[7]; p[7]=c;
++       c=p[1]; p[1]=p[6]; p[6]=c;
++       c=p[2]; p[2]=p[5]; p[5]=c;
++       c=p[3]; p[3]=p[4]; p[4]=c;
++       p+=8;
++      }
++      break;
++   default:
++      IF(1, "bad size");
++      break;
++  }
++ }
++}
++
+ static int LoadChar(LoadState* S)
+ {
+  char x;
+@@ -82,7 +125,7 @@
+ static TString* LoadString(LoadState* S)
+ {
+- size_t size;
++ unsigned int size;
+  LoadVar(S,size);
+  if (size==0)
+   return NULL;
+@@ -196,6 +239,7 @@
+  char s[LUAC_HEADERSIZE];
+  luaU_header(h);
+  LoadBlock(S,s,LUAC_HEADERSIZE);
++ S->swap=(s[6]!=h[6]); s[6]=h[6];
+  IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header");
+ }
+@@ -230,7 +274,7 @@
+  *h++=(char)LUAC_FORMAT;
+  *h++=(char)*(char*)&x;                               /* endianness */
+  *h++=(char)sizeof(int);
+- *h++=(char)sizeof(size_t);
++ *h++=(char)sizeof(unsigned int);
+  *h++=(char)sizeof(Instruction);
+  *h++=(char)sizeof(lua_Number);