/******************************************************************************* | |
* Copyright (c) 2016 CEA LIST. | |
* | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Created on: 14 févr. 2013 | |
* | |
* Contributors: | |
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr | |
* - Initial API and implementation | |
******************************************************************************/ | |
#ifndef COMPILATIONENVIRONMENT_H_ | |
#define COMPILATIONENVIRONMENT_H_ | |
#include <common/BF.h> | |
#include <fml/expression/AvmCode.h> | |
#include <fml/executable/AvmProgram.h> | |
#include <fml/executable/BaseAvmProgram.h> | |
#include <fml/executable/ExecutableForm.h> | |
#include <fml/type/BaseTypeSpecifier.h> | |
#include <fml/type/TypeManager.h> | |
#include <fml/infrastructure/Machine.h> | |
#include <collection/List.h> | |
#define COMPILE_CONTEXT_INITIAL_COUNT 16 | |
namespace sep | |
{ | |
class BaseAvmProgram; | |
class ExecutableForm; | |
class InstanceOfData; | |
class COMPILE_CONTEXT; | |
class CompilationEnvironment | |
{ | |
public: | |
/** | |
* CONSTRUCTOR | |
* Default | |
*/ | |
CompilationEnvironment(COMPILE_CONTEXT * aCTX, | |
BaseAvmProgram * aCompileCtx, ExecutableForm * aRuntimeCtx) | |
: mCTX( newCTX(aCTX, aCompileCtx, aRuntimeCtx) ) | |
{ | |
//!! NOTHING | |
} | |
// CompilationEnvironment(COMPILE_CONTEXT * aCTX, BaseAvmProgram * aCompileCtx) | |
// : mCTX( newCTX(aCTX, aCompileCtx, aCompileCtx->getExecutable()) ) | |
// { | |
// //!! NOTHING | |
// } | |
CompilationEnvironment(COMPILE_CONTEXT * aCTX, ExecutableForm * aCompileCtx) | |
: mCTX( newCTX(aCTX, aCompileCtx, aCompileCtx) ) | |
{ | |
//!! NOTHING | |
} | |
CompilationEnvironment(AvmProgram * aCompileCtx, | |
InstanceOfData * aVariableCtx = NULL) | |
: mCTX( newCTX(NULL, aCompileCtx, | |
aCompileCtx->getExecutable(), aVariableCtx) ) | |
{ | |
//!! NOTHING | |
} | |
CompilationEnvironment(ExecutableForm * aCompileCtx) | |
: mCTX( newCTX(NULL, aCompileCtx, aCompileCtx) ) | |
{ | |
//!! NOTHING | |
} | |
/** | |
* DESTRUCTOR | |
*/ | |
virtual ~CompilationEnvironment() | |
{ | |
freeCTX( mCTX ); | |
} | |
public: | |
/*ATTRIBUTES*/ | |
COMPILE_CONTEXT * mCTX; | |
/////////////////////////////////////////////////////////////////////////// | |
// CACHE MANAGER | |
/////////////////////////////////////////////////////////////////////////// | |
static List< COMPILE_CONTEXT * > COMPILE_CONTEXT_CACHE; | |
static void initCache(); | |
static void finalizeCache(); | |
static COMPILE_CONTEXT * newCTX(COMPILE_CONTEXT * PREV, | |
BaseAvmProgram * aCompileCtx, ExecutableForm * aRuntimeCtx, | |
InstanceOfData * aVariableCtx = NULL, | |
BaseTypeSpecifier * aType = TypeManager::UNIVERSAL, | |
bool needTypeChecking = true, | |
const Modifier & aModifier = Modifier::PROPERTY_UNDEFINED_MODIFIER); | |
static void freeCTX(COMPILE_CONTEXT * & CTX); | |
}; | |
struct COMPILE_CONTEXT : public ModifierImpl | |
{ | |
public: | |
/** | |
* STATIC | |
* ATTRIBUTES | |
*/ | |
static bool DEFAUL_TYPE_CHECKING_MASK; | |
static bool INLINE_DISABLE_MASK; | |
static bool INLINE_ENABLE_MASK; | |
static bool INLINE_PROCEDURE_MASK; | |
/** | |
* ATTRIBUTES | |
*/ | |
COMPILE_CONTEXT * PREV; | |
COMPILE_CONTEXT * NEXT; | |
BaseAvmProgram * mCompileCtx; | |
ExecutableForm * mRuntimeCtx; | |
InstanceOfData * mVariableCtx; | |
BaseTypeSpecifier * mType; | |
bool mNeedTypeChecking; | |
public: | |
/** | |
* CONSTRUCTOR | |
* Default | |
*/ | |
COMPILE_CONTEXT(COMPILE_CONTEXT * aCTX, BaseAvmProgram * aCompileCtx, | |
ExecutableForm * aRuntimeCtx, InstanceOfData * aVariableCtx, | |
BaseTypeSpecifier * aType = TypeManager::UNIVERSAL, | |
const Modifier & aModifier = Modifier::PROPERTY_UNDEFINED_MODIFIER) | |
: ModifierImpl( aModifier ), | |
PREV( aCTX ), NEXT( NULL ), | |
mCompileCtx ( aCompileCtx ), | |
mRuntimeCtx ( aRuntimeCtx ), | |
mVariableCtx( aVariableCtx ), | |
mType( aType ), | |
mNeedTypeChecking( true ) | |
{ | |
//!! NOTHING | |
} | |
/** | |
* DESTRUCTOR | |
*/ | |
virtual ~COMPILE_CONTEXT() | |
{ | |
//!! NOTHING | |
} | |
COMPILE_CONTEXT * newCTX(BaseAvmProgram * aCompileCtx, | |
ExecutableForm * aRuntimeCtx, InstanceOfData * aVariableCtx = NULL) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
aCompileCtx, aRuntimeCtx, aVariableCtx, | |
mType, mNeedTypeChecking, getModifier()) ); | |
} | |
COMPILE_CONTEXT * newCTX(BaseAvmProgram * aCompileCtx) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
aCompileCtx, aCompileCtx->getExecutable(), mVariableCtx, | |
mType, mNeedTypeChecking, getModifier()) ); | |
} | |
COMPILE_CONTEXT * newCompileCTX(BaseAvmProgram * aCompileCtx) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
aCompileCtx, mRuntimeCtx, mVariableCtx, | |
mType, mNeedTypeChecking, getModifier()) ); | |
} | |
COMPILE_CONTEXT * newCTX(ExecutableForm * aRuntimeCtx) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
mCompileCtx, aRuntimeCtx, mVariableCtx, | |
mType, mNeedTypeChecking, getModifier()) ); | |
} | |
COMPILE_CONTEXT * newCTX(ExecutableForm * aRuntimeCtx, | |
const Modifier & aModifier) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
mCompileCtx, aRuntimeCtx, mVariableCtx, | |
mType, mNeedTypeChecking, aModifier) ); | |
} | |
COMPILE_CONTEXT * newCTX(const Modifier & aModifier) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
mCompileCtx, mRuntimeCtx, mVariableCtx, | |
mType, mNeedTypeChecking, aModifier) ); | |
} | |
COMPILE_CONTEXT * clone() | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
mCompileCtx, mRuntimeCtx, mVariableCtx, | |
mType, mNeedTypeChecking, getModifier()) ); | |
} | |
COMPILE_CONTEXT * clone(const TypeSpecifier & aType) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
mCompileCtx, mRuntimeCtx, mVariableCtx, | |
aType.rawType(), mNeedTypeChecking, getModifier()) ); | |
} | |
COMPILE_CONTEXT * clone(BaseTypeSpecifier * aType) | |
{ | |
return( CompilationEnvironment::newCTX(this, | |
mCompileCtx, mRuntimeCtx, mVariableCtx, | |
aType, mNeedTypeChecking, getModifier()) ); | |
} | |
/** | |
* mType | |
*/ | |
inline bool hasType() const | |
{ | |
return( (mType != NULL) && (mType != TypeManager::UNIVERSAL) ); | |
} | |
inline avm_type_specifier_kind_t getTypeFamily() const | |
{ | |
return( ( mType != NULL ) ? | |
mType->getTypeSpecifierKind() : TYPE_UNDEFINED_SPECIFIER ); | |
} | |
inline bool typeMustBeMachineFamily() const | |
{ | |
return( (mType == NULL) | |
|| mType->hasTypeSpecifierKind(TYPE_MACHINE_SPECIFIER, | |
TYPE_UNIVERSAL_SPECIFIER, TYPE_UNDEFINED_SPECIFIER) ); | |
} | |
inline bool typeMustBePortFamily() const | |
{ | |
return( (mType == NULL) | |
|| mType->hasTypeSpecifierKind(TYPE_PORT_SPECIFIER, | |
TYPE_SIGNAL_SPECIFIER,TYPE_MESSAGE_SPECIFIER) | |
|| mType->hasTypeSpecifierKind(TYPE_UNIVERSAL_SPECIFIER, | |
TYPE_UNDEFINED_SPECIFIER) ); | |
} | |
inline bool typeMustBeChannelFamily() const | |
{ | |
return( (mType == NULL) | |
|| mType->hasTypeSpecifierKind(TYPE_CHANNEL_SPECIFIER, | |
TYPE_UNIVERSAL_SPECIFIER, TYPE_UNDEFINED_SPECIFIER) ); | |
} | |
inline bool typeMustBeBufferFamily() const | |
{ | |
return( (mType == NULL) | |
|| mType->hasTypeSpecifierKind(TYPE_BUFFER_SPECIFIER, | |
TYPE_UNIVERSAL_SPECIFIER, TYPE_UNDEFINED_SPECIFIER) ); | |
} | |
inline bool typeMustBeConnectorFamily() const | |
{ | |
return( (mType == NULL) | |
|| mType->hasTypeSpecifierKind(TYPE_CONNECTOR_SPECIFIER, | |
TYPE_UNIVERSAL_SPECIFIER, TYPE_UNDEFINED_SPECIFIER) ); | |
} | |
inline bool typeCouldBeOherFamily() const | |
{ | |
if( mType != NULL ) | |
{ | |
switch( mType->getTypeSpecifierKind() ) | |
{ | |
case TYPE_MACHINE_SPECIFIER: | |
case TYPE_PORT_SPECIFIER: | |
case TYPE_SIGNAL_SPECIFIER: | |
case TYPE_MESSAGE_SPECIFIER: | |
case TYPE_CHANNEL_SPECIFIER: | |
case TYPE_BUFFER_SPECIFIER: | |
case TYPE_CONNECTOR_SPECIFIER: | |
return( false ); | |
default: | |
return( true ); | |
} | |
} | |
return( true ); | |
} | |
inline bool typeCouldBeTypeSpecifierFamily() const | |
{ | |
return( typeCouldBeOherFamily() ); | |
} | |
inline bool typeCouldBeTransitionFamily() const | |
{ | |
return( typeCouldBeOherFamily() ); | |
} | |
inline bool typeCouldBeGenericProgramFamily() const | |
{ | |
return( typeCouldBeOherFamily() ); | |
} | |
/** | |
* mNeedTypeChecking | |
*/ | |
inline bool isStrongNeedTypeChecking(bool localTypeCheckingMask = true ) const | |
{ | |
return( localTypeCheckingMask | |
&& DEFAUL_TYPE_CHECKING_MASK | |
&& mNeedTypeChecking ); | |
} | |
inline bool isWeakNeedTypeChecking(bool localTypeCheckingMask = true ) const | |
{ | |
return( DEFAUL_TYPE_CHECKING_MASK | |
&& (localTypeCheckingMask | |
|| mNeedTypeChecking) ); | |
} | |
inline bool isNeedTypeChecking(bool localTypeCheckingMask = true ) const | |
{ | |
return( isStrongNeedTypeChecking(localTypeCheckingMask) ); | |
} | |
/** | |
* mCompileCtx | |
*/ | |
bool isCompileTransitionCtx() | |
{ | |
return( mCompileCtx->is< AvmTransition >() ); | |
} | |
bool isInlineEnable(ExecutableForm * anExecutable) | |
{ | |
return( INLINE_ENABLE_MASK | |
&& isCompileTransitionCtx() | |
&& anExecutable->isInlinableEnable() ); | |
} | |
bool isInlineProcedure(ExecutableForm * anExecutable) | |
{ | |
return( INLINE_PROCEDURE_MASK | |
&& isCompileTransitionCtx() | |
&& anExecutable->isInlinableProcedure() ); | |
} | |
/** | |
* mCompileCtx | |
*/ | |
bool isSpecificRuntimeCtx() | |
{ | |
return( (mRuntimeCtx != mCompileCtx) | |
&& (mRuntimeCtx != mCompileCtx->getContainer()) ); | |
} | |
/** | |
* report debug Context | |
*/ | |
OutStream & debugContext(OutStream & os); | |
/** | |
* report error Context & Location | |
*/ | |
OutStream & errorContext(OutStream & os); | |
PairOutStream & errorContext(PairOutStream & os); | |
TripleOutStream & errorContext(TripleOutStream & os); | |
OutStream & warningContext(OutStream & os); | |
PairOutStream & warningContext(PairOutStream & os); | |
TripleOutStream & warningContext(TripleOutStream & os); | |
/** | |
* Serialization | |
*/ | |
virtual void strHeader(OutStream & os) const; | |
virtual void toStream(OutStream & os) const; | |
}; | |
} /* namespace sep */ | |
#endif /* COMPILATIONENVIRONMENT_H_ */ |