Projekt

Obecné

Profil

Stáhnout (17.3 KB) Statistiky
| Větev: | Revize:
1
"use strict";
2

    
3
Object.defineProperty(exports, "__esModule", {
4
  value: true
5
});
6
exports.print = print;
7

    
8
var _ast = require("@webassemblyjs/ast");
9

    
10
var _long = _interopRequireDefault(require("@xtuc/long"));
11

    
12
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13

    
14
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); }
15

    
16
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; }
17

    
18
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"); } }
19

    
20
var compact = false;
21
var space = " ";
22

    
23
var quote = function quote(str) {
24
  return "\"".concat(str, "\"");
25
};
26

    
27
function indent(nb) {
28
  return Array(nb).fill(space + space).join("");
29
} // TODO(sven): allow arbitrary ast nodes
30

    
31

    
32
function print(n) {
33
  if (n.type === "Program") {
34
    return printProgram(n, 0);
35
  } else {
36
    throw new Error("Unsupported node in print of type: " + String(n.type));
37
  }
38
}
39

    
40
function printProgram(n, depth) {
41
  return n.body.reduce(function (acc, child) {
42
    if (child.type === "Module") {
43
      acc += printModule(child, depth + 1);
44
    }
45

    
46
    if (child.type === "Func") {
47
      acc += printFunc(child, depth + 1);
48
    }
49

    
50
    if (child.type === "BlockComment") {
51
      acc += printBlockComment(child);
52
    }
53

    
54
    if (child.type === "LeadingComment") {
55
      acc += printLeadingComment(child);
56
    }
57

    
58
    if (compact === false) {
59
      acc += "\n";
60
    }
61

    
62
    return acc;
63
  }, "");
64
}
65

    
66
function printTypeInstruction(n) {
67
  var out = "";
68
  out += "(";
69
  out += "type";
70
  out += space;
71

    
72
  if (n.id != null) {
73
    out += printIndex(n.id);
74
    out += space;
75
  }
76

    
77
  out += "(";
78
  out += "func";
79
  n.functype.params.forEach(function (param) {
80
    out += space;
81
    out += "(";
82
    out += "param";
83
    out += space;
84
    out += printFuncParam(param);
85
    out += ")";
86
  });
87
  n.functype.results.forEach(function (result) {
88
    out += space;
89
    out += "(";
90
    out += "result";
91
    out += space;
92
    out += result;
93
    out += ")";
94
  });
95
  out += ")"; // func
96

    
97
  out += ")";
98
  return out;
99
}
100

    
101
function printModule(n, depth) {
102
  var out = "(";
103
  out += "module";
104

    
105
  if (typeof n.id === "string") {
106
    out += space;
107
    out += n.id;
108
  }
109

    
110
  if (compact === false) {
111
    out += "\n";
112
  } else {
113
    out += space;
114
  }
115

    
116
  n.fields.forEach(function (field) {
117
    if (compact === false) {
118
      out += indent(depth);
119
    }
120

    
121
    switch (field.type) {
122
      case "Func":
123
        {
124
          out += printFunc(field, depth + 1);
125
          break;
126
        }
127

    
128
      case "TypeInstruction":
129
        {
130
          out += printTypeInstruction(field);
131
          break;
132
        }
133

    
134
      case "Table":
135
        {
136
          out += printTable(field);
137
          break;
138
        }
139

    
140
      case "Global":
141
        {
142
          out += printGlobal(field, depth + 1);
143
          break;
144
        }
145

    
146
      case "ModuleExport":
147
        {
148
          out += printModuleExport(field);
149
          break;
150
        }
151

    
152
      case "ModuleImport":
153
        {
154
          out += printModuleImport(field);
155
          break;
156
        }
157

    
158
      case "Memory":
159
        {
160
          out += printMemory(field);
161
          break;
162
        }
163

    
164
      case "BlockComment":
165
        {
166
          out += printBlockComment(field);
167
          break;
168
        }
169

    
170
      case "LeadingComment":
171
        {
172
          out += printLeadingComment(field);
173
          break;
174
        }
175

    
176
      case "Start":
177
        {
178
          out += printStart(field);
179
          break;
180
        }
181

    
182
      case "Elem":
183
        {
184
          out += printElem(field, depth);
185
          break;
186
        }
187

    
188
      case "Data":
189
        {
190
          out += printData(field, depth);
191
          break;
192
        }
193

    
194
      default:
195
        throw new Error("Unsupported node in printModule: " + String(field.type));
196
    }
197

    
198
    if (compact === false) {
199
      out += "\n";
200
    }
201
  });
202
  out += ")";
203
  return out;
204
}
205

    
206
function printData(n, depth) {
207
  var out = "";
208
  out += "(";
209
  out += "data";
210
  out += space;
211
  out += printIndex(n.memoryIndex);
212
  out += space;
213
  out += printInstruction(n.offset, depth);
214
  out += space;
215
  out += '"';
216
  n.init.values.forEach(function (byte) {
217
    // Avoid non-displayable characters
218
    if (byte <= 31 || byte == 34 || byte == 92 || byte >= 127) {
219
      out += "\\";
220
      out += ("00" + byte.toString(16)).substr(-2);
221
    } else if (byte > 255) {
222
      throw new Error("Unsupported byte in data segment: " + byte);
223
    } else {
224
      out += String.fromCharCode(byte);
225
    }
226
  });
227
  out += '"';
228
  out += ")";
229
  return out;
230
}
231

    
232
function printElem(n, depth) {
233
  var out = "";
234
  out += "(";
235
  out += "elem";
236
  out += space;
237
  out += printIndex(n.table);
238

    
239
  var _n$offset = _slicedToArray(n.offset, 1),
240
      firstOffset = _n$offset[0];
241

    
242
  out += space;
243
  out += "(";
244
  out += "offset";
245
  out += space;
246
  out += printInstruction(firstOffset, depth);
247
  out += ")";
248
  n.funcs.forEach(function (func) {
249
    out += space;
250
    out += printIndex(func);
251
  });
252
  out += ")";
253
  return out;
254
}
255

    
256
function printStart(n) {
257
  var out = "";
258
  out += "(";
259
  out += "start";
260
  out += space;
261
  out += printIndex(n.index);
262
  out += ")";
263
  return out;
264
}
265

    
266
function printLeadingComment(n) {
267
  // Don't print leading comments in compact mode
268
  if (compact === true) {
269
    return "";
270
  }
271

    
272
  var out = "";
273
  out += ";;";
274
  out += n.value;
275
  out += "\n";
276
  return out;
277
}
278

    
279
function printBlockComment(n) {
280
  // Don't print block comments in compact mode
281
  if (compact === true) {
282
    return "";
283
  }
284

    
285
  var out = "";
286
  out += "(;";
287
  out += n.value;
288
  out += ";)";
289
  out += "\n";
290
  return out;
291
}
292

    
293
function printSignature(n) {
294
  var out = "";
295
  n.params.forEach(function (param) {
296
    out += space;
297
    out += "(";
298
    out += "param";
299
    out += space;
300
    out += printFuncParam(param);
301
    out += ")";
302
  });
303
  n.results.forEach(function (result) {
304
    out += space;
305
    out += "(";
306
    out += "result";
307
    out += space;
308
    out += result;
309
    out += ")";
310
  });
311
  return out;
312
}
313

    
314
function printModuleImportDescr(n) {
315
  var out = "";
316

    
317
  if (n.type === "FuncImportDescr") {
318
    out += "(";
319
    out += "func";
320

    
321
    if ((0, _ast.isAnonymous)(n.id) === false) {
322
      out += space;
323
      out += printIdentifier(n.id);
324
    }
325

    
326
    out += printSignature(n.signature);
327
    out += ")";
328
  }
329

    
330
  if (n.type === "GlobalType") {
331
    out += "(";
332
    out += "global";
333
    out += space;
334
    out += printGlobalType(n);
335
    out += ")";
336
  }
337

    
338
  if (n.type === "Table") {
339
    out += printTable(n);
340
  }
341

    
342
  return out;
343
}
344

    
345
function printModuleImport(n) {
346
  var out = "";
347
  out += "(";
348
  out += "import";
349
  out += space;
350
  out += quote(n.module);
351
  out += space;
352
  out += quote(n.name);
353
  out += space;
354
  out += printModuleImportDescr(n.descr);
355
  out += ")";
356
  return out;
357
}
358

    
359
function printGlobalType(n) {
360
  var out = "";
361

    
362
  if (n.mutability === "var") {
363
    out += "(";
364
    out += "mut";
365
    out += space;
366
    out += n.valtype;
367
    out += ")";
368
  } else {
369
    out += n.valtype;
370
  }
371

    
372
  return out;
373
}
374

    
375
function printGlobal(n, depth) {
376
  var out = "";
377
  out += "(";
378
  out += "global";
379
  out += space;
380

    
381
  if (n.name != null && (0, _ast.isAnonymous)(n.name) === false) {
382
    out += printIdentifier(n.name);
383
    out += space;
384
  }
385

    
386
  out += printGlobalType(n.globalType);
387
  out += space;
388
  n.init.forEach(function (i) {
389
    out += printInstruction(i, depth + 1);
390
  });
391
  out += ")";
392
  return out;
393
}
394

    
395
function printTable(n) {
396
  var out = "";
397
  out += "(";
398
  out += "table";
399
  out += space;
400

    
401
  if (n.name != null && (0, _ast.isAnonymous)(n.name) === false) {
402
    out += printIdentifier(n.name);
403
    out += space;
404
  }
405

    
406
  out += printLimit(n.limits);
407
  out += space;
408
  out += n.elementType;
409
  out += ")";
410
  return out;
411
}
412

    
413
function printFuncParam(n) {
414
  var out = "";
415

    
416
  if (typeof n.id === "string") {
417
    out += "$" + n.id;
418
    out += space;
419
  }
420

    
421
  out += n.valtype;
422
  return out;
423
}
424

    
425
function printFunc(n, depth) {
426
  var out = "";
427
  out += "(";
428
  out += "func";
429

    
430
  if (n.name != null) {
431
    if (n.name.type === "Identifier" && (0, _ast.isAnonymous)(n.name) === false) {
432
      out += space;
433
      out += printIdentifier(n.name);
434
    }
435
  }
436

    
437
  if (n.signature.type === "Signature") {
438
    out += printSignature(n.signature);
439
  } else {
440
    var index = n.signature;
441
    out += space;
442
    out += "(";
443
    out += "type";
444
    out += space;
445
    out += printIndex(index);
446
    out += ")";
447
  }
448

    
449
  if (n.body.length > 0) {
450
    // func is empty since we ignore the default end instruction
451
    if (n.body.length === 1 && n.body[0].id === "end") {
452
      out += ")";
453
      return out;
454
    }
455

    
456
    if (compact === false) {
457
      out += "\n";
458
    }
459

    
460
    n.body.forEach(function (i) {
461
      if (i.id !== "end") {
462
        out += indent(depth);
463
        out += printInstruction(i, depth);
464

    
465
        if (compact === false) {
466
          out += "\n";
467
        }
468
      }
469
    });
470
    out += indent(depth - 1) + ")";
471
  } else {
472
    out += ")";
473
  }
474

    
475
  return out;
476
}
477

    
478
function printInstruction(n, depth) {
479
  switch (n.type) {
480
    case "Instr":
481
      // $FlowIgnore
482
      return printGenericInstruction(n, depth + 1);
483

    
484
    case "BlockInstruction":
485
      // $FlowIgnore
486
      return printBlockInstruction(n, depth + 1);
487

    
488
    case "IfInstruction":
489
      // $FlowIgnore
490
      return printIfInstruction(n, depth + 1);
491

    
492
    case "CallInstruction":
493
      // $FlowIgnore
494
      return printCallInstruction(n, depth + 1);
495

    
496
    case "CallIndirectInstruction":
497
      // $FlowIgnore
498
      return printCallIndirectIntruction(n, depth + 1);
499

    
500
    case "LoopInstruction":
501
      // $FlowIgnore
502
      return printLoopInstruction(n, depth + 1);
503

    
504
    default:
505
      throw new Error("Unsupported instruction: " + JSON.stringify(n.type));
506
  }
507
}
508

    
509
function printCallIndirectIntruction(n, depth) {
510
  var out = "";
511
  out += "(";
512
  out += "call_indirect";
513

    
514
  if (n.signature.type === "Signature") {
515
    out += printSignature(n.signature);
516
  } else if (n.signature.type === "Identifier") {
517
    out += space;
518
    out += "(";
519
    out += "type";
520
    out += space;
521
    out += printIdentifier(n.signature);
522
    out += ")";
523
  } else {
524
    throw new Error("CallIndirectInstruction: unsupported signature " + JSON.stringify(n.signature.type));
525
  }
526

    
527
  out += space;
528

    
529
  if (n.intrs != null) {
530
    // $FlowIgnore
531
    n.intrs.forEach(function (i, index) {
532
      // $FlowIgnore
533
      out += printInstruction(i, depth + 1); // $FlowIgnore
534

    
535
      if (index !== n.intrs.length - 1) {
536
        out += space;
537
      }
538
    });
539
  }
540

    
541
  out += ")";
542
  return out;
543
}
544

    
545
function printLoopInstruction(n, depth) {
546
  var out = "";
547
  out += "(";
548
  out += "loop";
549

    
550
  if (n.label != null && (0, _ast.isAnonymous)(n.label) === false) {
551
    out += space;
552
    out += printIdentifier(n.label);
553
  }
554

    
555
  if (typeof n.resulttype === "string") {
556
    out += space;
557
    out += "(";
558
    out += "result";
559
    out += space;
560
    out += n.resulttype;
561
    out += ")";
562
  }
563

    
564
  if (n.instr.length > 0) {
565
    n.instr.forEach(function (e) {
566
      if (compact === false) {
567
        out += "\n";
568
      }
569

    
570
      out += indent(depth);
571
      out += printInstruction(e, depth + 1);
572
    });
573

    
574
    if (compact === false) {
575
      out += "\n";
576
      out += indent(depth - 1);
577
    }
578
  }
579

    
580
  out += ")";
581
  return out;
582
}
583

    
584
function printCallInstruction(n, depth) {
585
  var out = "";
586
  out += "(";
587
  out += "call";
588
  out += space;
589
  out += printIndex(n.index);
590

    
591
  if (_typeof(n.instrArgs) === "object") {
592
    // $FlowIgnore
593
    n.instrArgs.forEach(function (arg) {
594
      out += space;
595
      out += printFuncInstructionArg(arg, depth + 1);
596
    });
597
  }
598

    
599
  out += ")";
600
  return out;
601
}
602

    
603
function printIfInstruction(n, depth) {
604
  var out = "";
605
  out += "(";
606
  out += "if";
607

    
608
  if (n.testLabel != null && (0, _ast.isAnonymous)(n.testLabel) === false) {
609
    out += space;
610
    out += printIdentifier(n.testLabel);
611
  }
612

    
613
  if (typeof n.result === "string") {
614
    out += space;
615
    out += "(";
616
    out += "result";
617
    out += space;
618
    out += n.result;
619
    out += ")";
620
  }
621

    
622
  if (n.test.length > 0) {
623
    out += space;
624
    n.test.forEach(function (i) {
625
      out += printInstruction(i, depth + 1);
626
    });
627
  }
628

    
629
  if (n.consequent.length > 0) {
630
    if (compact === false) {
631
      out += "\n";
632
    }
633

    
634
    out += indent(depth);
635
    out += "(";
636
    out += "then";
637
    depth++;
638
    n.consequent.forEach(function (i) {
639
      if (compact === false) {
640
        out += "\n";
641
      }
642

    
643
      out += indent(depth);
644
      out += printInstruction(i, depth + 1);
645
    });
646
    depth--;
647

    
648
    if (compact === false) {
649
      out += "\n";
650
      out += indent(depth);
651
    }
652

    
653
    out += ")";
654
  } else {
655
    if (compact === false) {
656
      out += "\n";
657
      out += indent(depth);
658
    }
659

    
660
    out += "(";
661
    out += "then";
662
    out += ")";
663
  }
664

    
665
  if (n.alternate.length > 0) {
666
    if (compact === false) {
667
      out += "\n";
668
    }
669

    
670
    out += indent(depth);
671
    out += "(";
672
    out += "else";
673
    depth++;
674
    n.alternate.forEach(function (i) {
675
      if (compact === false) {
676
        out += "\n";
677
      }
678

    
679
      out += indent(depth);
680
      out += printInstruction(i, depth + 1);
681
    });
682
    depth--;
683

    
684
    if (compact === false) {
685
      out += "\n";
686
      out += indent(depth);
687
    }
688

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

    
696
    out += "(";
697
    out += "else";
698
    out += ")";
699
  }
700

    
701
  if (compact === false) {
702
    out += "\n";
703
    out += indent(depth - 1);
704
  }
705

    
706
  out += ")";
707
  return out;
708
}
709

    
710
function printBlockInstruction(n, depth) {
711
  var out = "";
712
  out += "(";
713
  out += "block";
714

    
715
  if (n.label != null && (0, _ast.isAnonymous)(n.label) === false) {
716
    out += space;
717
    out += printIdentifier(n.label);
718
  }
719

    
720
  if (typeof n.result === "string") {
721
    out += space;
722
    out += "(";
723
    out += "result";
724
    out += space;
725
    out += n.result;
726
    out += ")";
727
  }
728

    
729
  if (n.instr.length > 0) {
730
    n.instr.forEach(function (i) {
731
      if (compact === false) {
732
        out += "\n";
733
      }
734

    
735
      out += indent(depth);
736
      out += printInstruction(i, depth + 1);
737
    });
738

    
739
    if (compact === false) {
740
      out += "\n";
741
    }
742

    
743
    out += indent(depth - 1);
744
    out += ")";
745
  } else {
746
    out += ")";
747
  }
748

    
749
  return out;
750
}
751

    
752
function printGenericInstruction(n, depth) {
753
  var out = "";
754
  out += "(";
755

    
756
  if (typeof n.object === "string") {
757
    out += n.object;
758
    out += ".";
759
  }
760

    
761
  out += n.id;
762
  n.args.forEach(function (arg) {
763
    out += space;
764
    out += printFuncInstructionArg(arg, depth + 1);
765
  });
766
  out += ")";
767
  return out;
768
}
769

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

    
775
  var _n$value = n.value,
