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

Side by Side Diff: src/code-stubs-hydrogen.cc

Issue 14284010: Introduce HObjectAccess, which is used by LoadNamedField and StoreNamedField to denote what parts (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Move all construction of HObjectAccess into static methods, hiding Portion. Created 7 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
OLDNEW
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 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 333
334 334
335 Handle<Code> FastCloneShallowArrayStub::GenerateCode() { 335 Handle<Code> FastCloneShallowArrayStub::GenerateCode() {
336 return DoGenerateCode(this); 336 return DoGenerateCode(this);
337 } 337 }
338 338
339 339
340 template <> 340 template <>
341 HValue* CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() { 341 HValue* CodeStubGraphBuilder<FastCloneShallowObjectStub>::BuildCodeStub() {
342 Zone* zone = this->zone(); 342 Zone* zone = this->zone();
343 Factory* factory = isolate()->factory();
344 HValue* undefined = graph()->GetConstantUndefined(); 343 HValue* undefined = graph()->GetConstantUndefined();
345 344
346 HInstruction* boilerplate = 345 HInstruction* boilerplate =
347 AddInstruction(new(zone) HLoadKeyed(GetParameter(0), 346 AddInstruction(new(zone) HLoadKeyed(GetParameter(0),
348 GetParameter(1), 347 GetParameter(1),
349 NULL, 348 NULL,
350 FAST_ELEMENTS)); 349 FAST_ELEMENTS));
351 350
352 IfBuilder checker(this); 351 IfBuilder checker(this);
353 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(boilerplate, undefined); 352 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(boilerplate, undefined);
(...skipping 15 matching lines...) Expand all
369 flags = static_cast<HAllocate::Flags>( 368 flags = static_cast<HAllocate::Flags>(
370 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE); 369 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE);
371 } 370 }
372 HInstruction* object = 371 HInstruction* object =
373 AddInstruction(new(zone) HAllocate(context(), 372 AddInstruction(new(zone) HAllocate(context(),
374 size_in_bytes, 373 size_in_bytes,
375 HType::JSObject(), 374 HType::JSObject(),
376 flags)); 375 flags));
377 376
378 for (int i = 0; i < size; i += kPointerSize) { 377 for (int i = 0; i < size; i += kPointerSize) {
379 HInstruction* value = 378 HObjectAccess* access = HObjectAccess::ForInobjectOffset(zone, i);
380 AddInstruction(new(zone) HLoadNamedField( 379 HInstruction* value = AddLoad(boilerplate, access);
381 boilerplate, true, Representation::Tagged(), i)); 380 AddStore(object, access, value);
382 AddInstruction(new(zone) HStoreNamedField(object,
383 factory->empty_string(),
384 value, true,
385 Representation::Tagged(), i));
386 } 381 }
387 382
388 checker.ElseDeopt(); 383 checker.ElseDeopt();
389 return object; 384 return object;
390 } 385 }
391 386
392 387
393 Handle<Code> FastCloneShallowObjectStub::GenerateCode() { 388 Handle<Code> FastCloneShallowObjectStub::GenerateCode() {
394 return DoGenerateCode(this); 389 return DoGenerateCode(this);
395 } 390 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() { 425 HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() {
431 Zone* zone = this->zone(); 426 Zone* zone = this->zone();
432 427
433 HValue* js_array = GetParameter(0); 428 HValue* js_array = GetParameter(0);
434 HValue* map = GetParameter(1); 429 HValue* map = GetParameter(1);
435 430
436 info()->MarkAsSavesCallerDoubles(); 431 info()->MarkAsSavesCallerDoubles();
437 432
438 AddInstruction(new(zone) HTrapAllocationMemento(js_array)); 433 AddInstruction(new(zone) HTrapAllocationMemento(js_array));
439 434
440 HInstruction* array_length = 435 HInstruction* array_length = AddLoad(js_array,
441 AddInstruction(HLoadNamedField::NewArrayLength( 436 HObjectAccess::ForArrayLength());
442 zone, js_array, js_array, HType::Smi())); 437 array_length->set_type(HType::Smi());
443 438
444 ElementsKind to_kind = casted_stub()->to_kind(); 439 ElementsKind to_kind = casted_stub()->to_kind();
445 BuildNewSpaceArrayCheck(array_length, to_kind); 440 BuildNewSpaceArrayCheck(array_length, to_kind);
446 441
447 IfBuilder if_builder(this); 442 IfBuilder if_builder(this);
448 443
449 if_builder.IfCompare(array_length, graph()->GetConstant0(), Token::EQ); 444 if_builder.IfCompare(array_length, graph()->GetConstant0(), Token::EQ);
450 if_builder.Then(); 445 if_builder.Then();
451 446
452 // Nothing to do, just change the map. 447 // Nothing to do, just change the map.
453 448
454 if_builder.Else(); 449 if_builder.Else();
455 450
456 HInstruction* elements = 451 HInstruction* elements =
457 AddInstruction(new(zone) HLoadElements(js_array, js_array)); 452 AddInstruction(new(zone) HLoadElements(js_array, js_array));
458 453
459 HInstruction* elements_length = 454 HInstruction* elements_length =
460 AddInstruction(new(zone) HFixedArrayBaseLength(elements)); 455 AddInstruction(new(zone) HFixedArrayBaseLength(elements));
461 456
462 HValue* new_elements = 457 HValue* new_elements =
463 BuildAllocateAndInitializeElements(context(), to_kind, elements_length); 458 BuildAllocateAndInitializeElements(context(), to_kind, elements_length);
464 459
465 BuildCopyElements(context(), elements, 460 BuildCopyElements(context(), elements,
466 casted_stub()->from_kind(), new_elements, 461 casted_stub()->from_kind(), new_elements,
467 to_kind, array_length, elements_length); 462 to_kind, array_length, elements_length);
468 463
469 Factory* factory = isolate()->factory(); 464 AddStore(js_array, HObjectAccess::ForElementsPointer(), new_elements);
470
471 AddInstruction(new(zone) HStoreNamedField(js_array,
472 factory->elements_field_string(),
473 new_elements, true,
474 Representation::Tagged(),
475 JSArray::kElementsOffset));
476 465
477 if_builder.End(); 466 if_builder.End();
478 467
479 AddInstruction(new(zone) HStoreNamedField(js_array, factory->length_string(), 468 AddStore(js_array, HObjectAccess::ForMap(), map);
480 map, true, 469
481 Representation::Tagged(),
482 JSArray::kMapOffset));
483 return js_array; 470 return js_array;
484 } 471 }
485 472
486 473
487 Handle<Code> TransitionElementsKindStub::GenerateCode() { 474 Handle<Code> TransitionElementsKindStub::GenerateCode() {
488 return DoGenerateCode(this); 475 return DoGenerateCode(this);
489 } 476 }
490 477
491 478
492 template <> 479 template <>
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 ? graph()->GetConstantSmi1() 621 ? graph()->GetConstantSmi1()
635 : graph()->GetConstantUndefined(); 622 : graph()->GetConstantUndefined();
636 } 623 }
637 624
638 625
639 Handle<Code> CompareNilICStub::GenerateCode() { 626 Handle<Code> CompareNilICStub::GenerateCode() {
640 return DoGenerateCode(this); 627 return DoGenerateCode(this);
641 } 628 }
642 629
643 } } // namespace v8::internal 630 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698