1/* 2** $Id: lapi.h $ 3** Auxiliary functions from Lua API 4** See Copyright Notice in lua.h 5*/ 6 7#ifndef lapi_h 8#define lapi_h 9 10 11#include "llimits.h" 12#include "lstate.h" 13 14 15/* Increments 'L->top.p', checking for stack overflows */ 16#define api_incr_top(L) {L->top.p++; \ 17 api_check(L, L->top.p <= L->ci->top.p, \ 18 "stack overflow");} 19 20 21/* 22** If a call returns too many multiple returns, the callee may not have 23** stack space to accommodate all results. In this case, this macro 24** increases its stack space ('L->ci->top.p'). 25*/ 26#define adjustresults(L,nres) \ 27 { if ((nres) <= LUA_MULTRET && L->ci->top.p < L->top.p) \ 28 L->ci->top.p = L->top.p; } 29 30 31/* Ensure the stack has at least 'n' elements */ 32#define api_checknelems(L,n) \ 33 api_check(L, (n) < (L->top.p - L->ci->func.p), \ 34 "not enough elements in the stack") 35 36 37/* 38** To reduce the overhead of returning from C functions, the presence of 39** to-be-closed variables in these functions is coded in the CallInfo's 40** field 'nresults', in a way that functions with no to-be-closed variables 41** with zero, one, or "all" wanted results have no overhead. Functions 42** with other number of wanted results, as well as functions with 43** variables to be closed, have an extra check. 44*/ 45 46#define hastocloseCfunc(n) ((n) < LUA_MULTRET) 47 48/* Map [-1, inf) (range of 'nresults') into (-inf, -2] */ 49#define codeNresults(n) (-(n) - 3) 50#define decodeNresults(n) (-(n) - 3) 51 52#endif 53