Projekt

Obecné

Profil

Stáhnout (17 KB) Statistiky
| Větev: | Revize:
1
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2

    
3
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
4

    
5
function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }
6

    
7
import { isAnonymous, isInstruction } from "@webassemblyjs/ast";
8
import Long from "@xtuc/long";
9
var compact = false;
10
var space = " ";
11

    
12
var quote = function quote(str) {
13
  return "\"".concat(str, "\"");
14
};
15

    
16
function indent(nb) {
17
  return Array(nb).fill(space + space).join("");
18
} // TODO(sven): allow arbitrary ast nodes
19

    
20

    
21
export function print(n) {
22
  if (n.type === "Program") {
23
    return printProgram(n, 0);
24
  } else {
25
    throw new Error("Unsupported node in print of type: " + String(n.type));
26
  }
27
}
28

    
29
function printProgram(n, depth) {
30
  return n.body.reduce(function (acc, child) {
31
    if (child.type === "Module") {
32
      acc += printModule(child, depth + 1);
33
    }
34

    
35
    if (child.type === "Func") {
36
      acc += printFunc(child, depth + 1);
37
    }
38

    
39
    if (child.type === "BlockComment") {
40
      acc += printBlockComment(child);
41
    }
42

    
43
    if (child.type === "LeadingComment") {
44
      acc += printLeadingComment(child);
45
    }
46

    
47
    if (compact === false) {
48
      acc += "\n";
49
    }
50

    
51
    return acc;
52
  }, "");
53
}
54

    
55
function printTypeInstruction(n) {
56
  var out = "";
57
  out += "(";
58
  out += "type";
59
  out += space;
60

    
61
  if (n.id != null) {
62
    out += printIndex(n.id);
63
    out += space;
64
  }
65

    
66
  out += "(";
67
  out += "func";
68
  n.functype.params.forEach(function (param) {
69
    out += space;
70
    out += "(";
71
    out += "param";
72
    out += space;
73
    out += printFuncParam(param);
74
    out += ")";
75
  });
76
  n.functype.results.forEach(function (result) {
77
    out += space;
78
    out += "(";
79
    out += "result";
80
    out += space;
81
    out += result;
82
    out += ")";
83
  });
84
  out += ")"; // func
85

    
86
  out += ")";
87
  return out;
88
}
89

    
90
function printModule(n, depth) {
91
  var out = "(";
92
  out += "module";
93

    
94
  if (typeof n.id === "string") {
95
    out += space;
96
    out += n.id;
97
  }
98

    
99
  if (compact === false) {
100
    out += "\n";
101
  } else {
102
    out += space;
103
  }
104

    
105
  n.fields.forEach(function (field) {
106
    if (compact === false) {
107
      out += indent(depth);
108
    }
109

    
110
    switch (field.type) {
111
      case "Func":
112
        {
113
          out += printFunc(field, depth + 1);
114
          break;
115
        }
116

    
117
      case "TypeInstruction":
118
        {
119
          out += printTypeInstruction(field);
120
          break;
121
        }
122

    
123
      case "Table":
124
        {
125
          out += printTable(field);
126
          break;
127
        }
128

    
129
      case "Global":
130
        {
131
          out += printGlobal(field, depth + 1);
132
          break;
133
        }
134

    
135
      case "ModuleExport":
136
        {
137
          out += printModuleExport(field);
138
          break;
139
        }
140

    
141
      case "ModuleImport":
142
        {
143
          out += printModuleImport(field);
144
          break;
145
        }
146

    
147
      case "Memory":
148
        {
149
          out += printMemory(field);
150
          break;
151
        }
152

    
153
      case "BlockComment":
154
        {
155
          out += printBlockComment(field);
156
          break;
157
        }
158

    
159
      case "LeadingComment":
160
        {
161
          out += printLeadingComment(field);
162
          break;
163
        }
164

    
165
      case "Start":
166
        {
167
          out += printStart(field);
168
          break;
169
        }
170

    
171
      case "Elem":
172
        {
173
          out += printElem(field, depth);
174
          break;
175
        }
176

    
177
      case "Data":
178
        {
179
          out += printData(field, depth);
180
          break;
181
        }
182

    
183
      default:
184
        throw new Error("Unsupported node in printModule: " + String(field.type));
185
    }
186

    
187
    if (compact === false) {
188
      out += "\n";
189
    }
190
  });
191
  out += ")";
192
  return out;
193
}
194

    
195
function printData(n, depth) {
196
  var out = "";
197
  out += "(";
198
  out += "data";
199
  out += space;
200
  out += printIndex(n.memoryIndex);
201
  out += space;
202
  out += printInstruction(n.offset, depth);
203
  out += space;
204
  out += '"';
205
  n.init.values.forEach(function (byte) {
206
    // Avoid non-displayable characters
207
    if (byte <= 31 || byte == 34 || byte == 92 || byte >= 127) {
208
      out += "\\";
209
      out += ("00" + byte.toString(16)).substr(-2);
210
    } else if (byte > 255) {
211
      throw new Error("Unsupported byte in data segment: " + byte);
212
    } else {
213
      out += String.fromCharCode(byte);
214
    }
215
  });
216
  out += '"';
217
  out += ")";
218
  return out;
219
}
220

    
221
function printElem(n, depth) {
222
  var out = "";
223
  out += "(";
224
  out += "elem";
225
  out += space;
226
  out += printIndex(n.table);
227

    
228
  var _n$offset = _slicedToArray(n.offset, 1),
229
      firstOffset = _n$offset[0];
230

    
231
  out += space;
232
  out += "(";
233
  out += "offset";
234
  out += space;
235
  out += printInstruction(firstOffset, depth);
236
  out += ")";
237
  n.funcs.forEach(function (func) {
238
    out += space;
239
    out += printIndex(func);
240
  });
241
  out += ")";
242
  return out;
243
}
244

    
245
function printStart(n) {
246
  var out = "";
247
  out += "(";
248
  out += "start";
249
  out += space;
250
  out += printIndex(n.index);
251
  out += ")";
252
  return out;
253
}
254

    
255
function printLeadingComment(n) {
256
  // Don't print leading comments in compact mode
257
  if (compact === true) {
258
    return "";
259
  }
260

    
261
  var out = "";
262
  out += ";;";
263
  out += n.value;
264
  out += "\n";
265
  return out;
266
}
267

    
268
function printBlockComment(n) {
269
  // Don't print block comments in compact mode
270
  if (compact === true) {
271
    return "";
272
  }
273

    
274
  var out = "";
275
  out += "(;";
276
  out += n.value;
277
  out += ";)";
278
  out += "\n";
279
  return out;
280
}
281

    
282
function printSignature(n) {
283
  var out = "";
284
  n.params.forEach(function (param) {
285
    out += space;
286
    out += "(";
287
    out += "param";
288
    out += space;
289
    out += printFuncParam(param);
290
    out += ")";
291
  });
292
  n.results.forEach(function (result) {
293
    out += space;
294
    out += "(";
295
    out += "result";
296
    out += space;
297
    out += result;
298
    out += ")";
299
  });
300
  return out;
301
}
302

    
303
function printModuleImportDescr(n) {
304
  var out = "";
305

    
306
  if (n.type === "FuncImportDescr") {
307
    out += "(";
308
    out += "func";
309

    
310
    if (isAnonymous(n.id) === false) {
311
      out += space;
312
      out += printIdentifier(n.id);
313
    }
314

    
315
    out += printSignature(n.signature);
316
    out += ")";
317
  }
318

    
319
  if (n.type === "GlobalType") {
320
    out += "(";
321
    out += "global";
322
    out += space;
323
    out += printGlobalType(n);
324
    out += ")";
325
  }
326

    
327
  if (n.type === "Table") {
328
    out += printTable(n);
329
  }
330

    
331
  return out;
332
}
333

    
334
function printModuleImport(n) {
335
  var out = "";
336
  out += "(";
337
  out += "import";
338
  out += space;
339
  out += quote(n.module);
340
  out += space;
341
  out += quote(n.name);
342
  out += space;
343
  out += printModuleImportDescr(n.descr);
344
  out += ")";
345
  return out;
346
}
347

    
348
function printGlobalType(n) {
349
  var out = "";
350

    
351
  if (n.mutability === "var") {
352
    out += "(";
353
    out += "mut";
354
    out += space;
355
    out += n.valtype;
356
    out += ")";
357
  } else {
358
    out += n.valtype;
359
  }
360

    
361
  return out;
362
}
363

    
364
function printGlobal(n, depth) {
365
  var out = "";
366
  out += "(";
367
  out += "global";
368
  out += space;
369

    
370
  if (n.name != null && isAnonymous(n.name) === false) {
371
    out += printIdentifier(n.name);
372
    out += space;
373
  }
374

    
375
  out += printGlobalType(n.globalType);
376
  out += space;
377
  n.init.forEach(function (i) {
378
    out += printInstruction(i, depth + 1);
379
  });
380
  out += ")";
381
  return out;
382
}
383

    
384
function printTable(n) {
385
  var out = "";
386
  out += "(";
387
  out += "table";
388
  out += space;
389

    
390
  if (n.name != null && isAnonymous(n.name) === false) {
391
    out += printIdentifier(n.name);
392
    out += space;
393
  }
394

    
395
  out += printLimit(n.limits);
396
  out += space;
397
  out += n.elementType;
398
  out += ")";
399
  return out;
400
}
401

    
402
function printFuncParam(n) {
403
  var out = "";
404

    
405
  if (typeof n.id === "string") {
406
    out += "$" + n.id;
407
    out += space;
408
  }
409

    
410
  out += n.valtype;
411
  return out;
412
}
413

    
414
function printFunc(n, depth) {
415
  var out = "";
416
  out += "(";
417
  out += "func";
418

    
419
  if (n.name != null) {
420
    if (n.name.type === "Identifier" && isAnonymous(n.name) === false) {
421
      out += space;
422
      out += printIdentifier(n.name);
423
    }
424
  }
425

    
426
  if (n.signature.type === "Signature") {
427
    out += printSignature(n.signature);
428
  } else {
429
    var index = n.signature;
430
    out += space;
431
    out += "(";
432
    out += "type";
433
    out += space;
434
    out += printIndex(index);
435
    out += ")";
436
  }
437

    
438
  if (n.body.length > 0) {
439
    // func is empty since we ignore the default end instruction
440
    if (n.body.length === 1 && n.body[0].id === "end") {
441
      out += ")";
442
      return out;
443
    }
444

    
445
    if (compact === false) {
446
      out += "\n";
447
    }
448

    
449
    n.body.forEach(function (i) {
450
      if (i.id !== "end") {
451
        out += indent(depth);
452
        out += printInstruction(i, depth);
453

    
454
        if (compact === false) {
455
          out += "\n";
456
        }
457
      }
458
    });
459
    out += indent(depth - 1) + ")";
460
  } else {
461
    out += ")";
462
  }
463

    
464
  return out;
465
}
466

    
467
function printInstruction(n, depth) {
468
  switch (n.type) {
469
    case "Instr":
470
      // $FlowIgnore
471
      return printGenericInstruction(n, depth + 1);
472

    
473
    case "BlockInstruction":
474
      // $FlowIgnore
475
      return printBlockInstruction(n, depth + 1);
476

    
477
    case "IfInstruction":
478
      // $FlowIgnore
479
      return printIfInstruction(n, depth + 1);
480

    
481
    case "CallInstruction":
482
      // $FlowIgnore
483
      return printCallInstruction(n, depth + 1);
484

    
485
    case "CallIndirectInstruction":
486
      // $FlowIgnore
487
      return printCallIndirectIntruction(n, depth + 1);
488

    
489
    case "LoopInstruction":
490
      // $FlowIgnore
491
      return printLoopInstruction(n, depth + 1);
492

    
493
    default:
494
      throw new Error("Unsupported instruction: " + JSON.stringify(n.type));
495
  }
496
}
497

    
498
function printCallIndirectIntruction(n, depth) {
499
  var out = "";
500
  out += "(";
501
  out += "call_indirect";
502

    
503
  if (n.signature.type === "Signature") {
504
    out += printSignature(n.signature);
505
  } else if (n.signature.type === "Identifier") {
506
    out += space;
507
    out += "(";
508
    out += "type";
509
    out += space;
510
    out += printIdentifier(n.signature);
511
    out += ")";
512
  } else {
513
    throw new Error("CallIndirectInstruction: unsupported signature " + JSON.stringify(n.signature.type));
514
  }
515

    
516
  out += space;
517

    
518
  if (n.intrs != null) {
519
    // $FlowIgnore
520
    n.intrs.forEach(function (i, index) {
521
      // $FlowIgnore
522
      out += printInstruction(i, depth + 1); // $FlowIgnore
523

    
524
      if (index !== n.intrs.length - 1) {
525
        out += space;
526
      }
527
    });
528
  }
529

    
530
  out += ")";
531
  return out;
532
}
533

    
534
function printLoopInstruction(n, depth) {
535
  var out = "";
536
  out += "(";
537
  out += "loop";
538

    
539
  if (n.label != null && isAnonymous(n.label) === false) {
540
    out += space;
541
    out += printIdentifier(n.label);
542
  }
543

    
544
  if (typeof n.resulttype === "string") {
545
    out += space;
546
    out += "(";
547
    out += "result";
548
    out += space;
549
    out += n.resulttype;
550
    out += ")";
551
  }
552

    
553
  if (n.instr.length > 0) {
554
    n.instr.forEach(function (e) {
555
      if (compact === false) {
556
        out += "\n";
557
      }
558

    
559
      out += indent(depth);
560
      out += printInstruction(e, depth + 1);
561
    });
562

    
563
    if (compact === false) {
564
      out += "\n";
565
      out += indent(depth - 1);
566
    }
567
  }
568

    
569
  out += ")";
570
  return out;
571
}
572

    
573
function printCallInstruction(n, depth) {
574
  var out = "";
575
  out += "(";
576
  out += "call";
577
  out += space;
578
  out += printIndex(n.index);
579

    
580
  if (_typeof(n.instrArgs) === "object") {
581
    // $FlowIgnore
582
    n.instrArgs.forEach(function (arg) {
583
      out += space;
584
      out += printFuncInstructionArg(arg, depth + 1);
585
    });
586
  }
587

    
588
  out += ")";
589
  return out;
590
}
591

    
592
function printIfInstruction(n, depth) {
593
  var out = "";
594
  out += "(";
595
  out += "if";
596

    
597
  if (n.testLabel != null && isAnonymous(n.testLabel) === false) {
598
    out += space;
599
    out += printIdentifier(n.testLabel);
600
  }
601

    
602
  if (typeof n.result === "string") {
603
    out += space;
604
    out += "(";
605
    out += "result";
606
    out += space;
607
    out += n.result;
608
    out += ")";
609
  }
610

    
611
  if (n.test.length > 0) {
612
    out += space;
613
    n.test.forEach(function (i) {
614
      out += printInstruction(i, depth + 1);
615
    });
616
  }
617

    
618
  if (n.consequent.length > 0) {
619
    if (compact === false) {
620
      out += "\n";
621
    }
622

    
623
    out += indent(depth);
624
    out += "(";
625
    out += "then";
626
    depth++;
627
    n.consequent.forEach(function (i) {
628
      if (compact === false) {
629
        out += "\n";
630
      }
631

    
632
      out += indent(depth);
633
      out += printInstruction(i, depth + 1);
634
    });
635
    depth--;
636

    
637
    if (compact === false) {
638
      out += "\n";
639
      out += indent(depth);
640
    }
641

    
642
    out += ")";
643
  } else {
644
    if (compact === false) {
645
      out += "\n";
646
      out += indent(depth);
647
    }
648

    
649
    out += "(";
650
    out += "then";
651
    out += ")";
652
  }
653

    
654
  if (n.alternate.length > 0) {
655
    if (compact === false) {
656
      out += "\n";
657
    }
658

    
659
    out += indent(depth);
660
    out += "(";
661
    out += "else";
662
    depth++;
663
    n.alternate.forEach(function (i) {
664
      if (compact === false) {
665
        out += "\n";
666
      }
667

    
668
      out += indent(depth);
669
      out += printInstruction(i, depth + 1);
670
    });
671
    depth--;
672

    
673
    if (compact === false) {
674
      out += "\n";
675
      out += indent(depth);
676
    }
677

    
678
    out += ")";
679
  } else {
680
    if (compact === false) {
681
      out += "\n";
682
      out += indent(depth);
683
    }
684

    
685
    out += "(";
686
    out += "else";
687
    out += ")";
688
  }
689

    
690
  if (compact === false) {
691
    out += "\n";
692
    out += indent(depth - 1);
693
  }
694

    
695
  out += ")";
696
  return out;
697
}
698

    
699
function printBlockInstruction(n, depth) {
700
  var out = "";
701
  out += "(";
702
  out += "block";
703

    
704
  if (n.label != null && isAnonymous(n.label) === false) {
705
    out += space;
706
    out += printIdentifier(n.label);
707
  }
708

    
709
  if (typeof n.result === "string") {
710
    out += space;
711
    out += "(";
712
    out += "result";
713
    out += space;
714
    out += n.result;
715
    out += ")";
716
  }
717

    
718
  if (n.instr.length > 0) {
719
    n.instr.forEach(function (i) {
720
      if (compact === false) {
721
        out += "\n";
722
      }
723

    
724
      out += indent(depth);
725
      out += printInstruction(i, depth + 1);
726
    });
727

    
728
    if (compact === false) {
729
      out += "\n";
730
    }
731

    
732
    out += indent(depth - 1);
733
    out += ")";
734
  } else {
735
    out += ")";
736
  }
737

    
738
  return out;
739
}
740

    
741
function printGenericInstruction(n, depth) {
742
  var out = "";
743
  out += "(";
744

    
745
  if (typeof n.object === "string") {
746
    out += n.object;
747
    out += ".";
748
  }
749

    
750
  out += n.id;
751
  n.args.forEach(function (arg) {
752
    out += space;
753
    out += printFuncInstructionArg(arg, depth + 1);
754
  });
755
  out += ")";
756
  return out;
757
}
758

    
759
function printLongNumberLiteral(n) {
760
  if (typeof n.raw === "string") {
761
    return n.raw;
762
  }
763

    
764
  var _n$value = n.value,
765
      low = _n$value.low,
766
      high = _n$value.high;
767
  var v = new Long(low, high);
768
  return v.toString();
769
}
770

    
771
function printFloatLiteral(n) {
772
  if (typeof n.raw === "string") {
773
    return n.raw;
774
  }
775

    
776
  return String(n.value);
777
}
778

    
779
function printFuncInstructionArg(n, depth) {
780
  var out = "";
781

    
782
  if (n.type === "NumberLiteral") {
783
    out += printNumberLiteral(n);
784
  }
785

    
786
  if (n.type === "LongNumberLiteral") {
787
    out += printLongNumberLiteral(n);
788
  }
789

    
790
  if (n.type === "Identifier" && isAnonymous(n) === false) {
791
    out += printIdentifier(n);
792
  }
793

    
794
  if (n.type === "ValtypeLiteral") {
795
    out += n.name;
796
  }
797

    
798
  if (n.type === "FloatLiteral") {
799
    out += printFloatLiteral(n);
800
  }
801

    
802
  if (isInstruction(n)) {
803
    out += printInstruction(n, depth + 1);
804
  }
805

    
806
  return out;
807
}
808

    
809
function printNumberLiteral(n) {
810
  if (typeof n.raw === "string") {
811
    return n.raw;
812
  }
813

    
814
  return String(n.value);
815
}
816

    
817
function printModuleExport(n) {
818
  var out = "";
819
  out += "(";
820
  out += "export";
821
  out += space;
822
  out += quote(n.name);
823

    
824
  if (n.descr.exportType === "Func") {
825
    out += space;
826
    out += "(";
827
    out += "func";
828
    out += space;
829
    out += printIndex(n.descr.id);
830
    out += ")";
831
  } else if (n.descr.exportType === "Global") {
832
    out += space;
833
    out += "(";
834
    out += "global";
835
    out += space;
836
    out += printIndex(n.descr.id);
837
    out += ")";
838
  } else if (n.descr.exportType === "Memory" || n.descr.exportType === "Mem") {
839
    out += space;
840
    out += "(";
841
    out += "memory";
842
    out += space;
843
    out += printIndex(n.descr.id);
844
    out += ")";
845
  } else if (n.descr.exportType === "Table") {
846
    out += space;
847
    out += "(";
848
    out += "table";
849
    out += space;
850
    out += printIndex(n.descr.id);
851
    out += ")";
852
  } else {
853
    throw new Error("printModuleExport: unknown type: " + n.descr.exportType);
854
  }
855

    
856
  out += ")";
857
  return out;
858
}
859

    
860
function printIdentifier(n) {
861
  return "$" + n.value;
862
}
863

    
864
function printIndex(n) {
865
  if (n.type === "Identifier") {
866
    return printIdentifier(n);
867
  } else if (n.type === "NumberLiteral") {
868
    return printNumberLiteral(n);
869
  } else {
870
    throw new Error("Unsupported index: " + n.type);
871
  }
872
}
873

    
874
function printMemory(n) {
875
  var out = "";
876
  out += "(";
877
  out += "memory";
878

    
879
  if (n.id != null) {
880
    out += space;
881
    out += printIndex(n.id);
882
    out += space;
883
  }
884

    
885
  out += printLimit(n.limits);
886
  out += ")";
887
  return out;
888
}
889

    
890
function printLimit(n) {
891
  var out = "";
892
  out += n.min + "";
893

    
894
  if (n.max != null) {
895
    out += space;
896
    out += String(n.max);
897
  }
898

    
899
  return out;
900
}
    (1-1/1)