OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 cons_symbol, \ | 313 cons_symbol, \ |
314 ConsSymbol) \ | 314 ConsSymbol) \ |
315 V(CONS_ASCII_SYMBOL_TYPE, \ | 315 V(CONS_ASCII_SYMBOL_TYPE, \ |
316 ConsString::kSize, \ | 316 ConsString::kSize, \ |
317 cons_ascii_symbol, \ | 317 cons_ascii_symbol, \ |
318 ConsAsciiSymbol) \ | 318 ConsAsciiSymbol) \ |
319 V(EXTERNAL_SYMBOL_TYPE, \ | 319 V(EXTERNAL_SYMBOL_TYPE, \ |
320 ExternalTwoByteString::kSize, \ | 320 ExternalTwoByteString::kSize, \ |
321 external_symbol, \ | 321 external_symbol, \ |
322 ExternalSymbol) \ | 322 ExternalSymbol) \ |
| 323 V(EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE, \ |
| 324 ExternalTwoByteString::kSize, \ |
| 325 external_symbol_with_ascii_data, \ |
| 326 ExternalSymbolWithAsciiData) \ |
323 V(EXTERNAL_ASCII_SYMBOL_TYPE, \ | 327 V(EXTERNAL_ASCII_SYMBOL_TYPE, \ |
324 ExternalAsciiString::kSize, \ | 328 ExternalAsciiString::kSize, \ |
325 external_ascii_symbol, \ | 329 external_ascii_symbol, \ |
326 ExternalAsciiSymbol) \ | 330 ExternalAsciiSymbol) \ |
327 V(STRING_TYPE, \ | 331 V(STRING_TYPE, \ |
328 SeqTwoByteString::kAlignedSize, \ | 332 SeqTwoByteString::kAlignedSize, \ |
329 string, \ | 333 string, \ |
330 String) \ | 334 String) \ |
331 V(ASCII_STRING_TYPE, \ | 335 V(ASCII_STRING_TYPE, \ |
332 SeqAsciiString::kAlignedSize, \ | 336 SeqAsciiString::kAlignedSize, \ |
333 ascii_string, \ | 337 ascii_string, \ |
334 AsciiString) \ | 338 AsciiString) \ |
335 V(CONS_STRING_TYPE, \ | 339 V(CONS_STRING_TYPE, \ |
336 ConsString::kSize, \ | 340 ConsString::kSize, \ |
337 cons_string, \ | 341 cons_string, \ |
338 ConsString) \ | 342 ConsString) \ |
339 V(CONS_ASCII_STRING_TYPE, \ | 343 V(CONS_ASCII_STRING_TYPE, \ |
340 ConsString::kSize, \ | 344 ConsString::kSize, \ |
341 cons_ascii_string, \ | 345 cons_ascii_string, \ |
342 ConsAsciiString) \ | 346 ConsAsciiString) \ |
343 V(EXTERNAL_STRING_TYPE, \ | 347 V(EXTERNAL_STRING_TYPE, \ |
344 ExternalTwoByteString::kSize, \ | 348 ExternalTwoByteString::kSize, \ |
345 external_string, \ | 349 external_string, \ |
346 ExternalString) \ | 350 ExternalString) \ |
| 351 V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE, \ |
| 352 ExternalTwoByteString::kSize, \ |
| 353 external_string_with_ascii_data, \ |
| 354 ExternalStringWithAsciiData) \ |
347 V(EXTERNAL_ASCII_STRING_TYPE, \ | 355 V(EXTERNAL_ASCII_STRING_TYPE, \ |
348 ExternalAsciiString::kSize, \ | 356 ExternalAsciiString::kSize, \ |
349 external_ascii_string, \ | 357 external_ascii_string, \ |
350 ExternalAsciiString) \ | 358 ExternalAsciiString) \ |
351 | 359 |
352 // A struct is a simple object a set of object-valued fields. Including an | 360 // A struct is a simple object a set of object-valued fields. Including an |
353 // object type in this causes the compiler to generate most of the boilerplate | 361 // object type in this causes the compiler to generate most of the boilerplate |
354 // code for the class including allocation and garbage collection routines, | 362 // code for the class including allocation and garbage collection routines, |
355 // casts and predicates. All you need to define is the class, methods and | 363 // casts and predicates. All you need to define is the class, methods and |
356 // object verification routines. Easy, no? | 364 // object verification routines. Easy, no? |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 // If bit 7 is clear, the low-order 2 bits indicate the representation | 413 // If bit 7 is clear, the low-order 2 bits indicate the representation |
406 // of the string. | 414 // of the string. |
407 const uint32_t kStringRepresentationMask = 0x03; | 415 const uint32_t kStringRepresentationMask = 0x03; |
408 enum StringRepresentationTag { | 416 enum StringRepresentationTag { |
409 kSeqStringTag = 0x0, | 417 kSeqStringTag = 0x0, |
410 kConsStringTag = 0x1, | 418 kConsStringTag = 0x1, |
411 kExternalStringTag = 0x2 | 419 kExternalStringTag = 0x2 |
412 }; | 420 }; |
413 const uint32_t kIsConsStringMask = 0x1; | 421 const uint32_t kIsConsStringMask = 0x1; |
414 | 422 |
| 423 // If bit 7 is clear, then bit 3 indicates whether this two-byte |
| 424 // string actually contains ascii data. |
| 425 const uint32_t kAsciiDataHintMask = 0x08; |
| 426 const uint32_t kAsciiDataHintTag = 0x08; |
| 427 |
415 | 428 |
416 // A ConsString with an empty string as the right side is a candidate | 429 // A ConsString with an empty string as the right side is a candidate |
417 // for being shortcut by the garbage collector unless it is a | 430 // for being shortcut by the garbage collector unless it is a |
418 // symbol. It's not common to have non-flat symbols, so we do not | 431 // symbol. It's not common to have non-flat symbols, so we do not |
419 // shortcut them thereby avoiding turning symbols into strings. See | 432 // shortcut them thereby avoiding turning symbols into strings. See |
420 // heap.cc and mark-compact.cc. | 433 // heap.cc and mark-compact.cc. |
421 const uint32_t kShortcutTypeMask = | 434 const uint32_t kShortcutTypeMask = |
422 kIsNotStringMask | | 435 kIsNotStringMask | |
423 kIsSymbolMask | | 436 kIsSymbolMask | |
424 kStringRepresentationMask; | 437 kStringRepresentationMask; |
425 const uint32_t kShortcutTypeTag = kConsStringTag; | 438 const uint32_t kShortcutTypeTag = kConsStringTag; |
426 | 439 |
427 | 440 |
428 enum InstanceType { | 441 enum InstanceType { |
429 // String types. | 442 // String types. |
430 SYMBOL_TYPE = kSymbolTag | kSeqStringTag, | 443 SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kSeqStringTag, |
431 ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kSeqStringTag, | 444 ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kSeqStringTag, |
432 CONS_SYMBOL_TYPE = kSymbolTag | kConsStringTag, | 445 CONS_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kConsStringTag, |
433 CONS_ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kConsStringTag, | 446 CONS_ASCII_SYMBOL_TYPE = kAsciiStringTag | kSymbolTag | kConsStringTag, |
434 EXTERNAL_SYMBOL_TYPE = kSymbolTag | kExternalStringTag, | 447 EXTERNAL_SYMBOL_TYPE = kTwoByteStringTag | kSymbolTag | kExternalStringTag, |
| 448 EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE = |
| 449 kTwoByteStringTag | kSymbolTag | kExternalStringTag | kAsciiDataHintTag, |
435 EXTERNAL_ASCII_SYMBOL_TYPE = | 450 EXTERNAL_ASCII_SYMBOL_TYPE = |
436 kAsciiStringTag | kSymbolTag | kExternalStringTag, | 451 kAsciiStringTag | kSymbolTag | kExternalStringTag, |
437 STRING_TYPE = kSeqStringTag, | 452 STRING_TYPE = kTwoByteStringTag | kSeqStringTag, |
438 ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag, | 453 ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag, |
439 CONS_STRING_TYPE = kConsStringTag, | 454 CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag, |
440 CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag, | 455 CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag, |
441 EXTERNAL_STRING_TYPE = kExternalStringTag, | 456 EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag, |
| 457 EXTERNAL_STRING_WITH_ASCII_DATA_TYPE = |
| 458 kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag, |
442 EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag, | 459 EXTERNAL_ASCII_STRING_TYPE = kAsciiStringTag | kExternalStringTag, |
443 PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, | 460 PRIVATE_EXTERNAL_ASCII_STRING_TYPE = EXTERNAL_ASCII_STRING_TYPE, |
444 | 461 |
445 // Objects allocated in their own spaces (never in new space). | 462 // Objects allocated in their own spaces (never in new space). |
446 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE | 463 MAP_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE |
447 CODE_TYPE, | 464 CODE_TYPE, |
448 ODDBALL_TYPE, | 465 ODDBALL_TYPE, |
449 JS_GLOBAL_PROPERTY_CELL_TYPE, | 466 JS_GLOBAL_PROPERTY_CELL_TYPE, |
450 | 467 |
451 // "Data", objects that cannot contain non-map-word pointers to heap | 468 // "Data", objects that cannot contain non-map-word pointers to heap |
(...skipping 3605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4057 inline int length(); | 4074 inline int length(); |
4058 inline void set_length(int value); | 4075 inline void set_length(int value); |
4059 | 4076 |
4060 // Get and set the hash field of the string. | 4077 // Get and set the hash field of the string. |
4061 inline uint32_t hash_field(); | 4078 inline uint32_t hash_field(); |
4062 inline void set_hash_field(uint32_t value); | 4079 inline void set_hash_field(uint32_t value); |
4063 | 4080 |
4064 inline bool IsAsciiRepresentation(); | 4081 inline bool IsAsciiRepresentation(); |
4065 inline bool IsTwoByteRepresentation(); | 4082 inline bool IsTwoByteRepresentation(); |
4066 | 4083 |
4067 // Check whether this string is an external two-byte string that in | 4084 // Returns whether this string has ascii chars, i.e. all of them can |
4068 // fact contains only ascii characters. | 4085 // be ascii encoded. This might be the case even if the string is |
| 4086 // two-byte. Such strings may appear when the embedder prefers |
| 4087 // two-byte external representations even for ascii data. |
4069 // | 4088 // |
4070 // Such strings may appear when the embedder prefers two-byte | 4089 // NOTE: this should be considered only a hint. False negatives are |
4071 // representations even for ascii data. | 4090 // possible. |
4072 inline bool IsExternalTwoByteStringWithAsciiChars(); | 4091 inline bool HasAsciiChars(); |
4073 | 4092 |
4074 // Get and set individual two byte chars in the string. | 4093 // Get and set individual two byte chars in the string. |
4075 inline void Set(int index, uint16_t value); | 4094 inline void Set(int index, uint16_t value); |
4076 // Get individual two byte char in the string. Repeated calls | 4095 // Get individual two byte char in the string. Repeated calls |
4077 // to this method are not efficient unless the string is flat. | 4096 // to this method are not efficient unless the string is flat. |
4078 inline uint16_t Get(int index); | 4097 inline uint16_t Get(int index); |
4079 | 4098 |
4080 // Try to flatten the string. Checks first inline to see if it is | 4099 // Try to flatten the string. Checks first inline to see if it is |
4081 // necessary. Does nothing if the string is not a cons string. | 4100 // necessary. Does nothing if the string is not a cons string. |
4082 // Flattening allocates a sequential string with the same data as | 4101 // Flattening allocates a sequential string with the same data as |
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5278 } else { | 5297 } else { |
5279 value &= ~(1 << bit_position); | 5298 value &= ~(1 << bit_position); |
5280 } | 5299 } |
5281 return value; | 5300 return value; |
5282 } | 5301 } |
5283 }; | 5302 }; |
5284 | 5303 |
5285 } } // namespace v8::internal | 5304 } } // namespace v8::internal |
5286 | 5305 |
5287 #endif // V8_OBJECTS_H_ | 5306 #endif // V8_OBJECTS_H_ |
OLD | NEW |