diff -urN lua-5.1-alpha/src/llex.c lua-5.1-alpha_new/src/llex.c
--- lua-5.1-alpha/src/llex.c	2005-05-17 15:49:15.000000000 -0400
+++ lua-5.1-alpha_new/src/llex.c	2005-09-04 22:47:27.231270000 -0400
@@ -7,6 +7,7 @@
 
 #include <ctype.h>
 #include <string.h>
+#include <stdlib.h>
 
 #define llex_c
 #define LUA_CORE
@@ -34,7 +35,7 @@
 /* ORDER RESERVED */
 const char *const luaX_tokens [] = {
     "and", "break", "do", "else", "elseif",
-    "end", "false", "for", "function", "if",
+    "end", "false", "for", "from", "function", "if",
     "in", "local", "nil", "not", "or", "repeat",
     "return", "then", "true", "until", "while",
     "..", "...", "==", ">=", "<=", "~=",
@@ -155,9 +156,33 @@
 
 
 
+static int luaO_hexstr2d (const char *s, lua_Number *result) {
+  char *endptr;
+  *result = strtoul(s, &endptr, 0);
+  if (endptr == s) return 0;  /* conversion failed */
+  if (*endptr == '\0') return 1;  /* most common case */
+  while (isspace(cast(unsigned char, *endptr))) endptr++;
+  if (*endptr != '\0') return 0;  /* invalid trailing characters? */
+  return 1;
+}
 
 /* LUA_NUMBER */
 static void read_numeral (LexState *ls, SemInfo *seminfo) {
+
+  if (ls->current == '0') {  /* check for hex prefix */
+    save_and_next(ls);
+    if (ls->current == 'x' || ls->current == 'X') {
+      save_and_next(ls);
+      while (isxdigit(ls->current)) {
+        save_and_next(ls);
+      }
+      save(ls, '\0');
+      if (!luaO_hexstr2d(luaZ_buffer(ls->buff), &seminfo->r))
+        luaX_lexerror(ls, "malformed hex number", TK_NUMBER);
+      return;
+    }
+  }
+
   while (isdigit(ls->current)) {
     save_and_next(ls);
   }
diff -urN lua-5.1-alpha/src/llex.h lua-5.1-alpha_new/src/llex.h
--- lua-5.1-alpha/src/llex.h	2005-06-06 09:30:25.000000000 -0400
+++ lua-5.1-alpha_new/src/llex.h	2005-09-04 22:19:58.875789000 -0400
@@ -24,7 +24,7 @@
 enum RESERVED {
   /* terminal symbols denoted by reserved words */
   TK_AND = FIRST_RESERVED, TK_BREAK,
-  TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,
+  TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FROM, TK_FUNCTION,
   TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,
   TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,
   /* other terminal symbols */
diff -urN lua-5.1-alpha/src/lparser.c lua-5.1-alpha_new/src/lparser.c
--- lua-5.1-alpha/src/lparser.c	2005-08-29 16:49:21.000000000 -0400
+++ lua-5.1-alpha_new/src/lparser.c	2005-09-06 22:50:22.354736000 -0400
@@ -944,8 +944,33 @@
 }
 
 
-static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
+static void getfrom (LexState *ls, expdesc *e, expdesc *v)
+{
+  expdesc key;
+  int k = v->k;
+
+  if (k == VLOCAL) {
+    codestring(ls, &key, getlocvar(ls->fs, v->info).varname);
+  }
+  else if (k == VUPVAL) {
+    codestring(ls, &key, ls->fs->f->upvalues[v->info]);
+  }
+  else if (k== VGLOBAL) {
+    init_exp(&key, VK, v->info);
+  }
+  else {
+    check_condition(ls, VLOCAL <= k && k <= VGLOBAL,
+                        "syntax error in from vars");
+  }
+  luaK_indexed(ls->fs, e, &key);
+}
+
+static int assignment (LexState *ls, struct LHS_assign *lh, int nvars,
+                       lu_byte *from_var)
+{
   expdesc e;
+  int from = 0;
+
   check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED,
                       "syntax error");
   if (testnext(ls, ',')) {  /* assignment -> `,' primaryexp assignment */
@@ -954,25 +979,44 @@
     primaryexp(ls, &nv.v);
     if (nv.v.k == VLOCAL)
       check_conflict(ls, lh, &nv.v);
-    assignment(ls, &nv, nvars+1);
+    from = assignment(ls, &nv, nvars+1, from_var);
   }
-  else {  /* assignment -> `=' explist1 */
+  else {  /* assignment -> FROM primaryexp | `=' explist1 */
     int nexps;
-    checknext(ls, '=');
-    nexps = explist1(ls, &e);
-    if (nexps != nvars) {
-      adjust_assign(ls, nvars, nexps, &e);
-      if (nexps > nvars)
-        ls->fs->freereg -= nexps - nvars;  /* remove extra values */
+
+    if (testnext(ls, TK_FROM)) {
+      new_localvarliteral(ls, "(from)", 0);
+      primaryexp(ls, &e);
+      luaK_exp2nextreg(ls->fs, &e);
+      *from_var = ls->fs->nactvar;
+      adjustlocalvars(ls, 1);
+
+      luaK_setoneret(ls->fs, &e);  /* close last expression */
+      getfrom(ls, &e, &lh->v);
+      luaK_storevar(ls->fs, &lh->v, &e);
+      return 1;  /* avoid default */
     }
     else {
+      checknext(ls, '=');
+      nexps = explist1(ls, &e);
+    }
+
+    if (nexps == nvars) {
       luaK_setoneret(ls->fs, &e);  /* close last expression */
       luaK_storevar(ls->fs, &lh->v, &e);
-      return;  /* avoid default */
+      return 0;  /* avoid default */
+    }
+    else {
+      adjust_assign(ls, nvars, nexps, &e);
+      if (nexps > nvars)
+        ls->fs->freereg -= nexps - nvars;  /* remove extra values */
     }
   }
+
   init_exp(&e, VNONRELOC, ls->fs->freereg-1);  /* default assignment */
+  if (from) getfrom(ls, &e, &lh->v);
   luaK_storevar(ls->fs, &lh->v, &e);
+  return from;
 }
 
 
@@ -1191,13 +1235,40 @@
 
 
 static void localstat (LexState *ls) {
-  /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */
+  /* stat -> LOCAL NAME {`,' NAME} [ FROM primaryexp | `=' explist1] */
   int nvars = 0;
   int nexps;
   expdesc e;
   do {
     new_localvar(ls, str_checkname(ls), nvars++);
   } while (testnext(ls, ','));
+
+  if (testnext(ls, TK_FROM)) {
+    lu_byte from_var;
+    int regs = ls->fs->freereg;
+    int vars = ls->fs->nactvar;
+
+    luaK_reserveregs(ls->fs, nvars);
+    adjustlocalvars(ls, nvars);
+
+    new_localvarliteral(ls, "(from)", 0);
+    primaryexp(ls, &e);
+    luaK_exp2nextreg(ls->fs, &e);
+    from_var = ls->fs->nactvar;
+    adjustlocalvars(ls, 1);
+    luaK_setoneret(ls->fs, &e);  /* close last expression */
+
+    for (nexps=0; nexps<nvars; nexps++) {
+      expdesc v, key;
+      init_exp(&e, VNONRELOC, ls->fs->freereg-1);
+      codestring(ls, &key, getlocvar(ls->fs, vars+nexps).varname);
+      luaK_indexed(ls->fs, &e, &key);
+      init_exp(&v, VLOCAL, regs+nexps);
+      luaK_storevar(ls->fs, &v, &e);
+    }
+    removevars(ls, from_var);
+    return;
+  }
   if (testnext(ls, '='))
     nexps = explist1(ls, &e);
   else {
@@ -1243,8 +1314,10 @@
   if (v.v.k == VCALL)  /* stat -> func */
     SETARG_C(getcode(fs, &v.v), 1);  /* call statement uses no results */
   else {  /* stat -> assignment */
+    lu_byte from_var;
     v.prev = NULL;
-    assignment(ls, &v, 1);
+    if (assignment(ls, &v, 1, &from_var))
+      removevars(ls, from_var);
   }
 }
 
diff -urN lua-5.1-alpha/src/luaconf.h lua-5.1-alpha_new/src/luaconf.h
--- lua-5.1-alpha/src/luaconf.h	2005-08-25 11:38:53.000000000 -0400
+++ lua-5.1-alpha_new/src/luaconf.h	2005-09-05 19:57:20.133721000 -0400
@@ -156,7 +156,11 @@
 @@ lua_assert describes the internal assertions in Lua.
 ** CHANGE that only if you need to debug Lua.
 */
+#if 0
 #define lua_assert(c)		((void)0)
+#else
+#define lua_assert(c)  assert(c)
+#endif
 
 
 /*
diff -urN lua-5.1-alpha/src/lua.h lua-5.1-alpha_new/src/lua.h
--- lua-5.1-alpha/src/lua.h	2005-09-02 13:11:12.000000000 -0400
+++ lua-5.1-alpha_new/src/lua.h	2005-09-05 19:57:20.133721000 -0400
@@ -11,6 +11,7 @@
 
 #include <stdarg.h>
 #include <stddef.h>
+#include <assert.h>
 
 
 #include "luaconf.h"
