| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 #include "test/cctest/cctest.h" | 6 #include "test/cctest/cctest.h" |
| 7 | 7 |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
| 10 #include "src/execution.h" | 10 #include "src/execution.h" |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 Isolate* isolate = CcTest::i_isolate(); | 201 Isolate* isolate = CcTest::i_isolate(); |
| 202 Heap* heap = isolate->heap(); | 202 Heap* heap = isolate->heap(); |
| 203 | 203 |
| 204 // Make sure function f has a call that uses a type feedback slot. | 204 // Make sure function f has a call that uses a type feedback slot. |
| 205 CompileRun( | 205 CompileRun( |
| 206 "function foo() { return 17; }" | 206 "function foo() { return 17; }" |
| 207 "function f(a) { a(); } f(foo);"); | 207 "function f(a) { a(); } f(foo);"); |
| 208 Handle<JSFunction> f = GetFunction("f"); | 208 Handle<JSFunction> f = GetFunction("f"); |
| 209 // There should be one IC. | 209 // There should be one IC. |
| 210 Handle<TypeFeedbackVector> feedback_vector = | 210 Handle<TypeFeedbackVector> feedback_vector = |
| 211 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); | 211 Handle<TypeFeedbackVector>(f->feedback_vector(), isolate); |
| 212 FeedbackVectorSlot slot(0); | 212 FeedbackVectorSlot slot(0); |
| 213 CallICNexus nexus(feedback_vector, slot); | 213 CallICNexus nexus(feedback_vector, slot); |
| 214 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 214 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 215 // CallIC doesn't return map feedback. | 215 // CallIC doesn't return map feedback. |
| 216 CHECK(!nexus.FindFirstMap()); | 216 CHECK(!nexus.FindFirstMap()); |
| 217 | 217 |
| 218 CompileRun("f(function() { return 16; })"); | 218 CompileRun("f(function() { return 16; })"); |
| 219 CHECK_EQ(GENERIC, nexus.StateFromFeedback()); | 219 CHECK_EQ(GENERIC, nexus.StateFromFeedback()); |
| 220 | 220 |
| 221 // After a collection, state should remain GENERIC. | 221 // After a collection, state should remain GENERIC. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 240 v8::HandleScope scope(context->GetIsolate()); | 240 v8::HandleScope scope(context->GetIsolate()); |
| 241 Isolate* isolate = CcTest::i_isolate(); | 241 Isolate* isolate = CcTest::i_isolate(); |
| 242 | 242 |
| 243 // Make sure function f has a call that uses a type feedback slot. | 243 // Make sure function f has a call that uses a type feedback slot. |
| 244 CompileRun( | 244 CompileRun( |
| 245 "function foo() { return 17; }" | 245 "function foo() { return 17; }" |
| 246 "function f(a) { a(); } f(foo);"); | 246 "function f(a) { a(); } f(foo);"); |
| 247 Handle<JSFunction> f = GetFunction("f"); | 247 Handle<JSFunction> f = GetFunction("f"); |
| 248 // There should be one IC. | 248 // There should be one IC. |
| 249 Handle<TypeFeedbackVector> feedback_vector = | 249 Handle<TypeFeedbackVector> feedback_vector = |
| 250 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); | 250 Handle<TypeFeedbackVector>(f->feedback_vector(), isolate); |
| 251 FeedbackVectorSlot slot(0); | 251 FeedbackVectorSlot slot(0); |
| 252 CallICNexus nexus(feedback_vector, slot); | 252 CallICNexus nexus(feedback_vector, slot); |
| 253 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 253 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 254 | 254 |
| 255 CompileRun("f(foo); f(foo);"); | 255 CompileRun("f(foo); f(foo);"); |
| 256 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 256 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 257 CHECK_EQ(3, nexus.ExtractCallCount()); | 257 CHECK_EQ(3, nexus.ExtractCallCount()); |
| 258 | 258 |
| 259 CompileRun( | 259 CompileRun( |
| 260 "function Foo() {}" | 260 "function Foo() {}" |
| 261 "function f(a) { new a(); } f(Foo);"); | 261 "function f(a) { new a(); } f(Foo);"); |
| 262 f = GetFunction("f"); | 262 f = GetFunction("f"); |
| 263 // There should be one IC. | 263 // There should be one IC. |
| 264 feedback_vector = | 264 feedback_vector = Handle<TypeFeedbackVector>(f->feedback_vector(), isolate); |
| 265 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); | |
| 266 FeedbackVectorSlot cslot(1); | 265 FeedbackVectorSlot cslot(1); |
| 267 | 266 |
| 268 CompileRun("f(Foo); f(Foo);"); | 267 CompileRun("f(Foo); f(Foo);"); |
| 269 CHECK(feedback_vector->Get(cslot)->IsSmi()); | 268 CHECK(feedback_vector->Get(cslot)->IsSmi()); |
| 270 CHECK_EQ(3, Smi::cast(feedback_vector->Get(cslot))->value()); | 269 CHECK_EQ(3, Smi::cast(feedback_vector->Get(cslot))->value()); |
| 271 } | 270 } |
| 272 | 271 |
| 273 TEST(VectorLoadICStates) { | 272 TEST(VectorLoadICStates) { |
| 274 if (i::FLAG_always_opt) return; | 273 if (i::FLAG_always_opt) return; |
| 275 CcTest::InitializeVM(); | 274 CcTest::InitializeVM(); |
| 276 LocalContext context; | 275 LocalContext context; |
| 277 v8::HandleScope scope(context->GetIsolate()); | 276 v8::HandleScope scope(context->GetIsolate()); |
| 278 Isolate* isolate = CcTest::i_isolate(); | 277 Isolate* isolate = CcTest::i_isolate(); |
| 279 Heap* heap = isolate->heap(); | 278 Heap* heap = isolate->heap(); |
| 280 | 279 |
| 281 // Make sure function f has a call that uses a type feedback slot. | 280 // Make sure function f has a call that uses a type feedback slot. |
| 282 CompileRun( | 281 CompileRun( |
| 283 "var o = { foo: 3 };" | 282 "var o = { foo: 3 };" |
| 284 "function f(a) { return a.foo; } f(o);"); | 283 "function f(a) { return a.foo; } f(o);"); |
| 285 Handle<JSFunction> f = GetFunction("f"); | 284 Handle<JSFunction> f = GetFunction("f"); |
| 286 // There should be one IC. | 285 // There should be one IC. |
| 287 Handle<TypeFeedbackVector> feedback_vector = | 286 Handle<TypeFeedbackVector> feedback_vector = |
| 288 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); | 287 Handle<TypeFeedbackVector>(f->feedback_vector(), isolate); |
| 289 FeedbackVectorSlot slot(0); | 288 FeedbackVectorSlot slot(0); |
| 290 LoadICNexus nexus(feedback_vector, slot); | 289 LoadICNexus nexus(feedback_vector, slot); |
| 291 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback()); | 290 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback()); |
| 292 | 291 |
| 293 CompileRun("f(o)"); | 292 CompileRun("f(o)"); |
| 294 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 293 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 295 // Verify that the monomorphic map is the one we expect. | 294 // Verify that the monomorphic map is the one we expect. |
| 296 v8::MaybeLocal<v8::Value> v8_o = | 295 v8::MaybeLocal<v8::Value> v8_o = |
| 297 CcTest::global()->Get(context.local(), v8_str("o")); | 296 CcTest::global()->Get(context.local(), v8_str("o")); |
| 298 Handle<JSObject> o = | 297 Handle<JSObject> o = |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 CompileRun( | 336 CompileRun( |
| 338 "o = 10;" | 337 "o = 10;" |
| 339 "function f() {" | 338 "function f() {" |
| 340 " var x = o + 10;" | 339 " var x = o + 10;" |
| 341 " return o + x + o;" | 340 " return o + x + o;" |
| 342 "}" | 341 "}" |
| 343 "f();"); | 342 "f();"); |
| 344 Handle<JSFunction> f = GetFunction("f"); | 343 Handle<JSFunction> f = GetFunction("f"); |
| 345 // There should be one IC slot. | 344 // There should be one IC slot. |
| 346 Handle<TypeFeedbackVector> feedback_vector = | 345 Handle<TypeFeedbackVector> feedback_vector = |
| 347 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); | 346 Handle<TypeFeedbackVector>(f->feedback_vector(), isolate); |
| 348 FeedbackVectorHelper helper(feedback_vector); | 347 FeedbackVectorHelper helper(feedback_vector); |
| 349 CHECK_EQ(1, helper.slot_count()); | 348 CHECK_EQ(1, helper.slot_count()); |
| 350 FeedbackVectorSlot slot(0); | 349 FeedbackVectorSlot slot(0); |
| 351 LoadICNexus nexus(feedback_vector, slot); | 350 LoadICNexus nexus(feedback_vector, slot); |
| 352 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 351 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 353 } | 352 } |
| 354 | 353 |
| 355 | 354 |
| 356 TEST(VectorLoadICOnSmi) { | 355 TEST(VectorLoadICOnSmi) { |
| 357 if (i::FLAG_always_opt) return; | 356 if (i::FLAG_always_opt) return; |
| 358 CcTest::InitializeVM(); | 357 CcTest::InitializeVM(); |
| 359 LocalContext context; | 358 LocalContext context; |
| 360 v8::HandleScope scope(context->GetIsolate()); | 359 v8::HandleScope scope(context->GetIsolate()); |
| 361 Isolate* isolate = CcTest::i_isolate(); | 360 Isolate* isolate = CcTest::i_isolate(); |
| 362 Heap* heap = isolate->heap(); | 361 Heap* heap = isolate->heap(); |
| 363 | 362 |
| 364 // Make sure function f has a call that uses a type feedback slot. | 363 // Make sure function f has a call that uses a type feedback slot. |
| 365 CompileRun( | 364 CompileRun( |
| 366 "var o = { foo: 3 };" | 365 "var o = { foo: 3 };" |
| 367 "function f(a) { return a.foo; } f(o);"); | 366 "function f(a) { return a.foo; } f(o);"); |
| 368 Handle<JSFunction> f = GetFunction("f"); | 367 Handle<JSFunction> f = GetFunction("f"); |
| 369 // There should be one IC. | 368 // There should be one IC. |
| 370 Handle<TypeFeedbackVector> feedback_vector = | 369 Handle<TypeFeedbackVector> feedback_vector = |
| 371 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); | 370 Handle<TypeFeedbackVector>(f->feedback_vector(), isolate); |
| 372 FeedbackVectorSlot slot(0); | 371 FeedbackVectorSlot slot(0); |
| 373 LoadICNexus nexus(feedback_vector, slot); | 372 LoadICNexus nexus(feedback_vector, slot); |
| 374 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback()); | 373 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback()); |
| 375 | 374 |
| 376 CompileRun("f(34)"); | 375 CompileRun("f(34)"); |
| 377 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 376 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 378 // Verify that the monomorphic map is the one we expect. | 377 // Verify that the monomorphic map is the one we expect. |
| 379 Map* number_map = heap->heap_number_map(); | 378 Map* number_map = heap->heap_number_map(); |
| 380 CHECK_EQ(number_map, nexus.FindFirstMap()); | 379 CHECK_EQ(number_map, nexus.FindFirstMap()); |
| 381 | 380 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 " y = a;" | 425 " y = a;" |
| 427 " return y;" | 426 " return y;" |
| 428 "}" | 427 "}" |
| 429 "a = 3;" | 428 "a = 3;" |
| 430 "testvar({});"); | 429 "testvar({});"); |
| 431 | 430 |
| 432 Handle<JSFunction> f = GetFunction("testvar"); | 431 Handle<JSFunction> f = GetFunction("testvar"); |
| 433 | 432 |
| 434 // There should be two LOAD_ICs, one for a and one for y at the end. | 433 // There should be two LOAD_ICs, one for a and one for y at the end. |
| 435 Handle<TypeFeedbackVector> feedback_vector = | 434 Handle<TypeFeedbackVector> feedback_vector = |
| 436 handle(f->shared()->feedback_vector(), isolate); | 435 handle(f->feedback_vector(), isolate); |
| 437 FeedbackVectorHelper helper(feedback_vector); | 436 FeedbackVectorHelper helper(feedback_vector); |
| 438 CHECK_EQ(4, helper.slot_count()); | 437 CHECK_EQ(4, helper.slot_count()); |
| 439 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::STORE_IC); | 438 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::STORE_IC); |
| 440 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC); | 439 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC); |
| 441 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC); | 440 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC); |
| 442 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::LOAD_IC); | 441 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::LOAD_IC); |
| 443 } | 442 } |
| 444 | 443 |
| 445 { | 444 { |
| 446 CompileRun( | 445 CompileRun( |
| 447 "function testprop(x) {" | 446 "function testprop(x) {" |
| 448 " x.blue = a;" | 447 " x.blue = a;" |
| 449 "}" | 448 "}" |
| 450 "testprop({ blue: 3 });"); | 449 "testprop({ blue: 3 });"); |
| 451 | 450 |
| 452 Handle<JSFunction> f = GetFunction("testprop"); | 451 Handle<JSFunction> f = GetFunction("testprop"); |
| 453 | 452 |
| 454 // There should be one LOAD_IC, for the load of a. | 453 // There should be one LOAD_IC, for the load of a. |
| 455 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); | 454 Handle<TypeFeedbackVector> feedback_vector(f->feedback_vector()); |
| 456 FeedbackVectorHelper helper(feedback_vector); | 455 FeedbackVectorHelper helper(feedback_vector); |
| 457 CHECK_EQ(2, helper.slot_count()); | 456 CHECK_EQ(2, helper.slot_count()); |
| 458 } | 457 } |
| 459 | 458 |
| 460 { | 459 { |
| 461 CompileRun( | 460 CompileRun( |
| 462 "function testpropfunc(x) {" | 461 "function testpropfunc(x) {" |
| 463 " x().blue = a;" | 462 " x().blue = a;" |
| 464 " return x().blue;" | 463 " return x().blue;" |
| 465 "}" | 464 "}" |
| 466 "function makeresult() { return { blue: 3 }; }" | 465 "function makeresult() { return { blue: 3 }; }" |
| 467 "testpropfunc(makeresult);"); | 466 "testpropfunc(makeresult);"); |
| 468 | 467 |
| 469 Handle<JSFunction> f = GetFunction("testpropfunc"); | 468 Handle<JSFunction> f = GetFunction("testpropfunc"); |
| 470 | 469 |
| 471 // There should be 2 LOAD_ICs and 2 CALL_ICs. | 470 // There should be 2 LOAD_ICs and 2 CALL_ICs. |
| 472 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); | 471 Handle<TypeFeedbackVector> feedback_vector(f->feedback_vector()); |
| 473 FeedbackVectorHelper helper(feedback_vector); | 472 FeedbackVectorHelper helper(feedback_vector); |
| 474 CHECK_EQ(5, helper.slot_count()); | 473 CHECK_EQ(5, helper.slot_count()); |
| 475 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::CALL_IC); | 474 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::CALL_IC); |
| 476 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC); | 475 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC); |
| 477 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC); | 476 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC); |
| 478 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::CALL_IC); | 477 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::CALL_IC); |
| 479 CHECK_SLOT_KIND(helper, 4, FeedbackVectorSlotKind::LOAD_IC); | 478 CHECK_SLOT_KIND(helper, 4, FeedbackVectorSlotKind::LOAD_IC); |
| 480 } | 479 } |
| 481 | 480 |
| 482 { | 481 { |
| 483 CompileRun( | 482 CompileRun( |
| 484 "function testkeyedprop(x) {" | 483 "function testkeyedprop(x) {" |
| 485 " x[0] = a;" | 484 " x[0] = a;" |
| 486 " return x[0];" | 485 " return x[0];" |
| 487 "}" | 486 "}" |
| 488 "testkeyedprop([0, 1, 2]);"); | 487 "testkeyedprop([0, 1, 2]);"); |
| 489 | 488 |
| 490 Handle<JSFunction> f = GetFunction("testkeyedprop"); | 489 Handle<JSFunction> f = GetFunction("testkeyedprop"); |
| 491 | 490 |
| 492 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for | 491 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for |
| 493 // the load of x[0] in the return statement. | 492 // the load of x[0] in the return statement. |
| 494 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); | 493 Handle<TypeFeedbackVector> feedback_vector(f->feedback_vector()); |
| 495 FeedbackVectorHelper helper(feedback_vector); | 494 FeedbackVectorHelper helper(feedback_vector); |
| 496 CHECK_EQ(3, helper.slot_count()); | 495 CHECK_EQ(3, helper.slot_count()); |
| 497 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC); | 496 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC); |
| 498 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::KEYED_STORE_IC); | 497 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::KEYED_STORE_IC); |
| 499 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::KEYED_LOAD_IC); | 498 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::KEYED_LOAD_IC); |
| 500 } | 499 } |
| 501 | 500 |
| 502 { | 501 { |
| 503 CompileRun( | 502 CompileRun( |
| 504 "function testcompound(x) {" | 503 "function testcompound(x) {" |
| 505 " x.old = x.young = x.in_between = a;" | 504 " x.old = x.young = x.in_between = a;" |
| 506 " return x.old + x.young;" | 505 " return x.old + x.young;" |
| 507 "}" | 506 "}" |
| 508 "testcompound({ old: 3, young: 3, in_between: 3 });"); | 507 "testcompound({ old: 3, young: 3, in_between: 3 });"); |
| 509 | 508 |
| 510 Handle<JSFunction> f = GetFunction("testcompound"); | 509 Handle<JSFunction> f = GetFunction("testcompound"); |
| 511 | 510 |
| 512 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young. | 511 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young. |
| 513 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); | 512 Handle<TypeFeedbackVector> feedback_vector(f->feedback_vector()); |
| 514 FeedbackVectorHelper helper(feedback_vector); | 513 FeedbackVectorHelper helper(feedback_vector); |
| 515 CHECK_EQ(6, helper.slot_count()); | 514 CHECK_EQ(6, helper.slot_count()); |
| 516 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC); | 515 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC); |
| 517 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::STORE_IC); | 516 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::STORE_IC); |
| 518 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC); | 517 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC); |
| 519 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::STORE_IC); | 518 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::STORE_IC); |
| 520 CHECK_SLOT_KIND(helper, 4, FeedbackVectorSlotKind::LOAD_IC); | 519 CHECK_SLOT_KIND(helper, 4, FeedbackVectorSlotKind::LOAD_IC); |
| 521 CHECK_SLOT_KIND(helper, 5, FeedbackVectorSlotKind::LOAD_IC); | 520 CHECK_SLOT_KIND(helper, 5, FeedbackVectorSlotKind::LOAD_IC); |
| 522 } | 521 } |
| 523 } | 522 } |
| 524 | 523 |
| 525 | 524 |
| 526 TEST(VectorStoreICBasic) { | 525 TEST(VectorStoreICBasic) { |
| 527 if (i::FLAG_always_opt) return; | 526 if (i::FLAG_always_opt) return; |
| 528 | 527 |
| 529 CcTest::InitializeVM(); | 528 CcTest::InitializeVM(); |
| 530 LocalContext context; | 529 LocalContext context; |
| 531 v8::HandleScope scope(context->GetIsolate()); | 530 v8::HandleScope scope(context->GetIsolate()); |
| 532 | 531 |
| 533 CompileRun( | 532 CompileRun( |
| 534 "function f(a) {" | 533 "function f(a) {" |
| 535 " a.foo = 5;" | 534 " a.foo = 5;" |
| 536 "}" | 535 "}" |
| 537 "var a = { foo: 3 };" | 536 "var a = { foo: 3 };" |
| 538 "f(a);" | 537 "f(a);" |
| 539 "f(a);" | 538 "f(a);" |
| 540 "f(a);"); | 539 "f(a);"); |
| 541 Handle<JSFunction> f = GetFunction("f"); | 540 Handle<JSFunction> f = GetFunction("f"); |
| 542 // There should be one IC slot. | 541 // There should be one IC slot. |
| 543 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); | 542 Handle<TypeFeedbackVector> feedback_vector(f->feedback_vector()); |
| 544 FeedbackVectorHelper helper(feedback_vector); | 543 FeedbackVectorHelper helper(feedback_vector); |
| 545 CHECK_EQ(1, helper.slot_count()); | 544 CHECK_EQ(1, helper.slot_count()); |
| 546 FeedbackVectorSlot slot(0); | 545 FeedbackVectorSlot slot(0); |
| 547 StoreICNexus nexus(feedback_vector, slot); | 546 StoreICNexus nexus(feedback_vector, slot); |
| 548 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 547 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 549 } | 548 } |
| 550 | 549 |
| 551 } // namespace | 550 } // namespace |
| OLD | NEW |