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

Side by Side Diff: src/objects.cc

Issue 11759008: Introduce ENABLE_LATIN_1 compile flag (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix FilterASCII Created 7 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 7266 matching lines...) Expand 10 before | Expand all | Expand 10 after
7277 return true; 7277 return true;
7278 } else if (map == heap->ascii_string_map()) { 7278 } else if (map == heap->ascii_string_map()) {
7279 this->set_map(heap->undetectable_ascii_string_map()); 7279 this->set_map(heap->undetectable_ascii_string_map());
7280 return true; 7280 return true;
7281 } 7281 }
7282 // Rest cannot be marked as undetectable 7282 // Rest cannot be marked as undetectable
7283 return false; 7283 return false;
7284 } 7284 }
7285 7285
7286 7286
7287 bool String::IsEqualTo(Vector<const char> str) { 7287 bool String::IsUtf8EqualTo(Vector<const char> str) {
7288 int slen = length(); 7288 int slen = length();
7289 // Can't check exact length equality, but we can check bounds. 7289 // Can't check exact length equality, but we can check bounds.
7290 int str_len = str.length(); 7290 int str_len = str.length();
7291 if (str_len < slen || 7291 if (str_len < slen ||
7292 str_len > slen*static_cast<int>(unibrow::Utf8::kMaxEncodedSize)) { 7292 str_len > slen*static_cast<int>(unibrow::Utf8::kMaxEncodedSize)) {
7293 return false; 7293 return false;
7294 } 7294 }
7295 int i; 7295 int i;
7296 unsigned remaining_in_str = static_cast<unsigned>(str_len); 7296 unsigned remaining_in_str = static_cast<unsigned>(str_len);
7297 const uint8_t* utf8_data = reinterpret_cast<const uint8_t*>(str.start()); 7297 const uint8_t* utf8_data = reinterpret_cast<const uint8_t*>(str.start());
7298 for (i = 0; i < slen && remaining_in_str > 0; i++) { 7298 for (i = 0; i < slen && remaining_in_str > 0; i++) {
7299 unsigned cursor = 0; 7299 unsigned cursor = 0;
7300 uint32_t r = unibrow::Utf8::ValueOf(utf8_data, remaining_in_str, &cursor); 7300 uint32_t r = unibrow::Utf8::ValueOf(utf8_data, remaining_in_str, &cursor);
7301 ASSERT(cursor > 0 && cursor <= remaining_in_str); 7301 ASSERT(cursor > 0 && cursor <= remaining_in_str);
7302 if (r > unibrow::Utf16::kMaxNonSurrogateCharCode) { 7302 if (r > unibrow::Utf16::kMaxNonSurrogateCharCode) {
7303 if (i > slen - 1) return false; 7303 if (i > slen - 1) return false;
7304 if (Get(i++) != unibrow::Utf16::LeadSurrogate(r)) return false; 7304 if (Get(i++) != unibrow::Utf16::LeadSurrogate(r)) return false;
7305 if (Get(i) != unibrow::Utf16::TrailSurrogate(r)) return false; 7305 if (Get(i) != unibrow::Utf16::TrailSurrogate(r)) return false;
7306 } else { 7306 } else {
7307 if (Get(i) != r) return false; 7307 if (Get(i) != r) return false;
7308 } 7308 }
7309 utf8_data += cursor; 7309 utf8_data += cursor;
7310 remaining_in_str -= cursor; 7310 remaining_in_str -= cursor;
7311 } 7311 }
7312 return i == slen && remaining_in_str == 0; 7312 return i == slen && remaining_in_str == 0;
7313 } 7313 }
7314 7314
7315 7315
7316 bool String::IsAsciiEqualTo(Vector<const char> str) { 7316 bool String::IsOneByteEqualTo(Vector<const uint8_t> str) {
7317 int slen = length(); 7317 int slen = length();
7318 if (str.length() != slen) return false; 7318 if (str.length() != slen) return false;
7319 FlatContent content = GetFlatContent(); 7319 FlatContent content = GetFlatContent();
7320 if (content.IsAscii()) { 7320 if (content.IsAscii()) {
7321 return CompareChars(content.ToAsciiVector().start(), 7321 return CompareChars(content.ToOneByteVector().start(),
7322 str.start(), slen) == 0; 7322 str.start(), slen) == 0;
7323 } 7323 }
7324 for (int i = 0; i < slen; i++) { 7324 for (int i = 0; i < slen; i++) {
7325 if (Get(i) != static_cast<uint16_t>(str[i])) return false; 7325 if (Get(i) != static_cast<uint16_t>(str[i])) return false;
7326 } 7326 }
7327 return true; 7327 return true;
7328 } 7328 }
7329 7329
7330 7330
7331 bool String::IsTwoByteEqualTo(Vector<const uc16> str) { 7331 bool String::IsTwoByteEqualTo(Vector<const uc16> str) {
(...skipping 4048 matching lines...) Expand 10 before | Expand all | Expand 10 after
11380 Smi* flags_; 11380 Smi* flags_;
11381 }; 11381 };
11382 11382
11383 // Utf8SymbolKey carries a vector of chars as key. 11383 // Utf8SymbolKey carries a vector of chars as key.
11384 class Utf8SymbolKey : public HashTableKey { 11384 class Utf8SymbolKey : public HashTableKey {
11385 public: 11385 public:
11386 explicit Utf8SymbolKey(Vector<const char> string, uint32_t seed) 11386 explicit Utf8SymbolKey(Vector<const char> string, uint32_t seed)
11387 : string_(string), hash_field_(0), seed_(seed) { } 11387 : string_(string), hash_field_(0), seed_(seed) { }
11388 11388
11389 bool IsMatch(Object* string) { 11389 bool IsMatch(Object* string) {
11390 return String::cast(string)->IsEqualTo(string_); 11390 return String::cast(string)->IsUtf8EqualTo(string_);
11391 } 11391 }
11392 11392
11393 uint32_t Hash() { 11393 uint32_t Hash() {
11394 if (hash_field_ != 0) return hash_field_ >> String::kHashShift; 11394 if (hash_field_ != 0) return hash_field_ >> String::kHashShift;
11395 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_); 11395 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_);
11396 uint32_t result = hash_field_ >> String::kHashShift; 11396 uint32_t result = hash_field_ >> String::kHashShift;
11397 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. 11397 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed.
11398 return result; 11398 return result;
11399 } 11399 }
11400 11400
11401 uint32_t HashForObject(Object* other) { 11401 uint32_t HashForObject(Object* other) {
11402 return String::cast(other)->Hash(); 11402 return String::cast(other)->Hash();
11403 } 11403 }
11404 11404
11405 MaybeObject* AsObject() { 11405 MaybeObject* AsObject() {
11406 if (hash_field_ == 0) Hash(); 11406 if (hash_field_ == 0) Hash();
11407 return Isolate::Current()->heap()->AllocateSymbol( 11407 return Isolate::Current()->heap()->AllocateSymbolFromUtf8(
11408 string_, chars_, hash_field_); 11408 string_, chars_, hash_field_);
11409 } 11409 }
11410 11410
11411 Vector<const char> string_; 11411 Vector<const char> string_;
11412 uint32_t hash_field_; 11412 uint32_t hash_field_;
11413 int chars_; // Caches the number of characters when computing the hash code. 11413 int chars_; // Caches the number of characters when computing the hash code.
11414 uint32_t seed_; 11414 uint32_t seed_;
11415 }; 11415 };
11416 11416
11417 11417
(...skipping 18 matching lines...) Expand all
11436 return String::cast(other)->Hash(); 11436 return String::cast(other)->Hash();
11437 } 11437 }
11438 11438
11439 Vector<const Char> string_; 11439 Vector<const Char> string_;
11440 uint32_t hash_field_; 11440 uint32_t hash_field_;
11441 uint32_t seed_; 11441 uint32_t seed_;
11442 }; 11442 };
11443 11443
11444 11444
11445 11445
11446 class AsciiSymbolKey : public SequentialSymbolKey<char> { 11446 class OneByteSymbolKey : public SequentialSymbolKey<uint8_t> {
11447 public: 11447 public:
11448 AsciiSymbolKey(Vector<const char> str, uint32_t seed) 11448 OneByteSymbolKey(Vector<const uint8_t> str, uint32_t seed)
11449 : SequentialSymbolKey<char>(str, seed) { } 11449 : SequentialSymbolKey<uint8_t>(str, seed) { }
11450 11450
11451 bool IsMatch(Object* string) { 11451 bool IsMatch(Object* string) {
11452 return String::cast(string)->IsAsciiEqualTo(string_); 11452 return String::cast(string)->IsOneByteEqualTo(string_);
11453 } 11453 }
11454 11454
11455 MaybeObject* AsObject() { 11455 MaybeObject* AsObject() {
11456 if (hash_field_ == 0) Hash(); 11456 if (hash_field_ == 0) Hash();
11457 return HEAP->AllocateAsciiSymbol(string_, hash_field_); 11457 return HEAP->AllocateOneByteSymbol(string_, hash_field_);
11458 } 11458 }
11459 }; 11459 };
11460 11460
11461 11461
11462 class SubStringAsciiSymbolKey : public HashTableKey { 11462 class SubStringOneByteSymbolKey : public HashTableKey {
11463 public: 11463 public:
11464 explicit SubStringAsciiSymbolKey(Handle<SeqOneByteString> string, 11464 explicit SubStringOneByteSymbolKey(Handle<SeqOneByteString> string,
11465 int from, 11465 int from,
11466 int length) 11466 int length)
11467 : string_(string), from_(from), length_(length) { } 11467 : string_(string), from_(from), length_(length) { }
11468 11468
11469 uint32_t Hash() { 11469 uint32_t Hash() {
11470 ASSERT(length_ >= 0); 11470 ASSERT(length_ >= 0);
11471 ASSERT(from_ + length_ <= string_->length()); 11471 ASSERT(from_ + length_ <= string_->length());
11472 char* chars = string_->GetChars() + from_; 11472 char* chars = string_->GetChars() + from_;
11473 hash_field_ = StringHasher::HashSequentialString( 11473 hash_field_ = StringHasher::HashSequentialString(
11474 chars, length_, string_->GetHeap()->HashSeed()); 11474 chars, length_, string_->GetHeap()->HashSeed());
11475 uint32_t result = hash_field_ >> String::kHashShift; 11475 uint32_t result = hash_field_ >> String::kHashShift;
11476 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. 11476 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed.
11477 return result; 11477 return result;
11478 } 11478 }
11479 11479
11480 11480
11481 uint32_t HashForObject(Object* other) { 11481 uint32_t HashForObject(Object* other) {
11482 return String::cast(other)->Hash(); 11482 return String::cast(other)->Hash();
11483 } 11483 }
11484 11484
11485 bool IsMatch(Object* string) { 11485 bool IsMatch(Object* string) {
11486 Vector<const char> chars(string_->GetChars() + from_, length_); 11486 Vector<const uint8_t> chars(string_->GetCharsU() + from_, length_);
11487 return String::cast(string)->IsAsciiEqualTo(chars); 11487 return String::cast(string)->IsOneByteEqualTo(chars);
11488 } 11488 }
11489 11489
11490 MaybeObject* AsObject() { 11490 MaybeObject* AsObject() {
11491 if (hash_field_ == 0) Hash(); 11491 if (hash_field_ == 0) Hash();
11492 Vector<const char> chars(string_->GetChars() + from_, length_); 11492 Vector<const uint8_t> chars(
11493 return HEAP->AllocateAsciiSymbol(chars, hash_field_); 11493 reinterpret_cast<uint8_t*>(string_->GetChars()) + from_,
11494 length_);
11495 return HEAP->AllocateOneByteSymbol(chars, hash_field_);
11494 } 11496 }
11495 11497
11496 private: 11498 private:
11497 Handle<SeqOneByteString> string_; 11499 Handle<SeqOneByteString> string_;
11498 int from_; 11500 int from_;
11499 int length_; 11501 int length_;
11500 uint32_t hash_field_; 11502 uint32_t hash_field_;
11501 }; 11503 };
11502 11504
11503 11505
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
12403 } 12405 }
12404 12406
12405 12407
12406 MaybeObject* SymbolTable::LookupUtf8Symbol(Vector<const char> str, 12408 MaybeObject* SymbolTable::LookupUtf8Symbol(Vector<const char> str,
12407 Object** s) { 12409 Object** s) {
12408 Utf8SymbolKey key(str, GetHeap()->HashSeed()); 12410 Utf8SymbolKey key(str, GetHeap()->HashSeed());
12409 return LookupKey(&key, s); 12411 return LookupKey(&key, s);
12410 } 12412 }
12411 12413
12412 12414
12413 MaybeObject* SymbolTable::LookupOneByteSymbol(Vector<const char> str, 12415 MaybeObject* SymbolTable::LookupOneByteSymbol(Vector<const uint8_t> str,
12414 Object** s) { 12416 Object** s) {
12415 AsciiSymbolKey key(str, GetHeap()->HashSeed()); 12417 OneByteSymbolKey key(str, GetHeap()->HashSeed());
12416 return LookupKey(&key, s); 12418 return LookupKey(&key, s);
12417 } 12419 }
12418 12420
12419 12421
12420 MaybeObject* SymbolTable::LookupSubStringOneByteSymbol( 12422 MaybeObject* SymbolTable::LookupSubStringOneByteSymbol(
12421 Handle<SeqOneByteString> str, 12423 Handle<SeqOneByteString> str,
12422 int from, 12424 int from,
12423 int length, 12425 int length,
12424 Object** s) { 12426 Object** s) {
12425 SubStringAsciiSymbolKey key(str, from, length); 12427 SubStringOneByteSymbolKey key(str, from, length);
12426 return LookupKey(&key, s); 12428 return LookupKey(&key, s);
12427 } 12429 }
12428 12430
12429 12431
12430 MaybeObject* SymbolTable::LookupTwoByteSymbol(Vector<const uc16> str, 12432 MaybeObject* SymbolTable::LookupTwoByteSymbol(Vector<const uc16> str,
12431 Object** s) { 12433 Object** s) {
12432 TwoByteSymbolKey key(str, GetHeap()->HashSeed()); 12434 TwoByteSymbolKey key(str, GetHeap()->HashSeed());
12433 return LookupKey(&key, s); 12435 return LookupKey(&key, s);
12434 } 12436 }
12435 12437
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after
13723 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13725 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13724 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13726 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13725 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13727 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13726 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13728 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13727 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13729 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13728 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13730 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13729 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13731 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13730 } 13732 }
13731 13733
13732 } } // namespace v8::internal 13734 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698