summaryrefslogtreecommitdiff
path: root/src/emscripten-helpers.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/emscripten-helpers.cc')
-rw-r--r--src/emscripten-helpers.cc237
1 files changed, 151 insertions, 86 deletions
diff --git a/src/emscripten-helpers.cc b/src/emscripten-helpers.cc
index 4e8d92f6..e7e8e2fc 100644
--- a/src/emscripten-helpers.cc
+++ b/src/emscripten-helpers.cc
@@ -17,99 +17,164 @@
#ifndef WABT_EMSCRIPTEN_HELPERS_H_
#define WABT_EMSCRIPTEN_HELPERS_H_
-#include <stddef.h>
+#include <cstddef>
+
+#include <memory>
#include "ast.h"
-#include "binary-reader.h"
+#include "ast-lexer.h"
+#include "ast-parser.h"
#include "binary-writer.h"
#include "common.h"
+#include "resolve-names.h"
+#include "source-error-handler.h"
#include "stream.h"
+#include "validator.h"
#include "writer.h"
-/* TODO(binji): it would be nicer to generate this as static data, but it's not
- * currently easy to do. Maybe use LLVM's python bindings for this? */
-
-#define DEFINE_SIZEOF(Name, name) \
- size_t wabt_sizeof_##name(void) { return sizeof(Name); }
-
-#define DEFINE_OFFSETOF(Name, name, member) \
- size_t wabt_offsetof_##name##_##member(void) { \
- return offsetof(Name, member); \
+struct WabtParseAstResult {
+ wabt::Result result;
+ std::unique_ptr<wabt::Script> script;
+};
+
+struct WabtWriteBinaryModuleResult {
+ wabt::Result result;
+ std::unique_ptr<wabt::OutputBuffer> binary_buffer;
+ std::unique_ptr<wabt::OutputBuffer> log_buffer;
+};
+
+extern "C" {
+
+wabt::AstLexer* wabt_new_ast_buffer_lexer(const char* filename,
+ const void* data,
+ size_t size) {
+ return wabt::new_ast_buffer_lexer(filename, data, size);
+}
+
+WabtParseAstResult* wabt_parse_ast(
+ wabt::AstLexer* lexer,
+ wabt::SourceErrorHandlerBuffer* error_handler) {
+ WabtParseAstResult* result = new WabtParseAstResult();
+ wabt::Script* script = nullptr;
+ result->result = wabt::parse_ast(lexer, &script, error_handler);
+ result->script.reset(script);
+ return result;
+
+}
+
+wabt::Result wabt_resolve_names_script(
+ wabt::AstLexer* lexer,
+ wabt::Script* script,
+ wabt::SourceErrorHandlerBuffer* error_handler) {
+ return resolve_names_script(lexer, script, error_handler);
+}
+
+wabt::Result wabt_validate_script(
+ wabt::AstLexer* lexer,
+ wabt::Script* script,
+ wabt::SourceErrorHandlerBuffer* error_handler) {
+ return validate_script(lexer, script, error_handler);
+}
+
+WabtWriteBinaryModuleResult* wabt_write_binary_module(wabt::Script* script,
+ int log,
+ int canonicalize_lebs,
+ int relocatable,
+ int write_debug_names) {
+ wabt::MemoryStream stream;
+ wabt::WriteBinaryOptions options;
+ options.log_stream = log ? &stream : nullptr;
+ options.canonicalize_lebs = canonicalize_lebs;
+ options.relocatable = relocatable;
+ options.write_debug_names = write_debug_names;
+
+ wabt::MemoryWriter writer;
+ wabt::Module* module = wabt::get_first_module(script);
+ WabtWriteBinaryModuleResult* result = new WabtWriteBinaryModuleResult();
+ result->result = write_binary_module(&writer, module, &options);
+ if (result->result == wabt::Result::Ok) {
+ result->binary_buffer = writer.ReleaseOutputBuffer();
+ result->log_buffer = log ? stream.ReleaseOutputBuffer() : nullptr;
}
-
-/* See http://stackoverflow.com/a/1872506 */
-#define CONCAT(a, b) CONCAT_(a, b)
-#define CONCAT_(a, b) CONCAT__(a, b)
-#define CONCAT__(a, b) a##b
-#define FOREACH_1(m, S, s, x, ...) m(S, s, x)
-#define FOREACH_2(m, S, s, x, ...) m(S, s, x) FOREACH_1(m, S, s, __VA_ARGS__)
-#define FOREACH_3(m, S, s, x, ...) m(S, s, x) FOREACH_2(m, S, s, __VA_ARGS__)
-#define FOREACH_4(m, S, s, x, ...) m(S, s, x) FOREACH_3(m, S, s, __VA_ARGS__)
-#define FOREACH_5(m, S, s, x, ...) m(S, s, x) FOREACH_4(m, S, s, __VA_ARGS__)
-#define FOREACH_6(m, S, s, x, ...) m(S, s, x) FOREACH_5(m, S, s, __VA_ARGS__)
-#define FOREACH_7(m, S, s, x, ...) m(S, s, x) FOREACH_6(m, S, s, __VA_ARGS__)
-#define FOREACH_8(m, S, s, x, ...) m(S, s, x) FOREACH_7(m, S, s, __VA_ARGS__)
-#define NARG(...) NARG_(__VA_ARGS__, RSEQ_N())
-#define NARG_(...) ARG_N(__VA_ARGS__)
-#define ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, N, ...) N
-#define RSEQ_N() 8, 7, 6, 5, 4, 3, 2, 1, 0
-#define FOREACH(m, S, s, ...) FOREACH_(NARG(__VA_ARGS__), m, S, s, __VA_ARGS__)
-#define FOREACH_(N, m, S, s, ...) CONCAT(FOREACH_, N)(m, S, s, __VA_ARGS__)
-#define DEFINE_STRUCT0(Name, name) DEFINE_SIZEOF(Name, name)
-#define DEFINE_STRUCT(Name, name, ...) \
- DEFINE_SIZEOF(Name, name) \
- FOREACH(DEFINE_OFFSETOF, Name, name, __VA_ARGS__)
-
-WABT_EXTERN_C_BEGIN
-
-/* clang-format off */
-DEFINE_STRUCT(
- WabtBinaryErrorHandler, binary_error_handler,
- on_error, user_data)
-
-DEFINE_STRUCT(
- WabtLocation, location,
- filename, line, first_column, last_column)
-
-DEFINE_STRUCT(
- WabtMemoryWriter, memory_writer,
- base, buf)
-
-DEFINE_STRUCT0(
- WabtModule, module)
-
-DEFINE_STRUCT(
- WabtOutputBuffer, output_buffer,
- start, size, capacity)
-
-DEFINE_STRUCT(
- WabtReadBinaryOptions, read_binary_options,
- read_debug_names)
-
-DEFINE_STRUCT0(
- WabtScript, script)
-
-DEFINE_STRUCT(
- WabtSourceErrorHandler, source_error_handler,
- on_error, source_line_max_length, user_data)
-
-DEFINE_STRUCT(
- WabtStream, stream,
- writer, offset, result, log_stream)
-
-DEFINE_STRUCT(
- WabtStringSlice, string_slice,
- start, length)
-
-DEFINE_STRUCT(
- WabtWriter, writer,
- write_data, move_data)
-
-DEFINE_STRUCT(
- WabtWriteBinaryOptions, write_binary_options,
- log_stream, canonicalize_lebs, write_debug_names)
-/* clang-format on */
-
-WABT_EXTERN_C_END
+ return result;
+}
+
+void wabt_destroy_script(wabt::Script* script) {
+ delete script;
+}
+
+void wabt_destroy_ast_lexer(wabt::AstLexer* lexer) {
+ destroy_ast_lexer(lexer);
+}
+
+// SourceErrorHandlerBuffer
+wabt::SourceErrorHandlerBuffer* wabt_new_source_error_handler_buffer(void) {
+ return new wabt::SourceErrorHandlerBuffer();
+}
+
+const void* wabt_source_error_handler_buffer_get_data(
+ wabt::SourceErrorHandlerBuffer* error_handler) {
+ return error_handler->buffer().data();
+}
+
+size_t wabt_source_error_handler_buffer_get_size(
+ wabt::SourceErrorHandlerBuffer* error_handler) {
+ return error_handler->buffer().size();
+}
+
+void wabt_destroy_source_error_handler_buffer(
+ wabt::SourceErrorHandlerBuffer* error_handler) {
+ delete error_handler;
+}
+
+// WabtParseAstResult
+wabt::Result wabt_parse_ast_result_get_result(WabtParseAstResult* result) {
+ return result->result;
+}
+
+wabt::Script* wabt_parse_ast_result_release_script(WabtParseAstResult* result) {
+ return result->script.release();
+}
+
+void wabt_destroy_parse_ast_result(WabtParseAstResult* result) {
+ delete result;
+}
+
+// WabtWriteBinaryModuleResult
+wabt::Result wabt_write_binary_module_result_get_result(
+ WabtWriteBinaryModuleResult* result) {
+ return result->result;
+}
+
+wabt::OutputBuffer*
+wabt_write_binary_module_result_release_binary_output_buffer(
+ WabtWriteBinaryModuleResult* result) {
+ return result->binary_buffer.release();
+}
+
+wabt::OutputBuffer* wabt_write_binary_module_result_release_log_output_buffer(
+ WabtWriteBinaryModuleResult* result) {
+ return result->log_buffer.release();
+}
+
+void wabt_destroy_write_binary_module_result(
+ WabtWriteBinaryModuleResult* result) {
+ delete result;
+}
+
+// wabt::OutputBuffer*
+const void* wabt_output_buffer_get_data(wabt::OutputBuffer* output_buffer) {
+ return output_buffer->data.data();
+}
+
+size_t wabt_output_buffer_get_size(wabt::OutputBuffer* output_buffer) {
+ return output_buffer->data.size();
+}
+
+void wabt_destroy_output_buffer(wabt::OutputBuffer* output_buffer) {
+ delete output_buffer;
+}
+
+} // extern "C"
#endif /* WABT_EMSCRIPTEN_HELPERS_H_ */