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 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 } | 235 } |
236 if (h2->IsSmi()) return false; | 236 if (h2->IsSmi()) return false; |
237 Handle<HeapNumber> n1 = Handle<HeapNumber>::cast(h1); | 237 Handle<HeapNumber> n1 = Handle<HeapNumber>::cast(h1); |
238 Handle<HeapNumber> n2 = Handle<HeapNumber>::cast(h2); | 238 Handle<HeapNumber> n2 = Handle<HeapNumber>::cast(h2); |
239 ASSERT(isfinite(n1->value())); | 239 ASSERT(isfinite(n1->value())); |
240 ASSERT(isfinite(n2->value())); | 240 ASSERT(isfinite(n2->value())); |
241 return n1->value() == n2->value(); | 241 return n1->value() == n2->value(); |
242 } | 242 } |
243 | 243 |
244 | 244 |
245 void ObjectLiteral::CalculateEmitStore() { | 245 void ObjectLiteral::CalculateEmitStore(Zone* zone) { |
246 ZoneHashMap table(Literal::Match); | 246 ZoneAllocationPolicy allocator(zone); |
| 247 |
| 248 ZoneHashMap table(Literal::Match, ZoneHashMap::kDefaultHashMapCapacity, |
| 249 allocator); |
247 for (int i = properties()->length() - 1; i >= 0; i--) { | 250 for (int i = properties()->length() - 1; i >= 0; i--) { |
248 ObjectLiteral::Property* property = properties()->at(i); | 251 ObjectLiteral::Property* property = properties()->at(i); |
249 Literal* literal = property->key(); | 252 Literal* literal = property->key(); |
250 if (literal->handle()->IsNull()) continue; | 253 if (literal->handle()->IsNull()) continue; |
251 uint32_t hash = literal->Hash(); | 254 uint32_t hash = literal->Hash(); |
252 // If the key of a computed property is in the table, do not emit | 255 // If the key of a computed property is in the table, do not emit |
253 // a store for the property later. | 256 // a store for the property later. |
254 if (property->kind() == ObjectLiteral::Property::COMPUTED && | 257 if (property->kind() == ObjectLiteral::Property::COMPUTED && |
255 table.Lookup(literal, hash, false) != NULL) { | 258 table.Lookup(literal, hash, false, allocator) != NULL) { |
256 property->set_emit_store(false); | 259 property->set_emit_store(false); |
257 } else { | 260 } else { |
258 // Add key to the table. | 261 // Add key to the table. |
259 table.Lookup(literal, hash, true); | 262 table.Lookup(literal, hash, true, allocator); |
260 } | 263 } |
261 } | 264 } |
262 } | 265 } |
263 | 266 |
264 | 267 |
265 void TargetCollector::AddTarget(Label* target) { | 268 void TargetCollector::AddTarget(Label* target, Zone* zone) { |
266 // Add the label to the collector, but discard duplicates. | 269 // Add the label to the collector, but discard duplicates. |
267 int length = targets_.length(); | 270 int length = targets_.length(); |
268 for (int i = 0; i < length; i++) { | 271 for (int i = 0; i < length; i++) { |
269 if (targets_[i] == target) return; | 272 if (targets_[i] == target) return; |
270 } | 273 } |
271 targets_.Add(target); | 274 targets_.Add(target, zone); |
272 } | 275 } |
273 | 276 |
274 | 277 |
275 bool UnaryOperation::ResultOverwriteAllowed() { | 278 bool UnaryOperation::ResultOverwriteAllowed() { |
276 switch (op_) { | 279 switch (op_) { |
277 case Token::BIT_NOT: | 280 case Token::BIT_NOT: |
278 case Token::SUB: | 281 case Token::SUB: |
279 return true; | 282 return true; |
280 default: | 283 default: |
281 return false; | 284 return false; |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 } | 393 } |
391 | 394 |
392 bool FunctionDeclaration::IsInlineable() const { | 395 bool FunctionDeclaration::IsInlineable() const { |
393 return false; | 396 return false; |
394 } | 397 } |
395 | 398 |
396 | 399 |
397 // ---------------------------------------------------------------------------- | 400 // ---------------------------------------------------------------------------- |
398 // Recording of type feedback | 401 // Recording of type feedback |
399 | 402 |
400 void Property::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 403 void Property::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
| 404 Zone* zone) { |
401 // Record type feedback from the oracle in the AST. | 405 // Record type feedback from the oracle in the AST. |
402 is_uninitialized_ = oracle->LoadIsUninitialized(this); | 406 is_uninitialized_ = oracle->LoadIsUninitialized(this); |
403 if (is_uninitialized_) return; | 407 if (is_uninitialized_) return; |
404 | 408 |
405 is_monomorphic_ = oracle->LoadIsMonomorphicNormal(this); | 409 is_monomorphic_ = oracle->LoadIsMonomorphicNormal(this); |
406 receiver_types_.Clear(); | 410 receiver_types_.Clear(); |
407 if (key()->IsPropertyName()) { | 411 if (key()->IsPropertyName()) { |
408 if (oracle->LoadIsBuiltin(this, Builtins::kLoadIC_ArrayLength)) { | 412 if (oracle->LoadIsBuiltin(this, Builtins::kLoadIC_ArrayLength)) { |
409 is_array_length_ = true; | 413 is_array_length_ = true; |
410 } else if (oracle->LoadIsBuiltin(this, Builtins::kLoadIC_StringLength)) { | 414 } else if (oracle->LoadIsBuiltin(this, Builtins::kLoadIC_StringLength)) { |
411 is_string_length_ = true; | 415 is_string_length_ = true; |
412 } else if (oracle->LoadIsBuiltin(this, | 416 } else if (oracle->LoadIsBuiltin(this, |
413 Builtins::kLoadIC_FunctionPrototype)) { | 417 Builtins::kLoadIC_FunctionPrototype)) { |
414 is_function_prototype_ = true; | 418 is_function_prototype_ = true; |
415 } else { | 419 } else { |
416 Literal* lit_key = key()->AsLiteral(); | 420 Literal* lit_key = key()->AsLiteral(); |
417 ASSERT(lit_key != NULL && lit_key->handle()->IsString()); | 421 ASSERT(lit_key != NULL && lit_key->handle()->IsString()); |
418 Handle<String> name = Handle<String>::cast(lit_key->handle()); | 422 Handle<String> name = Handle<String>::cast(lit_key->handle()); |
419 oracle->LoadReceiverTypes(this, name, &receiver_types_); | 423 oracle->LoadReceiverTypes(this, name, &receiver_types_); |
420 } | 424 } |
421 } else if (oracle->LoadIsBuiltin(this, Builtins::kKeyedLoadIC_String)) { | 425 } else if (oracle->LoadIsBuiltin(this, Builtins::kKeyedLoadIC_String)) { |
422 is_string_access_ = true; | 426 is_string_access_ = true; |
423 } else if (is_monomorphic_) { | 427 } else if (is_monomorphic_) { |
424 receiver_types_.Add(oracle->LoadMonomorphicReceiverType(this)); | 428 receiver_types_.Add(oracle->LoadMonomorphicReceiverType(this), |
| 429 zone); |
425 } else if (oracle->LoadIsMegamorphicWithTypeInfo(this)) { | 430 } else if (oracle->LoadIsMegamorphicWithTypeInfo(this)) { |
426 receiver_types_.Reserve(kMaxKeyedPolymorphism); | 431 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); |
427 oracle->CollectKeyedReceiverTypes(this->id(), &receiver_types_); | 432 oracle->CollectKeyedReceiverTypes(this->id(), &receiver_types_); |
428 } | 433 } |
429 } | 434 } |
430 | 435 |
431 | 436 |
432 void Assignment::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 437 void Assignment::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
| 438 Zone* zone) { |
433 Property* prop = target()->AsProperty(); | 439 Property* prop = target()->AsProperty(); |
434 ASSERT(prop != NULL); | 440 ASSERT(prop != NULL); |
435 is_monomorphic_ = oracle->StoreIsMonomorphicNormal(this); | 441 is_monomorphic_ = oracle->StoreIsMonomorphicNormal(this); |
436 receiver_types_.Clear(); | 442 receiver_types_.Clear(); |
437 if (prop->key()->IsPropertyName()) { | 443 if (prop->key()->IsPropertyName()) { |
438 Literal* lit_key = prop->key()->AsLiteral(); | 444 Literal* lit_key = prop->key()->AsLiteral(); |
439 ASSERT(lit_key != NULL && lit_key->handle()->IsString()); | 445 ASSERT(lit_key != NULL && lit_key->handle()->IsString()); |
440 Handle<String> name = Handle<String>::cast(lit_key->handle()); | 446 Handle<String> name = Handle<String>::cast(lit_key->handle()); |
441 oracle->StoreReceiverTypes(this, name, &receiver_types_); | 447 oracle->StoreReceiverTypes(this, name, &receiver_types_); |
442 } else if (is_monomorphic_) { | 448 } else if (is_monomorphic_) { |
443 // Record receiver type for monomorphic keyed stores. | 449 // Record receiver type for monomorphic keyed stores. |
444 receiver_types_.Add(oracle->StoreMonomorphicReceiverType(this)); | 450 receiver_types_.Add(oracle->StoreMonomorphicReceiverType(this), zone); |
445 } else if (oracle->StoreIsMegamorphicWithTypeInfo(this)) { | 451 } else if (oracle->StoreIsMegamorphicWithTypeInfo(this)) { |
446 receiver_types_.Reserve(kMaxKeyedPolymorphism); | 452 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); |
447 oracle->CollectKeyedReceiverTypes(this->id(), &receiver_types_); | 453 oracle->CollectKeyedReceiverTypes(this->id(), &receiver_types_); |
448 } | 454 } |
449 } | 455 } |
450 | 456 |
451 | 457 |
452 void CountOperation::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 458 void CountOperation::RecordTypeFeedback(TypeFeedbackOracle* oracle, |
| 459 Zone* zone) { |
453 is_monomorphic_ = oracle->StoreIsMonomorphicNormal(this); | 460 is_monomorphic_ = oracle->StoreIsMonomorphicNormal(this); |
454 receiver_types_.Clear(); | 461 receiver_types_.Clear(); |
455 if (is_monomorphic_) { | 462 if (is_monomorphic_) { |
456 // Record receiver type for monomorphic keyed stores. | 463 // Record receiver type for monomorphic keyed stores. |
457 receiver_types_.Add(oracle->StoreMonomorphicReceiverType(this)); | 464 receiver_types_.Add(oracle->StoreMonomorphicReceiverType(this), zone); |
458 } else if (oracle->StoreIsMegamorphicWithTypeInfo(this)) { | 465 } else if (oracle->StoreIsMegamorphicWithTypeInfo(this)) { |
459 receiver_types_.Reserve(kMaxKeyedPolymorphism); | 466 receiver_types_.Reserve(kMaxKeyedPolymorphism, zone); |
460 oracle->CollectKeyedReceiverTypes(this->id(), &receiver_types_); | 467 oracle->CollectKeyedReceiverTypes(this->id(), &receiver_types_); |
461 } | 468 } |
462 } | 469 } |
463 | 470 |
464 | 471 |
465 void CaseClause::RecordTypeFeedback(TypeFeedbackOracle* oracle) { | 472 void CaseClause::RecordTypeFeedback(TypeFeedbackOracle* oracle) { |
466 TypeInfo info = oracle->SwitchType(this); | 473 TypeInfo info = oracle->SwitchType(this); |
467 if (info.IsSmi()) { | 474 if (info.IsSmi()) { |
468 compare_type_ = SMI_ONLY; | 475 compare_type_ = SMI_ONLY; |
469 } else if (info.IsSymbol()) { | 476 } else if (info.IsSymbol()) { |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 } | 784 } |
778 | 785 |
779 | 786 |
780 // Convert regular expression trees to a simple sexp representation. | 787 // Convert regular expression trees to a simple sexp representation. |
781 // This representation should be different from the input grammar | 788 // This representation should be different from the input grammar |
782 // in as many cases as possible, to make it more difficult for incorrect | 789 // in as many cases as possible, to make it more difficult for incorrect |
783 // parses to look as correct ones which is likely if the input and | 790 // parses to look as correct ones which is likely if the input and |
784 // output formats are alike. | 791 // output formats are alike. |
785 class RegExpUnparser: public RegExpVisitor { | 792 class RegExpUnparser: public RegExpVisitor { |
786 public: | 793 public: |
787 RegExpUnparser(); | 794 explicit RegExpUnparser(Zone* zone); |
788 void VisitCharacterRange(CharacterRange that); | 795 void VisitCharacterRange(CharacterRange that); |
789 SmartArrayPointer<const char> ToString() { return stream_.ToCString(); } | 796 SmartArrayPointer<const char> ToString() { return stream_.ToCString(); } |
790 #define MAKE_CASE(Name) virtual void* Visit##Name(RegExp##Name*, void* data); | 797 #define MAKE_CASE(Name) virtual void* Visit##Name(RegExp##Name*, void* data); |
791 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) | 798 FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) |
792 #undef MAKE_CASE | 799 #undef MAKE_CASE |
793 private: | 800 private: |
794 StringStream* stream() { return &stream_; } | 801 StringStream* stream() { return &stream_; } |
795 HeapStringAllocator alloc_; | 802 HeapStringAllocator alloc_; |
796 StringStream stream_; | 803 StringStream stream_; |
| 804 Zone* zone_; |
797 }; | 805 }; |
798 | 806 |
799 | 807 |
800 RegExpUnparser::RegExpUnparser() : stream_(&alloc_) { | 808 RegExpUnparser::RegExpUnparser(Zone* zone) : stream_(&alloc_), zone_(zone) { |
801 } | 809 } |
802 | 810 |
803 | 811 |
804 void* RegExpUnparser::VisitDisjunction(RegExpDisjunction* that, void* data) { | 812 void* RegExpUnparser::VisitDisjunction(RegExpDisjunction* that, void* data) { |
805 stream()->Add("(|"); | 813 stream()->Add("(|"); |
806 for (int i = 0; i < that->alternatives()->length(); i++) { | 814 for (int i = 0; i < that->alternatives()->length(); i++) { |
807 stream()->Add(" "); | 815 stream()->Add(" "); |
808 that->alternatives()->at(i)->Accept(this, data); | 816 that->alternatives()->at(i)->Accept(this, data); |
809 } | 817 } |
810 stream()->Add(")"); | 818 stream()->Add(")"); |
(...skipping 19 matching lines...) Expand all Loading... |
830 } | 838 } |
831 } | 839 } |
832 | 840 |
833 | 841 |
834 | 842 |
835 void* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that, | 843 void* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that, |
836 void* data) { | 844 void* data) { |
837 if (that->is_negated()) | 845 if (that->is_negated()) |
838 stream()->Add("^"); | 846 stream()->Add("^"); |
839 stream()->Add("["); | 847 stream()->Add("["); |
840 for (int i = 0; i < that->ranges()->length(); i++) { | 848 for (int i = 0; i < that->ranges(zone_)->length(); i++) { |
841 if (i > 0) stream()->Add(" "); | 849 if (i > 0) stream()->Add(" "); |
842 VisitCharacterRange(that->ranges()->at(i)); | 850 VisitCharacterRange(that->ranges(zone_)->at(i)); |
843 } | 851 } |
844 stream()->Add("]"); | 852 stream()->Add("]"); |
845 return NULL; | 853 return NULL; |
846 } | 854 } |
847 | 855 |
848 | 856 |
849 void* RegExpUnparser::VisitAssertion(RegExpAssertion* that, void* data) { | 857 void* RegExpUnparser::VisitAssertion(RegExpAssertion* that, void* data) { |
850 switch (that->type()) { | 858 switch (that->type()) { |
851 case RegExpAssertion::START_OF_INPUT: | 859 case RegExpAssertion::START_OF_INPUT: |
852 stream()->Add("@^i"); | 860 stream()->Add("@^i"); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 return NULL; | 942 return NULL; |
935 } | 943 } |
936 | 944 |
937 | 945 |
938 void* RegExpUnparser::VisitEmpty(RegExpEmpty* that, void* data) { | 946 void* RegExpUnparser::VisitEmpty(RegExpEmpty* that, void* data) { |
939 stream()->Put('%'); | 947 stream()->Put('%'); |
940 return NULL; | 948 return NULL; |
941 } | 949 } |
942 | 950 |
943 | 951 |
944 SmartArrayPointer<const char> RegExpTree::ToString() { | 952 SmartArrayPointer<const char> RegExpTree::ToString(Zone* zone) { |
945 RegExpUnparser unparser; | 953 RegExpUnparser unparser(zone); |
946 Accept(&unparser, NULL); | 954 Accept(&unparser, NULL); |
947 return unparser.ToString(); | 955 return unparser.ToString(); |
948 } | 956 } |
949 | 957 |
950 | 958 |
951 RegExpDisjunction::RegExpDisjunction(ZoneList<RegExpTree*>* alternatives) | 959 RegExpDisjunction::RegExpDisjunction(ZoneList<RegExpTree*>* alternatives) |
952 : alternatives_(alternatives) { | 960 : alternatives_(alternatives) { |
953 ASSERT(alternatives->length() > 1); | 961 ASSERT(alternatives->length() > 1); |
954 RegExpTree* first_alternative = alternatives->at(0); | 962 RegExpTree* first_alternative = alternatives->at(0); |
955 min_match_ = first_alternative->min_match(); | 963 min_match_ = first_alternative->min_match(); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 OS::SNPrintF(buffer, "%d", Smi::cast(*handle_)->value()); | 1112 OS::SNPrintF(buffer, "%d", Smi::cast(*handle_)->value()); |
1105 str = arr; | 1113 str = arr; |
1106 } else { | 1114 } else { |
1107 str = DoubleToCString(handle_->Number(), buffer); | 1115 str = DoubleToCString(handle_->Number(), buffer); |
1108 } | 1116 } |
1109 return FACTORY->NewStringFromAscii(CStrVector(str)); | 1117 return FACTORY->NewStringFromAscii(CStrVector(str)); |
1110 } | 1118 } |
1111 | 1119 |
1112 | 1120 |
1113 } } // namespace v8::internal | 1121 } } // namespace v8::internal |
OLD | NEW |