Changes in src/AST/Convert.cpp [558d13b:6355ba7]
- File:
-
- 1 edited
-
src/AST/Convert.cpp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
r558d13b r6355ba7 10 10 // Created On : Thu May 09 15::37::05 2019 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Man Jun 10 11:51:00 201913 // Update Count : 1 112 // Last Modified On : Thu May 06 19:51:00 2019 13 // Update Count : 10 14 14 // 15 15 … … 92 92 93 93 Label makeLabel(Statement * labelled, const ast::Label& label) { 94 // This probably will leak memory, but only until we get rid of the old tree.95 if ( nullptr == labelled && label.location.isSet() ) {96 labelled = new NullStmt();97 labelled->location = label.location;98 }99 94 return Label( 100 95 label.name, … … 1389 1384 // Local Utilities: 1390 1385 1386 #define construct(T, key, ...) ({ \ 1387 void * data = ::operator new(sizeof(T)); \ 1388 cache.emplace( key, (T*)data ); \ 1389 new (data) T( __VA_ARGS__ ); \ 1390 }) 1391 1391 1392 template<typename NewT, typename OldT> 1392 1393 NewT * getAccept1( OldT old ) { … … 1402 1403 1403 1404 template<typename NewT, typename OldC> 1404 std::vector< ast::ptr<NewT> > getAcceptV( constOldC& old ) {1405 std::vector< ast::ptr<NewT> > getAcceptV( OldC& old ) { 1405 1406 std::vector< ast::ptr<NewT> > ret; 1406 1407 ret.reserve( old.size() ); … … 1417 1418 1418 1419 template<typename NewT, typename OldC> 1419 std::deque< ast::ptr<NewT> > getAcceptD( constOldC& old ) {1420 std::deque< ast::ptr<NewT> > getAcceptD( OldC& old ) { 1420 1421 std::deque< ast::ptr<NewT> > ret; 1421 1422 for ( auto a : old ) { … … 1430 1431 getAcceptD< ast::type, decltype( old->child ) >( old->child ) 1431 1432 1432 ast::Label make_label(const Label* old) { 1433 CodeLocation const & location = 1434 ( old->labelled ) ? old->labelled->location : CodeLocation(); 1433 ast::Label make_label(Label* old) { 1435 1434 return ast::Label( 1436 location,1435 old->labelled->location, 1437 1436 old->name, 1438 1437 GET_ACCEPT_V(attributes, Attribute) … … 1806 1805 } 1807 1806 1807 Label label = old->originalTarget; 1808 1808 auto stmt = new ast::BranchStmt( 1809 1809 old->location, 1810 1810 kind, 1811 make_label(& old->originalTarget),1811 make_label(&label), 1812 1812 GET_LABELS_V(old->labels) 1813 1813 ); … … 2191 2191 2192 2192 int isStringlikeConstantType(const Type *t) { 2193 const Type *referentType = nullptr;2194 2193 if ( const ArrayType * aty = dynamic_cast< const ArrayType * >( t ) ) { 2195 referentType = aty->base; 2196 } else if ( const PointerType * pty = dynamic_cast< const PointerType * >( t ) ) { 2197 referentType = pty->base; 2198 } 2199 if (referentType) { 2200 if ( const BasicType * bty = dynamic_cast< const BasicType * >( referentType ) ) { 2194 if ( const BasicType * bty = dynamic_cast< const BasicType * >( aty->base ) ) { 2201 2195 if ( bty->kind == BasicType::Kind::Char ) { 2202 2196 return true; … … 2209 2203 virtual void visit( ConstantExpr * old ) override final { 2210 2204 ast::ConstantExpr *rslt = nullptr; 2211 if (isStringlikeConstantType(old->result)) { 2212 rslt = new ast::ConstantExpr( 2213 old->location, 2214 GET_ACCEPT_1(result, Type), 2215 old->constant.get_value(), 2216 0, 2217 ast::ConstantExpr::Kind::String 2218 ); 2219 } else if (isIntlikeConstantType(old->result)) { 2205 if (isIntlikeConstantType(old->result)) { 2220 2206 rslt = new ast::ConstantExpr( 2221 2207 old->location, … … 2231 2217 old->constant.get_value(), 2232 2218 (double) old->constant.get_dval() 2219 ); 2220 } else if (isStringlikeConstantType(old->result)) { 2221 rslt = new ast::ConstantExpr( 2222 old->location, 2223 GET_ACCEPT_1(result, Type), 2224 old->constant.get_value(), 2225 0, 2226 ast::ConstantExpr::Kind::String 2233 2227 ); 2234 2228 }
Note:
See TracChangeset
for help on using the changeset viewer.