|
|
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
#ifndef SIMC_VALUE_REFERENCE
#define SIMC_VALUE_REFERENCE
/*
* This file contains classes that model symbols that result from * a value assignement. * Refer to the "Compiler Design Spec" for more detailed definitions * of a "defined value reference" and a "built-in value reference" * A defined value reference is caused by a value assignment statement * in which the RHS is just another symbol. A built-in value reference is * caused by a value assignment statement in which the RHS is a literal * value */
/* This is the base class for a defined or a built-in value reference
* All value references are symbols. Hence this class is derived from * SIMCSymbol. It stores a pointer to a symbol that represents the * type of the value */ class SIMCValueReference: public SIMCSymbol { SIMCSymbol **_type; long _typeLine, _typeColumn;
protected: SIMCValueReference (SIMCSymbol **type, long typeLine, long typeColumn, const char * const symbolName, SymbolType symbolType = LOCAL, SIMCModule *module = NULL, long _lineNumber = 0, long _columnNumber = 0, long _referenceCount = 0) : _type(type), _typeLine(typeLine), _typeColumn(typeColumn), SIMCSymbol( symbolName, symbolType, module, _lineNumber, _columnNumber, _referenceCount) { if(_type) (*_type)->IncrementReferenceCount(); }
virtual ~SIMCValueReference () { if(UseReferenceCount() && _type) (*_type)->DecrementReferenceCount(); }
public: SIMCSymbol ** GetTypeReference() const { return _type; } const char *GetTypeName() const { return (*_type)->GetSymbolName(); } long GetTypeLine() const { return _typeLine; }
void SetTypeLine( long x) { _typeLine = x; }
long GetTypeColumn() const { return _typeColumn; }
void SetTypeColumn( long x) { _typeColumn = x; } virtual void WriteSymbol( ostream& outStream ) const { outStream << "VALUE REFERENCE "; SIMCSymbol::WriteSymbol(outStream); outStream << endl; outStream << "\t TYPE DETAILS "; (*_type)->WriteBrief(outStream); outStream << endl; } };
/* This class models a built-in value reference. So, it has a pointer
* to the SIMCValue object that resulted in this value reference */
class SIMCBuiltInValueReference : public SIMCValueReference { SIMCValue *_value; BOOL _isSharedValue; // Set on the basis of the constructor used
public: SIMCBuiltInValueReference (SIMCSymbol **type, long typeLine, long typeColumn, SIMCValue *value, const char * const symbolName, SymbolType symbolType = LOCAL, SIMCModule *module = NULL, long lineNumber = 0, long columnNumber = 0, long referenceCount = 0) : _value(value), _isSharedValue(FALSE), SIMCValueReference( type, typeLine, typeColumn, symbolName, symbolType, module, lineNumber, columnNumber, referenceCount) {}
SIMCBuiltInValueReference(SIMCValueReference *symbol, SIMCBuiltInValueReference *bvRef) : _value(bvRef->GetValue()), _isSharedValue(TRUE), SIMCValueReference(symbol->GetTypeReference(), symbol->GetTypeLine(), symbol->GetTypeColumn(), symbol->GetSymbolName(), symbol->GetSymbolType(), symbol->GetModule(), symbol->GetLineNumber(), symbol->GetColumnNumber(), symbol->GetReferenceCount()) {}
virtual ~SIMCBuiltInValueReference() { if(!_isSharedValue) delete _value; }
SIMCValue * GetValue() const { return _value; } virtual void WriteSymbol( ostream& outStream ) const { outStream << "BUILTINVALUE REFERENCE " ; SIMCValueReference::WriteSymbol(outStream);
outStream << "\tVALUE DETAILS" << endl << (*_value) << endl; }
};
/* This class models a defined value reference, and hence has a pointer
* to another symbol that was used in creating this defined value reference */ class SIMCDefinedValueReference : public SIMCValueReference { SIMCSymbol ** _value; long _valueLine, _valueColumn; // the _value symbol itself may be another defined value reference
// All defined value references have to finally end on a built-in
// value reference. _realValue is that value reference
SIMCBuiltInValueReference *_realValue;
// What happened when an attempt was made to set _realType
SIMCResolutionStatus _status;
public: SIMCDefinedValueReference (SIMCSymbol **type, long typeLine, long typeColumn, SIMCSymbol **value, long valueLine, long valueColumn, const char * const symbolName, SymbolType symbolType = LOCAL, SIMCModule *module = NULL, long _lineNumber = 0, long _columnNumber = 0, long _referenceCount = 0) : _value(value), _valueLine(valueLine), _valueColumn(valueColumn), _realValue(NULL), _status(RESOLVE_UNSET), SIMCValueReference( type, typeLine, typeColumn, symbolName, symbolType, module, _lineNumber, _columnNumber, _referenceCount) { if( _value ) (*_value)->IncrementReferenceCount(); }
virtual ~SIMCDefinedValueReference() { if( UseReferenceCount() && _value ) (*_value)->DecrementReferenceCount(); }
SIMCSymbol ** GetValueReference() const { return _value; } SIMCBuiltInValueReference * GetRealValue() const { return _realValue; }
void SetRealValue(SIMCBuiltInValueReference *value) { _realValue = value; } SIMCResolutionStatus GetStatus() const { return _status; }
void SetStatus( SIMCResolutionStatus val) { _status = val; } long GetValueLine() const { return _valueLine; }
void SetValueLine( long x) { _valueLine = x; }
long GetValueColumn() const { return _valueColumn; }
void SetValueColumn( long x) { _valueColumn = x; } virtual void WriteSymbol( ostream& outStream ) const { outStream << "DEFINEDVALUEREFRENCE " ; SIMCValueReference::WriteSymbol(outStream); outStream << "\tVALUE DETAILS " ; (*_value)->WriteBrief(outStream); // SIMCValueReference::WriteSymbol(outStream);
outStream << endl;
switch(_status) { case RESOLVE_UNSET: outStream << "UNSET RESOLUTION" << endl; break; case RESOLVE_UNDEFINED: outStream << "UNDEFINED RESOLUTION" << endl; break; case RESOLVE_IMPORT: outStream << "RESOLVES TO IMPORT" << endl; break; case RESOLVE_CORRECT: outStream << "RESOLVES TO " << _realValue->GetSymbolName() << endl; break; }
} };
typedef CList<SIMCDefinedValueReference *, SIMCDefinedValueReference *> SIMCDefinedValueReferenceList;
#endif
|