Skip to content

Commit f457e64

Browse files
committed
---
yaml --- r: 83358 b: refs/heads/try c: 6ecbd75 h: refs/heads/master v: v3
1 parent e63f254 commit f457e64

File tree

5 files changed

+95
-55
lines changed

5 files changed

+95
-55
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 0e4d1fc8cae42e15e00f71d9f439b01bb25a86ae
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 6c08cc2db4f98e9f07ae7d50338396c4123c2f0a
5-
refs/heads/try: 37c32e249505f103f9bcad0bdd83f49f0efec9ef
5+
refs/heads/try: 6ecbd75843a2187027d09649c9046189d1d4a446
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c

branches/try/src/librustc/middle/astencode.rs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use middle;
2424
use util::ppaux::ty_to_str;
2525

2626
use std::at_vec;
27+
use std::libc;
2728
use extra::ebml::reader;
2829
use extra::ebml;
2930
use extra::serialize;
@@ -849,29 +850,43 @@ impl write_tag_and_id for writer::Encoder {
849850
}
850851
}
851852

853+
struct SideTableEncodingIdVisitor {
854+
ecx_ptr: *libc::c_void,
855+
new_ebml_w: writer::Encoder,
856+
maps: Maps,
857+
}
858+
859+
impl ast_util::IdVisitingOperation for SideTableEncodingIdVisitor {
860+
fn visit_id(&self, id: ast::NodeId) {
861+
// Note: this will cause a copy of ebml_w, which is bad as
862+
// it is mutable. But I believe it's harmless since we generate
863+
// balanced EBML.
864+
let mut new_ebml_w = self.new_ebml_w.clone();
865+
// See above
866+
let ecx: &e::EncodeContext = unsafe {
867+
cast::transmute(self.ecx_ptr)
868+
};
869+
encode_side_tables_for_id(ecx, self.maps, &mut new_ebml_w, id)
870+
}
871+
}
872+
852873
fn encode_side_tables_for_ii(ecx: &e::EncodeContext,
853874
maps: Maps,
854875
ebml_w: &mut writer::Encoder,
855876
ii: &ast::inlined_item) {
856877
ebml_w.start_tag(c::tag_table as uint);
857878
let new_ebml_w = (*ebml_w).clone();
858879

859-
// Because the ast visitor uses @fn, I can't pass in
860-
// ecx directly, but /I/ know that it'll be fine since
861-
// the lifetime is tied to the CrateContext that
862-
// lives this entire section.
863-
let ecx_ptr : *() = unsafe { cast::transmute(ecx) };
864-
ast_util::visit_ids_for_inlined_item(
865-
ii,
866-
|id: ast::NodeId| {
867-
// Note: this will cause a copy of ebml_w, which is bad as
868-
// it is mutable. But I believe it's harmless since we generate
869-
// balanced EBML.
870-
let mut new_ebml_w = new_ebml_w.clone();
871-
// See above
872-
let ecx : &e::EncodeContext = unsafe { cast::transmute(ecx_ptr) };
873-
encode_side_tables_for_id(ecx, maps, &mut new_ebml_w, id)
874-
});
880+
// Because the ast visitor uses @IdVisitingOperation, I can't pass in
881+
// ecx directly, but /I/ know that it'll be fine since the lifetime is
882+
// tied to the CrateContext that lives throughout this entire section.
883+
ast_util::visit_ids_for_inlined_item(ii, @SideTableEncodingIdVisitor {
884+
ecx_ptr: unsafe {
885+
cast::transmute(ecx)
886+
},
887+
new_ebml_w: new_ebml_w,
888+
maps: maps,
889+
} as @ast_util::IdVisitingOperation);
875890
ebml_w.end_tag();
876891
}
877892

branches/try/src/librustc/middle/lint.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,17 +1228,27 @@ fn lint_unused_mut() -> @mut OuterLint {
12281228
@mut UnusedMutLintVisitor{ stopping_on_items: false } as @mut OuterLint
12291229
}
12301230

