| 7757 | |
| 7758 | |
| 7759 | static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { |
| 7760 | int i; |
| 7761 | Proto *f = fs->f; |
| 7762 | int oldsize = f->sizeupvalues; |
| 7763 | for (i=0; i<f->nups; i++) { |
| 7764 | if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { |
| 7765 | lua_assert(f->upvalues[i] == name); |
| 7766 | return i; |
| 7767 | } |
| 7768 | } |
| 7769 | /* new one */ |
| 7770 | luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues"); |
| 7771 | luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, |
| 7772 | TString *, MAX_INT, ""); |
| 7773 | while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; |
| 7774 | f->upvalues[f->nups] = name; |
| 7775 | luaC_objbarrier(fs->L, f, name); |
| 7776 | lua_assert(v->k == VLOCAL || v->k == VUPVAL); |
| 7777 | fs->upvalues[f->nups].k = cast_byte(v->k); |
| 7778 | fs->upvalues[f->nups].info = cast_byte(v->u.s.info); |
| 7779 | return f->nups++; |
| 7780 | } |
| 7781 | |
| 7782 | |
| 7783 | static int searchvar (FuncState *fs, TString *n) { |