Differences From
Artifact [265a0fa659]:
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