blob: 2380f7447dee47cfa61ec0bd0f1d29f4c232041c [file] [log] [blame]
/*
* Copyright 2017 WebAssembly Community Group participants
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//
// Abstracts reading and writing, supporting both text and binary
// depending on the suffix.
//
// When the suffix is unclear, writing defaults to text (this
// allows odd suffixes, which we use in the test suite), while
// reading will check the magic number and default to text if not
// binary.
//
#include "wasm-io.h"
#include "wasm-s-parser.h"
#include "wasm-binary.h"
#include "support/file.h"
namespace wasm {
void ModuleReader::readText(std::string filename, Module& wasm) {
if (debug) std::cerr << "reading text from " << filename << "\n";
auto input(read_file<std::string>(filename, Flags::Text, debug ? Flags::Debug : Flags::Release));
SExpressionParser parser(const_cast<char*>(input.c_str()));
Element& root = *parser.root;
SExpressionWasmBuilder builder(wasm, *root[0]);
}
void ModuleReader::readBinary(std::string filename, Module& wasm) {
if (debug) std::cerr << "reading binary from " << filename << "\n";
auto input(read_file<std::vector<char>>(filename, Flags::Binary, debug ? Flags::Debug : Flags::Release));
WasmBinaryBuilder parser(wasm, input, debug);
parser.read();
}
void ModuleReader::read(std::string filename, Module& wasm) {
// see if this is a binary
auto contents = read_file<std::vector<char>>(filename, Flags::Binary, debug ? Flags::Debug : Flags::Release);
if (contents.size() >= 4 && contents[0] == '\0' && contents[1] == 'a' && contents[2] == 's' && contents[3] == 'm') {
readBinary(filename, wasm);
} else {
// default to text
readText(filename, wasm);
}
}
void ModuleWriter::writeText(Module& wasm, std::string filename) {
if (debug) std::cerr << "writing text to " << filename << "\n";
Output output(filename, Flags::Text, debug ? Flags::Debug : Flags::Release);
WasmPrinter::printModule(&wasm, output.getStream());
}
void ModuleWriter::writeBinary(Module& wasm, std::string filename) {
if (debug) std::cerr << "writing binary to " << filename << "\n";
BufferWithRandomAccess buffer(debug);
WasmBinaryWriter writer(&wasm, buffer, debug);
writer.setDebugInfo(debugInfo);
if (symbolMap.size() > 0) writer.setSymbolMap(symbolMap);
writer.write();
Output output(filename, Flags::Binary, debug ? Flags::Debug : Flags::Release);
buffer.writeTo(output);
}
void ModuleWriter::write(Module& wasm, std::string filename) {
if (binary && filename.size() > 0) {
writeBinary(wasm, filename);
} else {
writeText(wasm, filename);
}
}
}