wat4wasm 1.1.3 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/examples/04-ref.func/module-output.wat +11 -2
- package/examples/04-ref.func/module.wat +7 -0
- package/examples/shell-usages.sh +0 -7
- package/lib/cli.js +4 -4
- package/lib/helpers.js +48 -15
- package/lib/processors/ref_func.js +25 -0
- package/package.json +1 -1
- package/wat4wasm +70 -19
|
@@ -4,21 +4,30 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
+
|
|
8
|
+
|
|
7
9
|
(func $unreferenced_by_user)
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
|
|
13
|
-
(elem $wat4wasm declare func $unreferenced_by_user)
|
|
15
|
+
(elem $wat4wasm declare func $inline $unreferenced_by_user)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
14
19
|
|
|
15
20
|
|
|
16
21
|
|
|
17
22
|
|
|
23
|
+
(memory $wat4wasm 1)
|
|
18
24
|
|
|
19
25
|
|
|
26
|
+
(func $inline
|
|
27
|
+
(local $a i32)
|
|
28
|
+
(local.set $a (i32.const 2))
|
|
29
|
+
)
|
|
20
30
|
|
|
21
31
|
|
|
22
32
|
|
|
23
|
-
(start $wat4wasm)
|
|
24
33
|
)
|
package/examples/shell-usages.sh
CHANGED
|
@@ -1,36 +1,29 @@
|
|
|
1
1
|
cd 01-text
|
|
2
2
|
wat4wasm --input=module.wat --output=module-output.wat
|
|
3
|
-
rm wat4wasm
|
|
4
3
|
cd ..
|
|
5
4
|
|
|
6
5
|
cd 02-include
|
|
7
6
|
wat4wasm --input=module.wat --output=module-output.wat
|
|
8
|
-
rm wat4wasm
|
|
9
7
|
cd ..
|
|
10
8
|
|
|
11
9
|
cd 03-ref.extern
|
|
12
10
|
wat4wasm --input=module.wat --output=module-output.wat
|
|
13
|
-
rm wat4wasm
|
|
14
11
|
cd ..
|
|
15
12
|
|
|
16
13
|
cd 04-ref.func
|
|
17
14
|
wat4wasm --input=module.wat --output=module-output.wat
|
|
18
|
-
rm wat4wasm
|
|
19
15
|
cd ..
|
|
20
16
|
|
|
21
17
|
cd 05-global.get
|
|
22
18
|
wat4wasm --input=module.wat --output=module-output.wat
|
|
23
|
-
rm wat4wasm
|
|
24
19
|
cd ..
|
|
25
20
|
|
|
26
21
|
cd 06-async
|
|
27
22
|
wat4wasm --input=module.wat --output=module-output.wat
|
|
28
|
-
rm wat4wasm
|
|
29
23
|
cd ..
|
|
30
24
|
|
|
31
25
|
cd 07-data
|
|
32
26
|
wat4wasm --input=module.wat --output=module-output.wat --wat2wasm=wat2wasm
|
|
33
|
-
rm wat4wasm
|
|
34
27
|
cd ..
|
|
35
28
|
|
|
36
29
|
cd 08-reflectors
|
package/lib/cli.js
CHANGED
|
@@ -212,8 +212,8 @@ export async function processCLI(compileCallback, PROCESS = process) {
|
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
extension = "js";
|
|
215
|
-
filecontent = String(
|
|
216
|
-
|
|
215
|
+
filecontent = String(`
|
|
216
|
+
const view = ${wasmGenerator};
|
|
217
217
|
export let wasm = view.buffer;
|
|
218
218
|
|
|
219
219
|
wasm.module = null;
|
|
@@ -240,8 +240,8 @@ export async function processCLI(compileCallback, PROCESS = process) {
|
|
|
240
240
|
export default wasm;`);
|
|
241
241
|
|
|
242
242
|
filecontent = filecontent.replaceAll(
|
|
243
|
-
String(" ").repeat(filecontent.search(/\w/) - 1)
|
|
244
|
-
|
|
243
|
+
String(" ").repeat(filecontent.search(/\w/) - 1), ""
|
|
244
|
+
);
|
|
245
245
|
}
|
|
246
246
|
else {
|
|
247
247
|
extension = "html";
|
package/lib/helpers.js
CHANGED
|
@@ -217,7 +217,7 @@ const helpers = {
|
|
|
217
217
|
return keyword;
|
|
218
218
|
},
|
|
219
219
|
|
|
220
|
-
fixBlockKeyword(keyword, filter = {}) {
|
|
220
|
+
fixBlockKeyword(keyword = "", filter = {}) {
|
|
221
221
|
if (keyword.split(/\s/).length > 1) {
|
|
222
222
|
throw new Error(`Given keyword is wrong: ${keyword}`)
|
|
223
223
|
}
|
|
@@ -499,6 +499,7 @@ const helpers = {
|
|
|
499
499
|
after: this.input.substring(this.end)
|
|
500
500
|
}
|
|
501
501
|
},
|
|
502
|
+
mask: function (block) { return this.block = block.removedRaw(); },
|
|
502
503
|
maskedRaw: function () { return this.replacedRaw(this.uuid); },
|
|
503
504
|
removedRaw: function () { return this.replacedRaw(""); },
|
|
504
505
|
replacedRaw: function (str) {
|
|
@@ -528,26 +529,54 @@ const helpers = {
|
|
|
528
529
|
return blockName;
|
|
529
530
|
}
|
|
530
531
|
},
|
|
532
|
+
parentBlock: {
|
|
533
|
+
value: function () {
|
|
534
|
+
const lastBlockBefore = helpers.lastBlockBefore(this.toString(), this.begin);
|
|
535
|
+
if (lastBlockBefore) {
|
|
536
|
+
if (lastBlockBefore.end > this.end) {
|
|
537
|
+
return lastBlockBefore;
|
|
538
|
+
}
|
|
539
|
+
return lastBlockBefore.parentBlock();
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
},
|
|
531
543
|
generateId: { value: function () { return helpers.generateId(this.toString()) } },
|
|
532
544
|
name: { get: function () { return `${this.$name}`.substring(1); } },
|
|
533
545
|
rawContent: { get: function () { return helpers.rawContent(this.toString()) } },
|
|
534
546
|
blockContent: { get: function () { return helpers.blockContent(this.toString()) } },
|
|
535
547
|
hasAnyBlock: { get: function () { return helpers.hasAnyBlock(this.toString()) } },
|
|
536
|
-
indexOf: { value: function () { return this.
|
|
537
|
-
includes: { value: function () { return this.
|
|
538
|
-
lastIndexOf: { value: function () { return this.
|
|
539
|
-
split: { value: function () { return this.
|
|
540
|
-
at: { value: function () { return this.
|
|
541
|
-
length: { get: function () { return this.
|
|
548
|
+
indexOf: { value: function () { return this.toString().indexOf(...arguments) } },
|
|
549
|
+
includes: { value: function () { return this.toString().includes(...arguments) } },
|
|
550
|
+
lastIndexOf: { value: function () { return this.toString().lastIndexOf(...arguments) } },
|
|
551
|
+
split: { value: function () { return this.toString().split(...arguments) } },
|
|
552
|
+
at: { value: function () { return this.toString().at(...arguments) } },
|
|
553
|
+
length: { get: function () { return this.toString().length } },
|
|
542
554
|
charCodeAt: { value: function () { return this.block.charCodeAt(...arguments) } },
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
555
|
+
children: {
|
|
556
|
+
get: function () {
|
|
557
|
+
const blocks = new Array();
|
|
558
|
+
let firstBlock, code = this.toString().substring(1, this.length - 1);
|
|
559
|
+
|
|
560
|
+
while (code.includes("(")) {
|
|
561
|
+
firstBlock = helpers.parseBlockAt(
|
|
562
|
+
code, code.indexOf("(")
|
|
563
|
+
).toString();
|
|
564
|
+
|
|
565
|
+
blocks.push(firstBlock);
|
|
566
|
+
code = code.replace(firstBlock, "");
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
return blocks;
|
|
570
|
+
}
|
|
571
|
+
},
|
|
572
|
+
concat: { value: function () { return this.toString().concat(...arguments) } },
|
|
573
|
+
startsWith: { value: function () { return this.toString().startsWith(...arguments) } },
|
|
574
|
+
endsWith: { value: function () { return this.toString().endsWith(...arguments) } },
|
|
575
|
+
substring: { value: function () { return this.toString().substring(...arguments) } },
|
|
576
|
+
replace: { value: function () { return this.toString().replace(...arguments) } },
|
|
577
|
+
replaceAll: { value: function () { return this.toString().replaceAll(...arguments) } },
|
|
578
|
+
lastBlockOf: { value: function () { return helpers.lastBlockOf(this.toString(), ...arguments) } },
|
|
579
|
+
[Symbol.toPrimitive]: { value: function () { return this.toString(); } },
|
|
551
580
|
})
|
|
552
581
|
},
|
|
553
582
|
|
|
@@ -591,6 +620,10 @@ const helpers = {
|
|
|
591
620
|
parseFirstBlock(raw) {
|
|
592
621
|
raw = raw.toString();
|
|
593
622
|
return this.parseBlockAt(raw, raw.indexOf("(", 1));
|
|
623
|
+
},
|
|
624
|
+
|
|
625
|
+
lastBlockBefore(raw, begin) {
|
|
626
|
+
return this.parseBlockAt(raw, raw.lastIndexOf("(", raw.substring(0, begin)));
|
|
594
627
|
}
|
|
595
628
|
};
|
|
596
629
|
|
|
@@ -4,6 +4,31 @@ export const REF_FUNC_BLOCK_NAME = "ref.func";
|
|
|
4
4
|
|
|
5
5
|
export default function (wat, WAT4WASM) {
|
|
6
6
|
|
|
7
|
+
const inlineFunctions = new Array();
|
|
8
|
+
|
|
9
|
+
helpers
|
|
10
|
+
.parseBlockAt(wat.toString(), 0)
|
|
11
|
+
.children
|
|
12
|
+
.filter(b => b.startsWith("(func"))
|
|
13
|
+
.filter(b => b.substring(1).includes("(func"))
|
|
14
|
+
.map(b => b.substring(5, b.length - 1).trim())
|
|
15
|
+
.forEach(content => {
|
|
16
|
+
const maskSet = new helpers.MaskSet(content);
|
|
17
|
+
while (maskSet.hasBlock("func")) {
|
|
18
|
+
const inl = maskSet.lastBlockOf("func");
|
|
19
|
+
inlineFunctions.push(helpers.parseBlockAt(inl.toString(), 0));
|
|
20
|
+
maskSet.mask(inl);
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
;
|
|
24
|
+
|
|
25
|
+
if (inlineFunctions.length) {
|
|
26
|
+
inlineFunctions.forEach(func => {
|
|
27
|
+
wat = wat.replace(func.toString(), `(ref.func ${func.$name})`)
|
|
28
|
+
});
|
|
29
|
+
wat = helpers.append(wat, inlineFunctions.map(func => `\n\t${func}\n`).join("\n"));
|
|
30
|
+
}
|
|
31
|
+
|
|
7
32
|
const maskSetElem = new helpers.MaskSet(wat);
|
|
8
33
|
const elemSegments = new Array();
|
|
9
34
|
const needReference = new Set();
|
package/package.json
CHANGED
package/wat4wasm
CHANGED
|
@@ -483,7 +483,7 @@ function wat4beauty(watContent, alignIndentsWith = "\t", exportPadStart = 90) {
|
|
|
483
483
|
}
|
|
484
484
|
return keyword;
|
|
485
485
|
},
|
|
486
|
-
fixBlockKeyword(keyword, filter = {}) {
|
|
486
|
+
fixBlockKeyword(keyword = "", filter = {}) {
|
|
487
487
|
if (keyword.split(/\s/).length > 1) {
|
|
488
488
|
throw new Error(`Given keyword is wrong: ${keyword}`)
|
|
489
489
|
}
|
|
@@ -704,6 +704,7 @@ function wat4beauty(watContent, alignIndentsWith = "\t", exportPadStart = 90) {
|
|
|
704
704
|
after: this.input.substring(this.end)
|
|
705
705
|
}
|
|
706
706
|
},
|
|
707
|
+
mask: function (block) { return this.block = block.removedRaw(); },
|
|
707
708
|
maskedRaw: function () { return this.replacedRaw(this.uuid); },
|
|
708
709
|
removedRaw: function () { return this.replacedRaw(""); },
|
|
709
710
|
replacedRaw: function (str) {
|
|
@@ -731,26 +732,51 @@ function wat4beauty(watContent, alignIndentsWith = "\t", exportPadStart = 90) {
|
|
|
731
732
|
return blockName;
|
|
732
733
|
}
|
|
733
734
|
},
|
|
735
|
+
parentBlock: {
|
|
736
|
+
value: function () {
|
|
737
|
+
const lastBlockBefore = helpers.lastBlockBefore(this.toString(), this.begin);
|
|
738
|
+
if (lastBlockBefore) {
|
|
739
|
+
if (lastBlockBefore.end > this.end) {
|
|
740
|
+
return lastBlockBefore;
|
|
741
|
+
}
|
|
742
|
+
return lastBlockBefore.parentBlock();
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
},
|
|
734
746
|
generateId: { value: function () { return helpers.generateId(this.toString()) } },
|
|
735
747
|
name: { get: function () { return `${this.$name}`.substring(1); } },
|
|
736
748
|
rawContent: { get: function () { return helpers.rawContent(this.toString()) } },
|
|
737
749
|
blockContent: { get: function () { return helpers.blockContent(this.toString()) } },
|
|
738
750
|
hasAnyBlock: { get: function () { return helpers.hasAnyBlock(this.toString()) } },
|
|
739
|
-
indexOf: { value: function () { return this.
|
|
740
|
-
includes: { value: function () { return this.
|
|
741
|
-
lastIndexOf: { value: function () { return this.
|
|
742
|
-
split: { value: function () { return this.
|
|
743
|
-
at: { value: function () { return this.
|
|
744
|
-
length: { get: function () { return this.
|
|
751
|
+
indexOf: { value: function () { return this.toString().indexOf(...arguments) } },
|
|
752
|
+
includes: { value: function () { return this.toString().includes(...arguments) } },
|
|
753
|
+
lastIndexOf: { value: function () { return this.toString().lastIndexOf(...arguments) } },
|
|
754
|
+
split: { value: function () { return this.toString().split(...arguments) } },
|
|
755
|
+
at: { value: function () { return this.toString().at(...arguments) } },
|
|
756
|
+
length: { get: function () { return this.toString().length } },
|
|
745
757
|
charCodeAt: { value: function () { return this.block.charCodeAt(...arguments) } },
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
758
|
+
children: {
|
|
759
|
+
get: function () {
|
|
760
|
+
const blocks = new Array();
|
|
761
|
+
let firstBlock, code = this.toString().substring(1, this.length - 1);
|
|
762
|
+
while (code.includes("(")) {
|
|
763
|
+
firstBlock = helpers.parseBlockAt(
|
|
764
|
+
code, code.indexOf("(")
|
|
765
|
+
).toString();
|
|
766
|
+
blocks.push(firstBlock);
|
|
767
|
+
code = code.replace(firstBlock, "");
|
|
768
|
+
}
|
|
769
|
+
return blocks;
|
|
770
|
+
}
|
|
771
|
+
},
|
|
772
|
+
concat: { value: function () { return this.toString().concat(...arguments) } },
|
|
773
|
+
startsWith: { value: function () { return this.toString().startsWith(...arguments) } },
|
|
774
|
+
endsWith: { value: function () { return this.toString().endsWith(...arguments) } },
|
|
775
|
+
substring: { value: function () { return this.toString().substring(...arguments) } },
|
|
776
|
+
replace: { value: function () { return this.toString().replace(...arguments) } },
|
|
777
|
+
replaceAll: { value: function () { return this.toString().replaceAll(...arguments) } },
|
|
778
|
+
lastBlockOf: { value: function () { return helpers.lastBlockOf(this.toString(), ...arguments) } },
|
|
779
|
+
[Symbol.toPrimitive]: { value: function () { return this.toString(); } },
|
|
754
780
|
})
|
|
755
781
|
},
|
|
756
782
|
lastBlockOf(raw, keyword, filter) {
|
|
@@ -782,6 +808,9 @@ function wat4beauty(watContent, alignIndentsWith = "\t", exportPadStart = 90) {
|
|
|
782
808
|
parseFirstBlock(raw) {
|
|
783
809
|
raw = raw.toString();
|
|
784
810
|
return this.parseBlockAt(raw, raw.indexOf("(", 1));
|
|
811
|
+
},
|
|
812
|
+
lastBlockBefore(raw, begin) {
|
|
813
|
+
return this.parseBlockAt(raw, raw.lastIndexOf("(", raw.substring(0, begin)));
|
|
785
814
|
}
|
|
786
815
|
};
|
|
787
816
|
|
|
@@ -1186,6 +1215,28 @@ function REF_EXTERN (wat, WAT4WASM) {
|
|
|
1186
1215
|
|
|
1187
1216
|
const REF_FUNC_BLOCK_NAME = "ref.func";
|
|
1188
1217
|
function REF_FUNC (wat, WAT4WASM) {
|
|
1218
|
+
const inlineFunctions = new Array();
|
|
1219
|
+
helpers
|
|
1220
|
+
.parseBlockAt(wat.toString(), 0)
|
|
1221
|
+
.children
|
|
1222
|
+
.filter(b => b.startsWith("(func"))
|
|
1223
|
+
.filter(b => b.substring(1).includes("(func"))
|
|
1224
|
+
.map(b => b.substring(5, b.length - 1).trim())
|
|
1225
|
+
.forEach(content => {
|
|
1226
|
+
const maskSet = new helpers.MaskSet(content);
|
|
1227
|
+
while (maskSet.hasBlock("func")) {
|
|
1228
|
+
const inl = maskSet.lastBlockOf("func");
|
|
1229
|
+
inlineFunctions.push(helpers.parseBlockAt(inl.toString(), 0));
|
|
1230
|
+
maskSet.mask(inl);
|
|
1231
|
+
}
|
|
1232
|
+
})
|
|
1233
|
+
;
|
|
1234
|
+
if (inlineFunctions.length) {
|
|
1235
|
+
inlineFunctions.forEach(func => {
|
|
1236
|
+
wat = wat.replace(func.toString(), `(ref.func ${func.$name})`)
|
|
1237
|
+
});
|
|
1238
|
+
wat = helpers.append(wat, inlineFunctions.map(func => `\n\t${func}\n`).join("\n"));
|
|
1239
|
+
}
|
|
1189
1240
|
const maskSetElem = new helpers.MaskSet(wat);
|
|
1190
1241
|
const elemSegments = new Array();
|
|
1191
1242
|
const needReference = new Set();
|
|
@@ -1982,8 +2033,8 @@ async function processCLI(compileCallback, PROCESS = process) {
|
|
|
1982
2033
|
wasmGenerator = `Uint8Array.of(${wasmhex.toString().match(/[a-f0-9]{2}/g).map(h => parseInt(h, 16))})`;
|
|
1983
2034
|
}
|
|
1984
2035
|
extension = "js";
|
|
1985
|
-
filecontent = String(
|
|
1986
|
-
|
|
2036
|
+
filecontent = String(`
|
|
2037
|
+
const view = ${wasmGenerator};
|
|
1987
2038
|
export let wasm = view.buffer;
|
|
1988
2039
|
|
|
1989
2040
|
wasm.module = null;
|
|
@@ -2009,8 +2060,8 @@ async function processCLI(compileCallback, PROCESS = process) {
|
|
|
2009
2060
|
|
|
2010
2061
|
export default wasm;`);
|
|
2011
2062
|
filecontent = filecontent.replaceAll(
|
|
2012
|
-
String(" ").repeat(filecontent.search(/\w/) - 1)
|
|
2013
|
-
|
|
2063
|
+
String(" ").repeat(filecontent.search(/\w/) - 1), ""
|
|
2064
|
+
);
|
|
2014
2065
|
}
|
|
2015
2066
|
else {
|
|
2016
2067
|
extension = "html";
|