Function _buildFunction( AST nodeFunc ) { CTE cte; AST child; Function function; _func = Function_New( AST_GetStringValue( nodeFunc ) ); child = AST_GetFirstChild( nodeFunc ) ; if ( AST_GetType( child ) == AST_PARAM_LIST ) { _addArgs( child ); child = AST_GetNextSibling( child ); } if ( AST_GetType( child ) != AST_BLOCK ) { child = AST_GetNextSibling( child ); // skip function's type } _addBlock( child ); cte = Function_GetLastCTE( _func ); if ( cte && cte->cmd != RET && cte->cmd != RET_VAL ) { cte = CTE_New( RET, args ); Function_AddCTE( _func, cte ); } return _func; }
void * MemPool::allocEntry() { m_nAllocEntries++; Block * pBlock = m_blocks.first(); if(pBlock == 0) pBlock = _addBlock(); if( pBlock->nAllocEntries == pBlock->maxEntries ) { m_blocks.pushBack(pBlock); // This block is full so we put it in the back. pBlock = m_blocks.first(); if( pBlock->nAllocEntries == pBlock->maxEntries ) { _addBlock(); // We don't have any free entries left in any block. // so we need to create a new one. pBlock = m_blocks.first(); } } return pBlock->allocEntry(); }
static void _addCommand ( AST cmd ) { AST expNode, blockNode; Endr labelBegin, labelEnd, labelElIf, labelNext; Endr valID, varID; Endr rendr, lendr; AST rval, lval; AST elIfNode; AST _if; switch ( AST_GetType( cmd ) ) { case AST_DECL_VAR: _addDeclVar( cmd ); break; case AST_WHILE: labelBegin = _newLabel( ); labelEnd = _newLabel( ); _addLabel( labelBegin ); valID = _addExpression( AST_GetFirstChild( cmd ) ); _addIfFalse( varID, labelEnd ); _addBlock( AST_GetLastChild( cmd ) ); _addGoto( labelBegin ); _addLabel( labelEnd ); break; case AST_IF: expNode = AST_GetFirstChild( cmd ); blockNode = AST_GetNextSibling( expNode ); elIfNode = blockNode; labelNext = labelEnd = _newLabel( ); _if = AST_GetNextSibling( blockNode ); // IF "NORMAL" varID = _addExpression( expNode ); if( _if ) { labelNext = _newLabel( ); _addIfFalse( varID, labelNext ); } else { _addIfFalse( varID, labelEnd ); } _addBlock( blockNode ); if( _if ) { _addGoto( labelEnd ); } //FOI for( _if ; _if && AST_GetType( _if ) == AST_ELSE_IF ; ) { expNode = AST_GetFirstChild( _if ); blockNode = AST_GetNextSibling( expNode ); _if = AST_GetNextSibling( _if ); _addLabel( labelNext ); varID = _addExpression( expNode ); if( _if ) { labelNext = _newLabel( ); _addIfFalse( varID, labelNext ); } else { _addIfFalse( varID, labelEnd ); } _addBlock( blockNode ); if( _if ) { _addGoto( labelEnd); } } if( _if ) { _addLabel( labelNext ); blockNode = AST_GetFirstChild( _if ); _addBlock( blockNode ); } _addLabel( labelEnd ); break; case AST_ATTR: lval = AST_GetFirstChild( cmd ); lendr = _addVar( lval ); rval = AST_GetLastChild( cmd ); rendr = _addExpressionToEndr( rval, lendr ); break; case AST_CALL: _addCall( cmd ); break; case AST_RETURN: _addReturn( cmd ); break; default: break; } }