Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
| 10 #include "src/contexts.h" | 10 #include "src/contexts.h" |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 315 Handle<AccessorInfo> Accessors::StringLengthInfo( | 315 Handle<AccessorInfo> Accessors::StringLengthInfo( |
| 316 Isolate* isolate, PropertyAttributes attributes) { | 316 Isolate* isolate, PropertyAttributes attributes) { |
| 317 return MakeAccessor(isolate, | 317 return MakeAccessor(isolate, |
| 318 isolate->factory()->length_string(), | 318 isolate->factory()->length_string(), |
| 319 &StringLengthGetter, | 319 &StringLengthGetter, |
| 320 &StringLengthSetter, | 320 &StringLengthSetter, |
| 321 attributes); | 321 attributes); |
| 322 } | 322 } |
| 323 | 323 |
| 324 | 324 |
| 325 template <typename Char> | |
| 326 inline int CountRequiredEscapes(Handle<String> source) { | |
| 327 DisallowHeapAllocation no_gc; | |
| 328 int escapes = 0; | |
| 329 Vector<const Char> src = source->GetCharVector<Char>(); | |
| 330 for (int i = 0; i < src.length(); i++) { | |
| 331 if (src[i] == '/' && (i == 0 || src[i - 1] != '\\')) escapes++; | |
| 332 } | |
| 333 return escapes; | |
| 334 } | |
| 335 | |
| 336 | |
| 337 template <typename Char, typename StringType> | |
| 338 inline Handle<StringType> WriteEscapedRegExpSource(Handle<String> source, | |
| 339 Handle<StringType> result) { | |
| 340 DisallowHeapAllocation no_gc; | |
| 341 Vector<const Char> src = source->GetCharVector<Char>(); | |
| 342 Vector<Char> dst(result->GetChars(), result->length()); | |
| 343 int s = 0; | |
| 344 int d = 0; | |
| 345 while (s < src.length()) { | |
| 346 if (src[s] == '/' && (s == 0 || src[s - 1] != '\\')) dst[d++] = '\\'; | |
| 347 dst[d++] = src[s++]; | |
| 348 } | |
|
ulan
2014/11/21 09:19:34
DCHECK_EQ(result.length(), d);
| |
| 349 return result; | |
| 350 } | |
| 351 | |
| 352 | |
| 353 MaybeHandle<String> EscapeRegExpSource(Isolate* isolate, | |
| 354 Handle<String> source) { | |
| 355 String::Flatten(source); | |
| 356 if (source->length() == 0) return isolate->factory()->query_colon_string(); | |
| 357 bool one_byte = source->IsOneByteRepresentationUnderneath(); | |
| 358 int escapes = one_byte ? CountRequiredEscapes<uint8_t>(source) | |
| 359 : CountRequiredEscapes<uc16>(source); | |
| 360 if (escapes == 0) return source; | |
| 361 int length = source->length() + escapes; | |
| 362 if (one_byte) { | |
| 363 Handle<SeqOneByteString> result; | |
| 364 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, | |
| 365 isolate->factory()->NewRawOneByteString(length), | |
| 366 String); | |
| 367 return WriteEscapedRegExpSource<uint8_t>(source, result); | |
| 368 } else { | |
| 369 Handle<SeqTwoByteString> result; | |
| 370 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, | |
| 371 isolate->factory()->NewRawTwoByteString(length), | |
| 372 String); | |
| 373 return WriteEscapedRegExpSource<uc16>(source, result); | |
| 374 } | |
| 375 } | |
| 376 | |
| 377 | |
| 378 // Implements ECMA262 ES6 draft 21.2.5.9 | |
| 379 void Accessors::RegExpSourceGetter( | |
| 380 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { | |
| 381 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | |
| 382 HandleScope scope(isolate); | |
| 383 | |
| 384 Handle<Object> receiver = | |
| 385 Utils::OpenHandle(*v8::Local<v8::Value>(info.This())); | |
| 386 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(receiver); | |
| 387 Handle<String> pattern(regexp->Pattern(), isolate); | |
| 388 MaybeHandle<String> maybe = EscapeRegExpSource(isolate, pattern); | |
| 389 | |
| 390 Handle<String> result; | |
| 391 if (!maybe.ToHandle(&result)) { | |
| 392 isolate->OptionalRescheduleException(false); | |
| 393 return; | |
| 394 } | |
| 395 info.GetReturnValue().Set(Utils::ToLocal(result)); | |
| 396 } | |
| 397 | |
| 398 | |
| 399 void Accessors::RegExpSourceSetter(v8::Local<v8::Name> name, | |
| 400 v8::Local<v8::Value> value, | |
| 401 const v8::PropertyCallbackInfo<void>& info) { | |
| 402 UNREACHABLE(); | |
| 403 } | |
| 404 | |
| 405 | |
| 406 Handle<AccessorInfo> Accessors::RegExpSourceInfo( | |
| 407 Isolate* isolate, PropertyAttributes attributes) { | |
| 408 return MakeAccessor(isolate, isolate->factory()->source_string(), | |
| 409 &RegExpSourceGetter, &RegExpSourceSetter, attributes); | |
| 410 } | |
| 411 | |
| 412 | |
| 325 // | 413 // |
| 326 // Accessors::ScriptColumnOffset | 414 // Accessors::ScriptColumnOffset |
| 327 // | 415 // |
| 328 | 416 |
| 329 | 417 |
| 330 void Accessors::ScriptColumnOffsetGetter( | 418 void Accessors::ScriptColumnOffsetGetter( |
| 331 v8::Local<v8::Name> name, | 419 v8::Local<v8::Name> name, |
| 332 const v8::PropertyCallbackInfo<v8::Value>& info) { | 420 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 333 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 421 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
| 334 DisallowHeapAllocation no_allocation; | 422 DisallowHeapAllocation no_allocation; |
| (...skipping 1067 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1402 info->set_data(Smi::FromInt(index)); | 1490 info->set_data(Smi::FromInt(index)); |
| 1403 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1491 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
| 1404 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1492 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
| 1405 info->set_getter(*getter); | 1493 info->set_getter(*getter); |
| 1406 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1494 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
| 1407 return info; | 1495 return info; |
| 1408 } | 1496 } |
| 1409 | 1497 |
| 1410 | 1498 |
| 1411 } } // namespace v8::internal | 1499 } } // namespace v8::internal |
| OLD | NEW |