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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 public: | 85 public: |
86 ArrayContextChecker(HGraphBuilder* builder, HValue* constructor, | 86 ArrayContextChecker(HGraphBuilder* builder, HValue* constructor, |
87 HValue* array_function) | 87 HValue* array_function) |
88 : checker_(builder) { | 88 : checker_(builder) { |
89 checker_.If<HCompareObjectEqAndBranch, HValue*>(constructor, | 89 checker_.If<HCompareObjectEqAndBranch, HValue*>(constructor, |
90 array_function); | 90 array_function); |
91 checker_.Then(); | 91 checker_.Then(); |
92 } | 92 } |
93 | 93 |
94 ~ArrayContextChecker() { | 94 ~ArrayContextChecker() { |
95 checker_.ElseDeopt(); | 95 checker_.ElseDeopt("Array constructor called from different context"); |
96 checker_.End(); | 96 checker_.End(); |
97 } | 97 } |
98 private: | 98 private: |
99 IfBuilder checker_; | 99 IfBuilder checker_; |
100 }; | 100 }; |
101 | 101 |
102 enum ArgumentClass { | 102 enum ArgumentClass { |
103 NONE, | 103 NONE, |
104 SINGLE, | 104 SINGLE, |
105 MULTIPLE | 105 MULTIPLE |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 UNIMPLEMENTED(); | 226 UNIMPLEMENTED(); |
227 return NULL; | 227 return NULL; |
228 } | 228 } |
229 | 229 |
230 virtual HValue* BuildCodeUninitializedStub() { | 230 virtual HValue* BuildCodeUninitializedStub() { |
231 // Force a deopt that falls back to the runtime. | 231 // Force a deopt that falls back to the runtime. |
232 HValue* undefined = graph()->GetConstantUndefined(); | 232 HValue* undefined = graph()->GetConstantUndefined(); |
233 IfBuilder builder(this); | 233 IfBuilder builder(this); |
234 builder.IfNot<HCompareObjectEqAndBranch, HValue*>(undefined, undefined); | 234 builder.IfNot<HCompareObjectEqAndBranch, HValue*>(undefined, undefined); |
235 builder.Then(); | 235 builder.Then(); |
236 builder.ElseDeopt(); | 236 builder.ElseDeopt("Forced deopt to runtime"); |
237 return undefined; | 237 return undefined; |
238 } | 238 } |
239 | 239 |
240 Stub* casted_stub() { return static_cast<Stub*>(stub()); } | 240 Stub* casted_stub() { return static_cast<Stub*>(stub()); } |
241 }; | 241 }; |
242 | 242 |
243 | 243 |
244 Handle<Code> HydrogenCodeStub::GenerateLightweightMissCode(Isolate* isolate) { | 244 Handle<Code> HydrogenCodeStub::GenerateLightweightMissCode(Isolate* isolate) { |
245 Factory* factory = isolate->factory(); | 245 Factory* factory = isolate->factory(); |
246 | 246 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 length)); | 380 length)); |
381 } else { | 381 } else { |
382 ElementsKind elements_kind = casted_stub()->ComputeElementsKind(); | 382 ElementsKind elements_kind = casted_stub()->ComputeElementsKind(); |
383 environment()->Push(BuildCloneShallowArray(boilerplate, | 383 environment()->Push(BuildCloneShallowArray(boilerplate, |
384 allocation_site, | 384 allocation_site, |
385 alloc_site_mode, | 385 alloc_site_mode, |
386 elements_kind, | 386 elements_kind, |
387 length)); | 387 length)); |
388 } | 388 } |
389 | 389 |
390 checker.ElseDeopt(); | 390 checker.ElseDeopt("Uninitialized boilerplate literals"); |
391 checker.End(); | 391 checker.End(); |
392 | 392 |
393 return environment()->Pop(); | 393 return environment()->Pop(); |
394 } | 394 } |
395 | 395 |
396 | 396 |
397 Handle<Code> FastCloneShallowArrayStub::GenerateCode() { | 397 Handle<Code> FastCloneShallowArrayStub::GenerateCode() { |
398 return DoGenerateCode(this); | 398 return DoGenerateCode(this); |
399 } | 399 } |
400 | 400 |
(...skipping 26 matching lines...) Expand all Loading... |
427 HInstruction* object = Add<HAllocate>(size_in_bytes, HType::JSObject(), | 427 HInstruction* object = Add<HAllocate>(size_in_bytes, HType::JSObject(), |
428 isolate()->heap()->GetPretenureMode(), JS_OBJECT_TYPE); | 428 isolate()->heap()->GetPretenureMode(), JS_OBJECT_TYPE); |
429 | 429 |
430 for (int i = 0; i < size; i += kPointerSize) { | 430 for (int i = 0; i < size; i += kPointerSize) { |
431 HObjectAccess access = HObjectAccess::ForJSObjectOffset(i); | 431 HObjectAccess access = HObjectAccess::ForJSObjectOffset(i); |
432 Add<HStoreNamedField>(object, access, | 432 Add<HStoreNamedField>(object, access, |
433 Add<HLoadNamedField>(boilerplate, access)); | 433 Add<HLoadNamedField>(boilerplate, access)); |
434 } | 434 } |
435 | 435 |
436 environment()->Push(object); | 436 environment()->Push(object); |
437 checker.ElseDeopt(); | 437 checker.ElseDeopt("Uninitialized boilerplate in fast clone"); |
438 checker.End(); | 438 checker.End(); |
439 | 439 |
440 return environment()->Pop(); | 440 return environment()->Pop(); |
441 } | 441 } |
442 | 442 |
443 | 443 |
444 Handle<Code> FastCloneShallowObjectStub::GenerateCode() { | 444 Handle<Code> FastCloneShallowObjectStub::GenerateCode() { |
445 return DoGenerateCode(this); | 445 return DoGenerateCode(this); |
446 } | 446 } |
447 | 447 |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 Add<HCheckMaps>(receiver, placeholder_map, top_info()); | 837 Add<HCheckMaps>(receiver, placeholder_map, top_info()); |
838 | 838 |
839 HValue* cell = Add<HConstant>(placeholder_cell); | 839 HValue* cell = Add<HConstant>(placeholder_cell); |
840 HObjectAccess access(HObjectAccess::ForCellPayload(isolate())); | 840 HObjectAccess access(HObjectAccess::ForCellPayload(isolate())); |
841 HValue* cell_contents = Add<HLoadNamedField>(cell, access); | 841 HValue* cell_contents = Add<HLoadNamedField>(cell, access); |
842 | 842 |
843 if (stub->is_constant()) { | 843 if (stub->is_constant()) { |
844 IfBuilder builder(this); | 844 IfBuilder builder(this); |
845 builder.If<HCompareObjectEqAndBranch>(cell_contents, value); | 845 builder.If<HCompareObjectEqAndBranch>(cell_contents, value); |
846 builder.Then(); | 846 builder.Then(); |
847 builder.ElseDeopt(); | 847 builder.ElseDeopt("Unexpected cell contents in constant global store"); |
848 builder.End(); | 848 builder.End(); |
849 } else { | 849 } else { |
850 // Load the payload of the global parameter cell. A hole indicates that the | 850 // Load the payload of the global parameter cell. A hole indicates that the |
851 // property has been deleted and that the store must be handled by the | 851 // property has been deleted and that the store must be handled by the |
852 // runtime. | 852 // runtime. |
853 IfBuilder builder(this); | 853 IfBuilder builder(this); |
854 HValue* hole_value = Add<HConstant>(hole); | 854 HValue* hole_value = Add<HConstant>(hole); |
855 builder.If<HCompareObjectEqAndBranch>(cell_contents, hole_value); | 855 builder.If<HCompareObjectEqAndBranch>(cell_contents, hole_value); |
856 builder.Then(); | 856 builder.Then(); |
857 builder.Deopt(); | 857 builder.Deopt("Unexpected cell contents in global store"); |
858 builder.Else(); | 858 builder.Else(); |
859 Add<HStoreNamedField>(cell, access, value); | 859 Add<HStoreNamedField>(cell, access, value); |
860 builder.End(); | 860 builder.End(); |
861 } | 861 } |
862 | 862 |
863 return value; | 863 return value; |
864 } | 864 } |
865 | 865 |
866 | 866 |
867 Handle<Code> StoreGlobalStub::GenerateCode() { | 867 Handle<Code> StoreGlobalStub::GenerateCode() { |
868 return DoGenerateCode(this); | 868 return DoGenerateCode(this); |
869 } | 869 } |
870 | 870 |
871 | 871 |
872 template<> | 872 template<> |
873 HValue* CodeStubGraphBuilder<ElementsTransitionAndStoreStub>::BuildCodeStub() { | 873 HValue* CodeStubGraphBuilder<ElementsTransitionAndStoreStub>::BuildCodeStub() { |
874 HValue* value = GetParameter(0); | 874 HValue* value = GetParameter(0); |
875 HValue* map = GetParameter(1); | 875 HValue* map = GetParameter(1); |
876 HValue* key = GetParameter(2); | 876 HValue* key = GetParameter(2); |
877 HValue* object = GetParameter(3); | 877 HValue* object = GetParameter(3); |
878 | 878 |
879 if (FLAG_trace_elements_transitions) { | 879 if (FLAG_trace_elements_transitions) { |
880 // Tracing elements transitions is the job of the runtime. | 880 // Tracing elements transitions is the job of the runtime. |
881 Add<HDeoptimize>(Deoptimizer::EAGER); | 881 Add<HDeoptimize>("Deopt due to --trace-elements-transitions", |
| 882 Deoptimizer::EAGER); |
882 } else { | 883 } else { |
883 info()->MarkAsSavesCallerDoubles(); | 884 info()->MarkAsSavesCallerDoubles(); |
884 | 885 |
885 BuildTransitionElementsKind(object, map, | 886 BuildTransitionElementsKind(object, map, |
886 casted_stub()->from_kind(), | 887 casted_stub()->from_kind(), |
887 casted_stub()->to_kind(), | 888 casted_stub()->to_kind(), |
888 casted_stub()->is_jsarray()); | 889 casted_stub()->is_jsarray()); |
889 | 890 |
890 BuildUncheckedMonomorphicElementAccess(object, key, value, NULL, | 891 BuildUncheckedMonomorphicElementAccess(object, key, value, NULL, |
891 casted_stub()->is_jsarray(), | 892 casted_stub()->is_jsarray(), |
892 casted_stub()->to_kind(), | 893 casted_stub()->to_kind(), |
893 true, ALLOW_RETURN_HOLE, | 894 true, ALLOW_RETURN_HOLE, |
894 casted_stub()->store_mode()); | 895 casted_stub()->store_mode()); |
895 } | 896 } |
896 | 897 |
897 return value; | 898 return value; |
898 } | 899 } |
899 | 900 |
900 | 901 |
901 Handle<Code> ElementsTransitionAndStoreStub::GenerateCode() { | 902 Handle<Code> ElementsTransitionAndStoreStub::GenerateCode() { |
902 return DoGenerateCode(this); | 903 return DoGenerateCode(this); |
903 } | 904 } |
904 | 905 |
905 | 906 |
906 } } // namespace v8::internal | 907 } } // namespace v8::internal |
OLD | NEW |