void dDAGExpressionNodeVariable::CompileCIL(dCIL& cil)
{
	size_t pos =  m_name.find (D_SCOPE_PREFIX, 0, strlen (D_SCOPE_PREFIX));
	if (pos != 0) {
		bool state = RenameLocalVariable(m_name);
		if (!state) {
			DTRACE (("undefined local variable\n"));
			_ASSERTE (0);
		}
	}


	if (m_dimExpressions.GetCount()) {
		dDAGDimensionNode* const dim = m_dimExpressions.GetFirst()->GetInfo();
		dim->CompileCIL(cil);
		dCIL::dListNode* const dimInstruction = cil.NewStatement();
		dTreeAdressStmt& addressIndex = dimInstruction->GetInfo();
		addressIndex.m_instruction = dTreeAdressStmt::m_assigment;
		addressIndex.m_arg0.m_label = cil.NewTemp();
		addressIndex.m_arg1.m_label = dim->m_result; 

		string result = addressIndex.m_arg0.m_label;
		dTRACE_INTRUCTION (&addressIndex);

		for (dList<dDAGDimensionNode*>::dListNode* node = m_dimExpressions.GetFirst()->GetNext(); node; node = node->GetNext()) {
			dDAGDimensionNode* const dim = node->GetInfo();
			dim->CompileCIL(cil);
			
			dTreeAdressStmt& stmtMul = cil.NewStatement()->GetInfo();
			stmtMul.m_instruction = dTreeAdressStmt::m_assigment;
			stmtMul.m_operator = dTreeAdressStmt::m_mul;
			stmtMul.m_arg0.m_label = cil.NewTemp();
			stmtMul.m_arg1.m_label = result;
			stmtMul.m_arg2.m_label = dim->m_arraySize;

			dTRACE_INTRUCTION (&stmtMul);

			dTreeAdressStmt& stmtAdd = cil.NewStatement()->GetInfo();
			stmtAdd.m_instruction = dTreeAdressStmt::m_assigment;
			stmtAdd.m_operator = dTreeAdressStmt::m_add;
			stmtAdd.m_arg0.m_label = cil.NewTemp();
			stmtAdd.m_arg1.m_label = stmtMul.m_arg0.m_label;
			stmtAdd.m_arg2.m_label = dim->m_result;

			result = stmtAdd.m_arg0.m_label;

			dTRACE_INTRUCTION (&stmtAdd);
		}

		dTreeAdressStmt& dimSize = cil.NewStatement()->GetInfo();
		dimSize.m_instruction = dTreeAdressStmt::m_assigment;
		dimSize.m_operator = dTreeAdressStmt::m_mul;
		dimSize.m_arg0.m_label = cil.NewTemp();
		dimSize.m_arg1.m_label = result; 
		dimSize.m_arg2.m_label = "4"; 
		dTRACE_INTRUCTION (&dimSize);

		result = dimSize.m_arg0.m_label;

		_ASSERTE (m_parent);
		if (m_parent->GetTypeId() == dDAGFunctionStatementAssigment::GetRttiType()) {
			dDAGFunctionStatementAssigment* const asmt = (dDAGFunctionStatementAssigment*) m_parent;
			if (asmt->m_leftVariable == this) {
				//m_result = m_name + '[' + result + ']';
				m_result = result;
			} else {
				// emit an indirect addressing mode
				dTreeAdressStmt& tmp = cil.NewStatement()->GetInfo();
//				m_result = m_name + '[' + addressIndex.m_arg0.m_label + ']';
//				tmp.m_instruction = dTreeAdressStmt::m_assigment;
//				tmp.m_arg0.m_label = cil.NewTemp();
//				tmp.m_arg1.m_label = m_name + '[' + result + ']';
				tmp.m_instruction = dTreeAdressStmt::m_load;
				tmp.m_arg0.m_label = cil.NewTemp();
				tmp.m_arg1.m_label = m_name;
				tmp.m_arg2.m_label = result;
				dTRACE_INTRUCTION (&tmp);
				m_result = tmp.m_arg0.m_label; 
			}
			
		} else {
			// emit an indirect addressing mode
			dTreeAdressStmt& tmp = cil.NewStatement()->GetInfo();
//			m_result = m_name + '[' + addressIndex.m_arg0.m_label + ']';
//			tmp.m_instruction = dTreeAdressStmt::m_assigment;
//			tmp.m_arg0.m_label = cil.NewTemp();;
//			tmp.m_arg1.m_label = m_name + '[' + result + ']';
			tmp.m_instruction = dTreeAdressStmt::m_load;
			tmp.m_arg0.m_label = cil.NewTemp();
			tmp.m_arg1.m_label = m_name;
			tmp.m_arg2.m_label = result;
			dTRACE_INTRUCTION (&tmp);
			m_result = tmp.m_arg0.m_label; 
		}
	} else {
		m_result = m_name;
	}

}
void dDAGExpressionNodeAssigment::CompileCIL(dCIL& cil)  
{
	m_expression->CompileCIL(cil); 
	if (m_leftVariable->m_dimExpressions.GetCount()) {
		
		dDAGDimensionNode* const dim = m_leftVariable->m_dimExpressions.GetFirst()->GetInfo();
		dim->CompileCIL(cil);

		dString result = dim->m_result.m_label;
		for (dList<dDAGDimensionNode*>::dListNode* node = m_leftVariable->m_dimExpressions.GetFirst()->GetNext(); node; node = node->GetNext()) {
			dAssert (0);
			dDAGDimensionNode* const dim = node->GetInfo();
			dim->CompileCIL(cil);
#if 0			
			dCILInstr& stmtMul = cil.NewStatement()->GetInfo();
			stmtMul.m_instruction = dCILInstr::m_assigment;
			stmtMul.m_operator = dCILInstr::m_mul;
			stmtMul.m_arg0.m_label = cil.NewTemp();
			stmtMul.m_arg1.m_label = result;
			stmtMul.m_arg2.m_label = dim->m_arraySize;

			DTRACE_INTRUCTION (&stmtMul);

			dCILInstr& stmtAdd = cil.NewStatement()->GetInfo();
			stmtAdd.m_instruction = dCILInstr::m_assigment;
			stmtAdd.m_operator = dCILInstr::m_add;
			stmtAdd.m_arg0.m_label = cil.NewTemp();
			stmtAdd.m_arg1.m_label = stmtMul.m_arg0.m_label;
			stmtAdd.m_arg2 = dim->m_result;

			result = stmtAdd.m_arg0.m_label;

			DTRACE_INTRUCTION (&stmtAdd);
#endif
		}

		dAssert (m_leftVariable->m_parent);
		dTree<dCILInstr::dArg, dString>::dTreeNode* const variable = dDAG::FindLocalVariable(m_leftVariable->m_name);
		dAssert (variable);

		dCILInstr::dArg arg0 (LoadLocalVariable(cil, m_expression->m_result));
		dCILInstr::dArg arg1 (LoadLocalVariable(cil, variable->GetInfo()));

		int size = arg0.GetSizeInByte();
		dCILInstrIntergerLogical* const mulOffset = new dCILInstrIntergerLogical(cil, dCILThreeArgInstr::m_mul,cil.NewTemp(), dCILInstr::dArgType(dCILInstr::m_int), result, dCILInstr::dArgType(dCILInstr::m_int), dString(size), dCILInstr::m_constInt);
		mulOffset->Trace();

		dCILInstrIntergerLogical* const address = new dCILInstrIntergerLogical(cil, dCILThreeArgInstr::m_add, cil.NewTemp(), arg1.GetType(), arg1.m_label, arg1.GetType(), mulOffset->GetArg0().m_label, mulOffset->GetArg0().GetType());
		address->Trace();

		dCILInstrStore* const store = new dCILInstrStore(cil, address->GetArg0().m_label, address->GetArg0().GetType(), arg0.m_label, arg0.GetType());
		store->Trace();
		m_result = arg0;
		
	} else {
		m_leftVariable->CompileCIL(cil); 
		dCILInstr::dArg arg1 (LoadLocalVariable(cil, m_expression->m_result));
		dCILInstrMove* const move = new dCILInstrMove (cil, m_leftVariable->m_result.m_label, m_leftVariable->m_result.GetType(), arg1.m_label, arg1.GetType());
		move->Trace();
	}
}