Esempio n. 1
0
void TActualParamWithConversion::BuildConvert(TExpressionResult from_result, TFormalParameter to_formal_param)
{
	result = from_result;

	//если необходимо преобразование типа формального параметра то добавляем его
	if (result.GetClass() != to_formal_param.GetClass())
	{
		conversion = result.GetClass()->GetConversion(result.IsRef(), to_formal_param.GetClass());
		if (result.IsRef() && !to_formal_param.IsRef())
		{
			if (conversion == NULL)
			{
				//если отсутствует преобразование, но имеется конструктор копии
				copy_constr = result.GetClass()->GetCopyConstr();
				conversion = result.GetClass()->GetConversion(false, to_formal_param.GetClass());
			}
		}
		if(conversion == NULL)
			throw std::logic_error("Невозможно преобразовать тип!");
	}
	//если в стеке находится ссылка, а в качестве параметра требуется значение, то добавляем преобразование
	else if (result.IsRef() && !to_formal_param.IsRef())
	{
		copy_constr = result.GetClass()->GetCopyConstr();
		ref_to_rvalue = true;
	}
}
Esempio n. 2
0
//actual_parameter - параметр который был передан методу
//formal_parameter - параметр указаный в сигнатуре метода
bool IsEqualClasses(TExpressionResult actual_parameter, TFormalParameter formal_parameter, int& need_conv)
//============== На выходе =========================================
//результат - равенство классов или возможность преобразования (conversion) класса
{
	need_conv=0;
	if (actual_parameter.IsMethods() || actual_parameter.IsType())return false;
	if (formal_parameter.GetClass() != actual_parameter.GetClass())
	{
		if (!actual_parameter.GetClass()->HasConversion(formal_parameter.GetClass()))return false;
		//TODO
		//if (formal_parameter.IsRef() && !actual_parameter.GetClass()->IsNestedIn(formal_parameter.GetClass()))return false;
		need_conv+=1;	
	}
	if (actual_parameter.IsRef() && !formal_parameter.IsRef())need_conv += 1;
	return true;
}