/* Lexer error. */
LJ_NOINLINE void lj_err_lex(lua_State *L, GCstr *src, const char *tok,
			    BCLine line, ErrMsg em, va_list argp)
{
  char buff[LUA_IDSIZE];
  const char *msg;
  lj_debug_shortname(buff, src, line);
  msg = lj_strfmt_pushvf(L, err2msg(em), argp);
  msg = lj_strfmt_pushf(L, "%s:%d: %s", buff, line, msg);
  if (tok)
    lj_strfmt_pushf(L, err2msg(LJ_ERR_XNEAR), msg, tok);
  lj_err_throw(L, LUA_ERRSYNTAX);
}
/* Argument error message. */
LJ_NORET LJ_NOINLINE static void err_argmsg(lua_State *L, int narg,
					    const char *msg)
{
  const char *fname = "?";
  const char *ftype = lj_debug_funcname(L, L->base - 1, &fname);
  if (narg < 0 && narg > LUA_REGISTRYINDEX)
    narg = (int)(L->top - L->base) + narg + 1;
  if (ftype && ftype[3] == 'h' && --narg == 0)  /* Check for "method". */
    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg);
  else
    msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADARG), narg, fname, msg);
  lj_err_callermsg(L, msg);
}
Example #3
0
static const char *clib_extname(lua_State *L, const char *name)
{
    if (clib_needext(name)) {
        name = lj_strfmt_pushf(L, "%s.dll", name);
        L->top--;
    }
    return name;
}
Example #4
0
static IOFileUD *io_file_open(lua_State *L, const char *mode)
{
  const char *fname = strdata(lj_lib_checkstr(L, 1));
  IOFileUD *iof = io_file_new(L);
  iof->fp = fopen(fname, mode);
  if (iof->fp == NULL)
    luaL_argerror(L, 1, lj_strfmt_pushf(L, "%s: %s", fname, strerror(errno)));
  return iof;
}
Example #5
0
static const char *clib_extname(lua_State *L, const char *name)
{
    if (!strchr(name, '/')
#if LJ_TARGET_CYGWIN
            && !strchr(name, '\\')
#endif
       ) {
        if (!strchr(name, '.')) {
            name = lj_strfmt_pushf(L, CLIB_SOEXT, name);
            L->top--;
#if LJ_TARGET_CYGWIN
        } else {
            return name;
#endif
        }
        if (!(name[0] == CLIB_SOPREFIX[0] && name[1] == CLIB_SOPREFIX[1] &&
                name[2] == CLIB_SOPREFIX[2])) {
            name = lj_strfmt_pushf(L, CLIB_SOPREFIX "%s", name);
            L->top--;
        }
    }
    return name;
}
Example #6
0
/* Index a C library by name. */
TValue *lj_clib_index(lua_State *L, CLibrary *cl, GCstr *name)
{
    TValue *tv = lj_tab_setstr(L, cl->cache, name);
    if (LJ_UNLIKELY(tvisnil(tv))) {
        CTState *cts = ctype_cts(L);
        CType *ct;
        CTypeID id = lj_ctype_getname(cts, &ct, name, CLNS_INDEX);
        if (!id)
            lj_err_callerv(L, LJ_ERR_FFI_NODECL, strdata(name));
        if (ctype_isconstval(ct->info)) {
            CType *ctt = ctype_child(cts, ct);
            lua_assert(ctype_isinteger(ctt->info) && ctt->size <= 4);
            if ((ctt->info & CTF_UNSIGNED) && (int32_t)ct->size < 0)
                setnumV(tv, (lua_Number)(uint32_t)ct->size);
            else
                setintV(tv, (int32_t)ct->size);
        } else {
            const char *sym = clib_extsym(cts, ct, name);
#if LJ_TARGET_WINDOWS
            DWORD oldwerr = GetLastError();
#endif
            void *p = clib_getsym(cl, sym);
            GCcdata *cd;
            lua_assert(ctype_isfunc(ct->info) || ctype_isextern(ct->info));
#if LJ_TARGET_X86 && LJ_ABI_WIN
            /* Retry with decorated name for fastcall/stdcall functions. */
            if (!p && ctype_isfunc(ct->info)) {
                CTInfo cconv = ctype_cconv(ct->info);
                if (cconv == CTCC_FASTCALL || cconv == CTCC_STDCALL) {
                    CTSize sz = clib_func_argsize(cts, ct);
                    const char *symd = lj_strfmt_pushf(L,
                                                       cconv == CTCC_FASTCALL ? "@%s@%d" : "_%s@%d",
                                                       sym, sz);
                    L->top--;
                    p = clib_getsym(cl, symd);
                }
            }
#endif
            if (!p)
                clib_error(L, "cannot resolve symbol " LUA_QS ": %s", sym);
#if LJ_TARGET_WINDOWS
            SetLastError(oldwerr);
#endif
            cd = lj_cdata_new(cts, id, CTSIZE_PTR);
            *(void **)cdataptr(cd) = p;
            setcdataV(L, tv, cd);
        }
    }
    return tv;
}
Example #7
0
LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt,
        const char *name)
{
    DWORD err = GetLastError();
#if LJ_TARGET_XBOXONE
    wchar_t wbuf[128];
    char buf[128*2];
    if (!FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM,
                        NULL, err, 0, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL) ||
            !WideCharToMultiByte(CP_ACP, 0, wbuf, 128, buf, 128*2, NULL, NULL))
#else
    char buf[128];
    if (!FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM,
                        NULL, err, 0, buf, sizeof(buf), NULL))
#endif
        buf[0] = '\0';
    lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, buf));
}
/* Typecheck error for arguments. */
LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname)
{
  const char *tname, *msg;
  if (narg <= LUA_REGISTRYINDEX) {
    if (narg >= LUA_GLOBALSINDEX) {
      tname = lj_obj_itypename[~LJ_TTAB];
    } else {
      GCfunc *fn = curr_func(L);
      int idx = LUA_GLOBALSINDEX - narg;
      if (idx <= fn->c.nupvalues)
	tname = lj_typename(&fn->c.upvalue[idx-1]);
      else
	tname = lj_obj_typename[0];
    }
  } else {
    TValue *o = narg < 0 ? L->top + narg : L->base + narg-1;
    tname = o < L->top ? lj_typename(o) : lj_obj_typename[0];
  }
  msg = lj_strfmt_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname);
  err_argmsg(L, narg, msg);
}
Example #9
0
LJ_NORET LJ_NOINLINE static void clib_error(lua_State *L, const char *fmt,
        const char *name)
{
    lj_err_callermsg(L, lj_strfmt_pushf(L, fmt, name, "no support for this OS"));
}