refactor(util): move Lua named parameter support to a different file
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
f3c7bc948a
commit
bf57f951ea
6 changed files with 108 additions and 85 deletions
|
@ -10,6 +10,7 @@ Author: Leonardo de Moura
|
||||||
#include "util/script_state.h"
|
#include "util/script_state.h"
|
||||||
#include "util/list_lua.h"
|
#include "util/list_lua.h"
|
||||||
#include "util/pair_lua.h"
|
#include "util/pair_lua.h"
|
||||||
|
#include "util/lua_named_param.h"
|
||||||
#include "util/luaref.h"
|
#include "util/luaref.h"
|
||||||
#include "kernel/abstract.h"
|
#include "kernel/abstract.h"
|
||||||
#include "kernel/for_each_fn.h"
|
#include "kernel/for_each_fn.h"
|
||||||
|
|
|
@ -4,10 +4,11 @@ else()
|
||||||
set(THREAD_CPP "")
|
set(THREAD_CPP "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(util trace.cpp debug.cpp name.cpp name_set.cpp name_generator.cpp
|
add_library(util trace.cpp debug.cpp name.cpp name_set.cpp
|
||||||
exception.cpp interrupt.cpp hash.cpp escaped.cpp bit_tricks.cpp
|
name_generator.cpp exception.cpp interrupt.cpp hash.cpp escaped.cpp
|
||||||
safe_arith.cpp ascii.cpp memory.cpp shared_mutex.cpp realpath.cpp
|
bit_tricks.cpp safe_arith.cpp ascii.cpp memory.cpp shared_mutex.cpp
|
||||||
script_state.cpp script_exception.cpp rb_map.cpp lua.cpp
|
realpath.cpp script_state.cpp script_exception.cpp rb_map.cpp
|
||||||
luaref.cpp stackinfo.cpp lean_path.cpp serializer.cpp lbool.cpp ${THREAD_CPP})
|
lua.cpp luaref.cpp lua_named_param.cpp stackinfo.cpp lean_path.cpp
|
||||||
|
serializer.cpp lbool.cpp ${THREAD_CPP})
|
||||||
|
|
||||||
target_link_libraries(util ${LEAN_LIBS})
|
target_link_libraries(util ${LEAN_LIBS})
|
||||||
|
|
|
@ -195,76 +195,5 @@ lua_migrate_fn get_migrate_fn(lua_State * L, int i) {
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_bool_named_param(lua_State * L, int idx, char const * opt_name, bool def_value) {
|
|
||||||
if (lua_istable(L, idx)) {
|
|
||||||
bool result = def_value;
|
|
||||||
push_string(L, opt_name);
|
|
||||||
lua_gettable(L, idx);
|
|
||||||
if (lua_isboolean(L, -1)) {
|
|
||||||
result = lua_toboolean(L, -1);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
return result;
|
|
||||||
} else if (lua_isnil(L, -1)) {
|
|
||||||
lua_pop(L, 1);
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
lua_pop(L, 1);
|
|
||||||
throw exception(sstream() << "field '" << opt_name << "' must be a Boolean in table at arg #" << idx);
|
|
||||||
}
|
|
||||||
} else if (idx <= lua_gettop(L) && !lua_isnil(L, idx)) {
|
|
||||||
throw exception(sstream() << "arg #" << idx << " must be a table");
|
|
||||||
} else {
|
|
||||||
return def_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_int_named_param(lua_State * L, int idx, char const * opt_name, int def_value) {
|
|
||||||
if (lua_istable(L, idx)) {
|
|
||||||
int result = def_value;
|
|
||||||
push_string(L, opt_name);
|
|
||||||
lua_gettable(L, idx);
|
|
||||||
if (lua_isnumber(L, -1)) {
|
|
||||||
result = lua_tointeger(L, -1);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
return result;
|
|
||||||
} else if (lua_isnil(L, -1)) {
|
|
||||||
lua_pop(L, 1);
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
lua_pop(L, 1);
|
|
||||||
throw exception(sstream() << "field '" << opt_name << "' must be an integer in table at arg #" << idx);
|
|
||||||
}
|
|
||||||
} else if (idx <= lua_gettop(L) && !lua_isnil(L, idx)) {
|
|
||||||
throw exception(sstream() << "arg #" << idx << " must be a table");
|
|
||||||
} else {
|
|
||||||
return def_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned get_uint_named_param(lua_State * L, int idx, char const * opt_name, unsigned def_value) {
|
|
||||||
if (lua_istable(L, idx)) {
|
|
||||||
long result = def_value;
|
|
||||||
push_string(L, opt_name);
|
|
||||||
lua_gettable(L, idx);
|
|
||||||
if (lua_isnumber(L, -1)) {
|
|
||||||
long result = lua_tointeger(L, -1);
|
|
||||||
lua_pop(L, 1);
|
|
||||||
if (result < 0 || result > std::numeric_limits<unsigned>::max())
|
|
||||||
throw exception(sstream() << "field '" << opt_name << "' must be a unsigned integer in table at arg #" << idx);
|
|
||||||
return static_cast<unsigned>(result);
|
|
||||||
} else if (lua_isnil(L, -1)) {
|
|
||||||
lua_pop(L, 1);
|
|
||||||
return static_cast<unsigned>(result);
|
|
||||||
} else {
|
|
||||||
lua_pop(L, 1);
|
|
||||||
throw exception(sstream() << "field '" << opt_name << "' must be an integer in table at arg #" << idx);
|
|
||||||
}
|
|
||||||
} else if (idx <= lua_gettop(L) && !lua_isnil(L, idx)) {
|
|
||||||
throw exception(sstream() << "arg #" << idx << " must be a table");
|
|
||||||
} else {
|
|
||||||
return def_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2013 Microsoft Corporation. All rights reserved.
|
Copyright (c) 2013-2014 Microsoft Corporation. All rights reserved.
|
||||||
Released under Apache 2.0 license as described in the file LICENSE.
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
|
||||||
Author: Leonardo de Moura
|
Author: Leonardo de Moura
|
||||||
|
@ -138,12 +138,4 @@ inline int push_integer(lua_State * L, lua_Integer v) { lua_pushinteger(L, v); r
|
||||||
inline int push_number(lua_State * L, lua_Number v) { lua_pushnumber(L, v); return 1; }
|
inline int push_number(lua_State * L, lua_Number v) { lua_pushnumber(L, v); return 1; }
|
||||||
inline int push_nil(lua_State * L) { lua_pushnil(L); return 1; }
|
inline int push_nil(lua_State * L) { lua_pushnil(L); return 1; }
|
||||||
// =======================================
|
// =======================================
|
||||||
|
|
||||||
// =======================================
|
|
||||||
// Utilities for simulating Python-like named parameters using Lua tables.
|
|
||||||
// In the following function \c idx is the position of the Lua table on the Lua stack.
|
|
||||||
bool get_bool_named_param(lua_State * L, int idx, char const * opt_name, bool def_value);
|
|
||||||
int get_int_named_param(lua_State * L, int idx, char const * opt_name, int def_value);
|
|
||||||
unsigned get_uint_named_param(lua_State * L, int idx, char const * opt_name, unsigned def_value);
|
|
||||||
// =======================================
|
|
||||||
}
|
}
|
||||||
|
|
82
src/util/lua_named_param.cpp
Normal file
82
src/util/lua_named_param.cpp
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
||||||
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
|
||||||
|
Author: Leonardo de Moura
|
||||||
|
*/
|
||||||
|
#include <limits>
|
||||||
|
#include "util/lua_named_param.h"
|
||||||
|
#include "util/sstream.h"
|
||||||
|
|
||||||
|
namespace lean {
|
||||||
|
bool get_bool_named_param(lua_State * L, int idx, char const * opt_name, bool def_value) {
|
||||||
|
if (lua_istable(L, idx)) {
|
||||||
|
bool result = def_value;
|
||||||
|
push_string(L, opt_name);
|
||||||
|
lua_gettable(L, idx);
|
||||||
|
if (lua_isboolean(L, -1)) {
|
||||||
|
result = lua_toboolean(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return result;
|
||||||
|
} else if (lua_isnil(L, -1)) {
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
lua_pop(L, 1);
|
||||||
|
throw exception(sstream() << "field '" << opt_name << "' must be a Boolean in table at arg #" << idx);
|
||||||
|
}
|
||||||
|
} else if (idx <= lua_gettop(L) && !lua_isnil(L, idx)) {
|
||||||
|
throw exception(sstream() << "arg #" << idx << " must be a table");
|
||||||
|
} else {
|
||||||
|
return def_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_int_named_param(lua_State * L, int idx, char const * opt_name, int def_value) {
|
||||||
|
if (lua_istable(L, idx)) {
|
||||||
|
int result = def_value;
|
||||||
|
push_string(L, opt_name);
|
||||||
|
lua_gettable(L, idx);
|
||||||
|
if (lua_isnumber(L, -1)) {
|
||||||
|
result = lua_tointeger(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return result;
|
||||||
|
} else if (lua_isnil(L, -1)) {
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
lua_pop(L, 1);
|
||||||
|
throw exception(sstream() << "field '" << opt_name << "' must be an integer in table at arg #" << idx);
|
||||||
|
}
|
||||||
|
} else if (idx <= lua_gettop(L) && !lua_isnil(L, idx)) {
|
||||||
|
throw exception(sstream() << "arg #" << idx << " must be a table");
|
||||||
|
} else {
|
||||||
|
return def_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned get_uint_named_param(lua_State * L, int idx, char const * opt_name, unsigned def_value) {
|
||||||
|
if (lua_istable(L, idx)) {
|
||||||
|
push_string(L, opt_name);
|
||||||
|
lua_gettable(L, idx);
|
||||||
|
if (lua_isnumber(L, -1)) {
|
||||||
|
long result = lua_tointeger(L, -1);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
if (result < 0 || result > std::numeric_limits<unsigned>::max())
|
||||||
|
throw exception(sstream() << "field '" << opt_name << "' must be a unsigned integer in table at arg #" << idx);
|
||||||
|
return static_cast<unsigned>(result);
|
||||||
|
} else if (lua_isnil(L, -1)) {
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return static_cast<unsigned>(def_value);
|
||||||
|
} else {
|
||||||
|
lua_pop(L, 1);
|
||||||
|
throw exception(sstream() << "field '" << opt_name << "' must be an integer in table at arg #" << idx);
|
||||||
|
}
|
||||||
|
} else if (idx <= lua_gettop(L) && !lua_isnil(L, idx)) {
|
||||||
|
throw exception(sstream() << "arg #" << idx << " must be a table");
|
||||||
|
} else {
|
||||||
|
return def_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
18
src/util/lua_named_param.h
Normal file
18
src/util/lua_named_param.h
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
||||||
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
|
||||||
|
Author: Leonardo de Moura
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include "util/lua.h"
|
||||||
|
#include "util/optional.h"
|
||||||
|
|
||||||
|
namespace lean {
|
||||||
|
// =======================================
|
||||||
|
// Utilities for simulating Python-like named parameters using Lua tables.
|
||||||
|
// In the following function \c idx is the position of the Lua table on the Lua stack.
|
||||||
|
bool get_bool_named_param(lua_State * L, int idx, char const * opt_name, bool def_value);
|
||||||
|
int get_int_named_param(lua_State * L, int idx, char const * opt_name, int def_value);
|
||||||
|
unsigned get_uint_named_param(lua_State * L, int idx, char const * opt_name, unsigned def_value);
|
||||||
|
}
|
Loading…
Reference in a new issue