diff options
author | Michaël Zasso <targos@protonmail.com> | 2017-05-02 10:50:00 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2017-05-06 20:02:35 +0200 |
commit | 60d1aac8d225e844e68ae48e8f3d58802e635fbe (patch) | |
tree | 922f347dd054db18d88666fad7181e5a777f4022 /deps/v8/src/regexp | |
parent | 73d9c0f903ae371cd5011af64c3a6f69a1bda978 (diff) | |
download | android-node-v8-60d1aac8d225e844e68ae48e8f3d58802e635fbe.tar.gz android-node-v8-60d1aac8d225e844e68ae48e8f3d58802e635fbe.tar.bz2 android-node-v8-60d1aac8d225e844e68ae48e8f3d58802e635fbe.zip |
deps: update V8 to 5.8.283.38
PR-URL: https://github.com/nodejs/node/pull/12784
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
Diffstat (limited to 'deps/v8/src/regexp')
-rw-r--r-- | deps/v8/src/regexp/jsregexp-inl.h | 1 | ||||
-rw-r--r-- | deps/v8/src/regexp/jsregexp.cc | 14 | ||||
-rw-r--r-- | deps/v8/src/regexp/jsregexp.h | 2 | ||||
-rw-r--r-- | deps/v8/src/regexp/regexp-ast.cc | 6 | ||||
-rw-r--r-- | deps/v8/src/regexp/regexp-ast.h | 22 | ||||
-rw-r--r-- | deps/v8/src/regexp/regexp-macro-assembler.cc | 7 | ||||
-rw-r--r-- | deps/v8/src/regexp/regexp-parser.cc | 4 | ||||
-rw-r--r-- | deps/v8/src/regexp/regexp-utils.cc | 9 | ||||
-rw-r--r-- | deps/v8/src/regexp/regexp-utils.h | 2 | ||||
-rw-r--r-- | deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc | 2 |
10 files changed, 57 insertions, 12 deletions
diff --git a/deps/v8/src/regexp/jsregexp-inl.h b/deps/v8/src/regexp/jsregexp-inl.h index ca7a9fe991..4bcda43496 100644 --- a/deps/v8/src/regexp/jsregexp-inl.h +++ b/deps/v8/src/regexp/jsregexp-inl.h @@ -7,7 +7,6 @@ #define V8_REGEXP_JSREGEXP_INL_H_ #include "src/allocation.h" -#include "src/handles.h" #include "src/heap/heap.h" #include "src/objects.h" #include "src/regexp/jsregexp.h" diff --git a/deps/v8/src/regexp/jsregexp.cc b/deps/v8/src/regexp/jsregexp.cc index 8b21459059..0ed3086ce6 100644 --- a/deps/v8/src/regexp/jsregexp.cc +++ b/deps/v8/src/regexp/jsregexp.cc @@ -1106,12 +1106,11 @@ RegExpEngine::CompilationResult RegExpCompiler::Assemble( RegExpNode* start, int capture_count, Handle<String> pattern) { - Heap* heap = pattern->GetHeap(); + Isolate* isolate = pattern->GetHeap()->isolate(); #ifdef DEBUG if (FLAG_trace_regexp_assembler) - macro_assembler_ = - new RegExpMacroAssemblerTracer(isolate(), macro_assembler); + macro_assembler_ = new RegExpMacroAssemblerTracer(isolate, macro_assembler); else #endif macro_assembler_ = macro_assembler; @@ -1135,11 +1134,11 @@ RegExpEngine::CompilationResult RegExpCompiler::Assemble( } Handle<HeapObject> code = macro_assembler_->GetCode(pattern); - heap->IncreaseTotalRegexpCodeGenerated(code->Size()); + isolate->IncreaseTotalRegexpCodeGenerated(code->Size()); work_list_ = NULL; #ifdef ENABLE_DISASSEMBLER if (FLAG_print_code) { - CodeTracer::Scope trace_scope(heap->isolate()->GetCodeTracer()); + CodeTracer::Scope trace_scope(isolate->GetCodeTracer()); OFStream os(trace_scope.file()); Handle<Code>::cast(code)->Disassemble(pattern->ToCString().get(), os); } @@ -6761,8 +6760,9 @@ RegExpEngine::CompilationResult RegExpEngine::Compile( bool RegExpEngine::TooMuchRegExpCode(Handle<String> pattern) { Heap* heap = pattern->GetHeap(); bool too_much = pattern->length() > RegExpImpl::kRegExpTooLargeToOptimize; - if (heap->total_regexp_code_generated() > RegExpImpl::kRegExpCompiledLimit && - heap->memory_allocator()->SizeExecutable() > + if (heap->isolate()->total_regexp_code_generated() > + RegExpImpl::kRegExpCompiledLimit && + heap->CommittedMemoryExecutable() > RegExpImpl::kRegExpExecutableMemoryLimit) { too_much = true; } diff --git a/deps/v8/src/regexp/jsregexp.h b/deps/v8/src/regexp/jsregexp.h index b2e84ba4f3..77d61ae17e 100644 --- a/deps/v8/src/regexp/jsregexp.h +++ b/deps/v8/src/regexp/jsregexp.h @@ -158,7 +158,7 @@ class RegExpImpl { // total regexp code compiled including code that has subsequently been freed // and the total executable memory at any point. static const size_t kRegExpExecutableMemoryLimit = 16 * MB; - static const int kRegExpCompiledLimit = 1 * MB; + static const size_t kRegExpCompiledLimit = 1 * MB; static const int kRegExpTooLargeToOptimize = 20 * KB; private: diff --git a/deps/v8/src/regexp/regexp-ast.cc b/deps/v8/src/regexp/regexp-ast.cc index b5c2bb6d91..85babb1f74 100644 --- a/deps/v8/src/regexp/regexp-ast.cc +++ b/deps/v8/src/regexp/regexp-ast.cc @@ -264,6 +264,12 @@ void* RegExpUnparser::VisitCapture(RegExpCapture* that, void* data) { return NULL; } +void* RegExpUnparser::VisitGroup(RegExpGroup* that, void* data) { + os_ << "(?: "; + that->body()->Accept(this, data); + os_ << ")"; + return NULL; +} void* RegExpUnparser::VisitLookaround(RegExpLookaround* that, void* data) { os_ << "("; diff --git a/deps/v8/src/regexp/regexp-ast.h b/deps/v8/src/regexp/regexp-ast.h index 07a8155437..a45d083cdb 100644 --- a/deps/v8/src/regexp/regexp-ast.h +++ b/deps/v8/src/regexp/regexp-ast.h @@ -21,12 +21,12 @@ namespace internal { VISIT(Atom) \ VISIT(Quantifier) \ VISIT(Capture) \ + VISIT(Group) \ VISIT(Lookaround) \ VISIT(BackReference) \ VISIT(Empty) \ VISIT(Text) - #define FORWARD_DECLARE(Name) class RegExp##Name; FOR_EACH_REG_EXP_TREE_TYPE(FORWARD_DECLARE) #undef FORWARD_DECLARE @@ -440,6 +440,26 @@ class RegExpCapture final : public RegExpTree { const ZoneVector<uc16>* name_; }; +class RegExpGroup final : public RegExpTree { + public: + explicit RegExpGroup(RegExpTree* body) : body_(body) {} + void* Accept(RegExpVisitor* visitor, void* data) override; + RegExpNode* ToNode(RegExpCompiler* compiler, + RegExpNode* on_success) override { + return body_->ToNode(compiler, on_success); + } + RegExpGroup* AsGroup() override; + bool IsAnchoredAtStart() override { return body_->IsAnchoredAtStart(); } + bool IsAnchoredAtEnd() override { return body_->IsAnchoredAtEnd(); } + bool IsGroup() override; + int min_match() override { return body_->min_match(); } + int max_match() override { return body_->max_match(); } + Interval CaptureRegisters() override { return body_->CaptureRegisters(); } + RegExpTree* body() { return body_; } + + private: + RegExpTree* body_; +}; class RegExpLookaround final : public RegExpTree { public: diff --git a/deps/v8/src/regexp/regexp-macro-assembler.cc b/deps/v8/src/regexp/regexp-macro-assembler.cc index 0a7f5c1b9e..2e3a8a2f76 100644 --- a/deps/v8/src/regexp/regexp-macro-assembler.cc +++ b/deps/v8/src/regexp/regexp-macro-assembler.cc @@ -134,6 +134,9 @@ const byte* NativeRegExpMacroAssembler::StringCharacterPosition( start_index += SlicedString::cast(subject)->offset(); subject = SlicedString::cast(subject)->parent(); } + if (subject->IsThinString()) { + subject = ThinString::cast(subject)->actual(); + } DCHECK(start_index >= 0); DCHECK(start_index <= subject->length()); if (subject->IsSeqOneByteString()) { @@ -146,6 +149,7 @@ const byte* NativeRegExpMacroAssembler::StringCharacterPosition( return reinterpret_cast<const byte*>( ExternalOneByteString::cast(subject)->GetChars() + start_index); } else { + DCHECK(subject->IsExternalTwoByteString()); return reinterpret_cast<const byte*>( ExternalTwoByteString::cast(subject)->GetChars() + start_index); } @@ -239,6 +243,9 @@ NativeRegExpMacroAssembler::Result NativeRegExpMacroAssembler::Match( subject_ptr = slice->parent(); slice_offset = slice->offset(); } + if (StringShape(subject_ptr).IsThin()) { + subject_ptr = ThinString::cast(subject_ptr)->actual(); + } // Ensure that an underlying string has the same representation. bool is_one_byte = subject_ptr->IsOneByteRepresentation(); DCHECK(subject_ptr->IsExternalString() || subject_ptr->IsSeqString()); diff --git a/deps/v8/src/regexp/regexp-parser.cc b/deps/v8/src/regexp/regexp-parser.cc index 3035f6a9a9..3621f7d96e 100644 --- a/deps/v8/src/regexp/regexp-parser.cc +++ b/deps/v8/src/regexp/regexp-parser.cc @@ -216,7 +216,9 @@ RegExpTree* RegExpParser::ParseDisjunction() { RegExpCapture* capture = GetCapture(capture_index); capture->set_body(body); body = capture; - } else if (group_type != GROUPING) { + } else if (group_type == GROUPING) { + body = new (zone()) RegExpGroup(body); + } else { DCHECK(group_type == POSITIVE_LOOKAROUND || group_type == NEGATIVE_LOOKAROUND); bool is_positive = (group_type == POSITIVE_LOOKAROUND); diff --git a/deps/v8/src/regexp/regexp-utils.cc b/deps/v8/src/regexp/regexp-utils.cc index d40431866a..570a348f74 100644 --- a/deps/v8/src/regexp/regexp-utils.cc +++ b/deps/v8/src/regexp/regexp-utils.cc @@ -145,7 +145,14 @@ bool RegExpUtils::IsUnmodifiedRegExp(Isolate* isolate, Handle<Object> obj) { if (!proto->IsJSReceiver()) return false; Handle<Map> initial_proto_initial_map = isolate->regexp_prototype_map(); - return (JSReceiver::cast(proto)->map() == *initial_proto_initial_map); + if (JSReceiver::cast(proto)->map() != *initial_proto_initial_map) { + return false; + } + + // The smi check is required to omit ToLength(lastIndex) calls with possible + // user-code execution on the fast path. + Object* last_index = JSRegExp::cast(recv)->LastIndex(); + return last_index->IsSmi() && Smi::cast(last_index)->value() >= 0; } int RegExpUtils::AdvanceStringIndex(Isolate* isolate, Handle<String> string, diff --git a/deps/v8/src/regexp/regexp-utils.h b/deps/v8/src/regexp/regexp-utils.h index eff1ed739c..eb5f85c0bd 100644 --- a/deps/v8/src/regexp/regexp-utils.h +++ b/deps/v8/src/regexp/regexp-utils.h @@ -10,6 +10,8 @@ namespace v8 { namespace internal { +class RegExpMatchInfo; + // Helper methods for C++ regexp builtins. class RegExpUtils : public AllStatic { public: diff --git a/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc b/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc index aafc840680..54dc3415e8 100644 --- a/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc +++ b/deps/v8/src/regexp/x64/regexp-macro-assembler-x64.cc @@ -6,8 +6,10 @@ #include "src/regexp/x64/regexp-macro-assembler-x64.h" +#include "src/factory.h" #include "src/log.h" #include "src/macro-assembler.h" +#include "src/objects-inl.h" #include "src/regexp/regexp-macro-assembler.h" #include "src/regexp/regexp-stack.h" #include "src/unicode.h" |