dScriptCompiler::dUserVariable dScriptCompiler::EndScopeBlock ()
{
	dUserVariable returnNode;
	returnNode.m_node = GetCurrentScope();
	m_scopeStack.Remove(m_scopeStack.GetLast());
	return returnNode;
}
dScriptCompiler::dUserVariable dScriptCompiler::NewExpressionNodeLogiOperator (const dUserVariable& expressionA, const dUserVariable& logicOperator, const dUserVariable& expressionB)
{
	dUserVariable returnNode;

	dAssert (expressionA.m_node && expressionA.m_node->IsType(dDAGExpressionNode::GetRttiType()));
	dAssert (expressionB.m_node && expressionB.m_node->IsType(dDAGExpressionNode::GetRttiType()));

	dDAGExpressionNodeLogicOperator::dLogicOperator logOperator = dDAGExpressionNodeLogicOperator::m_and;
	switch (int (logicOperator.m_token))
	{
		case _LOGIC_OR:
			logOperator = dDAGExpressionNodeLogicOperator::m_or;
			break;

		case _LOGIC_AND:
			logOperator = dDAGExpressionNodeLogicOperator::m_and;
			break;

		default:
			dAssert (0);
	}

	dAssert (GetCurrentScope());
	dDAGExpressionNodeLogicOperator* const node = new dDAGExpressionNodeLogicOperator (m_allNodes, logOperator, (dDAGExpressionNode*)expressionA.m_node, (dDAGExpressionNode*)expressionB.m_node);

//	expressionA.m_node->Release();
//	expressionB.m_node->Release();
	returnNode.m_node = node;
	return returnNode;
}
Exemple #3
0
 void DIGenerator::Visit(const Ides::Types::StructType* ty) {
     std::vector<llvm::Value*> membersDI;
     for (auto i = ty->GetMembers().begin(); i != ty->GetMembers().end(); ++i) {
         membersDI.push_back(GetType(i->second));
     }
     
     createStructType(llvm::DIDescriptor(GetCurrentScope()),
                      ty->GetName(),
                      llvm::DIFile(),
                      0,
                      ty->GetSize(),
                      ty->GetAlignment(),
                      0,
                      llvm::DIType(),
                      getOrCreateArray(membersDI));
 }
dScriptCompiler::dUserVariable dScriptCompiler::AddStatementToCurrentBlock(const dUserVariable& statement)
{
	dUserVariable returnNode;

	dDAGScopeBlockNode* const block = GetCurrentScope();

	dDAGFunctionStatement* const statementNode = (dDAGFunctionStatement*)statement.m_node;
	if (statementNode) {
		if (statementNode->IsType(dDAGExpressionNode::GetRttiType())) {
			for (dDAGParameterNode* node = (dDAGParameterNode*) statementNode; node; node = (dDAGParameterNode*) node->m_next) {
				block->AddStatement(node);
			}
		} else {
			dAssert (statementNode->IsType(dDAGFunctionStatement::GetRttiType()));
			block->AddStatement(statementNode);
		}
	}

	returnNode.m_node = block;
	return returnNode;
}
dScriptCompiler::dUserVariable dScriptCompiler::NewVariableToCurrentBlock (const dString& modifiers, const dUserVariable& type, const dString& name)
{
	dUserVariable variableName(NewVariableStatement (name, modifiers));

	dDAGParameterNode* const variableNameNode = (dDAGParameterNode*)variableName.m_node;
	dAssert (variableNameNode->IsType(dDAGParameterNode::GetRttiType()));

	dDAGTypeNode* const typeNode = (dDAGTypeNode*)type.m_node;
	dAssert (typeNode->GetTypeId() == dDAGTypeNode::GetRttiType());
	variableNameNode->SetType(typeNode);

	dAssert (m_scopeStack.GetCount());
	dDAGScopeBlockNode* const block = GetCurrentScope();
	block->AddStatement(variableNameNode);

	dUserVariable returnNode (NewExpressionNodeVariable (name, modifiers));
	dAssert (returnNode.m_node->GetTypeId() == dDAGExpressionNodeVariable::GetRttiType());
	dDAGExpressionNodeVariable* const node = (dDAGExpressionNodeVariable*) returnNode.m_node;
	node->SetType((dDAGTypeNode*) typeNode->Clone (m_allNodes));
	return returnNode;
}
dScriptCompiler::dUserVariable dScriptCompiler::ConcatenateExpressions(const dUserVariable& expressionA, const dUserVariable& expressionB)
{
	dUserVariable returnNode;
	dDAGExpressionNode* const nodeA = (dDAGExpressionNode*)expressionA.m_node;
	dDAGExpressionNode* const nodeB = (dDAGExpressionNode*)expressionB.m_node;
	dAssert (nodeA->IsType(dDAGExpressionNode::GetRttiType()));
	dAssert (nodeB->IsType(dDAGExpressionNode::GetRttiType()));

	dDAGExpressionNode* nextNode = nodeA;
	for (; nextNode->m_next; nextNode = (dDAGExpressionNode*) nextNode->m_next);
	nextNode->m_next = nodeB;

	dDAGExpressionNodeVariable* const leftVarListA = nodeA->FindLeftVariable();
	if (leftVarListA && leftVarListA->m_type) {
		dDAGExpressionNodeVariable* const leftVarListB = nodeB->FindLeftVariable();
		if (leftVarListB && !leftVarListB->m_type) {

			dUserVariable localVariable(NewVariableStatement (leftVarListB->m_name, ""));

			dDAGParameterNode* const variableNode = (dDAGParameterNode*)localVariable.m_node;
			dAssert (variableNode->IsType(dDAGParameterNode::GetRttiType()));
			variableNode->SetType((dDAGTypeNode*) leftVarListA->m_type->Clone(m_allNodes));
			leftVarListB->SetType((dDAGTypeNode*) leftVarListA->m_type->Clone(m_allNodes));

			if (m_scopeStack.GetCount()) {
				dDAGScopeBlockNode* const block = GetCurrentScope();
				block->AddStatement(variableNode);
			} else {
				dAssert (0);
				//dDAGClassNode* const curClass = GetCurrentClass();
				//curClass->AddVariable(variableNode);
			}
		}
	}
	returnNode.m_node = nodeA;

	return returnNode;
}
void TypeSpecifierResolutionPass::Visit(ForStatement *forStatement)
{
	Symbol *parent = GetCurrentScope();
	forStatement->SetParentSymbol(parent);
	SemanticAnalysisPass::Visit(forStatement);
}
void TypeSpecifierResolutionPass::Visit(SwitchSection *switchSection)
{
	Symbol *parent = GetCurrentScope();
	switchSection->SetParentSymbol(parent);
	SemanticAnalysisPass::Visit(switchSection);
}
void TypeSpecifierResolutionPass::Visit(CompoundStatement *compoundStatement)
{
	Symbol *parent = GetCurrentScope();
	compoundStatement->SetParentSymbol(parent);
	SemanticAnalysisPass::Visit(compoundStatement);
}