@@ -2039,6 +2039,58 @@ Result BinaryReaderIR::OnGenericCustomSection(std::string_view name,
20392039 return Result::Ok;
20402040}
20412041
2042+ class BinaryReaderComponentIR : public ComponentBinaryReaderDelegate {
2043+ public:
2044+ BinaryReaderComponentIR (Component* out_component,
2045+ const char * filename,
2046+ Errors* errors);
2047+
2048+ private:
2049+ bool OnError (const Error&) override { return false ; }
2050+
2051+ Result OnCoreModule (const void * data,
2052+ size_t size,
2053+ const ReadBinaryOptions& options) override ;
2054+ Result BeginComponent (uint32_t version, size_t depth) override ;
2055+ Result EndComponent () override ;
2056+
2057+ Errors* errors_ = nullptr ;
2058+ Component* component_ = nullptr ;
2059+
2060+ const char * filename_;
2061+ };
2062+
2063+ BinaryReaderComponentIR::BinaryReaderComponentIR (Component* out_component,
2064+ const char * filename,
2065+ Errors* errors)
2066+ : errors_(errors), component_(out_component), filename_(filename) {}
2067+
2068+ Result BinaryReaderComponentIR::OnCoreModule (const void * data,
2069+ size_t size,
2070+ const ReadBinaryOptions& options) {
2071+ auto coreModule = std::make_unique<ComponentCoreModule>();
2072+ BinaryReaderIR reader (coreModule->module (), filename_, errors_);
2073+ CHECK_RESULT (ReadBinary (data, size, &reader, options));
2074+ component_->definitions .push_back (std::move (coreModule));
2075+ return Result::Ok;
2076+ }
2077+
2078+ Result BinaryReaderComponentIR::BeginComponent (uint32_t version, size_t depth) {
2079+ if (depth == 0 ) {
2080+ return Result::Ok;
2081+ }
2082+ auto innerComponent = std::make_unique<ComponentComponent>(component_);
2083+ Component* parent = component_;
2084+ component_ = innerComponent->component ();
2085+ parent->definitions .push_back (std::move (innerComponent));
2086+ return Result::Ok;
2087+ }
2088+
2089+ Result BinaryReaderComponentIR::EndComponent () {
2090+ component_ = component_->parent ;
2091+ return Result::Ok;
2092+ }
2093+
20422094} // end anonymous namespace
20432095
20442096Result ReadBinaryIr (const char * filename,
@@ -2051,4 +2103,14 @@ Result ReadBinaryIr(const char* filename,
20512103 return ReadBinary (data, size, &reader, options);
20522104}
20532105
2106+ Result ReadBinaryComponentIr (const char * filename,
2107+ const void * data,
2108+ size_t size,
2109+ const ReadBinaryOptions& options,
2110+ Errors* errors,
2111+ Component* out_component) {
2112+ BinaryReaderComponentIR reader (out_component, filename, errors);
2113+ return ReadBinaryComponent (data, size, &reader, options);
2114+ }
2115+
20542116} // namespace wabt
0 commit comments