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

Side by Side Diff: runtime/vm/object.cc

Issue 539153002: Port and integrate the irregexp engine from V8 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Port remaining V8 regexp tests and fix exposed bugs. Created 6 years, 2 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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 5363 matching lines...) Expand 10 before | Expand all | Expand 10 after
5374 break; 5374 break;
5375 case RawFunction::kMethodExtractor: 5375 case RawFunction::kMethodExtractor:
5376 return "kMethodExtractor"; 5376 return "kMethodExtractor";
5377 break; 5377 break;
5378 case RawFunction::kNoSuchMethodDispatcher: 5378 case RawFunction::kNoSuchMethodDispatcher:
5379 return "kNoSuchMethodDispatcher"; 5379 return "kNoSuchMethodDispatcher";
5380 break; 5380 break;
5381 case RawFunction::kInvokeFieldDispatcher: 5381 case RawFunction::kInvokeFieldDispatcher:
5382 return "kInvokeFieldDispatcher"; 5382 return "kInvokeFieldDispatcher";
5383 break; 5383 break;
5384 case RawFunction::kIrregexpFunction:
5385 return "kIrregexpFunction";
5386 break;
5384 default: 5387 default:
5385 UNREACHABLE(); 5388 UNREACHABLE();
5386 return NULL; 5389 return NULL;
5387 } 5390 }
5388 } 5391 }
5389 5392
5390 5393
5391 void Function::SetRedirectionType(const Type& type) const { 5394 void Function::SetRedirectionType(const Type& type) const {
5392 ASSERT(IsFactory()); 5395 ASSERT(IsFactory());
5393 Object& obj = Object::Handle(raw_ptr()->data_); 5396 Object& obj = Object::Handle(raw_ptr()->data_);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
5459 StorePointer(&raw_ptr()->name_, value.raw()); 5462 StorePointer(&raw_ptr()->name_, value.raw());
5460 } 5463 }
5461 5464
5462 5465
5463 void Function::set_owner(const Object& value) const { 5466 void Function::set_owner(const Object& value) const {
5464 ASSERT(!value.IsNull()); 5467 ASSERT(!value.IsNull());
5465 StorePointer(&raw_ptr()->owner_, value.raw()); 5468 StorePointer(&raw_ptr()->owner_, value.raw());
5466 } 5469 }
5467 5470
5468 5471
5472 void Function::set_regexp(const JSRegExp& value) const {
5473 ASSERT(!value.IsNull());
5474 StorePointer(&raw_ptr()->regexp_, value.raw());
5475 }
5476
5477
5469 void Function::set_result_type(const AbstractType& value) const { 5478 void Function::set_result_type(const AbstractType& value) const {
5470 ASSERT(!value.IsNull()); 5479 ASSERT(!value.IsNull());
5471 StorePointer(&raw_ptr()->result_type_, value.raw()); 5480 StorePointer(&raw_ptr()->result_type_, value.raw());
5472 } 5481 }
5473 5482
5474 5483
5475 RawAbstractType* Function::ParameterTypeAt(intptr_t index) const { 5484 RawAbstractType* Function::ParameterTypeAt(intptr_t index) const {
5476 const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_); 5485 const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_);
5477 return AbstractType::RawCast(parameter_types.At(index)); 5486 return AbstractType::RawCast(parameter_types.At(index));
5478 } 5487 }
(...skipping 1296 matching lines...) Expand 10 before | Expand all | Expand 10 after
6775 break; 6784 break;
6776 case RawFunction::kMethodExtractor: 6785 case RawFunction::kMethodExtractor:
6777 kind_str = " method-extractor"; 6786 kind_str = " method-extractor";
6778 break; 6787 break;
6779 case RawFunction::kNoSuchMethodDispatcher: 6788 case RawFunction::kNoSuchMethodDispatcher:
6780 kind_str = " no-such-method-dispatcher"; 6789 kind_str = " no-such-method-dispatcher";
6781 break; 6790 break;
6782 case RawFunction::kInvokeFieldDispatcher: 6791 case RawFunction::kInvokeFieldDispatcher:
6783 kind_str = "invoke-field-dispatcher"; 6792 kind_str = "invoke-field-dispatcher";
6784 break; 6793 break;
6794 case RawFunction::kIrregexpFunction:
6795 kind_str = "irregexp-function";
6796 break;
6785 default: 6797 default:
6786 UNREACHABLE(); 6798 UNREACHABLE();
6787 } 6799 }
6788 const char* kFormat = "Function '%s':%s%s%s%s."; 6800 const char* kFormat = "Function '%s':%s%s%s%s.";
6789 const char* function_name = String::Handle(name()).ToCString(); 6801 const char* function_name = String::Handle(name()).ToCString();
6790 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, 6802 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name,
6791 static_str, abstract_str, kind_str, const_str) + 1; 6803 static_str, abstract_str, kind_str, const_str) + 1;
6792 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 6804 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
6793 OS::SNPrint(chars, len, kFormat, function_name, 6805 OS::SNPrint(chars, len, kFormat, function_name,
6794 static_str, abstract_str, kind_str, const_str); 6806 static_str, abstract_str, kind_str, const_str);
(...skipping 3639 matching lines...) Expand 10 before | Expand all | Expand 10 after
10434 OS::Print("Function not found %s.%s\n", #class_name, #function_name); \ 10446 OS::Print("Function not found %s.%s\n", #class_name, #function_name); \
10435 } else if (func.SourceFingerprint() != fp) { \ 10447 } else if (func.SourceFingerprint() != fp) { \
10436 has_errors = true; \ 10448 has_errors = true; \
10437 OS::Print("Wrong fingerprint for '%s': expecting %d found %d\n", \ 10449 OS::Print("Wrong fingerprint for '%s': expecting %d found %d\n", \
10438 func.ToFullyQualifiedCString(), fp, func.SourceFingerprint()); \ 10450 func.ToFullyQualifiedCString(), fp, func.SourceFingerprint()); \
10439 collected_fp_diffs.Add(FpDiff(fp, func.SourceFingerprint())); \ 10451 collected_fp_diffs.Add(FpDiff(fp, func.SourceFingerprint())); \
10440 } \ 10452 } \
10441 10453
10442 all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary())); 10454 all_libs.Add(&Library::ZoneHandle(Library::CoreLibrary()));
10443 CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS); 10455 CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
10456 CORE_REGEXP_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
10444 CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS); 10457 CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS);
10445 10458
10446 all_libs.Add(&Library::ZoneHandle(Library::MathLibrary())); 10459 all_libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
10447 all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary())); 10460 all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
10448 OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS); 10461 OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS);
10449 INLINE_WHITE_LIST(CHECK_FINGERPRINTS); 10462 INLINE_WHITE_LIST(CHECK_FINGERPRINTS);
10450 POLYMORPHIC_TARGET_LIST(CHECK_FINGERPRINTS); 10463 POLYMORPHIC_TARGET_LIST(CHECK_FINGERPRINTS);
10451 10464
10452 all_libs.Clear(); 10465 all_libs.Clear();
10453 all_libs.Add(&Library::ZoneHandle(Library::MathLibrary())); 10466 all_libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
(...skipping 9571 matching lines...) Expand 10 before | Expand all | Expand 10 after
20025 chars[total_len] = '\0'; 20038 chars[total_len] = '\0';
20026 return chars; 20039 return chars;
20027 } 20040 }
20028 20041
20029 20042
20030 void JSRegExp::set_pattern(const String& pattern) const { 20043 void JSRegExp::set_pattern(const String& pattern) const {
20031 StorePointer(&raw_ptr()->pattern_, pattern.raw()); 20044 StorePointer(&raw_ptr()->pattern_, pattern.raw());
20032 } 20045 }
20033 20046
20034 20047
20048 void JSRegExp::set_function(intptr_t cid, const Function& value) {
20049 RawFunction** dest = NULL;
20050 switch (cid) {
20051 case kOneByteStringCid: dest = &raw_ptr()->one_byte_function_; break;
Florian Schneider 2014/10/01 17:04:15 break lines after if there is more than one statem
20052 case kTwoByteStringCid: dest = &raw_ptr()->two_byte_function_; break;
20053 case kExternalOneByteStringCid:
20054 dest = &raw_ptr()->external_one_byte_function_; break;
20055 case kExternalTwoByteStringCid:
20056 dest = &raw_ptr()->external_two_byte_function_; break;
20057 default: UNREACHABLE();
20058 }
20059 ASSERT(dest != NULL);
20060
20061 StorePointer(dest, value.raw());
20062 }
20063
20064
20065 void JSRegExp::set_sample_subject(intptr_t cid, const String& value) const {
20066 RawString** dest = NULL;
20067 switch (cid) {
20068 case kOneByteStringCid: dest = &raw_ptr()->one_byte_subject_; break;
Florian Schneider 2014/10/01 17:04:15 Also here.
20069 case kTwoByteStringCid: dest = &raw_ptr()->two_byte_subject_; break;
20070 case kExternalOneByteStringCid:
20071 dest = &raw_ptr()->external_one_byte_subject_; break;
20072 case kExternalTwoByteStringCid:
20073 dest = &raw_ptr()->external_two_byte_subject_; break;
20074 default: UNREACHABLE();
20075 }
20076 ASSERT(dest != NULL);
20077
20078 StorePointer(dest, value.raw());
20079 }
20080
20081
20082
20035 void JSRegExp::set_num_bracket_expressions(intptr_t value) const { 20083 void JSRegExp::set_num_bracket_expressions(intptr_t value) const {
20036 raw_ptr()->num_bracket_expressions_ = Smi::New(value); 20084 raw_ptr()->num_bracket_expressions_ = Smi::New(value);
20037 } 20085 }
20038 20086
20039 20087
20040 RawJSRegExp* JSRegExp::New(intptr_t len, Heap::Space space) { 20088 RawJSRegExp* JSRegExp::New(intptr_t len, Heap::Space space) {
20041 if (len < 0 || len > kMaxElements) { 20089 if (len < 0 || len > kMaxElements) {
20042 // This should be caught before we reach here. 20090 // This should be caught before we reach here.
20043 FATAL1("Fatal error in JSRegexp::New: invalid len %" Pd "\n", len); 20091 FATAL1("Fatal error in JSRegexp::New: invalid len %" Pd "\n", len);
20044 } 20092 }
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
20361 return tag_label.ToCString(); 20409 return tag_label.ToCString();
20362 } 20410 }
20363 20411
20364 20412
20365 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 20413 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
20366 Instance::PrintJSONImpl(stream, ref); 20414 Instance::PrintJSONImpl(stream, ref);
20367 } 20415 }
20368 20416
20369 20417
20370 } // namespace dart 20418 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698