Skip to content

Commit 5314e33

Browse files
authored
feat(compiler): Test typemetadata size (#2352)
1 parent 4850458 commit 5314e33

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

compiler/test/suites/basic_functionality.re

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,44 @@ describe("basic functionality", ({test, testSkip}) => {
1313
let assertParse = makeParseRunner(test);
1414
let assertRun = makeRunner(test_or_skip);
1515
let assertRunError = makeErrorRunner(test_or_skip);
16+
let assertTypeMetaDataSize =
17+
(~elide_type_info=false, name, prog, expectedSize) => {
18+
test(
19+
name,
20+
({expect}) => {
21+
ignore(
22+
compile(
23+
~link=true,
24+
~config_fn=
25+
() => {
26+
Grain_utils.Config.compilation_mode := Runtime;
27+
Grain_utils.Config.elide_type_info := elide_type_info;
28+
},
29+
name,
30+
prog,
31+
),
32+
);
33+
let bytes = {
34+
let ic = open_in_bin(wasmfile(name));
35+
let chan_len = in_channel_length(ic);
36+
let bytes = Bytes.create(chan_len);
37+
really_input(ic, bytes, 0, chan_len);
38+
close_in(ic);
39+
bytes;
40+
};
41+
let asm = Binaryen.Module.read(bytes);
42+
// TODO(#2358): Binaryen Validate the given memory segment exists
43+
if (Binaryen.Memory.get_num_segments(asm) > 0) {
44+
let type_metadata =
45+
Binaryen.Memory.get_segment_data(asm, "type_metadata");
46+
let type_metadata_size = Bytes.length(type_metadata);
47+
expect.int(type_metadata_size).toBe(expectedSize);
48+
} else {
49+
expect.int(-1).toBe(expectedSize);
50+
};
51+
},
52+
);
53+
};
1654
let smallestFileConfig = () => {
1755
Grain_utils.Config.elide_type_info := true;
1856
Grain_utils.Config.profile := Some(Grain_utils.Config.Release);
@@ -387,6 +425,66 @@ describe("basic functionality", ({test, testSkip}) => {
387425
"hello world\n",
388426
);
389427

428+
assertTypeMetaDataSize(
429+
"type_metadata_base_size",
430+
{|
431+
@runtimeMode
432+
module Main
433+
|},
434+
32,
435+
);
436+
437+
assertTypeMetaDataSize(
438+
~elide_type_info=true,
439+
"type_metadata_base_size_no_type_info",
440+
{|
441+
@runtimeMode
442+
module Main
443+
|},
444+
-1,
445+
);
446+
447+
assertTypeMetaDataSize(
448+
"type_metadata_size",
449+
{|
450+
@runtimeMode
451+
module Main
452+
453+
record Test {
454+
field1: Bool,
455+
field2: Bool
456+
}
457+
458+
enum T {
459+
One,
460+
Two,
461+
Three
462+
}
463+
|},
464+
168,
465+
);
466+
467+
assertTypeMetaDataSize(
468+
~elide_type_info=true,
469+
"type_metadata_size_no_type_info",
470+
{|
471+
@runtimeMode
472+
module Main
473+
474+
record Test {
475+
field1: Bool,
476+
field2: Bool
477+
}
478+
479+
enum T {
480+
One,
481+
Two,
482+
Three
483+
}
484+
|},
485+
-1,
486+
);
487+
390488
assertFilesize(
391489
~config_fn=smallestFileConfig,
392490
"smallest_grain_program",

0 commit comments

Comments
 (0)