Code dump
[remote-dom-vm] / vm / src / vm.min.js.template
1 #define // This is the master file for minified source, containing various tricks to shrink it as far as possible.
2 #define // After being fed through gpp, all leading whitespace on every line is removed, and then all line breaks are removed.
3 #define // End result, an ECMAScript module of fully minified code.
4
5 #define Opcode.CreateElement 0
6 #define Opcode.CreateSvgElement 1
7 #define Opcode.CreateTextNode 2
8 #define Opcode.CreateComment 3
9 #define Opcode.CreateDocumentFragment 4
10 #define Opcode.SetData 5
11 #define Opcode.SetAttribute 6
12 #define Opcode.RemoveAttribute 7
13 #define Opcode.AppendChild 8
14 #define Opcode.InsertBefore 9
15 #define Opcode.Free 10
16
17 #define // Global variables (the textDecoder/var1 collision is fine)
18 #define textDecoder t
19 #define readString a
20 #define // Local variables of execute(), readString() and maybe a little else
21 #define instructions e
22 #define nodes s
23 #define offset b
24 #define var1 t
25 #define var2 r
26 #define var3 c
27 #define length n
28 #define // Local variables of push_node (also uses nodes)
29 #define node t
30 #define id a
31 #define // VM instance properties
32 #define NODES t
33 #define NEXT_ID a
34 #define push_node e
35
36 export default class VM{
37 constructor(){
38 # define // FIXME: is 0 document or what? (Perhaps I should define a “document” opcode rather than prefilling it?)
39 # ifdef WITH_REALLOCATOR
40 this.NEXT_ID = 0;
41 # endif
42 this.NODES=[];
43 }
44
45 #ifdef WITH_REALLOCATOR
46 push_node(node) {
47 var nodes=this.NODES,
48 id=this.NEXT_ID;
49 id<nodes.length||nodes.push(id+1),
50 this.NEXT_ID=nodes[id],
51 nodes[id]=node
52 }
53 # define PUSH_NODE this.push_node
54 #else
55 # define PUSH_NODE nodes.push
56 #endif
57
58 execute(instructions){
59 for(
60 var var1,
61 var2,
62 var3,
63 nodes=this.NODES,
64 length=instructions.byteLength,
65 offset=0;
66 offset<length;
67 )
68 while(offset<length)
69 switch(
70 var3=instructions[offset++],
71 var1=instructions[offset++]<<24|instructions[offset++]<<16|instructions[offset++]<<8|instructions[offset++],
72 var3
73 ){
74 case Opcode.CreateElement:
75 #ifdef WITH_SVG
76 case Opcode.CreateSvgElement:
77 #endif
78 [var2,offset]=readString(instructions,offset),
79 PUSH_NODE(
80 #ifdef WITH_SVG
81 var3?
82 #define // The way I’m abusing #define for comments here gets veeeeery close to falling apart on the next line! 😀
83 nodes[var1].createElementNS("http://www.w3.org/2000/svg",var2):
84 #endif
85 nodes[var1].createElement(var2)
86 );
87 break;
88 case Opcode.CreateTextNode:
89 [var2,offset]=readString(instructions,offset),
90 PUSH_NODE(nodes[var1].createTextNode(var2));
91 break;
92 #ifdef WITH_COMMENT
93 case Opcode.CreateComment:
94 [var2,offset]=readString(instructions,offset),
95 PUSH_NODE(nodes[var1].createComment(var2));
96 break;
97 #endif
98 #ifdef WITH_DOCUMENT_FRAGMENT
99 case Opcode.CreateDocumentFragment:
100 PUSH_NODE(nodes[var1].createDocumentFragment());
101 break;
102 #endif
103 case Opcode.SetData:
104 [var2,offset]=readString(instructions,offset),
105 nodes[var1].data=var2;
106 break;
107 case Opcode.SetAttribute:
108 [var2,offset]=readString(instructions,offset),
109 [var3,offset]=readString(instructions,offset),
110 nodes[var1].setAttribute(var2,var3);
111 break;
112 case Opcode.RemoveAttribute:
113 [var2,offset]=readString(instructions,offset),
114 nodes[var1].removeAttribute(var2);
115 break;
116 case Opcode.AppendChild:
117 nodes[var1].appendChild(nodes[instructions[offset++]<<24|instructions[offset++]<<16|instructions[offset++]<<8|instructions[offset++]]);
118 break;
119 case Opcode.InsertBefore:
120 var2=nodes[instructions[offset++]<<24|instructions[offset++]<<16|instructions[offset++]<<8|instructions[offset++]],
121 nodes[var1].insertBefore(
122 nodes[instructions[offset++]<<24|instructions[offset++]<<16|instructions[offset++]<<8|instructions[offset++]],
123 var2
124 );
125 break;
126 case Opcode.Free:
127 delete nodes[var1];
128 break
129 }
130 }
131 }
132
133 var textDecoder=new TextDecoder,
134 function readString(instructions,offset){
135 var length=instructions[offset++]<<24|instructions[offset++]<<16|instructions[offset++]<<8|instructions[offset++];
136 return[
137 textDecoder.decode(new Uint8Array(instructions.buffer,instructions.byteOffset+offset,length)),
138 offset+length
139 ]
140 }