fixed: function and blocks were incorrectly cached

(now we have a tree in Item::Function.parameters too
        and we should go through that tree as well)
fixed: in Generator: Item::Function.par should be cleared
       only if Item::Function.name is not empty
changed: in Generator: use method 'write' of an output stream
       instead of operator<<
added: Clear() method to Blocks class
changed: in Generator
       Generator has its own Vars class now
       we don't need SetVars() method
added: to Generator:
       void CanUseCache(bool can_use_cache);
       // set whether or not we can use cache for functions or blocks
       // true by default

       void CanUseVars(bool can_use_variables);
       // set whether or not we can use variables: [def ...] statement
       // true by default





git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@977 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2014-10-19 21:09:34 +00:00
parent 6f9f274e08
commit 03fe124ad9
6 changed files with 121 additions and 69 deletions

View File

@@ -48,6 +48,23 @@ namespace Ezc
{
void Cache(Blocks & blocks, Item::Function & function)
{
function.item_block = 0;
if( !function.name.empty() && function.arg < 0 )
{
Blocks::Iterator i = blocks.Find(function.name);
if( i != blocks.End() )
function.item_block = &i->second;
}
for(size_t i=0 ; i < function.parameters.size() ; ++i)
Cache(blocks, *function.parameters[i]);
}
void Cache(Blocks & blocks, Item & item)
{
// one exception (if_index is putting its argument on the functions stack)
@@ -57,18 +74,7 @@ void Cache(Blocks & blocks, Item & item)
if( item.type != Item::item_ifindex )
{
for(size_t f=0; f < item.functions.size() ; ++f)
{
Item::Function & function = item.functions[f];
function.item_block = 0;
if( function.arg < 0 )
{
Blocks::Iterator b = blocks.Find(function.name);
if( b != blocks.End() )
function.item_block = &b->second;
}
}
Cache(blocks, item.functions[f]);
}
for(size_t i=0; i < item.item_tab.size() ; ++i)