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

Side by Side Diff: src/jsregexp.cc

Issue 719403005: One instead of two runtime calls when initializing regexp. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressed comments Created 6 years, 1 month 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 | « src/jsregexp.h ('k') | src/regexp.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/ast.h" 7 #include "src/ast.h"
8 #include "src/base/platform/platform.h" 8 #include "src/base/platform/platform.h"
9 #include "src/compilation-cache.h" 9 #include "src/compilation-cache.h"
10 #include "src/compiler.h" 10 #include "src/compiler.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 MaybeHandle<Object> RegExpImpl::CreateRegExpLiteral( 51 MaybeHandle<Object> RegExpImpl::CreateRegExpLiteral(
52 Handle<JSFunction> constructor, 52 Handle<JSFunction> constructor,
53 Handle<String> pattern, 53 Handle<String> pattern,
54 Handle<String> flags) { 54 Handle<String> flags) {
55 // Call the construct code with 2 arguments. 55 // Call the construct code with 2 arguments.
56 Handle<Object> argv[] = { pattern, flags }; 56 Handle<Object> argv[] = { pattern, flags };
57 return Execution::New(constructor, arraysize(argv), argv); 57 return Execution::New(constructor, arraysize(argv), argv);
58 } 58 }
59 59
60 60
61 static JSRegExp::Flags RegExpFlagsFromString(Handle<String> str) {
62 int flags = JSRegExp::NONE;
63 for (int i = 0; i < str->length(); i++) {
64 switch (str->Get(i)) {
65 case 'i':
66 flags |= JSRegExp::IGNORE_CASE;
67 break;
68 case 'g':
69 flags |= JSRegExp::GLOBAL;
70 break;
71 case 'm':
72 flags |= JSRegExp::MULTILINE;
73 break;
74 case 'y':
75 if (FLAG_harmony_regexps) flags |= JSRegExp::STICKY;
76 break;
77 }
78 }
79 return JSRegExp::Flags(flags);
80 }
81
82
83 MUST_USE_RESULT 61 MUST_USE_RESULT
84 static inline MaybeHandle<Object> ThrowRegExpException( 62 static inline MaybeHandle<Object> ThrowRegExpException(
85 Handle<JSRegExp> re, 63 Handle<JSRegExp> re,
86 Handle<String> pattern, 64 Handle<String> pattern,
87 Handle<String> error_text, 65 Handle<String> error_text,
88 const char* message) { 66 const char* message) {
89 Isolate* isolate = re->GetIsolate(); 67 Isolate* isolate = re->GetIsolate();
90 Factory* factory = isolate->factory(); 68 Factory* factory = isolate->factory();
91 Handle<FixedArray> elements = factory->NewFixedArray(2); 69 Handle<FixedArray> elements = factory->NewFixedArray(2);
92 elements->set(0, *pattern); 70 elements->set(0, *pattern);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 } 127 }
150 return true; 128 return true;
151 } 129 }
152 130
153 131
154 // Generic RegExp methods. Dispatches to implementation specific methods. 132 // Generic RegExp methods. Dispatches to implementation specific methods.
155 133
156 134
157 MaybeHandle<Object> RegExpImpl::Compile(Handle<JSRegExp> re, 135 MaybeHandle<Object> RegExpImpl::Compile(Handle<JSRegExp> re,
158 Handle<String> pattern, 136 Handle<String> pattern,
159 Handle<String> flag_str) { 137 JSRegExp::Flags flags) {
160 Isolate* isolate = re->GetIsolate(); 138 Isolate* isolate = re->GetIsolate();
161 Zone zone(isolate); 139 Zone zone(isolate);
162 JSRegExp::Flags flags = RegExpFlagsFromString(flag_str);
163 CompilationCache* compilation_cache = isolate->compilation_cache(); 140 CompilationCache* compilation_cache = isolate->compilation_cache();
164 MaybeHandle<FixedArray> maybe_cached = 141 MaybeHandle<FixedArray> maybe_cached =
165 compilation_cache->LookupRegExp(pattern, flags); 142 compilation_cache->LookupRegExp(pattern, flags);
166 Handle<FixedArray> cached; 143 Handle<FixedArray> cached;
167 bool in_cache = maybe_cached.ToHandle(&cached); 144 bool in_cache = maybe_cached.ToHandle(&cached);
168 LOG(isolate, RegExpCompileEvent(re, in_cache)); 145 LOG(isolate, RegExpCompileEvent(re, in_cache));
169 146
170 Handle<Object> result; 147 Handle<Object> result;
171 if (in_cache) { 148 if (in_cache) {
172 re->set_data(*cached); 149 re->set_data(*cached);
(...skipping 5987 matching lines...) Expand 10 before | Expand all | Expand 10 after
6160 } 6137 }
6161 6138
6162 return compiler.Assemble(&macro_assembler, 6139 return compiler.Assemble(&macro_assembler,
6163 node, 6140 node,
6164 data->capture_count, 6141 data->capture_count,
6165 pattern); 6142 pattern);
6166 } 6143 }
6167 6144
6168 6145
6169 }} // namespace v8::internal 6146 }} // namespace v8::internal
OLDNEW
« no previous file with comments | « src/jsregexp.h ('k') | src/regexp.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698