parsav  Diff

Differences From Artifact [07d2cb4a7e]:

To Artifact [e41dd1991a]:


    15     15   	local p = m.ptr(ty:astype())
    16     16   	return `p {
    17     17   		ptr = [&ty:astype()](m.heapa_raw(sizeof(ty) * sz));
    18     18   		ct = sz;
    19     19   	}
    20     20   end)
    21     21   
    22         -m.ptr = terralib.memoize(function(ty)
    23         -	local t = terralib.types.newstruct(string.format('ptr<%s>', ty))
           22  +local function mkptr(ty, dyn)
           23  +	local t = terralib.types.newstruct(string.format('%s<%s>', dyn and 'ptr' or 'ref', ty))
    24     24   	t.entries = {
    25     25   		{'ptr', &ty};
    26     26   		{'ct', intptr};
    27     27   	}
    28     28   	t.ptr_basetype = ty
    29     29   	local recurse = false
    30     30   	if ty:isstruct() then
    31     31   		if ty.methods.free then recurse = true end
    32     32   	end
    33     33   	t.metamethods.__not = macro(function(self)
    34     34   		return `self.ptr
    35     35   	end)
    36         -	t.methods = {
    37         -		free = terra(self: &t): bool
    38         -			[recurse and quote
    39         -				self.ptr:free()
    40         -			end or {}]
    41         -			if self.ct > 0 then
    42         -				m.heapf(self.ptr)
    43         -				self.ct = 0
    44         -				return true
           36  +	if dyn then
           37  +		t.methods = {
           38  +			free = terra(self: &t): bool
           39  +				[recurse and quote
           40  +					self.ptr:free()
           41  +				end or {}]
           42  +				if self.ct > 0 then
           43  +					m.heapf(self.ptr)
           44  +					self.ct = 0
           45  +					return true
           46  +				end
           47  +				return false
           48  +			end;
           49  +			init = terra(self: &t, newct: intptr): bool
           50  +				var nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
           51  +				if nv ~= nil then
           52  +					self.ptr = nv
           53  +					self.ct = newct
           54  +					return true
           55  +				else return false end
           56  +			end;
           57  +			resize = terra(self: &t, newct: intptr): bool
           58  +				var nv: &ty
           59  +				if self.ct > 0
           60  +					then nv = [&ty](m.heapr_raw(self.ptr, sizeof(ty) * newct))
           61  +					else nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
           62  +				end
           63  +				if nv ~= nil then
           64  +					self.ptr = nv
           65  +					self.ct = newct
           66  +					return true
           67  +				else return false end
           68  +			end;
           69  +		}
           70  +		terra t:ensure(n: intptr)
           71  +			if self.ptr == nil then
           72  +				if not self:init(n) then return t {ptr=nil,ct=0} end
    45     73   			end
    46         -			return false
    47         -		end;
    48         -		init = terra(self: &t, newct: intptr): bool
    49         -			var nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
    50         -			if nv ~= nil then
    51         -				self.ptr = nv
    52         -				self.ct = newct
    53         -				return true
    54         -			else return false end
    55         -		end;
    56         -		resize = terra(self: &t, newct: intptr): bool
    57         -			var nv: &ty
    58         -			if self.ct > 0
    59         -				then nv = [&ty](m.heapr_raw(self.ptr, sizeof(ty) * newct))
    60         -				else nv = [&ty](m.heapa_raw(sizeof(ty) * newct))
           74  +			if self.ct >= n then return @self end
           75  +			self:resize(n)
           76  +			return @self
           77  +		end
           78  +	end
           79  +	terra t:advance(n: intptr)
           80  +		self.ptr = self.ptr + n
           81  +		self.ct = self.ct - n
           82  +		return self.ptr
           83  +	end
           84  +	if not ty:isstruct() then
           85  +		terra t:cmp_raw(other: &ty)
           86  +			for i=0, self.ct do
           87  +				if self.ptr[i] ~= other[i] then return false end
    61     88   			end
    62         -			if nv ~= nil then
    63         -				self.ptr = nv
    64         -				self.ct = newct
    65         -				return true
    66         -			else return false end
    67         -		end;
    68         -	}
           89  +			return true
           90  +		end
           91  +		terra t:cmp(other: t)
           92  +			if other.ct ~= self.ct then return false end
           93  +			return self:cmp_raw(other.ptr)
           94  +		end
           95  +	end
    69     96   	return t
    70         -end)
           97  +end
           98  +
           99  +m.ptr = terralib.memoize(function(ty) return mkptr(ty, true) end)
          100  +m.ref = terralib.memoize(function(ty) return mkptr(ty, false) end)
    71    101   
    72    102   m.vec = terralib.memoize(function(ty)
    73    103   	local v = terralib.types.newstruct(string.format('vec<%s>', ty.name))
    74    104   	v.entries = {
    75    105   		{field = 'storage', type = m.ptr(ty)};
    76    106   		{field = 'sz', type = intptr};
    77    107   		{field = 'run', type = intptr};