Added __shallow_literal and __shallow_parsed...

...partial converters for optimizing code.  Added corresponding
helpers.
This commit is contained in:
Guillaume Melquiond 2010-07-19 06:59:46 +00:00
parent 6b0034a742
commit b0d9e98fa4
2 changed files with 53 additions and 1 deletions

View file

@ -293,4 +293,26 @@ function helper.parsed(cfg)
end end
end end
function helper.shallow_literal(cfg)
local t = type(cfg)
if t == "table" then
return cfg
elseif t == "userdata" then
return cfg.__shallow_literal
else
return cfg or {}
end
end
function helper.shallow_parsed(cfg)
local t = type(cfg)
if t == "table" then
return tovconfig(cfg).__shallow_parsed
elseif t == "userdata" then
return cfg.__shallow_parsed
else
return cfg or {}
end
end
return helper return helper

View file

@ -544,7 +544,8 @@ static int impl_tstring_tostring(lua_State *L)
/** /**
* Gets the parsed field of a vconfig object (_index metamethod). * Gets the parsed field of a vconfig object (_index metamethod).
* Special fields __literal and __parsed return Lua tables. * Special fields __literal, __shallow_literal, __parsed, and
* __shallow_parsed, return Lua tables.
*/ */
static int impl_vconfig_get(lua_State *L) static int impl_vconfig_get(lua_State *L)
{ {
@ -579,6 +580,35 @@ static int impl_vconfig_get(lua_State *L)
table_of_wml_config(L, v->get_parsed_config()); table_of_wml_config(L, v->get_parsed_config());
return 1; return 1;
} }
if (strcmp(m, "__shallow_literal") == 0) {
lua_newtable(L);
foreach (const config::attribute &a, v->get_config().attribute_range()) {
luaW_pushscalar(L, a.second);
lua_setfield(L, -2, a.first.c_str());
}
copy_children:
int j = 1;
for (vconfig::all_children_iterator i = v->ordered_begin(),
i_end = v->ordered_end(); i != i_end; ++i)
{
lua_createtable(L, 2, 0);
lua_pushstring(L, i.get_key().c_str());
lua_rawseti(L, -2, 1);
luaW_pushvconfig(L, i.get_child());
lua_rawseti(L, -2, 2);
lua_rawseti(L, -2, j);
++j;
}
return 1;
}
if (strcmp(m, "__shallow_parsed") == 0) {
lua_newtable(L);
foreach (const config::attribute &a, v->get_config().attribute_range()) {
luaW_pushscalar(L, v->expand(a.first));
lua_setfield(L, -2, a.first.c_str());
}
goto copy_children;
}
if (v->null() || !v->has_attribute(m)) return 0; if (v->null() || !v->has_attribute(m)) return 0;
luaW_pushscalar(L, (*v)[m]); luaW_pushscalar(L, (*v)[m]);