commit ea7bfc7db638a22f789ba1a666673aea7bedf084
parent 58363be5add8a0cc92a69d6776a4c00543413281
Author: William Casarin <jb55@jb55.com>
Date:   Mon,  5 Jul 2021 10:36:52 -0700
parse memory section
Diffstat:
2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/src/wasm.c b/src/wasm.c
@@ -338,6 +338,20 @@ static const char *reftype_name(enum reftype reftype)
 	return "unknown_reftype";
 }
 
+static void print_memory_section(struct memsec *memory)
+{
+	int i;
+	struct limits *mem;
+
+	debug("%d memory:\n", memory->num_mems);
+	for (i = 0; i < memory->num_mems; i++) {
+		mem = &memory->mems[i];
+		debug("    ");
+		print_limits(mem);
+		debug("\n");
+	}
+}
+
 static void print_table_section(struct tablesec *section)
 {
 	int i;
@@ -399,6 +413,7 @@ static void print_module(struct module *module)
 	print_import_section(&module->import_section);
 	print_export_section(&module->export_section);
 	print_table_section(&module->table_section);
+	print_memory_section(&module->memory_section);
 	//print_code_section(&module->code_section);
 }
 
@@ -805,6 +820,30 @@ static int parse_table(struct wasm_parser *p, struct table *table)
 	return 1;
 }
 
+static int parse_memory_section(struct wasm_parser *p,
+		struct memsec *memory_section)
+{
+	struct limits *mems;
+	unsigned int elems, i;
+
+	if (!parse_vector(p, sizeof(*mems), &elems, (void**)&mems)) {
+		note_error(p, "mems vector");
+		return 0;
+	}
+
+	for (i = 0; i < elems; i++) {
+		if (!parse_limits(p, &mems[i])) {
+			note_error(p, "memory #%d/%d", i+1, elems);
+			return 0;
+		}
+	}
+
+	memory_section->num_mems = elems;
+	memory_section->mems = mems;
+
+	return 1;
+}
+
 static int parse_table_section(struct wasm_parser *p,
 		struct tablesec *table_section)
 {
@@ -1040,8 +1079,11 @@ static int parse_section_by_tag(struct wasm_parser *p, enum section_tag tag,
 		}
 		return 1;
 	case section_memory:
-		note_error(p, "section_memory parse not implemented");
-		return 0;
+		if (!parse_memory_section(p, &p->module.memory_section)) {
+			note_error(p, "memory section");
+			return 0;
+		}
+		return 1;
 	case section_global:
 		note_error(p, "section_global parse not implemented");
 		return 0;
diff --git a/src/wasm.h b/src/wasm.h
@@ -71,6 +71,11 @@ struct tablesec {
 	int num_tables;
 };
 
+struct memsec {
+	struct limits *mems; /* memtype */
+	int num_mems;
+};
+
 struct funcsec {
 	unsigned int *type_indices;
 	int num_indices;
@@ -304,6 +309,7 @@ struct module {
 	struct exportsec export_section;
 	struct codesec code_section;
 	struct tablesec table_section;
+	struct memsec memory_section;
 };
 
 struct wasm_interp {