| 39 | using namespace solidity::langutil; |
| 40 | |
| 41 | std::shared_ptr<Object> ObjectParser::parse(std::shared_ptr<Scanner> const& _scanner, bool _reuseScanner) |
| 42 | { |
| 43 | m_recursionDepth = 0; |
| 44 | try |
| 45 | { |
| 46 | std::shared_ptr<Object> object; |
| 47 | m_scanner = _scanner; |
| 48 | |
| 49 | if (currentToken() == Token::LBrace) |
| 50 | { |
| 51 | // Special case: Code-only form. |
| 52 | object = std::make_shared<Object>(); |
| 53 | object->name = "object"; |
| 54 | auto sourceNameMapping = tryParseSourceNameMapping(); |
| 55 | object->debugData = std::make_shared<ObjectDebugData>(ObjectDebugData{sourceNameMapping}); |
| 56 | object->setCode(parseBlock(sourceNameMapping)); |
| 57 | if (!object->hasCode()) |
| 58 | return nullptr; |
| 59 | } |
| 60 | else |
| 61 | object = parseObject(); |
| 62 | if (!_reuseScanner) |
| 63 | expectToken(Token::EOS); |
| 64 | return object; |
| 65 | } |
| 66 | catch (FatalError const&) |
| 67 | { |
| 68 | if (!m_errorReporter.hasErrors()) |
| 69 | { |
| 70 | std::cerr << "Unreported fatal error:" << std::endl; |
| 71 | std::cerr << boost::current_exception_diagnostic_information() << std::endl; |
| 72 | yulAssert(false, "Unreported fatal error."); |
| 73 | } |
| 74 | } |
| 75 | return nullptr; |
| 76 | } |
| 77 | |
| 78 | std::shared_ptr<Object> ObjectParser::parseObject(Object* _containingObject) |
| 79 | { |