blob: 09f717ab10d853053153dad7580eeac1da8d85b8 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <precomp.h>
#include "pe_funct.hxx"
// NOT FULLY DEFINED SERVICES
#include <cosv/tpl/tpltools.hxx>
#include <ary/cpp/c_gate.hxx>
#include <ary/cpp/c_funct.hxx>
#include <ary/cpp/c_type.hxx>
#include <ary/cpp/cp_ce.hxx>
#include <ary/cpp/cp_type.hxx>
#include <ary/cpp/inpcontx.hxx>
#include "pe_type.hxx"
#include "pe_param.hxx"
namespace cpp
{
inline void
PE_Function::PerformFinishingPunctuation()
{
SetTokenResult(not_done,pop_success);
}
PE_Function::PE_Function( Cpp_PE * i_pParent )
: Cpp_PE(i_pParent),
pStati( new PeStatusArray<PE_Function> ),
// pSpParameter,
// pSpuParameter,
// pSpType,
// pSpuException,
// pSpuCastOperatorType,
nResult(0),
bResult_WithImplementation(false),
aName(60),
eVirtuality(ary::cpp::VIRTUAL_none),
eConVol(ary::cpp::CONVOL_none),
// aFlags,
nReturnType(0),
// aParameters
// aExceptions,
bThrow(false),
nBracketCounterInImplementation(0)
{
Setup_StatusFunctions();
pSpParameter = new SP_Parameter(*this);
pSpType = new SP_Type(*this);
pSpuParameter = new SPU_Parameter(*pSpParameter, 0, &PE_Function::SpReturn_Parameter);
pSpuException = new SPU_Type(*pSpType, 0, &PE_Function::SpReturn_Exception);
pSpuCastOperatorType = new SPU_Type(*pSpType, &PE_Function::SpInit_CastOperatorType, &PE_Function::SpReturn_CastOperatorType);
}
PE_Function::~PE_Function()
{
}
void
PE_Function::Init_Std( const String & i_sName,
ary::cpp::Type_id i_nReturnType,
bool i_bVirtual,
ary::cpp::FunctionFlags i_aFlags )
{
aName << i_sName;
eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
aFlags = i_aFlags;
nReturnType = i_nReturnType;
pStati->SetCur(afterName);
}
void
PE_Function::Init_Ctor( const String & i_sName,
ary::cpp::FunctionFlags i_aFlags )
{
aName << i_sName;
eVirtuality = ary::cpp::VIRTUAL_none;
aFlags = i_aFlags;
nReturnType = 0;
pStati->SetCur(afterName);
}
void
PE_Function::Init_Dtor( const String & i_sName,
bool i_bVirtual,
ary::cpp::FunctionFlags i_aFlags )
{
aName << "~" << i_sName;
eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
aFlags = i_aFlags;
nReturnType = 0;
pStati->SetCur(afterName);
}
void
PE_Function::Init_CastOperator( bool i_bVirtual,
ary::cpp::FunctionFlags i_aFlags )
{
aName << "operator ";
eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
aFlags = i_aFlags;
nReturnType = 0;
pStati->SetCur(afterCastOperator);
}
void
PE_Function::Init_NormalOperator( ary::cpp::Type_id i_nReturnType,
bool i_bVirtual,
ary::cpp::FunctionFlags i_aFlags )
{
aName << "operator";
eVirtuality = i_bVirtual ? ary::cpp::VIRTUAL_virtual : ary::cpp::VIRTUAL_none;
aFlags = i_aFlags;
nReturnType = i_nReturnType;
pStati->SetCur(afterStdOperator);
}
ary::cpp::Ce_id
PE_Function::Result_Id() const
{
return nResult;
}
void
PE_Function::Call_Handler( const cpp::Token & i_rTok )
{
pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text());
}
void
PE_Function::Setup_StatusFunctions()
{
typedef CallFunction<PE_Function>::F_Tok F_Tok;
static F_Tok stateF_afterStdOperator[] =
{ &PE_Function::On_afterOperator_Std_Operator,
&PE_Function::On_afterOperator_Std_LeftBracket,
&PE_Function::On_afterOperator_Std_LeftBracket,
&PE_Function::On_afterOperator_Std_Operator,
&PE_Function::On_afterOperator_Std_Operator,
&PE_Function::On_afterOperator_Std_Operator,
&PE_Function::On_afterOperator_Std_Operator,
&PE_Function::On_afterOperator_Std_Operator,
&PE_Function::On_afterOperator_Std_Operator };
static INT16 stateT_afterStdOperator[] =
{ Tid_Operator,
Tid_ArrayBracket_Left,
Tid_Bracket_Left,
Tid_Comma,
Tid_Assign,
Tid_Less,
Tid_Greater,
Tid_Asterix,
Tid_AmpersAnd };
static F_Tok stateF_afterStdOperatorLeftBracket[] =
{ &PE_Function::On_afterStdOperatorLeftBracket_RightBracket,
&PE_Function::On_afterStdOperatorLeftBracket_RightBracket };
static INT16 stateT_afterStdOperatorLeftBracket[] =
{ Tid_ArrayBracket_Right,
Tid_Bracket_Right };
static F_Tok stateF_afterCastOperator[] =
{ &PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type,
&PE_Function::On_afterOperator_Cast_Type };
static INT16 stateT_afterCastOperator[] =
{ Tid_Identifier,
Tid_class,
Tid_struct,
Tid_union,
Tid_enum,
Tid_const,
Tid_volatile,
Tid_DoubleColon,
Tid_typename,
Tid_BuiltInType,
Tid_TypeSpecializer };
static F_Tok stateF_afterName[] = { &PE_Function::On_afterName_Bracket_Left };
static INT16 stateT_afterName[] = { Tid_Bracket_Left };
static F_Tok stateF_expectParameterSeparator[] =
{ &PE_Function::On_expectParameterSeparator_BracketRight,
&PE_Function::On_expectParameterSeparator_Comma };
static INT16 stateT_expectParameterSeparator[] =
{ Tid_Bracket_Right,
Tid_Comma };
static F_Tok stateF_afterParameters[] = { &PE_Function::On_afterParameters_const,
&PE_Function::On_afterParameters_volatile,
&PE_Function::On_afterParameters_throw,
&PE_Function::On_afterParameters_SwBracket_Left,
&PE_Function::On_afterParameters_Semicolon,
&PE_Function::On_afterParameters_Comma,
&PE_Function::On_afterParameters_Colon,
&PE_Function::On_afterParameters_Assign };
static INT16 stateT_afterParameters[] = { Tid_const,
Tid_volatile,
Tid_throw,
Tid_SwBracket_Left,
Tid_Semicolon,
Tid_Comma,
Tid_Colon,
Tid_Assign };
static F_Tok stateF_afterThrow[] = { &PE_Function::On_afterThrow_Bracket_Left };
static INT16 stateT_afterThrow[] = { Tid_Bracket_Left };
static F_Tok stateF_expectExceptionSeparator[] =
{ &PE_Function::On_expectExceptionSeparator_BracketRight,
&PE_Function::On_expectExceptionSeparator_Comma };
static INT16 stateT_expectExceptionSeparator[] =
{ Tid_Bracket_Right,
Tid_Comma };
static F_Tok stateF_afterExceptions[] = { &PE_Function::On_afterExceptions_SwBracket_Left,
&PE_Function::On_afterExceptions_Semicolon,
&PE_Function::On_afterExceptions_Comma,
&PE_Function::On_afterExceptions_Colon,
&PE_Function::On_afterExceptions_Assign };
static INT16 stateT_afterExceptions[] = { Tid_SwBracket_Left,
Tid_Semicolon,
Tid_Comma,
Tid_Colon,
Tid_Assign };
static F_Tok stateF_expectZero[] = { &PE_Function::On_expectZero_Constant };
static INT16 stateT_expectZero[] = { Tid_Constant };
static F_Tok stateF_inImplementation[] =
{ &PE_Function::On_inImplementation_SwBracket_Left,
&PE_Function::On_inImplementation_SwBracket_Right };
static INT16 stateT_inImplementation[] =
{ Tid_SwBracket_Left,
Tid_SwBracket_Right };
SEMPARSE_CREATE_STATUS(PE_Function, afterStdOperator, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, afterStdOperatorLeftBracket, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, afterCastOperator, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, afterName, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, expectParameterSeparator, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, afterParameters, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, afterThrow, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, expectExceptionSeparator, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, afterExceptions, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, expectZero, Hdl_SyntaxError);
SEMPARSE_CREATE_STATUS(PE_Function, inImplementation, On_inImplementation_Default );
}
void
PE_Function::InitData()
{
pStati->SetCur( afterName ),
nResult = 0;
bResult_WithImplementation = false;
aName.seekp(0);
eVirtuality = ary::cpp::VIRTUAL_none;
eConVol = ary::cpp::CONVOL_none;
aFlags.Reset();
nReturnType = 0;
csv::erase_container(aParameters);
csv::erase_container(aExceptions);
bThrow = false;
}
void
PE_Function::TransferData()
{
String sName( aName.c_str() );
ary::cpp::Function *
pFunction = Env().AryGate().Ces().Store_Operation(
Env().Context(),
sName,
nReturnType,
aParameters,
eVirtuality,
eConVol,
aFlags,
bThrow,
aExceptions );
if (pFunction != 0)
{
// KORR_FUTURE: How to handle differing documentation?
Dyn< StringVector >
pTplParams ( Env().Get_CurTemplateParameters() );
if ( pTplParams )
{
for ( StringVector::const_iterator it = pTplParams->begin();
it != pTplParams->end();
++it )
{
pFunction->Add_TemplateParameterType( *it, ary::cpp::Type_id(0) );
} // end for
}
Env().Event_Store_Function(*pFunction);
}
pStati->SetCur(size_of_states);
}
void
PE_Function::Hdl_SyntaxError(const char * i_sText)
{
StdHandlingOfSyntaxError(i_sText);
}
void
PE_Function::SpInit_CastOperatorType()
{
pSpuCastOperatorType->Child().Init_AsCastOperatorType();
}
void
PE_Function::SpReturn_Parameter()
{
pStati->SetCur(expectParameterSeparator);
ary::cpp::Type_id nParamType = pSpuParameter->Child().Result_FrontType();
if ( nParamType.IsValid() ) // Check, if there was a parameter, or only the closing ')'.
{
aParameters.push_back( pSpuParameter->Child().Result_ParamInfo() );
}
}
void
PE_Function::SpReturn_Exception()
{
pStati->SetCur(expectExceptionSeparator);
ary::cpp::Type_id
nException = pSpuException->Child().Result_Type().TypeId();
if ( nException.IsValid() AND pSpuException->Child().Result_KindOf() == PE_Type::is_type )
{
aExceptions.push_back( nException );
}
}
void
PE_Function::SpReturn_CastOperatorType()
{
pStati->SetCur(afterName);
Env().AryGate().Types().Get_TypeText(
aName, pSpuCastOperatorType->Child().Result_Type().TypeId() );
}
void
PE_Function::On_afterOperator_Std_Operator(const char * i_sText)
{
SetTokenResult(done,stay);
pStati->SetCur(afterName);
if ( 'a' <= *i_sText AND *i_sText <= 'z' )
aName << ' ';
aName << i_sText;
}
void
PE_Function::On_afterOperator_Std_LeftBracket(const char * i_sText)
{
SetTokenResult(done,stay);
pStati->SetCur(afterStdOperatorLeftBracket);
aName << i_sText;
}
void
PE_Function::On_afterStdOperatorLeftBracket_RightBracket(const char * i_sText)
{
SetTokenResult(done,stay);
pStati->SetCur(afterName);
aName << i_sText;
}
void
PE_Function::On_afterOperator_Cast_Type(const char *)
{
pSpuCastOperatorType->Push(not_done);
}
void
PE_Function::On_afterName_Bracket_Left(const char *)
{
pSpuParameter->Push(done);
}
void
PE_Function::On_expectParameterSeparator_BracketRight(const char *)
{
SetTokenResult(done,stay);
pStati->SetCur(afterParameters);
}
void
PE_Function::On_expectParameterSeparator_Comma(const char *)
{
pSpuParameter->Push(done);
}
void
PE_Function::On_afterParameters_const(const char *)
{
SetTokenResult(done,stay);
eConVol = static_cast<E_ConVol>(
static_cast<int>(eConVol) | static_cast<int>(ary::cpp::CONVOL_const) );
}
void
PE_Function::On_afterParameters_volatile(const char *)
{
SetTokenResult(done,stay);
eConVol = static_cast<E_ConVol>(
static_cast<int>(eConVol) | static_cast<int>(ary::cpp::CONVOL_volatile) );
}
void
PE_Function::On_afterParameters_throw(const char *)
{
SetTokenResult(done,stay);
pStati->SetCur(afterThrow);
bThrow = true;
}
void
PE_Function::On_afterParameters_SwBracket_Left(const char *)
{
EnterImplementation(1);
}
void
PE_Function::On_afterParameters_Semicolon(const char *)
{
PerformFinishingPunctuation();
}
void
PE_Function::On_afterParameters_Comma(const char *)
{
PerformFinishingPunctuation();
}
void
PE_Function::On_afterParameters_Colon(const char *)
{
EnterImplementation(0);
}
void
PE_Function::On_afterParameters_Assign(const char *)
{
SetTokenResult(done,stay);
pStati->SetCur(expectZero);
}
void
PE_Function::On_afterThrow_Bracket_Left(const char *)
{
pSpuException->Push(done);
}
void
PE_Function::On_expectExceptionSeparator_BracketRight(const char *)
{
SetTokenResult(done,stay);
pStati->SetCur(afterExceptions);
}
void
PE_Function::On_expectExceptionSeparator_Comma(const char *)
{
pSpuException->Push(done);
}
void
PE_Function::On_afterExceptions_SwBracket_Left(const char *)
{
EnterImplementation(1);
}
void
PE_Function::On_afterExceptions_Semicolon(const char *)
{
PerformFinishingPunctuation();
}
void
PE_Function::On_afterExceptions_Comma(const char *)
{
PerformFinishingPunctuation();
}
void
PE_Function::On_afterExceptions_Colon(const char *)
{
EnterImplementation(0);
}
void
PE_Function::On_afterExceptions_Assign(const char *)
{
SetTokenResult(done,stay);
pStati->SetCur(expectZero);
}
void
PE_Function::On_expectZero_Constant(const char * i_sText)
{
if ( strcmp(i_sText,"0") != 0 )
Hdl_SyntaxError(i_sText);
SetTokenResult(done,stay);
pStati->SetCur(afterExceptions);
eVirtuality = ary::cpp::VIRTUAL_abstract;
}
void
PE_Function::On_inImplementation_SwBracket_Left(const char *)
{
SetTokenResult(done,stay);
nBracketCounterInImplementation++;
}
void
PE_Function::On_inImplementation_SwBracket_Right(const char *)
{
nBracketCounterInImplementation--;
if (nBracketCounterInImplementation == 0)
{
SetTokenResult(done,pop_success);
}
else
{
SetTokenResult(done,stay);
}
}
void
PE_Function::On_inImplementation_Default(const char *)
{
SetTokenResult(done,stay);
}
void
PE_Function::EnterImplementation( intt i_nBracketCountStart )
{
SetTokenResult(done,stay);
pStati->SetCur(inImplementation);
bResult_WithImplementation = true;
nBracketCounterInImplementation = i_nBracketCountStart;
if ( Env().Context().CurClass() != 0 )
{
aFlags.SetInline();
}
}
} // namespace cpp