锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

漫话Redis源码之一百零一十三

时间:2022-08-28 19:30:01 7jb4继电器3th2040

本周有很多事情,不想说话,静静地看代码:

static void traceexec (lua_State *L, const Instruction *pc) {   lu_byte mask = L->hookmask;   const Instruction *oldpc = L->savedpc;   L->savedpc = pc;   if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {     resethookcount(L);     luaD_callhook(L, LUA_HOOKCOUNT, -1);   }   if (mask & LUA_MASKLINE) {     Proto *p = ci_func(L->ci)->l.p;     int npc = pcRel(pc, p);     int newline = getline(p, npc);     /* call linehook when enter a new function, when jump back (loop),        or when enter a new line */     if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p)))       luaD_callhook(L, LUA_HOOKLINE, newline);   } }   static void callTMres (lua_State *L, StkId res, const TValue *f,                         const TValue *p1, const TValue *p2) {   ptrdiff_t result = savestack(L, res);   setobj2s(L, L->top, f);  /* push function */   setobj2s(L, L->top 1, p1);  /* 1st argument */   setobj2s(L, L->top 2, p2);  /* 2nd argument */   luaD_checkstack(L, 3);   L->top  = 3;   luaD_call(L, L->top - 3, 1);   res = restorestack(L, result);   L->top--;   setobjs2s(L, res, L->top); }    static void callTM (lua_State *L, const TValue *f, const TValue *p1,                     const TValue *p2, const TValue *p3) {   setobj2s(L, L->top, f);  /* push function */   setobj2s(L, L->top 1, p1);  /* 1st argument */   setobj2s(L, L->top 2, p2);  /* 2nd argument */   setobj2s(L, L->top 3, p3);  /* 3th argument */   luaD_checkstack(L, 4);   L->top  = 4;   luaD_call(L, L->top - 4, 0); }   void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {   int loop;   for (loop = 0; loop < MAXTAGLOOP; loop  ) {     const TValue *tm;     if (ttistable(t)) {  /* `t' is a table? */       Table *h = hvalue(t);       const TValue *res = luaH_get(h, key); /* do a primitive get */       if (! */       Table *h = hvalue(t);       const TValue *res = luaH_get(h, key); /* do a primitive get */       if (!ttisnil(res) ||  /* result is no nil? */           (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */         setobj2s(L, val, res);         return;       }       /* else will try the tag method */     }     else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX)))       luaG_typeerror(L, t, "index");     if (ttisfunction(tm)) {       callTMres(L, val, tm, t, key);       return;     }     t = tm;  /* else repeat with `tm' */    }   luaG_runerror(L, "loop in gettable"); }   void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {   int loop;   TValue temp;   for (loop = 0; loop < MAXTAGLOOP; loop  ) {     const TValue *tm;     if (ttistable(t)) {  /* `t' is a table? */       Table *h = hvalue(t);       TValue *oldval = luaH_set(L, h, key); /* do a primitive set */       if (!ttisnil(oldval) ||  /* result is no nil?ttisnil(oldval) ||  /* result is no nil? */           (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */         setobj2t(L, oldval, val);         h->flags = 0;         luaC_barriert(L, h, val);         return;       }       /* else will try the tag method */     }     else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))       luaG_typeerror(L, t, "index");     if (ttisfunction(tm)) {       callTM(L, tm, t, key, val);       return;     }     /* else repeat with `tm' */     setobj(L, &temp, tm);  /* avoid pointing inside table (may rehash) */     t = &temp;   }   luaG_runerror(L, "loop in settable"); }   static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,                        StkId res, TMS event) {   const TValue *tm = luaT_gettmbyobj(L, p1, event);  /* try first operand */   if (ttisnil(tm))     tm = luaT_gettmbyobj(L, p2, event);  /* try second operand */   if (ttisnil(tm)) return 0;   callTMres(L, res, tm, p1, p2);   return 1; }   static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,                                   TMS event) {   const TValue *tm1 = fasttm(L, mt1, event);   const TValue *tm2;   if (tm1 == NULL) return NULL;  /* no metamethod */   if (mt1 == mt2) return tm1;  /* same metatables => same metamethods */   tm2 = fasttm(L, mt2, event);   if (tm2 == NULL) return NULL;  /* no metamethod */   if (luaO_rawequalObj(tm1, tm2))  /* same metamethods? */     return tm1;   return NULL; }   static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,                          TMS event) {   const TValue *tm1 = luaT_gettmbyobj(L, p1, event);   const TValue *tm2;   if (ttisnil(tm1)) return -1;  /* no metamethod? */   tm2 = luaT_gettmbyobj(L, p2, event);   if (! */   tm2 = luaT_gettmbyobj(L, p2, event);   if (!luaO_rawequalObj(tm1, tm2))  /* different metamethods? */     return -1;   callTMres(L, L->top, tm1, p1, p2);   return !l_isfalse(L->top); }   static int l_strcmp (const TString *ls, const TString *rs) {   const char *l = getstr(ls);   size_t ll = ls->tsv.len;   const char *r = getstr(rs);   size_t lr = rs->tv.len;
  for (;;) {
    int temp = strcoll(l, r);
    if (temp != 0) return temp;
    else {  /* strings are equal up to a `\0' */
      size_t len = strlen(l);  /* index of first `\0' in both strings */
      if (len == lr)  /* r is finished? */
        return (len == ll) ? 0 : 1;
      else if (len == ll)  /* l is finished? */
        return -1;  /* l is smaller than r (because r is not finished) */
      /* both strings longer than `len'; go on comparing (after the `\0') */
      len++;
      l += len; ll -= len; r += len; lr -= len;
    }
  }
}

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章