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

Side by Side Diff: src/objects.cc

Issue 1972093003: Fix RegExp.prototype.compile error case (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 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
« no previous file with comments | « no previous file | test/mjsunit/regexp-compile.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 15407 matching lines...) Expand 10 before | Expand all | Expand 10 after
15418 Isolate* isolate = regexp->GetIsolate(); 15418 Isolate* isolate = regexp->GetIsolate();
15419 Factory* factory = isolate->factory(); 15419 Factory* factory = isolate->factory();
15420 // If source is the empty string we set it to "(?:)" instead as 15420 // If source is the empty string we set it to "(?:)" instead as
15421 // suggested by ECMA-262, 5th, section 15.10.4.1. 15421 // suggested by ECMA-262, 5th, section 15.10.4.1.
15422 if (source->length() == 0) source = factory->query_colon_string(); 15422 if (source->length() == 0) source = factory->query_colon_string();
15423 15423
15424 Handle<String> escaped_source; 15424 Handle<String> escaped_source;
15425 ASSIGN_RETURN_ON_EXCEPTION(isolate, escaped_source, 15425 ASSIGN_RETURN_ON_EXCEPTION(isolate, escaped_source,
15426 EscapeRegExpSource(isolate, source), JSRegExp); 15426 EscapeRegExpSource(isolate, source), JSRegExp);
15427 15427
15428 RETURN_ON_EXCEPTION(isolate, RegExpImpl::Compile(regexp, source, flags),
15429 JSRegExp);
15430
15428 regexp->set_source(*escaped_source); 15431 regexp->set_source(*escaped_source);
15429 regexp->set_flags(Smi::FromInt(flags)); 15432 regexp->set_flags(Smi::FromInt(flags));
15430 15433
15431 Map* map = regexp->map(); 15434 Map* map = regexp->map();
15432 Object* constructor = map->GetConstructor(); 15435 Object* constructor = map->GetConstructor();
15433 if (constructor->IsJSFunction() && 15436 if (constructor->IsJSFunction() &&
15434 JSFunction::cast(constructor)->initial_map() == map) { 15437 JSFunction::cast(constructor)->initial_map() == map) {
15435 // If we still have the original map, set in-object properties directly. 15438 // If we still have the original map, set in-object properties directly.
15436 regexp->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, 15439 regexp->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex,
15437 Smi::FromInt(0), SKIP_WRITE_BARRIER); 15440 Smi::FromInt(0), SKIP_WRITE_BARRIER);
15438 } else { 15441 } else {
15439 // Map has changed, so use generic, but slower, method. 15442 // Map has changed, so use generic, but slower, method.
15440 PropertyAttributes writable = 15443 PropertyAttributes writable =
15441 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 15444 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
15442 JSObject::SetOwnPropertyIgnoreAttributes( 15445 JSObject::SetOwnPropertyIgnoreAttributes(
15443 regexp, factory->last_index_string(), 15446 regexp, factory->last_index_string(),
15444 Handle<Smi>(Smi::FromInt(0), isolate), writable) 15447 Handle<Smi>(Smi::FromInt(0), isolate), writable)
15445 .Check(); 15448 .Check();
15446 } 15449 }
15447 15450
15448 RETURN_ON_EXCEPTION(isolate, RegExpImpl::Compile(regexp, source, flags),
15449 JSRegExp);
15450
15451 return regexp; 15451 return regexp;
15452 } 15452 }
15453 15453
15454 15454
15455 // RegExpKey carries the source and flags of a regular expression as key. 15455 // RegExpKey carries the source and flags of a regular expression as key.
15456 class RegExpKey : public HashTableKey { 15456 class RegExpKey : public HashTableKey {
15457 public: 15457 public:
15458 RegExpKey(Handle<String> string, JSRegExp::Flags flags) 15458 RegExpKey(Handle<String> string, JSRegExp::Flags flags)
15459 : string_(string), flags_(Smi::FromInt(flags)) {} 15459 : string_(string), flags_(Smi::FromInt(flags)) {}
15460 15460
(...skipping 2814 matching lines...) Expand 10 before | Expand all | Expand 10 after
18275 if (cell->value() != *new_value) { 18275 if (cell->value() != *new_value) {
18276 cell->set_value(*new_value); 18276 cell->set_value(*new_value);
18277 Isolate* isolate = cell->GetIsolate(); 18277 Isolate* isolate = cell->GetIsolate();
18278 cell->dependent_code()->DeoptimizeDependentCodeGroup( 18278 cell->dependent_code()->DeoptimizeDependentCodeGroup(
18279 isolate, DependentCode::kPropertyCellChangedGroup); 18279 isolate, DependentCode::kPropertyCellChangedGroup);
18280 } 18280 }
18281 } 18281 }
18282 18282
18283 } // namespace internal 18283 } // namespace internal
18284 } // namespace v8 18284 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regexp-compile.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698