| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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/longjump.h" | 5 #include "vm/longjump.h" |
| 6 #include "vm/object_store.h" | 6 #include "vm/object_store.h" |
| 7 #include "vm/regexp_parser.h" | 7 #include "vm/regexp_parser.h" |
| 8 | 8 |
| 9 namespace dart { | 9 namespace dart { |
| 10 | 10 |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 } | 242 } |
| 243 | 243 |
| 244 | 244 |
| 245 void RegExpParser::Reset(intptr_t pos) { | 245 void RegExpParser::Reset(intptr_t pos) { |
| 246 next_pos_ = pos; | 246 next_pos_ = pos; |
| 247 has_more_ = (pos < in().Length()); | 247 has_more_ = (pos < in().Length()); |
| 248 Advance(); | 248 Advance(); |
| 249 } | 249 } |
| 250 | 250 |
| 251 | 251 |
| 252 bool RegExpParser::ParseFunction(ParsedFunction *parsed_function) { |
| 253 Isolate* isolate = parsed_function->isolate(); |
| 254 JSRegExp& regexp = JSRegExp::Handle(parsed_function->function().regexp()); |
| 255 |
| 256 const String& pattern = String::Handle(regexp.pattern()); |
| 257 const bool multiline = regexp.is_multi_line(); |
| 258 |
| 259 RegExpCompileData* compile_data = new(isolate) RegExpCompileData(); |
| 260 if (!RegExpParser::ParseRegExp(pattern, multiline, compile_data)) { |
| 261 // Parsing failures are handled in the JSRegExp factory constructor. |
| 262 UNREACHABLE(); |
| 263 } |
| 264 |
| 265 regexp.set_num_bracket_expressions(compile_data->capture_count); |
| 266 if (compile_data->simple) { |
| 267 regexp.set_is_simple(); |
| 268 } else { |
| 269 regexp.set_is_complex(); |
| 270 } |
| 271 |
| 272 parsed_function->SetRegExpCompileData(compile_data); |
| 273 |
| 274 return true; |
| 275 } |
| 276 |
| 277 |
| 252 bool RegExpParser::ParseRegExp(const String& input, | 278 bool RegExpParser::ParseRegExp(const String& input, |
| 253 bool multiline, | 279 bool multiline, |
| 254 RegExpCompileData* result) { | 280 RegExpCompileData* result) { |
| 255 ASSERT(result != NULL); | 281 ASSERT(result != NULL); |
| 256 LongJumpScope jump; | 282 LongJumpScope jump; |
| 257 RegExpParser parser(input, &result->error, multiline); | 283 RegExpParser parser(input, &result->error, multiline); |
| 258 if (setjmp(*jump.Set()) == 0) { | 284 if (setjmp(*jump.Set()) == 0) { |
| 259 RegExpTree* tree = parser.ParsePattern(); | 285 RegExpTree* tree = parser.ParsePattern(); |
| 260 ASSERT(tree != NULL); | 286 ASSERT(tree != NULL); |
| 261 ASSERT(result->error.IsNull()); | 287 ASSERT(result->error.IsNull()); |
| 262 result->tree = tree; | 288 result->tree = tree; |
| 263 intptr_t capture_count = parser.captures_started(); | 289 intptr_t capture_count = parser.captures_started(); |
| 264 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0; | 290 result->simple = tree->IsAtom() && parser.simple() && capture_count == 0; |
| 265 result->contains_anchor = parser.contains_anchor(); | 291 result->contains_anchor = parser.contains_anchor(); |
| 266 result->capture_count = capture_count; | 292 result->capture_count = capture_count; |
| 267 } else { | 293 } else { |
| 268 ASSERT(!result->error.IsNull()); | 294 ASSERT(!result->error.IsNull()); |
| 295 Isolate::Current()->object_store()->clear_sticky_error(); |
| 269 | 296 |
| 270 // TODO(jgruber): Throw a format exception once we are ready to replace | 297 // Throw a FormatException on parsing failures. |
| 271 // jscre. For now, we ignore the error set by LongJump. | 298 const String& message = String::Handle( |
| 272 Isolate::Current()->object_store()->clear_sticky_error(); | 299 String::Concat(result->error, input)); |
| 300 const Array& args = Array::Handle(Array::New(1)); |
| 301 args.SetAt(0, message); |
| 302 |
| 303 Exceptions::ThrowByType(Exceptions::kFormat, args); |
| 273 } | 304 } |
| 274 return !parser.failed(); | 305 return !parser.failed(); |
| 275 } | 306 } |
| 276 | 307 |
| 277 | 308 |
| 278 void RegExpParser::ReportError(const char* message) { | 309 void RegExpParser::ReportError(const char* message) { |
| 279 failed_ = true; | 310 failed_ = true; |
| 280 *error_ = String::New(message); | 311 *error_ = String::New(message); |
| 281 // Zip to the end to make sure the no more input is read. | 312 // Zip to the end to make sure the no more input is read. |
| 282 current_ = kEndMarker; | 313 current_ = kEndMarker; |
| (...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 uint32_t c = ParseClassCharacterEscape(); | 1061 uint32_t c = ParseClassCharacterEscape(); |
| 1031 return CharacterRange::Singleton(c); | 1062 return CharacterRange::Singleton(c); |
| 1032 } | 1063 } |
| 1033 } else { | 1064 } else { |
| 1034 Advance(); | 1065 Advance(); |
| 1035 return CharacterRange::Singleton(first); | 1066 return CharacterRange::Singleton(first); |
| 1036 } | 1067 } |
| 1037 } | 1068 } |
| 1038 | 1069 |
| 1039 } // namespace dart | 1070 } // namespace dart |
| OLD | NEW |