| ... | @@ -2067,11 +2067,23 @@ pub const Node = struct { | ... | @@ -2067,11 +2067,23 @@ pub const Node = struct { |
| 2067 | } | 2067 | } |
| 2068 | }; | 2068 | }; |
| 2069 | | 2069 | |
| | 2070 | /// Elements occur directly in memory after ArrayInitializer. |
| 2070 | pub const ArrayInitializer = struct { | 2071 | pub const ArrayInitializer = struct { |
| 2071 | base: Node = Node{ .id = .ArrayInitializer }, | 2072 | base: Node = Node{ .id = .ArrayInitializer }, |
| 2072 | rtoken: TokenIndex, | 2073 | rtoken: TokenIndex, |
| | 2074 | list_len: NodeIndex, |
| 2073 | lhs: *Node, | 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 | pub fn iterate(self: *const ArrayInitializer) Node.Iterator { | 2088 | pub fn iterate(self: *const ArrayInitializer) Node.Iterator { |
| 2077 | return .{ .parent_node = &self.base, .index = 0, .node = null }; | 2089 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | @@ -2084,8 +2096,8 @@ pub const Node = struct { | ... | @@ -2084,8 +2096,8 @@ pub const Node = struct { |
| 2084 | if (i < 1) return self.lhs; | 2096 | if (i < 1) return self.lhs; |
| 2085 | i -= 1; | 2097 | i -= 1; |
| 2086 | | 2098 | |
| 2087 | if (i < self.list.len) return self.list[i]; | 2099 | if (i < self.list_len) return self.listConst()[i]; |
| 2088 | i -= self.list.len; | 2100 | i -= self.list_len; |
| 2089 | | 2101 | |
| 2090 | return null; | 2102 | return null; |
| 2091 | } | 2103 | } |
| ... | @@ -2097,13 +2109,39 @@ pub const Node = struct { | ... | @@ -2097,13 +2109,39 @@ pub const Node = struct { |
| 2097 | pub fn lastToken(self: *const ArrayInitializer) TokenIndex { | 2109 | pub fn lastToken(self: *const ArrayInitializer) TokenIndex { |
| 2098 | return self.rtoken; | 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 | pub const ArrayInitializerDot = struct { | 2129 | pub const ArrayInitializerDot = struct { |
| 2103 | base: Node = Node{ .id = .ArrayInitializerDot }, | 2130 | base: Node = Node{ .id = .ArrayInitializerDot }, |
| 2104 | dot: TokenIndex, | 2131 | dot: TokenIndex, |
| 2105 | rtoken: TokenIndex, | 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 | pub fn iterate(self: *const ArrayInitializerDot) Node.Iterator { | 2146 | pub fn iterate(self: *const ArrayInitializerDot) Node.Iterator { |
| 2109 | return .{ .parent_node = &self.base, .index = 0, .node = null }; | 2147 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | @@ -2113,8 +2151,8 @@ pub const Node = struct { | ... | @@ -2113,8 +2151,8 @@ pub const Node = struct { |
| 2113 | var i = it.index; | 2151 | var i = it.index; |
| 2114 | it.index += 1; | 2152 | it.index += 1; |
| 2115 | | 2153 | |
| 2116 | if (i < self.list.len) return self.list[i]; | 2154 | if (i < self.list_len) return self.listConst()[i]; |
| 2117 | i -= self.list.len; | 2155 | i -= self.list_len; |
| 2118 | | 2156 | |
| 2119 | return null; | 2157 | return null; |
| 2120 | } | 2158 | } |
| ... | @@ -2126,13 +2164,39 @@ pub const Node = struct { | ... | @@ -2126,13 +2164,39 @@ pub const Node = struct { |
| 2126 | pub fn lastToken(self: *const ArrayInitializerDot) TokenIndex { | 2164 | pub fn lastToken(self: *const ArrayInitializerDot) TokenIndex { |
| 2127 | return self.rtoken; | 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 | pub const StructInitializer = struct { | 2184 | pub const StructInitializer = struct { |
| 2132 | base: Node = Node{ .id = .StructInitializer }, | 2185 | base: Node = Node{ .id = .StructInitializer }, |
| 2133 | rtoken: TokenIndex, | 2186 | rtoken: TokenIndex, |
| | 2187 | list_len: NodeIndex, |
| 2134 | lhs: *Node, | 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 | pub fn iterate(self: *const StructInitializer) Node.Iterator { | 2201 | pub fn iterate(self: *const StructInitializer) Node.Iterator { |
| 2138 | return .{ .parent_node = &self.base, .index = 0, .node = null }; | 2202 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | @@ -2145,8 +2209,8 @@ pub const Node = struct { | ... | @@ -2145,8 +2209,8 @@ pub const Node = struct { |
| 2145 | if (i < 1) return self.lhs; | 2209 | if (i < 1) return self.lhs; |
| 2146 | i -= 1; | 2210 | i -= 1; |
| 2147 | | 2211 | |
| 2148 | if (i < self.list.len) return self.list[i]; | 2212 | if (i < self.list_len) return self.listConst()[i]; |
| 2149 | i -= self.list.len; | 2213 | i -= self.list_len; |
| 2150 | | 2214 | |
| 2151 | return null; | 2215 | return null; |
| 2152 | } | 2216 | } |
| ... | @@ -2158,13 +2222,39 @@ pub const Node = struct { | ... | @@ -2158,13 +2222,39 @@ pub const Node = struct { |
| 2158 | pub fn lastToken(self: *const StructInitializer) TokenIndex { | 2222 | pub fn lastToken(self: *const StructInitializer) TokenIndex { |
| 2159 | return self.rtoken; | 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 | pub const StructInitializerDot = struct { | 2242 | pub const StructInitializerDot = struct { |
| 2164 | base: Node = Node{ .id = .StructInitializerDot }, | 2243 | base: Node = Node{ .id = .StructInitializerDot }, |
| 2165 | dot: TokenIndex, | 2244 | dot: TokenIndex, |
| 2166 | rtoken: TokenIndex, | 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 | pub fn iterate(self: *const StructInitializerDot) Node.Iterator { | 2259 | pub fn iterate(self: *const StructInitializerDot) Node.Iterator { |
| 2170 | return .{ .parent_node = &self.base, .index = 0, .node = null }; | 2260 | return .{ .parent_node = &self.base, .index = 0, .node = null }; |
| ... | @@ -2174,8 +2264,8 @@ pub const Node = struct { | ... | @@ -2174,8 +2264,8 @@ pub const Node = struct { |
| 2174 | var i = it.index; | 2264 | var i = it.index; |
| 2175 | it.index += 1; | 2265 | it.index += 1; |
| 2176 | | 2266 | |
| 2177 | if (i < self.list.len) return self.list[i]; | 2267 | if (i < self.list_len) return self.listConst()[i]; |
| 2178 | i -= self.list.len; | 2268 | i -= self.list_len; |
| 2179 | | 2269 | |
| 2180 | return null; | 2270 | return null; |
| 2181 | } | 2271 | } |
| ... | @@ -2187,6 +2277,20 @@ pub const Node = struct { | ... | @@ -2187,6 +2277,20 @@ pub const Node = struct { |
| 2187 | pub fn lastToken(self: *const StructInitializerDot) TokenIndex { | 2277 | pub fn lastToken(self: *const StructInitializerDot) TokenIndex { |
| 2188 | return self.rtoken; | 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 | /// Parameter nodes directly follow Call in memory. | 2296 | /// Parameter nodes directly follow Call in memory. |