Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(781)

Side by Side Diff: test/mjsunit/harmony/generators-debug-liveedit.js

Issue 266983004: Prevent liveedit on or under generators with open activations (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« src/liveedit.cc ('K') | « src/objects-inl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Flags: --expose-debug-as debug --harmony-generators
6
7 var Debug = debug.Debug;
8 var LiveEdit = Debug.LiveEdit;
9
10 unique_id = 0;
11
12 var Generator = (function*(){}).constructor;
13
14 function assertIteratorResult(value, done, result) {
15 assertEquals({value: value, done: done}, result);
16 }
17
18 function CatGenerator() {
19 // Prevents eval script caching.
20 unique_id++;
21 return Generator('callback',
22 "/* " + unique_id + "*/\n" +
23 "yield callback();\n" +
24 "return 'Cat';\n");
25 }
26
27 function CatFetcher() {
28 // Prevents eval script caching.
29 unique_id++;
30 return Function('callback',
31 "/* " + unique_id + "*/\n" +
32 "callback();\n" +
33 "return 'Cat';\n");
34 }
35
36 // First, try CatGenerator with no perturbations.
37 (function(){
38 var generator = CatGenerator();
39 function callback() {};
40 var iter = generator(callback);
41 assertIteratorResult(undefined, false, iter.next());
42 assertIteratorResult("Cat", true, iter.next());
43 })();
44
45 function patch(fun, from, to) {
46 function debug() {
47 var log = new Array();
48 var script = Debug.findScript(fun);
49 var pos = script.source.indexOf(from);
50 try {
51 LiveEdit.TestApi.ApplySingleChunkPatch(script, pos, from.length, to,
52 log);
53 } finally {
54 print("Change log: " + JSON.stringify(log) + "\n");
55 }
56 }
57 Debug.ExecuteInDebugContext(debug, false);
58 }
59
60 // Try to edit a CatGenerator while it's running, then again while it's stopped.
61 (function(){
62 var generator = CatGenerator();
63
64 var gen_patch_attempted = false;
65 function attempt_gen_patch() {
66 assertFalse(gen_patch_attempted);
67 gen_patch_attempted = true;
68 assertThrows(function() { patch(generator, "'Cat'", "'Capybara'") },
69 LiveEdit.Failure);
70 };
71 var iter = generator(attempt_gen_patch);
72 assertIteratorResult(undefined, false, iter.next());
73 // Patch should not succeed because there is a live generator activation on
74 // the stack.
75 assertIteratorResult("Cat", true, iter.next());
76 assertTrue(gen_patch_attempted);
77
78 // At this point one iterator is live, but closed, so the patch will succeed.
79 patch(generator, "'Cat'", "'Capybara'");
80 iter = generator(function(){});
81 assertIteratorResult(undefined, false, iter.next());
82 // Patch successful.
83 assertIteratorResult("Capybara", true, iter.next());
84
85 // Patching will fail however when a live iterator is suspended.
86 iter = generator(function(){});
87 assertIteratorResult(undefined, false, iter.next());
88 assertThrows(function() { patch(generator, "'Capybara'", "'Tapir'") }, LiveEdi t.Failure);
Yang 2014/05/06 13:05:03 line break somewhere for the 80-char limit would b
89 assertIteratorResult("Capybara", true, iter.next());
90
91 // Try to patch functions with activations inside and outside generator
92 // function activations. We should succeed in the former case, but not in the
93 // latter.
94 var fetch_outside = CatFetcher();
95 var fetch_inside = CatFetcher();
96 var fun_patch_attempted = false;
97 var fun_patch_restarted = false;
98 function attempt_fun_patches() {
99 if (fun_patch_attempted) {
100 assertFalse(fun_patch_restarted);
101 fun_patch_restarted = true;
102 return;
103 }
104 fun_patch_attempted = true;
105 // Patching outside a generator activation must fail.
106 assertThrows(function() { patch(fetch_outside, "'Cat'", "'Cobra'") },
107 LiveEdit.Failure);
108 // Patching inside a generator activation may succeed.
109 patch(fetch_inside, "'Cat'", "'Koala'");
110 }
111 iter = generator(function() { return fetch_inside(attempt_fun_patches) });
112 assertEquals('Cat',
113 fetch_outside(function () {
114 assertIteratorResult('Koala', false, iter.next());
115 assertTrue(fun_patch_restarted);
116 }));
117 })();
OLDNEW
« src/liveedit.cc ('K') | « src/objects-inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698