lua: add reference counting for strings - this will need A LOT of testing, but it...
[openwrt.git] / package / lua / patches / 300-opcode_performance.patch
index dbc89a8..e870a25 100644 (file)
  
  /*
   * If 'obj' is a string, it is tried to be interpreted as a number.
  
  /*
   * If 'obj' is a string, it is tried to be interpreted as a number.
-@@ -562,12 +565,65 @@
+@@ -562,12 +565,63 @@ static inline int arith_mode( const TVal
      ARITH_OP1_END
  #endif
  
 +#ifdef COMPUTED_GOTO
 +#define OPCODE_TARGET(op) DO_OP_##op:
      ARITH_OP1_END
  #endif
  
 +#ifdef COMPUTED_GOTO
 +#define OPCODE_TARGET(op) DO_OP_##op:
-+#define CALL_OPCODE(op) \
-+      if ((op < sizeof(opcodes) / sizeof(opcodes[0])) && opcodes[op]) \
-+              goto *opcodes[op];
++#define CALL_OPCODE(op) goto *opcodes[op];
 +#define OPCODE_PTR(op) [OP_##op] = &&DO_OP_##op
 +#else
 +#define OPCODE_TARGET(op) case OP_##op:
 +#define OPCODE_PTR(op) [OP_##op] = &&DO_OP_##op
 +#else
 +#define OPCODE_TARGET(op) case OP_##op:
   reentry:  /* entry point */
    lua_assert(isLua(L->ci));
    pc = L->savedpc;
   reentry:  /* entry point */
    lua_assert(isLua(L->ci));
    pc = L->savedpc;
-@@ -593,32 +649,32 @@
+@@ -592,33 +646,33 @@ void luaV_execute (lua_State *L, int nex
+     lua_assert(base == L->base && L->base == L->ci->base);
      lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);
      lua_assert(L->top == L->ci->top || luaG_checkopenop(i));
      lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);
      lua_assert(L->top == L->ci->top || luaG_checkopenop(i));
-     switch (GET_OPCODE(i)) {
+-    switch (GET_OPCODE(i)) {
 -      case OP_MOVE: {
 -      case OP_MOVE: {
++    CALL_OPCODE(GET_OPCODE(i)) {
 +      OPCODE_TARGET(MOVE) {
          setobjs2s(L, ra, RB(i));
          continue;
 +      OPCODE_TARGET(MOVE) {
          setobjs2s(L, ra, RB(i));
          continue;
          TValue g;
          TValue *rb = KBx(i);
          sethvalue(L, &g, cl->env);
          TValue g;
          TValue *rb = KBx(i);
          sethvalue(L, &g, cl->env);
-@@ -626,88 +682,88 @@
+@@ -626,88 +680,88 @@ void luaV_execute (lua_State *L, int nex
          Protect(luaV_gettable(L, &g, rb, ra));
          continue;
        }
          Protect(luaV_gettable(L, &g, rb, ra));
          continue;
        }
          const TValue *rb = RB(i);
          switch (ttype(rb)) {
            case LUA_TTABLE: {
          const TValue *rb = RB(i);
          switch (ttype(rb)) {
            case LUA_TTABLE: {
-@@ -727,18 +783,18 @@
+@@ -727,18 +781,18 @@ void luaV_execute (lua_State *L, int nex
          }
          continue;
        }
          }
          continue;
        }
          TValue *rb = RKB(i);
          TValue *rc = RKC(i);
          Protect(
          TValue *rb = RKB(i);
          TValue *rc = RKC(i);
          Protect(
-@@ -748,7 +804,7 @@
+@@ -748,7 +802,7 @@ void luaV_execute (lua_State *L, int nex
          pc++;
          continue;
        }
          pc++;
          continue;
        }
          Protect(
            if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i))
              dojump(L, pc, GETARG_sBx(*pc));
          Protect(
            if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i))
              dojump(L, pc, GETARG_sBx(*pc));
-@@ -756,7 +812,7 @@
+@@ -756,7 +810,7 @@ void luaV_execute (lua_State *L, int nex
          pc++;
          continue;
        }
          pc++;
          continue;
        }
          Protect(
            if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i))
              dojump(L, pc, GETARG_sBx(*pc));
          Protect(
            if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i))
              dojump(L, pc, GETARG_sBx(*pc));
-@@ -764,13 +820,13 @@
+@@ -764,13 +818,13 @@ void luaV_execute (lua_State *L, int nex
          pc++;
          continue;
        }
          pc++;
          continue;
        }
          TValue *rb = RB(i);
          if (l_isfalse(rb) != GETARG_C(i)) {
            setobjs2s(L, ra, rb);
          TValue *rb = RB(i);
          if (l_isfalse(rb) != GETARG_C(i)) {
            setobjs2s(L, ra, rb);
-@@ -779,7 +835,7 @@
+@@ -779,7 +833,7 @@ void luaV_execute (lua_State *L, int nex
          pc++;
          continue;
        }
          pc++;
          continue;
        }
          int b = GETARG_B(i);
          int nresults = GETARG_C(i) - 1;
          if (b != 0) L->top = ra+b;  /* else previous instruction set top */
          int b = GETARG_B(i);
          int nresults = GETARG_C(i) - 1;
          if (b != 0) L->top = ra+b;  /* else previous instruction set top */
-@@ -800,7 +856,7 @@
+@@ -800,7 +854,7 @@ void luaV_execute (lua_State *L, int nex
            }
          }
        }
            }
          }
        }
          int b = GETARG_B(i);
          if (b != 0) L->top = ra+b;  /* else previous instruction set top */
          L->savedpc = pc;
          int b = GETARG_B(i);
          if (b != 0) L->top = ra+b;  /* else previous instruction set top */
          L->savedpc = pc;
