Skip to content

Commit dffd45f

Browse files
committed
---
yaml --- r: 590 b: refs/heads/master c: af6e1d2 h: refs/heads/master v: v3
1 parent fa097d6 commit dffd45f

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: a48c382549f01ddbd5707601a2257bf45d0d4f5c
2+
refs/heads/master: af6e1d2c2ba777622c21455f897bbc7a1c88372d

trunk/src/boot/me/typestate.ml

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,10 @@ let typestate_verify_visitor
12741274
Walk.visit_block_pre = visit_block_pre }
12751275
;;
12761276

1277+
type slots_stack = node_id Stack.t;;
1278+
type block_slots_stack = slots_stack Stack.t;;
1279+
type frame_block_slots_stack = block_slots_stack Stack.t;;
1280+
12771281
let lifecycle_visitor
12781282
(cx:ctxt)
12791283
(tables_stack:typestate_tables Stack.t)
@@ -1291,14 +1295,14 @@ let lifecycle_visitor
12911295
let tables _ = Stack.top tables_stack in
12921296

12931297
let (live_block_slots:(node_id, unit) Hashtbl.t) = Hashtbl.create 0 in
1294-
let (block_slots:(node_id Stack.t) Stack.t) = Stack.create () in
1298+
let (frame_blocks:frame_block_slots_stack) = Stack.create () in
12951299

12961300
let (implicit_init_block_slots:(node_id,node_id) Hashtbl.t) =
12971301
Hashtbl.create 0
12981302
in
12991303

13001304
let push_slot sl =
1301-
Stack.push sl (Stack.top block_slots)
1305+
Stack.push sl (Stack.top (Stack.top frame_blocks))
13021306
in
13031307

13041308
let mark_slot_live sl =
@@ -1307,7 +1311,7 @@ let lifecycle_visitor
13071311

13081312

13091313
let visit_block_pre b =
1310-
Stack.push (Stack.create()) block_slots;
1314+
Stack.push (Stack.create()) (Stack.top frame_blocks);
13111315
begin
13121316
match htab_search implicit_init_block_slots b.id with
13131317
None -> ()
@@ -1335,7 +1339,7 @@ let lifecycle_visitor
13351339

13361340
let visit_block_post b =
13371341
inner.Walk.visit_block_post b;
1338-
let blk_slots = Stack.pop block_slots in
1342+
let block_slots = Stack.pop (Stack.top frame_blocks) in
13391343
let stmts = b.node in
13401344
let len = Array.length stmts in
13411345
if len > 0
@@ -1355,7 +1359,7 @@ let lifecycle_visitor
13551359
* slots that actually got initialized (went live) at some
13561360
* point in the block.
13571361
*)
1358-
let slots = stk_elts_from_top blk_slots in
1362+
let slots = stk_elts_from_top block_slots in
13591363
let live =
13601364
List.filter
13611365
(fun i -> Hashtbl.mem live_block_slots i)
@@ -1443,8 +1447,8 @@ let lifecycle_visitor
14431447
match s.node with
14441448
Ast.STMT_ret _
14451449
| Ast.STMT_be _ ->
1446-
let stks = stk_elts_from_top block_slots in
1447-
let slots = List.concat (List.map stk_elts_from_top stks) in
1450+
let blocks = stk_elts_from_top (Stack.top frame_blocks) in
1451+
let slots = List.concat (List.map stk_elts_from_top blocks) in
14481452
let live =
14491453
List.filter
14501454
(fun i -> Hashtbl.mem live_block_slots i)
@@ -1454,11 +1458,57 @@ let lifecycle_visitor
14541458
| _ -> ()
14551459
in
14561460

1461+
let enter_frame _ =
1462+
Stack.push (Stack.create()) frame_blocks
1463+
in
1464+
1465+
let leave_frame _ =
1466+
ignore (Stack.pop frame_blocks)
1467+
in
1468+
1469+
let visit_mod_item_pre n p i =
1470+
enter_frame();
1471+
inner.Walk.visit_mod_item_pre n p i
1472+
in
1473+
1474+
let visit_mod_item_post n p i =
1475+
inner.Walk.visit_mod_item_post n p i;
1476+
leave_frame()
1477+
in
1478+
1479+
let visit_obj_fn_pre obj ident fn =
1480+
enter_frame();
1481+
inner.Walk.visit_obj_fn_pre obj ident fn
1482+
in
1483+
1484+
let visit_obj_fn_post obj ident fn =
1485+
inner.Walk.visit_obj_fn_post obj ident fn;
1486+
leave_frame()
1487+
in
1488+
1489+
let visit_obj_drop_pre obj b =
1490+
enter_frame();
1491+
inner.Walk.visit_obj_drop_pre obj b
1492+
in
1493+
1494+
let visit_obj_drop_post obj b =
1495+
inner.Walk.visit_obj_drop_post obj b;
1496+
leave_frame()
1497+
in
1498+
14571499
{ inner with
14581500
Walk.visit_block_pre = visit_block_pre;
14591501
Walk.visit_block_post = visit_block_post;
14601502
Walk.visit_stmt_pre = visit_stmt_pre;
1461-
Walk.visit_stmt_post = visit_stmt_post
1503+
Walk.visit_stmt_post = visit_stmt_post;
1504+
1505+
Walk.visit_mod_item_pre = visit_mod_item_pre;
1506+
Walk.visit_mod_item_post = visit_mod_item_post;
1507+
Walk.visit_obj_fn_pre = visit_obj_fn_pre;
1508+
Walk.visit_obj_fn_post = visit_obj_fn_post;
1509+
Walk.visit_obj_drop_pre = visit_obj_drop_pre;
1510+
Walk.visit_obj_drop_post = visit_obj_drop_post;
1511+
14621512
}
14631513
;;
14641514

trunk/src/test/run-pass/lib-map.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ fn test_simple() {
2222

2323
check (hm.get(11u) == 13u);
2424
check (hm.get(12u) == 14u);
25+
check (hm.get(10u) == 12u);
2526

2627
log "*** finished test_simple";
2728
}

0 commit comments

Comments
 (0)