Skip to content

Commit 1376607

Browse files
authored
Rollup merge of #41662 - nikomatsakis:on-demandify-region-mapping, r=eddyb
On demandify region mapping This is an adaptation of @cramertj's PR. I am sort of tempted to keep simplifying it, but also tempted to land it so and we can refactor more in follow-up PRs. As is, it does the following things: - makes the region-maps an on-demand query, per function `tcx.region_maps(def_id)` - interns code extents instead of of having them be integers - remove the "root region extent" and (to some extent) item extents; instead we use `Option<CodeExtent<'tcx>>` in a few places (no space inefficiency since `CodeExtent<'tcx>` is now a pointer). I'm not entirely happy with the way I have it setup though. Here are some of the changes I was considering (I'm not sure if they would work out well): 1. Removing `item_extents` entirely -- they are rarely used now, because most of the relevant places now accept an `Option<Region<'tcx>>` or an `Option<CodeExtent<'tcx>>`, but I think still used in a few places. 2. Merging `RegionMaps` into the typeck tables, instead of having it be its own query. 3. Change `CodeExtent<'tcx>` to store the parent pointer. This would mean that fewer places in the code actually *need* a `RegionMaps` anyhow, since most of them just want to be able to walk "up the tree". On the other hand, you wouldn't be able to intern a `CodeExtent<'tcx>` for some random node-id, you'd need to look it up in the table (since there'd be more information). Most of this code is semi-temporary -- I expect it to largely go away as we move to NLL -- so I'm also not *that* concerned with making it perfect. r? @eddyb
2 parents 5b4e8d0 + c008f05 commit 1376607

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+1212
-1187
lines changed

src/librustc/cfg/construct.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ use syntax::ast;
1515
use syntax::ptr::P;
1616

1717
use hir::{self, PatKind};
18+
use hir::def_id::DefId;
1819

1920
struct CFGBuilder<'a, 'tcx: 'a> {
2021
tcx: TyCtxt<'a, 'tcx, 'tcx>,
22+
owner_def_id: DefId,
2123
tables: &'a ty::TypeckTables<'tcx>,
2224
graph: CFGGraph,
2325
fn_exit: CFGIndex,
@@ -56,6 +58,7 @@ pub fn construct<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
5658

5759
let mut cfg_builder = CFGBuilder {
5860
tcx: tcx,
61+
owner_def_id,
5962
tables: tables,
6063
graph: graph,
6164
fn_exit: fn_exit,
@@ -583,11 +586,12 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
583586
scope_id: ast::NodeId,
584587
to_index: CFGIndex) {
585588
let mut data = CFGEdgeData { exiting_scopes: vec![] };
586-
let mut scope = self.tcx.region_maps.node_extent(from_expr.id);
587-
let target_scope = self.tcx.region_maps.node_extent(scope_id);
589+
let mut scope = self.tcx.node_extent(from_expr.id);
590+
let target_scope = self.tcx.node_extent(scope_id);
591+
let region_maps = self.tcx.region_maps(self.owner_def_id);
588592
while scope != target_scope {
589-
data.exiting_scopes.push(scope.node_id(&self.tcx.region_maps));
590-
scope = self.tcx.region_maps.encl_scope(scope);
593+
data.exiting_scopes.push(scope.node_id());
594+
scope = region_maps.encl_scope(scope);
591595
}
592596
self.graph.add_edge(from_index, to_index, data);
593597
}

src/librustc/dep_graph/dep_node.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub enum DepNode<D: Clone + Debug> {
5656
WorkProduct(Arc<WorkProductId>),
5757

5858
// Represents different phases in the compiler.
59-
RegionResolveCrate,
59+
RegionMaps(D),
6060
Coherence,
6161
Resolve,
6262
CoherenceCheckTrait(D),
@@ -197,7 +197,6 @@ impl<D: Clone + Debug> DepNode<D> {
197197
BorrowCheckKrate => Some(BorrowCheckKrate),
198198
MirKrate => Some(MirKrate),
199199
TypeckBodiesKrate => Some(TypeckBodiesKrate),
200-
RegionResolveCrate => Some(RegionResolveCrate),
201200
Coherence => Some(Coherence),
202201
Resolve => Some(Resolve),
203202
Variance => Some(Variance),
@@ -223,6 +222,7 @@ impl<D: Clone + Debug> DepNode<D> {
223222
def_ids.map(MirShim)
224223
}
225224
BorrowCheck(ref d) => op(d).map(BorrowCheck),
225+
RegionMaps(ref d) => op(d).map(RegionMaps),
226226
RvalueCheck(ref d) => op(d).map(RvalueCheck),
227227
TransCrateItem(ref d) => op(d).map(TransCrateItem),
228228
TransInlinedItem(ref d) => op(d).map(TransInlinedItem),

src/librustc/hir/intravisit.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use syntax::codemap::Spanned;
3939
use syntax_pos::Span;
4040
use hir::*;
4141
use hir::def::Def;
42-
use hir::map::Map;
42+
use hir::map::{self, Map};
4343
use super::itemlikevisit::DeepVisitor;
4444

4545
use std::cmp;
@@ -140,6 +140,23 @@ impl<'this, 'tcx> NestedVisitorMap<'this, 'tcx> {
140140
/// to monitor future changes to `Visitor` in case a new method with a
141141
/// new default implementation gets introduced.)
142142
pub trait Visitor<'v> : Sized {
143+
/// Invokes the suitable visitor method for the given `Node`
144+
/// extracted from the hir map.
145+
fn visit_hir_map_node(&mut self, node: map::Node<'v>) {
146+
match node {
147+
map::NodeItem(a) => self.visit_item(a),
148+
map::NodeForeignItem(a) => self.visit_foreign_item(a),
149+
map::NodeTraitItem(a) => self.visit_trait_item(a),
150+
map::NodeImplItem(a) => self.visit_impl_item(a),
151+
map::NodeExpr(a) => self.visit_expr(a),
152+
map::NodeStmt(a) => self.visit_stmt(a),
153+
map::NodeTy(a) => self.visit_ty(a),
154+
map::NodePat(a) => self.visit_pat(a),
155+
map::NodeBlock(a) => self.visit_block(a),
156+
_ => bug!("Visitor::visit_hir_map_node() not yet impl for node `{:?}`", node)
157+
}
158+
}
159+
143160
///////////////////////////////////////////////////////////////////////////
144161
// Nested items.
145162

src/librustc/ich/impls_ty.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ impl<'a, 'tcx> HashStable<StableHashingContext<'a, 'tcx>> for ty::subst::Kind<'t
3939
}
4040
}
4141

42-
impl<'a, 'tcx> HashStable<StableHashingContext<'a, 'tcx>> for ty::Region {
42+
impl<'a, 'tcx> HashStable<StableHashingContext<'a, 'tcx>> for ty::RegionKind<'tcx> {
4343
fn hash_stable<W: StableHasherResult>(&self,
4444
hcx: &mut StableHashingContext<'a, 'tcx>,
4545
hasher: &mut StableHasher<W>) {
@@ -432,17 +432,6 @@ impl_stable_hash_for!(enum ty::cast::CastKind {
432432
FnPtrAddrCast
433433
});
434434

435-
impl<'a, 'tcx> HashStable<StableHashingContext<'a, 'tcx>> for ::middle::region::CodeExtent
436-
{
437-
fn hash_stable<W: StableHasherResult>(&self,
438-
hcx: &mut StableHashingContext<'a, 'tcx>,
439-
hasher: &mut StableHasher<W>) {
440-
hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| {
441-
hcx.tcx().region_maps.code_extent_data(*self).hash_stable(hcx, hasher);
442-
});
443-
}
444-
}
445-
446435
impl<'a, 'tcx> HashStable<StableHashingContext<'a, 'tcx>> for ::middle::region::CodeExtentData
447436
{
448437
fn hash_stable<W: StableHasherResult>(&self,
@@ -477,7 +466,7 @@ impl_stable_hash_for!(struct ty::adjustment::CoerceUnsizedInfo {
477466
custom_kind
478467
});
479468

480-
impl_stable_hash_for!(struct ty::FreeRegion {
469+
impl_stable_hash_for!(struct ty::FreeRegion<'tcx> {
481470
scope,
482471
bound_region
483472
});

src/librustc/infer/combine.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ impl<'cx, 'gcx, 'tcx> ty::fold::TypeFolder<'gcx, 'tcx> for Generalizer<'cx, 'gcx
315315
}
316316
}
317317

318-
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
318+
fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
319319
match *r {
320320
// Never make variables for regions bound within the type itself,
321321
// nor for erased regions.

src/librustc/infer/equate.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
7878
}
7979
}
8080

81-
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
82-
-> RelateResult<'tcx, &'tcx ty::Region> {
81+
fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>)
82+
-> RelateResult<'tcx, ty::Region<'tcx>> {
8383
debug!("{}.regions({:?}, {:?})",
8484
self.tag(),
8585
a,

src/librustc/infer/error_reporting/mod.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ use traits::{ObligationCause, ObligationCauseCode};
6969
use ty::{self, TyCtxt, TypeFoldable};
7070
use ty::{Region, Issue32330};
7171
use ty::error::TypeError;
72+
use syntax::ast::DUMMY_NODE_ID;
7273
use syntax_pos::{Pos, Span};
7374
use errors::{DiagnosticBuilder, DiagnosticStyledString};
7475

@@ -78,7 +79,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
7879
pub fn note_and_explain_region(self,
7980
err: &mut DiagnosticBuilder,
8081
prefix: &str,
81-
region: &'tcx ty::Region,
82+
region: ty::Region<'tcx>,
8283
suffix: &str) {
8384
fn item_scope_tag(item: &hir::Item) -> &'static str {
8485
match item.node {
@@ -123,14 +124,14 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
123124
format!("{}unknown scope: {:?}{}. Please report a bug.",
124125
prefix, scope, suffix)
125126
};
126-
let span = match scope.span(&self.region_maps, &self.hir) {
127+
let span = match scope.span(&self.hir) {
127128
Some(s) => s,
128129
None => {
129130
err.note(&unknown_scope());
130131
return;
131132
}
132133
};
133-
let tag = match self.hir.find(scope.node_id(&self.region_maps)) {
134+
let tag = match self.hir.find(scope.node_id()) {
134135
Some(hir_map::NodeBlock(_)) => "block",
135136
Some(hir_map::NodeExpr(expr)) => match expr.node {
136137
hir::ExprCall(..) => "call",
@@ -150,7 +151,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
150151
return;
151152
}
152153
};
153-
let scope_decorated_tag = match self.region_maps.code_extent_data(scope) {
154+
let scope_decorated_tag = match *scope {
154155
region::CodeExtentData::Misc(_) => tag,
155156
region::CodeExtentData::CallSiteScope { .. } => {
156157
"scope of call-site for function"
@@ -183,7 +184,8 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
183184
}
184185
};
185186

186-
let node = fr.scope.node_id(&self.region_maps);
187+
let node = fr.scope.map(|s| s.node_id())
188+
.unwrap_or(DUMMY_NODE_ID);
187189
let unknown;
188190
let tag = match self.hir.find(node) {
189191
Some(hir_map::NodeBlock(_)) |
@@ -515,7 +517,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
515517
values.1.push_normal("<");
516518
}
517519

518-
fn lifetime_display(lifetime: &Region) -> String {
520+
fn lifetime_display(lifetime: Region) -> String {
519521
let s = format!("{}", lifetime);
520522
if s.is_empty() {
521523
"'_".to_string()
@@ -767,7 +769,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
767769
fn report_generic_bound_failure(&self,
768770
origin: SubregionOrigin<'tcx>,
769771
bound_kind: GenericKind<'tcx>,
770-
sub: &'tcx Region)
772+
sub: Region<'tcx>)
771773
{
772774
// FIXME: it would be better to report the first error message
773775
// with the span of the parameter itself, rather than the span
@@ -846,9 +848,9 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
846848
fn report_sub_sup_conflict(&self,
847849
var_origin: RegionVariableOrigin,
848850
sub_origin: SubregionOrigin<'tcx>,
849-
sub_region: &'tcx Region,
851+
sub_region: Region<'tcx>,
850852
sup_origin: SubregionOrigin<'tcx>,
851-
sup_region: &'tcx Region) {
853+
sup_region: Region<'tcx>) {
852854
let mut err = self.report_inference_failure(var_origin);
853855

854856
self.tcx.note_and_explain_region(&mut err,

src/librustc/infer/error_reporting/note.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
146146

147147
pub(super) fn report_concrete_failure(&self,
148148
origin: SubregionOrigin<'tcx>,
149-
sub: &'tcx Region,
150-
sup: &'tcx Region)
149+
sub: Region<'tcx>,
150+
sup: Region<'tcx>)
151151
-> DiagnosticBuilder<'tcx> {
152152
match origin {
153153
infer::Subtype(trace) => {

src/librustc/infer/freshen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for TypeFreshener<'a, 'gcx, 'tcx> {
8383
self.infcx.tcx
8484
}
8585

86-
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
86+
fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
8787
match *r {
8888
ty::ReEarlyBound(..) |
8989
ty::ReLateBound(..) => {

src/librustc/infer/fudge.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ impl<'a, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for RegionFudger<'a, 'gcx, 'tcx> {
147147
}
148148
}
149149

150-
fn fold_region(&mut self, r: &'tcx ty::Region) -> &'tcx ty::Region {
150+
fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> {
151151
match *r {
152152
ty::ReVar(v) if self.region_vars.contains(&v) => {
153153
self.infcx.next_region_var(self.origin.clone())

src/librustc/infer/glb.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
5959
lattice::super_lattice_tys(self, a, b)
6060
}
6161

62-
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
63-
-> RelateResult<'tcx, &'tcx ty::Region> {
62+
fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>)
63+
-> RelateResult<'tcx, ty::Region<'tcx>> {
6464
debug!("{}.regions({:?}, {:?})",
6565
self.tag(),
6666
a,

src/librustc/infer/higher_ranked/mod.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,9 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
269269
snapshot: &CombinedSnapshot,
270270
debruijn: ty::DebruijnIndex,
271271
new_vars: &[ty::RegionVid],
272-
a_map: &FxHashMap<ty::BoundRegion, &'tcx ty::Region>,
273-
r0: &'tcx ty::Region)
274-
-> &'tcx ty::Region {
272+
a_map: &FxHashMap<ty::BoundRegion, ty::Region<'tcx>>,
273+
r0: ty::Region<'tcx>)
274+
-> ty::Region<'tcx> {
275275
// Regions that pre-dated the LUB computation stay as they are.
276276
if !is_var_in_set(new_vars, r0) {
277277
assert!(!r0.is_bound());
@@ -284,7 +284,7 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
284284
// Variables created during LUB computation which are
285285
// *related* to regions that pre-date the LUB computation
286286
// stay as they are.
287-
if !tainted.iter().all(|r| is_var_in_set(new_vars, *r)) {
287+
if !tainted.iter().all(|&r| is_var_in_set(new_vars, r)) {
288288
debug!("generalize_region(r0={:?}): \
289289
non-new-variables found in {:?}",
290290
r0, tainted);
@@ -365,11 +365,11 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
365365
snapshot: &CombinedSnapshot,
366366
debruijn: ty::DebruijnIndex,
367367
new_vars: &[ty::RegionVid],
368-
a_map: &FxHashMap<ty::BoundRegion, &'tcx ty::Region>,
368+
a_map: &FxHashMap<ty::BoundRegion, ty::Region<'tcx>>,
369369
a_vars: &[ty::RegionVid],
370370
b_vars: &[ty::RegionVid],
371-
r0: &'tcx ty::Region)
372-
-> &'tcx ty::Region {
371+
r0: ty::Region<'tcx>)
372+
-> ty::Region<'tcx> {
373373
if !is_var_in_set(new_vars, r0) {
374374
assert!(!r0.is_bound());
375375
return r0;
@@ -434,8 +434,8 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
434434

435435
fn rev_lookup<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
436436
span: Span,
437-
a_map: &FxHashMap<ty::BoundRegion, &'tcx ty::Region>,
438-
r: &'tcx ty::Region) -> &'tcx ty::Region
437+
a_map: &FxHashMap<ty::BoundRegion, ty::Region<'tcx>>,
438+
r: ty::Region<'tcx>) -> ty::Region<'tcx>
439439
{
440440
for (a_br, a_r) in a_map {
441441
if *a_r == r {
@@ -450,14 +450,14 @@ impl<'a, 'gcx, 'tcx> CombineFields<'a, 'gcx, 'tcx> {
450450

451451
fn fresh_bound_variable<'a, 'gcx, 'tcx>(infcx: &InferCtxt<'a, 'gcx, 'tcx>,
452452
debruijn: ty::DebruijnIndex)
453-
-> &'tcx ty::Region {
453+
-> ty::Region<'tcx> {
454454
infcx.region_vars.new_bound(debruijn)
455455
}
456456
}
457457
}
458458

459459
fn var_ids<'a, 'gcx, 'tcx>(fields: &CombineFields<'a, 'gcx, 'tcx>,
460-
map: &FxHashMap<ty::BoundRegion, &'tcx ty::Region>)
460+
map: &FxHashMap<ty::BoundRegion, ty::Region<'tcx>>)
461461
-> Vec<ty::RegionVid> {
462462
map.iter()
463463
.map(|(_, &r)| match *r {
@@ -472,7 +472,7 @@ fn var_ids<'a, 'gcx, 'tcx>(fields: &CombineFields<'a, 'gcx, 'tcx>,
472472
.collect()
473473
}
474474

475-
fn is_var_in_set(new_vars: &[ty::RegionVid], r: &ty::Region) -> bool {
475+
fn is_var_in_set(new_vars: &[ty::RegionVid], r: ty::Region) -> bool {
476476
match *r {
477477
ty::ReVar(ref v) => new_vars.iter().any(|x| x == v),
478478
_ => false
@@ -484,7 +484,7 @@ fn fold_regions_in<'a, 'gcx, 'tcx, T, F>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
484484
mut fldr: F)
485485
-> T
486486
where T: TypeFoldable<'tcx>,
487-
F: FnMut(&'tcx ty::Region, ty::DebruijnIndex) -> &'tcx ty::Region,
487+
F: FnMut(ty::Region<'tcx>, ty::DebruijnIndex) -> ty::Region<'tcx>,
488488
{
489489
tcx.fold_regions(unbound_value, &mut false, |region, current_depth| {
490490
// we should only be encountering "escaping" late-bound regions here,
@@ -502,9 +502,9 @@ fn fold_regions_in<'a, 'gcx, 'tcx, T, F>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
502502
impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
503503
fn tainted_regions(&self,
504504
snapshot: &CombinedSnapshot,
505-
r: &'tcx ty::Region,
505+
r: ty::Region<'tcx>,
506506
directions: TaintDirections)
507-
-> FxHashSet<&'tcx ty::Region> {
507+
-> FxHashSet<ty::Region<'tcx>> {
508508
self.region_vars.tainted(&snapshot.region_vars_snapshot, r, directions)
509509
}
510510

@@ -731,7 +731,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
731731
// region back to the `ty::BoundRegion` that it originally
732732
// represented. Because `leak_check` passed, we know that
733733
// these taint sets are mutually disjoint.
734-
let inv_skol_map: FxHashMap<&'tcx ty::Region, ty::BoundRegion> =
734+
let inv_skol_map: FxHashMap<ty::Region<'tcx>, ty::BoundRegion> =
735735
skol_map
736736
.iter()
737737
.flat_map(|(&skol_br, &skol)| {

src/librustc/infer/lub.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
5959
lattice::super_lattice_tys(self, a, b)
6060
}
6161

62-
fn regions(&mut self, a: &'tcx ty::Region, b: &'tcx ty::Region)
63-
-> RelateResult<'tcx, &'tcx ty::Region> {
62+
fn regions(&mut self, a: ty::Region<'tcx>, b: ty::Region<'tcx>)
63+
-> RelateResult<'tcx, ty::Region<'tcx>> {
6464
debug!("{}.regions({:?}, {:?})",
6565
self.tag(),
6666
a,

0 commit comments

Comments
 (0)