| 181 | |
| 182 | |
| 183 | static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { |
| 184 | int i; |
| 185 | Proto *f = fs->f; |
| 186 | int oldsize = f->sizeupvalues; |
| 187 | for (i=0; i<f->nups; i++) { |
| 188 | if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { |
| 189 | lua_assert(f->upvalues[i] == name); |
| 190 | return i; |
| 191 | } |
| 192 | } |
| 193 | /* new one */ |
| 194 | luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues"); |
| 195 | luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, |
| 196 | TString *, MAX_INT, ""); |
| 197 | while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; |
| 198 | f->upvalues[f->nups] = name; |
| 199 | luaC_objbarrier(fs->L, f, name); |
| 200 | lua_assert(v->k == VLOCAL || v->k == VUPVAL); |
| 201 | fs->upvalues[f->nups].k = cast_byte(v->k); |
| 202 | fs->upvalues[f->nups].info = cast_byte(v->u.s.info); |
| 203 | return f->nups++; |
| 204 | } |
| 205 | |
| 206 | |
| 207 | static int searchvar (FuncState *fs, TString *n) { |