parsav  Diff

Differences From Artifact [9f68e11c52]:

To Artifact [db48a650e7]:


    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