fix(util/sexpr): nested Lua objects

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2014-07-09 11:13:17 -07:00
parent 2ef7b9be2f
commit d31cde473e
4 changed files with 26 additions and 2 deletions

View file

@ -310,6 +310,7 @@ pretty_fn::pretty_fn(environment const & env, options const & o):
} }
format pretty_fn::operator()(expr const & e) { format pretty_fn::operator()(expr const & e) {
m_depth = 0; m_num_steps = 0;
return pp_child(purify(e), 0).first; return pp_child(purify(e), 0).first;
} }

View file

@ -81,6 +81,29 @@ int equal(lua_State * L, int idx1, int idx2) {
#endif #endif
} }
char const * tostring(lua_State * L, int idx) {
if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */
switch (lua_type(L, idx)) {
case LUA_TNUMBER:
case LUA_TSTRING:
lua_pushvalue(L, idx);
break;
case LUA_TBOOLEAN:
lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false"));
break;
case LUA_TNIL:
lua_pushliteral(L, "nil");
break;
default: {
std::ostringstream strm;
strm << lua_typename(L, idx) << ": " << lua_topointer(L, idx);
lua_pushstring(L, strm.str().c_str());
break;
}}
}
return lua_tostring(L, -1);
}
int get_nonnil_top(lua_State * L) { int get_nonnil_top(lua_State * L) {
int top = lua_gettop(L); int top = lua_gettop(L);
while (top > 0 && lua_isnil(L, top)) while (top > 0 && lua_isnil(L, top))
@ -181,4 +204,3 @@ void check_atleast_num_args(lua_State * L, int low) {
if (lua_gettop(L) < low) throw exception("too few arguments to function"); if (lua_gettop(L) < low) throw exception("too few arguments to function");
} }
} }

View file

@ -20,6 +20,7 @@ size_t objlen(lua_State * L, int idx);
void dofile(lua_State * L, char const * fname); void dofile(lua_State * L, char const * fname);
void dostring(lua_State * L, char const * str); void dostring(lua_State * L, char const * str);
void pcall(lua_State * L, int nargs, int nresults, int errorfun); void pcall(lua_State * L, int nargs, int nresults, int errorfun);
char const * tostring (lua_State * L, int idx);
/** /**
\brief Return true iff coroutine is done, false if it has yielded, \brief Return true iff coroutine is done, false if it has yielded,
and throws an exception if error. and throws an exception if error.

View file

@ -441,7 +441,7 @@ public:
virtual void display(std::ostream & out) const { virtual void display(std::ostream & out) const {
lua_State * L = m_ref.get_state(); lua_State * L = m_ref.get_state();
m_ref.push(); m_ref.push();
out << lua_tostring(L, -1); out << tostring(L, -1);
lua_pop(L, 1); lua_pop(L, 1);
} }
}; };