Beispiel #1
0
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;
}
Beispiel #2
0
	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();
	}
Beispiel #3
0
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;
	}
}