parsav  Diff

Differences From Artifact [265a0fa659]:

To Artifact [1e93ad8eb5]:


   112    112   
   113    113   local terra biggest(a: intptr, b: intptr)
   114    114   	if a > b then return a else return b end
   115    115   end
   116    116   
   117    117   terra m.acc:init(run: intptr)
   118    118   	--lib.dbg('initializing string accumulator')
   119         -	self.buf = [rawstring](lib.mem.heapa_raw(run))
   120         -	self.run = run
   121         -	self.space = run
          119  +	if run == 0 then
          120  +		lib.warn('attempted to allocate zero-length string accumulator')
          121  +		self.buf = nil
          122  +	else
          123  +		self.buf = [rawstring](lib.mem.heapa_raw(run))
          124  +		if self.buf == nil then
          125  +			lib.warn('string buffer allocation failed, very little memory availble')
          126  +		end
          127  +	end
          128  +	self.run = lib.trn(self.buf == nil, 0, run)
          129  +	self.space = self.run
   122    130   	self.sz = 0
   123    131   	return self
   124    132   end;
   125    133   
   126    134   terra m.acc:free()
   127    135   	--lib.dbg('freeing string accumulator')
   128    136   	if self.buf ~= nil and self.space > 0 then
................................................................................
   159    167   
   160    168   terra m.acc:push(str: rawstring, len: intptr)
   161    169   	--var llen = len
   162    170   	if str == nil then return self end
   163    171   	--if str[len - 1] == 0xA then llen = llen - 1 end -- don't display newlines in debug output
   164    172   	-- lib.dbg('pushing "',{str,llen},'" onto accumulator')
   165    173   	if self.buf == nil then self:init(self.run) end
          174  +	if self.buf == nil then lib.warn('attempted to push string onto unallocated accumulator') return self end
   166    175   	if len == 0 then len = m.sz(str) end
   167    176   	if len >= self.space - self.sz then
   168    177   		self.space = self.space + biggest(self.run,len + 1)
   169    178   		self.buf = [rawstring](lib.mem.heapr_raw(self.buf, self.space))
   170    179   	end
   171    180   	lib.mem.cpy(self.buf + self.sz, str, len)
   172    181   	self.sz = self.sz + len