-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathNameSection.v3
80 lines (76 loc) · 2.67 KB
/
NameSection.v3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright 2020 Ben L. Titzer. All rights reserved.
// See LICENSE for details of Apache 2.0 license.
// The name section is a special custom section that is interpreted by
// engines to aid in debugging.
class NameSection extends CustomSection {
def module: Module;
private var decoded: bool;
private var module_name: string;
private var func_names: Array<string>;
private var local_names: Array<Array<string>>;
new(module, payload: Array<byte>) super("name", payload) { }
def getModuleName() -> string {
lazyDecode();
return module_name;
}
def getFuncName(func: int) -> string {
lazyDecode();
if (func_names == null) return null;
if (u32.view(func) >= func_names.length) return null;
return func_names[func];
}
def getLocalName(func: int, local: int) -> string {
lazyDecode();
if (local_names == null) return null;
if (u32.view(func) >= local_names.length) return null;
var map = local_names[func];
if (u32.view(local) >= map.length) return null;
return map[local];
}
def lazyDecode() -> this {
if (decoded) return;
decoded = true;
var extensions: Extension.set, limits = Limits.new().set(extensions);
var error = ErrorGen.new("");
var d = Decoder.new(payload, error);
var p = WasmParser.new(extensions, limits, module, error, d);
if (d.match1(0)) {
// module name
var subsize = p.readU32("module name subsection size", limits.max_module_size);
module_name = p.readUtf8String("module name");
}
if (d.match1(1)) {
// function names
var subsize = p.readU32("function name subsection size", limits.max_module_size);
var count = p.readU32("function count", u32.view(module.functions.length));
var total_func_count = module.functions.length;
func_names = Array.new(total_func_count);
for (i < count) {
if (error.error()) break;
var func = p.readFuncIndex();
if (func < 0 || func >= total_func_count) break;
func_names[func] = p.readUtf8String("function name");
}
}
if (d.match1(2)) {
// local names
var subsize = p.readU32("local names subsection size", limits.max_module_size);
var count = p.readU32("local function count", u32.view(module.functions.length));
local_names = Array.new(int.view(module.functions.length));
for (i < count) {
if (error.error()) break;
var func = p.readFuncIndex();
if (func < 0) break;
var count = p.readU32("local count", limits.max_num_locals);
var names = Array<string>.new(int.view(count));
local_names[func] = names;
for (i < count) {
if (error.error()) break;
var local = p.readU32("local index", limits.max_num_locals);
if (local >= names.length) break;
names[local] = p.readUtf8String("local name");
}
}
}
}
}