1231-
fn lint_session(cx: @mut Context) -> @mut visit::Visitor<()> {
1232-
ast_util::id_visitor(|id| {
1233-
match cx.tcx.sess.lints.pop(&id) {
1234-
None => {},
1231+
struct LintReportingIdVisitor {
1232+
cx: @mut Context,
1233+
}
1234+
1235+
impl ast_util::IdVisitingOperation for LintReportingIdVisitor {
1236+
fn visit_id(&self, id: ast::NodeId) {
1237+
match self.cx.tcx.sess.lints.pop(&id) {
1238+
None => {}
12351239
Some(l) => {
12361240
for (lint, span, msg) in l.move_iter() {
1237-
cx.span_lint(lint, span, msg)
1241+
self.cx.span_lint(lint, span, msg)
12381242
}
12391243
}
12401244
}
1241-
}, false)
1245+
}
1246+
}
1247+
1248+
fn lint_session(cx: @mut Context) -> @mut visit::Visitor<()> {
1249+
ast_util::id_visitor(@LintReportingIdVisitor {
1250+
cx: cx,
1251+
} as @ast_util::IdVisitingOperation, false)
12421252
}
12431253

12441254
struct UnnecessaryAllocationLintVisitor { stopping_on_items: bool }

branches/try/src/librustc/rustc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ struct RustcEmitter {
299299

300300
impl diagnostic::Emitter for RustcEmitter {
301301
fn emit(&self,
302-
cmsp: Option<(@codemap::CodeMap, codemap::span)>,
302+
cmsp: Option<(@codemap::CodeMap, codemap::Span)>,
303303
msg: &str,
304304
lvl: diagnostic::level) {
305305
if lvl == diagnostic::fatal {

branches/try/src/libsyntax/ast_util.rs

Lines changed: 46 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -397,29 +397,33 @@ impl id_range {
397397
}
398398
}
399399

400-
pub fn id_visitor(vfn: @fn(NodeId), pass_through_items: bool)
400+
pub fn id_visitor(operation: @IdVisitingOperation, pass_through_items: bool)
401401
-> @mut Visitor<()> {
402402
let visitor = @mut IdVisitor {
403-
visit_callback: vfn,
403+
operation: operation,
404404
pass_through_items: pass_through_items,
405405
visited_outermost: false,
406406
};
407407
visitor as @mut Visitor<()>
408408
}
409409

410+
pub trait IdVisitingOperation {
411+
fn visit_id(&self, node_id: NodeId);
412+
}
413+
410414
pub struct IdVisitor {
411-
visit_callback: @fn(NodeId),
415+
operation: @IdVisitingOperation,
412416
pass_through_items: bool,
413417
visited_outermost: bool,
414418
}
415419

416420
impl IdVisitor {
417421
fn visit_generics_helper(&self, generics: &Generics) {
418422
for type_parameter in generics.ty_params.iter() {
419-
(self.visit_callback)(type_parameter.id)
423+
self.operation.visit_id(type_parameter.id)
420424
}
421425
for lifetime in generics.lifetimes.iter() {
422-
(self.visit_callback)(lifetime.id)
426+
self.operation.visit_id(lifetime.id)
423427
}
424428
}
425429
}
@@ -430,26 +434,26 @@ impl Visitor<()> for IdVisitor {
430434
_: Span,
431435
node_id: NodeId,
432436
env: ()) {
433-
(self.visit_callback)(node_id);
437+
self.operation.visit_id(node_id);
434438
visit::walk_mod(self, module, env)
435439
}
436440

437441
fn visit_view_item(&mut self, view_item: &view_item, env: ()) {
438442
match view_item.node {
439443
view_item_extern_mod(_, _, _, node_id) => {
440-
(self.visit_callback)(node_id)
444+
self.operation.visit_id(node_id)
441445
}
442446
view_item_use(ref view_paths) => {
443447
for view_path in view_paths.iter() {
444448
match view_path.node {
445449
view_path_simple(_, _, node_id) |
446450
view_path_glob(_, node_id) => {
447-
(self.visit_callback)(node_id)
451+
self.operation.visit_id(node_id)
448452
}
449453
view_path_list(_, ref paths, node_id) => {
450-
(self.visit_callback)(node_id);
454+
self.operation.visit_id(node_id);
451455
for path in paths.iter() {
452-
(self.visit_callback)(path.node.id)
456+
self.operation.visit_id(path.node.id)
453457
}
454458
}
455459
}
@@ -460,7 +464,7 @@ impl Visitor<()> for IdVisitor {
460464
}
461465

462466
fn visit_foreign_item(&mut self, foreign_item: @foreign_item, env: ()) {
463-
(self.visit_callback)(foreign_item.id);
467+
self.operation.visit_id(foreign_item.id);
464468
visit::walk_foreign_item(self, foreign_item, env)
465469
}
466470

@@ -473,11 +477,11 @@ impl Visitor<()> for IdVisitor {
473477
}
474478
}
475479

476-
(self.visit_callback)(item.id);
480+
self.operation.visit_id(item.id);
477481
match item.node {
478482
item_enum(ref enum_definition, _) => {
479483
for variant in enum_definition.variants.iter() {
480-
(self.visit_callback)(variant.node.id)
484+
self.operation.visit_id(variant.node.id)
481485
}
482486
}
483487
_ => {}
@@ -489,22 +493,22 @@ impl Visitor<()> for IdVisitor {
489493
}
490494

491495
fn visit_local(&mut self, local: @Local, env: ()) {
492-
(self.visit_callback)(local.id);
496+
self.operation.visit_id(local.id);
493497
visit::walk_local(self, local, env)
494498
}
495499

496500
fn visit_block(&mut self, block: &Block, env: ()) {
497-
(self.visit_callback)(block.id);
501+
self.operation.visit_id(block.id);
498502
visit::walk_block(self, block, env)
499503
}
500504

501505
fn visit_stmt(&mut self, statement: @Stmt, env: ()) {
502-
(self.visit_callback)(ast_util::stmt_id(statement));
506+
self.operation.visit_id(ast_util::stmt_id(statement));
503507
visit::walk_stmt(self, statement, env)
504508
}
505509

506510
fn visit_pat(&mut self, pattern: @Pat, env: ()) {
507-
(self.visit_callback)(pattern.id);
511+
self.operation.visit_id(pattern.id);
508512
visit::walk_pat(self, pattern, env)
509513
}
510514

@@ -513,17 +517,17 @@ impl Visitor<()> for IdVisitor {
513517
{
514518
let optional_callee_id = expression.get_callee_id();
515519
for callee_id in optional_callee_id.iter() {
516-
(self.visit_callback)(*callee_id)
520+
self.operation.visit_id(*callee_id)
517521
}
518522
}
519-
(self.visit_callback)(expression.id);
523+
self.operation.visit_id(expression.id);
520524
visit::walk_expr(self, expression, env)
521525
}
522526

523527
fn visit_ty(&mut self, typ: &Ty, env: ()) {
524-
(self.visit_callback)(typ.id);
528+
self.operation.visit_id(typ.id);
525529
match typ.node {
526-
ty_path(_, _, id) => (self.visit_callback)(id),
530+
ty_path(_, _, id) => self.operation.visit_id(id),
527531
_ => {}
528532
}
529533
visit::walk_ty(self, typ, env)
@@ -549,21 +553,21 @@ impl Visitor<()> for IdVisitor {
549553
}
550554
}
551555

552-
(self.visit_callback)(node_id);
556+
self.operation.visit_id(node_id);
553557

554558
match *function_kind {
555559
visit::fk_item_fn(_, generics, _, _) => {
556560
self.visit_generics_helper(generics)
557561
}
558562
visit::fk_method(_, generics, method) => {
559-
(self.visit_callback)(method.self_id);
563+
self.operation.visit_id(method.self_id);
560564
self.visit_generics_helper(generics)
561565
}
562566
visit::fk_anon(_) | visit::fk_fn_block => {}
563567
}
564568

565569
for argument in function_declaration.inputs.iter() {
566-
(self.visit_callback)(argument.id)
570+
self.operation.visit_id(argument.id)
567571
}
568572

569573
visit::walk_fn(self,
@@ -583,25 +587,36 @@ impl Visitor<()> for IdVisitor {
583587
}
584588

585589
fn visit_struct_field(&mut self, struct_field: @struct_field, env: ()) {
586-
(self.visit_callback)(struct_field.node.id);
590+
self.operation.visit_id(struct_field.node.id);
587591
visit::walk_struct_field(self, struct_field, env)
588592
}
589593
}
590594

591-
pub fn visit_ids_for_inlined_item(item: &inlined_item, vfn: @fn(NodeId)) {
595+
pub fn visit_ids_for_inlined_item(item: &inlined_item,
596+
operation: @IdVisitingOperation) {
592597
let mut id_visitor = IdVisitor {
593-
visit_callback: vfn,
598+
operation: operation,
594599
pass_through_items: true,
595600
visited_outermost: false,
596601
};
597602
item.accept((), &mut id_visitor);
598603
}
599604

600-
pub fn compute_id_range(visit_ids_fn: &fn(@fn(NodeId))) -> id_range {
601-
let result = @mut id_range::max();
602-
do visit_ids_fn |id| {
603-
result.add(id);
605+
struct IdRangeComputingVisitor {
606+
result: @mut id_range,
607+
}
608+
609+
impl IdVisitingOperation for IdRangeComputingVisitor {
610+
fn visit_id(&self, id: NodeId) {
611+
self.result.add(id)
604612
}
613+
}
614+
615+
pub fn compute_id_range(visit_ids_fn: &fn(@IdVisitingOperation)) -> id_range {
616+
let result = @mut id_range::max();
617+
visit_ids_fn(@IdRangeComputingVisitor {
618+
result: result,
619+
} as @IdVisitingOperation);
605620
*result
606621
}
607622

0 commit comments

Comments
 (0)