| ... | ... | @@ -2067,11 +2067,23 @@ pub const Node = struct { |
| 2067 | 2067 | } |
| 2068 | 2068 | }; |
| 2069 | 2069 | |
| 2070 | /// Elements occur directly in memory after ArrayInitializer. |
| 2070 | 2071 | pub const ArrayInitializer = struct { |
| 2071 | 2072 | base: Node = Node{ .id = .ArrayInitializer }, |
| 2072 | 2073 | rtoken: TokenIndex, |
| 2074 | list_len: NodeIndex, |
| 2073 | 2075 | lhs: *Node, |
| 2074 | | list: []*Node, |
| 2076 | |
| 2077 | /// After this the caller must initialize the fields_and_decls list. |
| 2078 | pub fn alloc(allocator: *mem.Allocator, list_len: NodeIndex) !*ArrayInitializer { |
| 2079 | const bytes = try allocator.alignedAlloc(u8, @alignOf(ArrayInitializer), sizeInBytes(list_len)); |
| 2080 | return @ptrCast(*ArrayInitializer, bytes.ptr); |
| 2081 | } |
| 2082 | |
| 2083 | pub fn free(self: *ArrayInitializer, allocator: *mem.Allocator) void { |
| 2084 | const bytes = @ptrCast([*]u8, self)[0..sizeInBytes(self.list_len)]; |
| 2085 | allocator.free(bytes); |
| 2086 | } |
| 2075 | 2087 | |
| 2076 | 2088 | pub fn iterate(self: *const ArrayInitializer) Node.Iterator { |
| 2077 | 2089 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | ... | @@ -2084,8 +2096,8 @@ pub const Node = struct { |
| 2084 | 2096 | if (i < 1) return self.lhs; |
| 2085 | 2097 | i -= 1; |
| 2086 | 2098 | |
| 2087 | | if (i < self.list.len) return self.list[i]; |
| 2088 | | i -= self.list.len; |
| 2099 | if (i < self.list_len) return self.listConst()[i]; |
| 2100 | i -= self.list_len; |
| 2089 | 2101 | |
| 2090 | 2102 | return null; |
| 2091 | 2103 | } |
| ... | ... | @@ -2097,13 +2109,39 @@ pub const Node = struct { |
| 2097 | 2109 | pub fn lastToken(self: *const ArrayInitializer) TokenIndex { |
| 2098 | 2110 | return self.rtoken; |
| 2099 | 2111 | } |
| 2112 | |
| 2113 | pub fn list(self: *ArrayInitializer) []*Node { |
| 2114 | const decls_start = @ptrCast([*]u8, self) + @sizeOf(ArrayInitializer); |
| 2115 | return @ptrCast([*]*Node, decls_start)[0..self.list_len]; |
| 2116 | } |
| 2117 | |
| 2118 | pub fn listConst(self: *const ArrayInitializer) []const *Node { |
| 2119 | const decls_start = @ptrCast([*]const u8, self) + @sizeOf(ArrayInitializer); |
| 2120 | return @ptrCast([*]const *Node, decls_start)[0..self.list_len]; |
| 2121 | } |
| 2122 | |
| 2123 | fn sizeInBytes(list_len: NodeIndex) usize { |
| 2124 | return @sizeOf(ArrayInitializer) + @sizeOf(*Node) * @as(usize, list_len); |
| 2125 | } |
| 2100 | 2126 | }; |
| 2101 | 2127 | |
| 2128 | /// Elements occur directly in memory after ArrayInitializerDot. |
| 2102 | 2129 | pub const ArrayInitializerDot = struct { |
| 2103 | 2130 | base: Node = Node{ .id = .ArrayInitializerDot }, |
| 2104 | 2131 | dot: TokenIndex, |
| 2105 | 2132 | rtoken: TokenIndex, |
| 2106 | | list: []*Node, |
| 2133 | list_len: NodeIndex, |
| 2134 | |
| 2135 | /// After this the caller must initialize the fields_and_decls list. |
| 2136 | pub fn alloc(allocator: *mem.Allocator, list_len: NodeIndex) !*ArrayInitializerDot { |
| 2137 | const bytes = try allocator.alignedAlloc(u8, @alignOf(ArrayInitializerDot), sizeInBytes(list_len)); |
| 2138 | return @ptrCast(*ArrayInitializerDot, bytes.ptr); |
| 2139 | } |
| 2140 | |
| 2141 | pub fn free(self: *ArrayInitializerDot, allocator: *mem.Allocator) void { |
| 2142 | const bytes = @ptrCast([*]u8, self)[0..sizeInBytes(self.list_len)]; |
| 2143 | allocator.free(bytes); |
| 2144 | } |
| 2107 | 2145 | |
| 2108 | 2146 | pub fn iterate(self: *const ArrayInitializerDot) Node.Iterator { |
| 2109 | 2147 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | ... | @@ -2113,8 +2151,8 @@ pub const Node = struct { |
| 2113 | 2151 | var i = it.index; |
| 2114 | 2152 | it.index += 1; |
| 2115 | 2153 | |
| 2116 | | if (i < self.list.len) return self.list[i]; |
| 2117 | | i -= self.list.len; |
| 2154 | if (i < self.list_len) return self.listConst()[i]; |
| 2155 | i -= self.list_len; |
| 2118 | 2156 | |
| 2119 | 2157 | return null; |
| 2120 | 2158 | } |
| ... | ... | @@ -2126,13 +2164,39 @@ pub const Node = struct { |
| 2126 | 2164 | pub fn lastToken(self: *const ArrayInitializerDot) TokenIndex { |
| 2127 | 2165 | return self.rtoken; |
| 2128 | 2166 | } |
| 2167 | |
| 2168 | pub fn list(self: *ArrayInitializerDot) []*Node { |
| 2169 | const decls_start = @ptrCast([*]u8, self) + @sizeOf(ArrayInitializerDot); |
| 2170 | return @ptrCast([*]*Node, decls_start)[0..self.list_len]; |
| 2171 | } |
| 2172 | |
| 2173 | pub fn listConst(self: *const ArrayInitializerDot) []const *Node { |
| 2174 | const decls_start = @ptrCast([*]const u8, self) + @sizeOf(ArrayInitializerDot); |
| 2175 | return @ptrCast([*]const *Node, decls_start)[0..self.list_len]; |
| 2176 | } |
| 2177 | |
| 2178 | fn sizeInBytes(list_len: NodeIndex) usize { |
| 2179 | return @sizeOf(ArrayInitializerDot) + @sizeOf(*Node) * @as(usize, list_len); |
| 2180 | } |
| 2129 | 2181 | }; |
| 2130 | 2182 | |
| 2183 | /// Elements occur directly in memory after StructInitializer. |
| 2131 | 2184 | pub const StructInitializer = struct { |
| 2132 | 2185 | base: Node = Node{ .id = .StructInitializer }, |
| 2133 | 2186 | rtoken: TokenIndex, |
| 2187 | list_len: NodeIndex, |
| 2134 | 2188 | lhs: *Node, |
| 2135 | | list: []*Node, |
| 2189 | |
| 2190 | /// After this the caller must initialize the fields_and_decls list. |
| 2191 | pub fn alloc(allocator: *mem.Allocator, list_len: NodeIndex) !*StructInitializer { |
| 2192 | const bytes = try allocator.alignedAlloc(u8, @alignOf(StructInitializer), sizeInBytes(list_len)); |
| 2193 | return @ptrCast(*StructInitializer, bytes.ptr); |
| 2194 | } |
| 2195 | |
| 2196 | pub fn free(self: *StructInitializer, allocator: *mem.Allocator) void { |
| 2197 | const bytes = @ptrCast([*]u8, self)[0..sizeInBytes(self.list_len)]; |
| 2198 | allocator.free(bytes); |
| 2199 | } |
| 2136 | 2200 | |
| 2137 | 2201 | pub fn iterate(self: *const StructInitializer) Node.Iterator { |
| 2138 | 2202 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | ... | @@ -2145,8 +2209,8 @@ pub const Node = struct { |
| 2145 | 2209 | if (i < 1) return self.lhs; |
| 2146 | 2210 | i -= 1; |
| 2147 | 2211 | |
| 2148 | | if (i < self.list.len) return self.list[i]; |
| 2149 | | i -= self.list.len; |
| 2212 | if (i < self.list_len) return self.listConst()[i]; |
| 2213 | i -= self.list_len; |
| 2150 | 2214 | |
| 2151 | 2215 | return null; |
| 2152 | 2216 | } |
| ... | ... | @@ -2158,13 +2222,39 @@ pub const Node = struct { |
| 2158 | 2222 | pub fn lastToken(self: *const StructInitializer) TokenIndex { |
| 2159 | 2223 | return self.rtoken; |
| 2160 | 2224 | } |
| 2225 | |
| 2226 | pub fn list(self: *StructInitializer) []*Node { |
| 2227 | const decls_start = @ptrCast([*]u8, self) + @sizeOf(StructInitializer); |
| 2228 | return @ptrCast([*]*Node, decls_start)[0..self.list_len]; |
| 2229 | } |
| 2230 | |
| 2231 | pub fn listConst(self: *const StructInitializer) []const *Node { |
| 2232 | const decls_start = @ptrCast([*]const u8, self) + @sizeOf(StructInitializer); |
| 2233 | return @ptrCast([*]const *Node, decls_start)[0..self.list_len]; |
| 2234 | } |
| 2235 | |
| 2236 | fn sizeInBytes(list_len: NodeIndex) usize { |
| 2237 | return @sizeOf(StructInitializer) + @sizeOf(*Node) * @as(usize, list_len); |
| 2238 | } |
| 2161 | 2239 | }; |
| 2162 | 2240 | |
| 2241 | /// Elements occur directly in memory after StructInitializerDot. |
| 2163 | 2242 | pub const StructInitializerDot = struct { |
| 2164 | 2243 | base: Node = Node{ .id = .StructInitializerDot }, |
| 2165 | 2244 | dot: TokenIndex, |
| 2166 | 2245 | rtoken: TokenIndex, |
| 2167 | | list: []*Node, |
| 2246 | list_len: NodeIndex, |
| 2247 | |
| 2248 | /// After this the caller must initialize the fields_and_decls list. |
| 2249 | pub fn alloc(allocator: *mem.Allocator, list_len: NodeIndex) !*StructInitializerDot { |
| 2250 | const bytes = try allocator.alignedAlloc(u8, @alignOf(StructInitializerDot), sizeInBytes(list_len)); |
| 2251 | return @ptrCast(*StructInitializerDot, bytes.ptr); |
| 2252 | } |
| 2253 | |
| 2254 | pub fn free(self: *StructInitializerDot, allocator: *mem.Allocator) void { |
| 2255 | const bytes = @ptrCast([*]u8, self)[0..sizeInBytes(self.list_len)]; |
| 2256 | allocator.free(bytes); |
| 2257 | } |
| 2168 | 2258 | |
| 2169 | 2259 | pub fn iterate(self: *const StructInitializerDot) Node.Iterator { |
| 2170 | 2260 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | ... | @@ -2174,8 +2264,8 @@ pub const Node = struct { |
| 2174 | 2264 | var i = it.index; |
| 2175 | 2265 | it.index += 1; |
| 2176 | 2266 | |
| 2177 | | if (i < self.list.len) return self.list[i]; |
| 2178 | | i -= self.list.len; |
| 2267 | if (i < self.list_len) return self.listConst()[i]; |
| 2268 | i -= self.list_len; |
| 2179 | 2269 | |
| 2180 | 2270 | return null; |
| 2181 | 2271 | } |
| ... | ... | @@ -2187,6 +2277,20 @@ pub const Node = struct { |
| 2187 | 2277 | pub fn lastToken(self: *const StructInitializerDot) TokenIndex { |
| 2188 | 2278 | return self.rtoken; |
| 2189 | 2279 | } |
| 2280 | |
| 2281 | pub fn list(self: *StructInitializerDot) []*Node { |
| 2282 | const decls_start = @ptrCast([*]u8, self) + @sizeOf(StructInitializerDot); |
| 2283 | return @ptrCast([*]*Node, decls_start)[0..self.list_len]; |
| 2284 | } |
| 2285 | |
| 2286 | pub fn listConst(self: *const StructInitializerDot) []const *Node { |
| 2287 | const decls_start = @ptrCast([*]const u8, self) + @sizeOf(StructInitializerDot); |
| 2288 | return @ptrCast([*]const *Node, decls_start)[0..self.list_len]; |
| 2289 | } |
| 2290 | |
| 2291 | fn sizeInBytes(list_len: NodeIndex) usize { |
| 2292 | return @sizeOf(StructInitializerDot) + @sizeOf(*Node) * @as(usize, list_len); |
| 2293 | } |
| 2190 | 2294 | }; |
| 2191 | 2295 | |
| 2192 | 2296 | /// Parameter nodes directly follow Call in memory. |