| 2544 | |
| 2545 | |
| 2546 | LUA_API int lua_setmetatable (lua_State *L, int objindex) { |
| 2547 | TValue *obj; |
| 2548 | Table *mt; |
| 2549 | lua_lock(L); |
| 2550 | api_checknelems(L, 1); |
| 2551 | obj = index2adr(L, objindex); |
| 2552 | api_checkvalidindex(L, obj); |
| 2553 | if (ttisnil(L->top - 1)) |
| 2554 | mt = NULL; |
| 2555 | else { |
| 2556 | api_check(L, ttistable(L->top - 1)); |
| 2557 | mt = hvalue(L->top - 1); |
| 2558 | } |
| 2559 | switch (ttype(obj)) { |
| 2560 | case LUA_TTABLE: { |
| 2561 | hvalue(obj)->metatable = mt; |
| 2562 | if (mt) |
| 2563 | luaC_objbarriert(L, hvalue(obj), mt); |
| 2564 | break; |
| 2565 | } |
| 2566 | case LUA_TUSERDATA: { |
| 2567 | uvalue(obj)->metatable = mt; |
| 2568 | if (mt) |
| 2569 | luaC_objbarrier(L, rawuvalue(obj), mt); |
| 2570 | break; |
| 2571 | } |
| 2572 | default: { |
| 2573 | G(L)->mt[ttype(obj)] = mt; |
| 2574 | break; |
| 2575 | } |
| 2576 | } |
| 2577 | L->top--; |
| 2578 | lua_unlock(L); |
| 2579 | return 1; |
| 2580 | } |
| 2581 | |
| 2582 | |
| 2583 | LUA_API int lua_setfenv (lua_State *L, int idx) { |
no test coverage detected