/* * no arguments * * This function is separate from check_is because it calls enif_make_badarg * and so it must return the badarg exception as its return value. Thus, the * badarg exception indicates success. Failure is indicated by returning an * error atom. */ static ERL_NIF_TERM check_is_exception(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ERL_NIF_TERM error_atom = enif_make_atom(env, "error"); ERL_NIF_TERM badarg = enif_make_badarg(env); if (enif_is_exception(env, error_atom)) return error_atom; if (!enif_is_exception(env, badarg)) return error_atom; return badarg; }
static void push_nif_term(lua_State* lua, ERL_NIF_TERM message, ErlNifEnv* env, ErlNifResourceType* resource_type) { const int top = lua_gettop(lua); if(enif_is_atom(env, message)) { push_nif_atom(lua, message, env); } else if(enif_is_binary(env, message)) { // TODO @@@ binary also seems to be the custom types // that erlang makes. This may be OK, but maybe we should // think about putting a special type for them in lua push_nif_binary(lua, message, env); } else if(enif_is_list(env, message)) { if(enif_is_empty_list(env, message)) { luaL_checkstack(lua, 1, ERROR_STACK_MESSAGE); lua_newtable(lua); } else { // TODO @@@ try to send it as an IO list first and // if that fails send it as a regular list push_nif_list(lua, message, env, resource_type); } } else if(enif_is_tuple(env, message)) { push_nif_tuple(lua, message, env, resource_type); } else if(enif_is_pid(env, message)) { push_nif_pid(lua, message, env); } else if(enif_is_ref(env, message)) { push_nif_ref(lua, message, env); } else if(enif_is_exception(env, message)) { //printf("#exception\n"); luaL_checkstack(lua, 1, ERROR_STACK_MESSAGE); lua_pushliteral(lua, "sending an exception is not supported"); } else if(enif_is_fun(env, message)) { //printf("#fun\n"); luaL_checkstack(lua, 1, ERROR_STACK_MESSAGE); lua_pushliteral(lua, "sending a function reference is not supported"); } else if(enif_is_port(env, message)) { //printf("#port\n"); luaL_checkstack(lua, 1, ERROR_STACK_MESSAGE); lua_pushliteral(lua, "sending a port is not supported"); } else { // thank you r14 -- must be a number push_nif_number(lua, message, env); } assert(lua_gettop(lua) == top+1); }