776
      low = _n$value.low,
777
      high = _n$value.high;
778
  var v = new _long.default(low, high);
779
  return v.toString();
780
}
781

    
782
function printFloatLiteral(n) {
783
  if (typeof n.raw === "string") {
784
    return n.raw;
785
  }
786

    
787
  return String(n.value);
788
}
789

    
790
function printFuncInstructionArg(n, depth) {
791
  var out = "";
792

    
793
  if (n.type === "NumberLiteral") {
794
    out += printNumberLiteral(n);
795
  }
796

    
797
  if (n.type === "LongNumberLiteral") {
798
    out += printLongNumberLiteral(n);
799
  }
800

    
801
  if (n.type === "Identifier" && (0, _ast.isAnonymous)(n) === false) {
802
    out += printIdentifier(n);
803
  }
804

    
805
  if (n.type === "ValtypeLiteral") {
806
    out += n.name;
807
  }
808

    
809
  if (n.type === "FloatLiteral") {
810
    out += printFloatLiteral(n);
811
  }
812

    
813
  if ((0, _ast.isInstruction)(n)) {
814
    out += printInstruction(n, depth + 1);
815
  }
816

    
817
  return out;
818
}
819

    
820
function printNumberLiteral(n) {
821
  if (typeof n.raw === "string") {
822
    return n.raw;
823
  }
824

    
825
  return String(n.value);
826
}
827

    
828
function printModuleExport(n) {
829
  var out = "";
830
  out += "(";
831
  out += "export";
832
  out += space;
833
  out += quote(n.name);
834

    
835
  if (n.descr.exportType === "Func") {
836
    out += space;
837
    out += "(";
838
    out += "func";
839
    out += space;
840
    out += printIndex(n.descr.id);
841
    out += ")";
842
  } else if (n.descr.exportType === "Global") {
843
    out += space;
844
    out += "(";
845
    out += "global";
846
    out += space;
847
    out += printIndex(n.descr.id);
848
    out += ")";
849
  } else if (n.descr.exportType === "Memory" || n.descr.exportType === "Mem") {
850
    out += space;
851
    out += "(";
852
    out += "memory";
853
    out += space;
854
    out += printIndex(n.descr.id);
855
    out += ")";
856
  } else if (n.descr.exportType === "Table") {
857
    out += space;
858
    out += "(";
859
    out += "table";
860
    out += space;
861
    out += printIndex(n.descr.id);
862
    out += ")";
863
  } else {
864
    throw new Error("printModuleExport: unknown type: " + n.descr.exportType);
865
  }
866

    
867
  out += ")";
868
  return out;
869
}
870

    
871
function printIdentifier(n) {
872
  return "$" + n.value;
873
}
874

    
875
function printIndex(n) {
876
  if (n.type === "Identifier") {
877
    return printIdentifier(n);
878
  } else if (n.type === "NumberLiteral") {
879
    return printNumberLiteral(n);
880
  } else {
881
    throw new Error("Unsupported index: " + n.type);
882
  }
883
}
884

    
885
function printMemory(n) {
886
  var out = "";
887
  out += "(";
888
  out += "memory";
889

    
890
  if (n.id != null) {
891
    out += space;
892
    out += printIndex(n.id);
893
    out += space;
894
  }
895

    
896
  out += printLimit(n.limits);
897
  out += ")";
898
  return out;
899
}
900

    
901
function printLimit(n) {
902
  var out = "";
903
  out += n.min + "";
904

    
905
  if (n.max != null) {
906
    out += space;
907
    out += String(n.max);
908
  }
909

    
910
  return out;
911
}
    (1-1/1)