OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 CHECK_EQ(5, CompileRun("ordering.length")->Int32Value()); | 159 CHECK_EQ(5, CompileRun("ordering.length")->Int32Value()); |
160 CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); | 160 CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); |
161 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); | 161 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); |
162 CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); | 162 CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); |
163 // Note that we re-deliver to observers 1 and 2, while observer3 | 163 // Note that we re-deliver to observers 1 and 2, while observer3 |
164 // already received the second record during the first round. | 164 // already received the second record during the first round. |
165 CHECK_EQ(1, CompileRun("ordering[3]")->Int32Value()); | 165 CHECK_EQ(1, CompileRun("ordering[3]")->Int32Value()); |
166 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); | 166 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); |
167 } | 167 } |
168 | 168 |
| 169 TEST(DeliveryOrderingDeliverChangeRecords) { |
| 170 HarmonyIsolate isolate; |
| 171 HandleScope scope; |
| 172 LocalContext context; |
| 173 CompileRun( |
| 174 "var obj = {};" |
| 175 "var ordering = [];" |
| 176 "function observer1() { ordering.push(1); if (!obj.b) obj.b = true };" |
| 177 "function observer2() { ordering.push(2); };" |
| 178 "Object.observe(obj, observer1);" |
| 179 "Object.observe(obj, observer2);" |
| 180 "obj.a = 1;" |
| 181 "Object.deliverChangeRecords(observer2);"); |
| 182 CHECK_EQ(4, CompileRun("ordering.length")->Int32Value()); |
| 183 // First, observer2 is called due to deliverChangeRecords |
| 184 CHECK_EQ(2, CompileRun("ordering[0]")->Int32Value()); |
| 185 // Then, observer1 is called when the stack unwinds |
| 186 CHECK_EQ(1, CompileRun("ordering[1]")->Int32Value()); |
| 187 // observer1's mutation causes both 1 and 2 to be reactivated, |
| 188 // with 1 having priority. |
| 189 CHECK_EQ(1, CompileRun("ordering[2]")->Int32Value()); |
| 190 CHECK_EQ(2, CompileRun("ordering[3]")->Int32Value()); |
| 191 } |
| 192 |
169 TEST(ObjectHashTableGrowth) { | 193 TEST(ObjectHashTableGrowth) { |
170 HarmonyIsolate isolate; | 194 HarmonyIsolate isolate; |
171 HandleScope scope; | 195 HandleScope scope; |
172 // Initializing this context sets up initial hash tables. | 196 // Initializing this context sets up initial hash tables. |
173 LocalContext context; | 197 LocalContext context; |
174 Handle<Value> obj = CompileRun("obj = {};"); | 198 Handle<Value> obj = CompileRun("obj = {};"); |
175 Handle<Value> observer = CompileRun( | 199 Handle<Value> observer = CompileRun( |
176 "var ran = false;" | 200 "var ran = false;" |
177 "(function() { ran = true })"); | 201 "(function() { ran = true })"); |
178 { | 202 { |
179 // As does initializing this context. | 203 // As does initializing this context. |
180 LocalContext context2; | 204 LocalContext context2; |
181 context2->Global()->Set(String::New("obj"), obj); | 205 context2->Global()->Set(String::New("obj"), obj); |
182 context2->Global()->Set(String::New("observer"), observer); | 206 context2->Global()->Set(String::New("observer"), observer); |
183 CompileRun( | 207 CompileRun( |
184 "var objArr = [];" | 208 "var objArr = [];" |
185 // 100 objects should be enough to make the hash table grow | 209 // 100 objects should be enough to make the hash table grow |
186 // (and thus relocate). | 210 // (and thus relocate). |
187 "for (var i = 0; i < 100; ++i) {" | 211 "for (var i = 0; i < 100; ++i) {" |
188 " objArr.push({});" | 212 " objArr.push({});" |
189 " Object.observe(objArr[objArr.length-1], function(){});" | 213 " Object.observe(objArr[objArr.length-1], function(){});" |
190 "}" | 214 "}" |
191 "Object.observe(obj, observer);"); | 215 "Object.observe(obj, observer);"); |
192 } | 216 } |
193 // obj is now marked "is_observed", but our map has moved. | 217 // obj is now marked "is_observed", but our map has moved. |
194 CompileRun("obj.foo = 'bar'"); | 218 CompileRun("obj.foo = 'bar'"); |
195 CHECK(CompileRun("ran")->BooleanValue()); | 219 CHECK(CompileRun("ran")->BooleanValue()); |
196 } | 220 } |
OLD | NEW |