-@@ -832,7 +888,7 @@
+@@ -832,7 +886,7 @@ void luaV_execute (lua_State *L, int nex
            }
          }
        }
            }
          }
        }
          int b = GETARG_B(i);
          if (b != 0) L->top = ra+b-1;
          if (L->openupval) luaF_close(L, base);
          int b = GETARG_B(i);
          if (b != 0) L->top = ra+b-1;
          if (L->openupval) luaF_close(L, base);
-@@ -847,7 +903,7 @@
+@@ -847,7 +901,7 @@ void luaV_execute (lua_State *L, int nex
            goto reentry;
          }
        }
            goto reentry;
          }
        }
          /* If start,step and limit are all integers, we don't need to check
           * against overflow in the looping.
           */
          /* If start,step and limit are all integers, we don't need to check
           * against overflow in the looping.
           */
-@@ -875,7 +931,7 @@
+@@ -875,7 +929,7 @@ void luaV_execute (lua_State *L, int nex
          }
          continue;
        }
          }
          continue;
        }
          const TValue *init = ra;
          const TValue *plimit = ra+1;
          const TValue *pstep = ra+2;
          const TValue *init = ra;
          const TValue *plimit = ra+1;
          const TValue *pstep = ra+2;
-@@ -898,7 +954,7 @@
+@@ -898,7 +952,7 @@ void luaV_execute (lua_State *L, int nex
          dojump(L, pc, GETARG_sBx(i));
          continue;
        }
          dojump(L, pc, GETARG_sBx(i));
          continue;
        }
          StkId cb = ra + 3;  /* call base */
          setobjs2s(L, cb+2, ra+2);
          setobjs2s(L, cb+1, ra+1);
          StkId cb = ra + 3;  /* call base */
          setobjs2s(L, cb+2, ra+2);
          setobjs2s(L, cb+1, ra+1);
-@@ -914,7 +970,7 @@
+@@ -914,7 +968,7 @@ void luaV_execute (lua_State *L, int nex
          pc++;
          continue;
        }
          pc++;
          continue;
        }
          int n = GETARG_B(i);
          int c = GETARG_C(i);
          int last;
          int n = GETARG_B(i);
          int c = GETARG_C(i);
          int last;
-@@ -936,11 +992,11 @@
+@@ -936,11 +990,11 @@ void luaV_execute (lua_State *L, int nex
          }
          continue;
        }
          }
          continue;
        }
          Proto *p;
          Closure *ncl;
          int nup, j;
          Proto *p;
          Closure *ncl;
          int nup, j;
-@@ -960,7 +1016,7 @@
+@@ -960,7 +1014,7 @@ void luaV_execute (lua_State *L, int nex
          Protect(luaC_checkGC(L));
          continue;
        }
          Protect(luaC_checkGC(L));
          continue;
        }
This page took 0.031368 seconds and 4 git commands to generate.