Changeset c36298d for src/SynTree/Constant.cc
- Timestamp:
- Jun 17, 2019, 11:01:04 AM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- b4d34fa
- Parents:
- 6a1dfda
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SynTree/Constant.cc
r6a1dfda rc36298d 22 22 #include "Type.h" // for BasicType, Type, Type::Qualifiers, PointerType 23 23 24 Constant::Constant( Type * type, std::string rep, unsigned long long val ) : type( type ), rep( rep ), val( val ) {} 25 Constant::Constant( Type * type, std::string rep, double val ) : type( type ), rep( rep ), val( val ) {} 24 Constant::Constant( Type * type, std::string rep, std::optional<unsigned long long> ival ) : type( type ), rep( rep ), ival( ival ) {} 26 25 27 Constant::Constant( const Constant &other ) : BaseSyntaxNode( other ), rep( other.rep ), val( other.val ) {26 Constant::Constant( const Constant &other ) : BaseSyntaxNode( other ), rep( other.rep ), ival( other.ival ) { 28 27 type = other.type->clone(); 29 28 } … … 35 34 } 36 35 37 Constant Constant::from_char( char c ) {38 return Constant( new BasicType( Type::Qualifiers(), BasicType::Char ), std::to_string( c ), (unsigned long long int)c );39 }40 41 36 Constant Constant::from_int( int i ) { 42 37 return Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), std::to_string( i ), (unsigned long long int)i ); … … 45 40 Constant Constant::from_ulong( unsigned long i ) { 46 41 return Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), std::to_string( i ), (unsigned long long int)i ); 47 }48 49 Constant Constant::from_double( double d ) {50 return Constant( new BasicType( Type::Qualifiers(), BasicType::Double ), std::to_string( d ), d );51 }52 53 Constant Constant::from_string( std::string const & cEscapedVal, Type *charType ) {54 assert(cEscapedVal.length() >= 2);55 assert(cEscapedVal.front() == '"');56 assert(cEscapedVal.back() == '"');57 ArrayType * at = new ArrayType( noQualifiers, charType,58 new ConstantExpr( Constant::from_ulong( cEscapedVal.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'59 false, false );60 return Constant( at, cEscapedVal, (unsigned long long int)0 );61 42 } 62 43 … … 74 55 unsigned long long Constant::get_ival() const { 75 56 assertf( strict_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve ival from non-integer constant." ); 76 return val.ival; 77 } 78 79 double Constant::get_dval() const { 80 assertf( ! strict_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve dval from integer constant." ); 81 return val.dval; 57 return ival.value(); 82 58 } 83 59 84 60 void Constant::print( std::ostream &os, Indenter ) const { 85 os << "(" << rep << " " << val.ival;61 os << "(" << rep << " " << (ival ? toString(ival.value()) : "") ; 86 62 if ( type ) { 87 63 os << ": ";
Note: See TracChangeset
for help on using the changeset viewer.