@@ -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