Differences From
Artifact [9f68e11c52]:
89 89 end
90 90
91 91 local copiers = {}
92 92 local senders = {}
93 93 local appenders = {}
94 94 local symtxt = symbol(lib.mem.ptr(int8))
95 95 local cpypos = symbol(&opaque)
96 + local pool = symbol(&lib.mem.pool)
96 97 local accumulator = symbol(&lib.str.acc)
97 98 local destcon = symbol(&lib.net.mg_connection)
98 99 for idx, seg in ipairs(segs) do
99 100 copiers[#copiers+1] = quote [cpypos] = lib.mem.cpy([cpypos], [&opaque]([seg]), [#seg]) end
100 101 senders[#senders+1] = quote lib.net.mg_send([destcon], [seg], [#seg]) end
101 102 appenders[#appenders+1] = quote [accumulator]:push([seg], [#seg]) end
102 103 if fields[idx] and fields[idx].mode then
103 104 local f = fields[idx]
104 105 local fp = `symself.[f.key]
105 106 copiers[#copiers+1] = quote
106 107 if fp.ct > 0 then
107 - var san = lib.html.sanitize(fp, [f.mode == ':'])
108 + var san = lib.html.sanitize(pool, fp, [f.mode == ':'])
108 109 [cpypos] = lib.mem.cpy([cpypos], [&opaque](san.ptr), san.ct)
109 110 --san:free()
110 111 end
111 112 end
112 113 senders[#senders+1] = quote
113 114 if fp.ct > 0 then
114 - var san = lib.html.sanitize(fp, [f.mode == ':'])
115 + var san = lib.html.sanitize(pool, fp, [f.mode == ':'])
115 116 lib.net.mg_send([destcon], san.ptr, san.ct)
116 117 --san:free()
117 118 end
118 119 end
119 120 appenders[#appenders+1] = quote
120 121 if fp.ct > 0 then
121 - var san = lib.html.sanitize(fp, [f.mode == ':'])
122 + var san = lib.html.sanitize(pool, fp, [f.mode == ':'])
122 123 [accumulator]:ppush(san)
123 124 --san:free()
124 125 end
125 126 end
126 127 elseif fields[idx] then
127 128 local f = fields[idx]
128 129 local fp = `symself.[f.key]
................................................................................
139 140 appenders[#appenders+1] = quote
140 141 if fp.ct > 0 then [accumulator]:ppush(fp) end
141 142 end
142 143 end
143 144 end
144 145
145 146 local tid = tplspec.id or '<anonymous>'
147 + rec.methods.poolstr = terra([symself],[pool])
148 + lib.dbg(['pooling template ' .. tid])
149 + [tallyup]
150 + var [symtxt] = pool:alloc(int8, [runningtally])
151 + var [cpypos] = [&opaque](symtxt.ptr)
152 + [copiers]
153 + @[&int8](cpypos) = 0
154 + symtxt.ct = [&int8](cpypos) - symtxt.ptr
155 + return symtxt
156 + end
146 157 rec.methods.tostr = terra([symself])
147 158 lib.dbg(['compiling template ' .. tid])
148 159 [tallyup]
149 160 var [symtxt] = lib.mem.heapa(int8, [runningtally])
150 161 var [cpypos] = [&opaque](symtxt.ptr)
162 + var p: lib.mem.pool p:init(128)
163 + var [pool] = &p
151 164 [copiers]
152 165 @[&int8](cpypos) = 0
153 166 symtxt.ct = [&int8](cpypos) - symtxt.ptr
167 + pool:free()
154 168 return symtxt
155 169 end
156 170 rec.methods.append = terra([symself], [accumulator])
171 + var [pool]
172 + var p: lib.mem.pool
173 + if [accumulator].pool == nil then
174 + p:init(128)
175 + pool = &p
176 + else pool = [accumulator].pool end
157 177 lib.dbg(['appending template ' .. tid])
158 178 [tallyup]
159 179 accumulator:cue([runningtally])
160 180 [appenders]
181 + if [accumulator].pool == nil then p:free() end
161 182 return accumulator
162 183 end
163 184 rec.methods.head = terra([symself], [destcon], code: uint16, hd: lib.mem.ptr(lib.http.header))
185 + var p: lib.mem.pool p:init(128) -- FIXME
186 + var [pool] = &p
164 187 lib.dbg(['transmitting template headers ' .. tid])
165 188 [tallyup]
166 189 lib.net.mg_printf([destcon], 'HTTP/1.1 %s', lib.http.codestr(code))
167 190 for i = 0, hd.ct do
168 191 lib.net.mg_printf([destcon], '%s: %s\r\n', hd.ptr[i].key, hd.ptr[i].value)
169 192 end
170 193 lib.net.mg_printf([destcon],'Content-Length: %llu\r\n\r\n', [runningtally] + 1)
194 + p:free()
171 195 end
172 196 rec.methods.send = terra([symself], [destcon], code: uint16, hd: lib.mem.ptr(lib.http.header))
197 + var p: lib.mem.pool p:init(128) -- FIXME
198 + var [pool] = &p
173 199 lib.dbg(['transmitting template ' .. tid])
174 200
175 201 symself:head(destcon,code,hd)
176 202
177 203 [senders]
178 204 lib.net.mg_send([destcon],'\r\n',2)
205 + p:free()
179 206 end
180 207 rec.methods.sz = terra([symself])
181 208 lib.dbg(['tallying template ' .. tid])
182 209 [tallyup]
183 210 return [runningtally] + 1
184 211 end
185 212
186 213 return rec
187 214 end
188 215
189 216 return m