OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 17 matching lines...) Expand all Loading... |
28 // Review notes: | 28 // Review notes: |
29 // | 29 // |
30 // - The use of macros in these inline functions may seem superfluous | 30 // - The use of macros in these inline functions may seem superfluous |
31 // but it is absolutely needed to make sure gcc generates optimal | 31 // but it is absolutely needed to make sure gcc generates optimal |
32 // code. gcc is not happy when attempting to inline too deep. | 32 // code. gcc is not happy when attempting to inline too deep. |
33 // | 33 // |
34 | 34 |
35 #ifndef V8_OBJECTS_INL_H_ | 35 #ifndef V8_OBJECTS_INL_H_ |
36 #define V8_OBJECTS_INL_H_ | 36 #define V8_OBJECTS_INL_H_ |
37 | 37 |
| 38 #include "elements.h" |
38 #include "objects.h" | 39 #include "objects.h" |
39 #include "contexts.h" | 40 #include "contexts.h" |
40 #include "conversions-inl.h" | 41 #include "conversions-inl.h" |
41 #include "heap.h" | 42 #include "heap.h" |
42 #include "isolate.h" | 43 #include "isolate.h" |
43 #include "property.h" | 44 #include "property.h" |
44 #include "spaces.h" | 45 #include "spaces.h" |
45 #include "v8memory.h" | 46 #include "v8memory.h" |
46 | 47 |
47 namespace v8 { | 48 namespace v8 { |
(...skipping 1580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 } | 1629 } |
1629 | 1630 |
1630 | 1631 |
1631 inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() { | 1632 inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() { |
1632 ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64); | 1633 ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64); |
1633 ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32); | 1634 ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32); |
1634 return OS::nan_value(); | 1635 return OS::nan_value(); |
1635 } | 1636 } |
1636 | 1637 |
1637 | 1638 |
1638 double FixedDoubleArray::get(int index) { | 1639 double FixedDoubleArray::get_scalar(int index) { |
1639 ASSERT(map() != HEAP->fixed_cow_array_map() && | 1640 ASSERT(map() != HEAP->fixed_cow_array_map() && |
1640 map() != HEAP->fixed_array_map()); | 1641 map() != HEAP->fixed_array_map()); |
1641 ASSERT(index >= 0 && index < this->length()); | 1642 ASSERT(index >= 0 && index < this->length()); |
1642 double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize); | 1643 double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize); |
1643 ASSERT(!is_the_hole_nan(result)); | 1644 ASSERT(!is_the_hole_nan(result)); |
1644 return result; | 1645 return result; |
1645 } | 1646 } |
1646 | 1647 |
1647 | 1648 |
| 1649 MaybeObject* FixedDoubleArray::get(int index) { |
| 1650 if (is_the_hole(index)) { |
| 1651 return GetHeap()->the_hole_value(); |
| 1652 } else { |
| 1653 return GetHeap()->NumberFromDouble(get_scalar(index)); |
| 1654 } |
| 1655 } |
| 1656 |
| 1657 |
1648 void FixedDoubleArray::set(int index, double value) { | 1658 void FixedDoubleArray::set(int index, double value) { |
1649 ASSERT(map() != HEAP->fixed_cow_array_map() && | 1659 ASSERT(map() != HEAP->fixed_cow_array_map() && |
1650 map() != HEAP->fixed_array_map()); | 1660 map() != HEAP->fixed_array_map()); |
1651 int offset = kHeaderSize + index * kDoubleSize; | 1661 int offset = kHeaderSize + index * kDoubleSize; |
1652 if (isnan(value)) value = canonical_not_the_hole_nan_as_double(); | 1662 if (isnan(value)) value = canonical_not_the_hole_nan_as_double(); |
1653 WRITE_DOUBLE_FIELD(this, offset, value); | 1663 WRITE_DOUBLE_FIELD(this, offset, value); |
1654 } | 1664 } |
1655 | 1665 |
1656 | 1666 |
1657 void FixedDoubleArray::set_the_hole(int index) { | 1667 void FixedDoubleArray::set_the_hole(int index) { |
(...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2362 Address ByteArray::GetDataStartAddress() { | 2372 Address ByteArray::GetDataStartAddress() { |
2363 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; | 2373 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; |
2364 } | 2374 } |
2365 | 2375 |
2366 | 2376 |
2367 uint8_t* ExternalPixelArray::external_pixel_pointer() { | 2377 uint8_t* ExternalPixelArray::external_pixel_pointer() { |
2368 return reinterpret_cast<uint8_t*>(external_pointer()); | 2378 return reinterpret_cast<uint8_t*>(external_pointer()); |
2369 } | 2379 } |
2370 | 2380 |
2371 | 2381 |
2372 uint8_t ExternalPixelArray::get(int index) { | 2382 uint8_t ExternalPixelArray::get_scalar(int index) { |
2373 ASSERT((index >= 0) && (index < this->length())); | 2383 ASSERT((index >= 0) && (index < this->length())); |
2374 uint8_t* ptr = external_pixel_pointer(); | 2384 uint8_t* ptr = external_pixel_pointer(); |
2375 return ptr[index]; | 2385 return ptr[index]; |
2376 } | 2386 } |
2377 | 2387 |
2378 | 2388 |
| 2389 MaybeObject* ExternalPixelArray::get(int index) { |
| 2390 return Smi::FromInt(static_cast<int>(get_scalar(index))); |
| 2391 } |
| 2392 |
| 2393 |
2379 void ExternalPixelArray::set(int index, uint8_t value) { | 2394 void ExternalPixelArray::set(int index, uint8_t value) { |
2380 ASSERT((index >= 0) && (index < this->length())); | 2395 ASSERT((index >= 0) && (index < this->length())); |
2381 uint8_t* ptr = external_pixel_pointer(); | 2396 uint8_t* ptr = external_pixel_pointer(); |
2382 ptr[index] = value; | 2397 ptr[index] = value; |
2383 } | 2398 } |
2384 | 2399 |
2385 | 2400 |
2386 void* ExternalArray::external_pointer() { | 2401 void* ExternalArray::external_pointer() { |
2387 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); | 2402 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); |
2388 return reinterpret_cast<void*>(ptr); | 2403 return reinterpret_cast<void*>(ptr); |
2389 } | 2404 } |
2390 | 2405 |
2391 | 2406 |
2392 void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) { | 2407 void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) { |
2393 intptr_t ptr = reinterpret_cast<intptr_t>(value); | 2408 intptr_t ptr = reinterpret_cast<intptr_t>(value); |
2394 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); | 2409 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); |
2395 } | 2410 } |
2396 | 2411 |
2397 | 2412 |
2398 int8_t ExternalByteArray::get(int index) { | 2413 int8_t ExternalByteArray::get_scalar(int index) { |
2399 ASSERT((index >= 0) && (index < this->length())); | 2414 ASSERT((index >= 0) && (index < this->length())); |
2400 int8_t* ptr = static_cast<int8_t*>(external_pointer()); | 2415 int8_t* ptr = static_cast<int8_t*>(external_pointer()); |
2401 return ptr[index]; | 2416 return ptr[index]; |
2402 } | 2417 } |
2403 | 2418 |
2404 | 2419 |
| 2420 MaybeObject* ExternalByteArray::get(int index) { |
| 2421 return Smi::FromInt(static_cast<int>(get_scalar(index))); |
| 2422 } |
| 2423 |
| 2424 |
2405 void ExternalByteArray::set(int index, int8_t value) { | 2425 void ExternalByteArray::set(int index, int8_t value) { |
2406 ASSERT((index >= 0) && (index < this->length())); | 2426 ASSERT((index >= 0) && (index < this->length())); |
2407 int8_t* ptr = static_cast<int8_t*>(external_pointer()); | 2427 int8_t* ptr = static_cast<int8_t*>(external_pointer()); |
2408 ptr[index] = value; | 2428 ptr[index] = value; |
2409 } | 2429 } |
2410 | 2430 |
2411 | 2431 |
2412 uint8_t ExternalUnsignedByteArray::get(int index) { | 2432 uint8_t ExternalUnsignedByteArray::get_scalar(int index) { |
2413 ASSERT((index >= 0) && (index < this->length())); | 2433 ASSERT((index >= 0) && (index < this->length())); |
2414 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); | 2434 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); |
2415 return ptr[index]; | 2435 return ptr[index]; |
2416 } | 2436 } |
2417 | 2437 |
2418 | 2438 |
| 2439 MaybeObject* ExternalUnsignedByteArray::get(int index) { |
| 2440 return Smi::FromInt(static_cast<int>(get_scalar(index))); |
| 2441 } |
| 2442 |
| 2443 |
2419 void ExternalUnsignedByteArray::set(int index, uint8_t value) { | 2444 void ExternalUnsignedByteArray::set(int index, uint8_t value) { |
2420 ASSERT((index >= 0) && (index < this->length())); | 2445 ASSERT((index >= 0) && (index < this->length())); |
2421 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); | 2446 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); |
2422 ptr[index] = value; | 2447 ptr[index] = value; |
2423 } | 2448 } |
2424 | 2449 |
2425 | 2450 |
2426 int16_t ExternalShortArray::get(int index) { | 2451 int16_t ExternalShortArray::get_scalar(int index) { |
2427 ASSERT((index >= 0) && (index < this->length())); | 2452 ASSERT((index >= 0) && (index < this->length())); |
2428 int16_t* ptr = static_cast<int16_t*>(external_pointer()); | 2453 int16_t* ptr = static_cast<int16_t*>(external_pointer()); |
2429 return ptr[index]; | 2454 return ptr[index]; |
2430 } | 2455 } |
2431 | 2456 |
2432 | 2457 |
| 2458 MaybeObject* ExternalShortArray::get(int index) { |
| 2459 return Smi::FromInt(static_cast<int>(get_scalar(index))); |
| 2460 } |
| 2461 |
| 2462 |
2433 void ExternalShortArray::set(int index, int16_t value) { | 2463 void ExternalShortArray::set(int index, int16_t value) { |
2434 ASSERT((index >= 0) && (index < this->length())); | 2464 ASSERT((index >= 0) && (index < this->length())); |
2435 int16_t* ptr = static_cast<int16_t*>(external_pointer()); | 2465 int16_t* ptr = static_cast<int16_t*>(external_pointer()); |
2436 ptr[index] = value; | 2466 ptr[index] = value; |
2437 } | 2467 } |
2438 | 2468 |
2439 | 2469 |
2440 uint16_t ExternalUnsignedShortArray::get(int index) { | 2470 uint16_t ExternalUnsignedShortArray::get_scalar(int index) { |
2441 ASSERT((index >= 0) && (index < this->length())); | 2471 ASSERT((index >= 0) && (index < this->length())); |
2442 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); | 2472 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); |
2443 return ptr[index]; | 2473 return ptr[index]; |
2444 } | 2474 } |
2445 | 2475 |
2446 | 2476 |
| 2477 MaybeObject* ExternalUnsignedShortArray::get(int index) { |
| 2478 return Smi::FromInt(static_cast<int>(get_scalar(index))); |
| 2479 } |
| 2480 |
| 2481 |
2447 void ExternalUnsignedShortArray::set(int index, uint16_t value) { | 2482 void ExternalUnsignedShortArray::set(int index, uint16_t value) { |
2448 ASSERT((index >= 0) && (index < this->length())); | 2483 ASSERT((index >= 0) && (index < this->length())); |
2449 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); | 2484 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); |
2450 ptr[index] = value; | 2485 ptr[index] = value; |
2451 } | 2486 } |
2452 | 2487 |
2453 | 2488 |
2454 int32_t ExternalIntArray::get(int index) { | 2489 int32_t ExternalIntArray::get_scalar(int index) { |
2455 ASSERT((index >= 0) && (index < this->length())); | 2490 ASSERT((index >= 0) && (index < this->length())); |
2456 int32_t* ptr = static_cast<int32_t*>(external_pointer()); | 2491 int32_t* ptr = static_cast<int32_t*>(external_pointer()); |
2457 return ptr[index]; | 2492 return ptr[index]; |
2458 } | 2493 } |
2459 | 2494 |
2460 | 2495 |
| 2496 MaybeObject* ExternalIntArray::get(int index) { |
| 2497 return GetHeap()->NumberFromInt32(get_scalar(index)); |
| 2498 } |
| 2499 |
| 2500 |
2461 void ExternalIntArray::set(int index, int32_t value) { | 2501 void ExternalIntArray::set(int index, int32_t value) { |
2462 ASSERT((index >= 0) && (index < this->length())); | 2502 ASSERT((index >= 0) && (index < this->length())); |
2463 int32_t* ptr = static_cast<int32_t*>(external_pointer()); | 2503 int32_t* ptr = static_cast<int32_t*>(external_pointer()); |
2464 ptr[index] = value; | 2504 ptr[index] = value; |
2465 } | 2505 } |
2466 | 2506 |
2467 | 2507 |
2468 uint32_t ExternalUnsignedIntArray::get(int index) { | 2508 uint32_t ExternalUnsignedIntArray::get_scalar(int index) { |
2469 ASSERT((index >= 0) && (index < this->length())); | 2509 ASSERT((index >= 0) && (index < this->length())); |
2470 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); | 2510 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); |
2471 return ptr[index]; | 2511 return ptr[index]; |
2472 } | 2512 } |
2473 | 2513 |
2474 | 2514 |
| 2515 MaybeObject* ExternalUnsignedIntArray::get(int index) { |
| 2516 return GetHeap()->NumberFromUint32(get_scalar(index)); |
| 2517 } |
| 2518 |
| 2519 |
2475 void ExternalUnsignedIntArray::set(int index, uint32_t value) { | 2520 void ExternalUnsignedIntArray::set(int index, uint32_t value) { |
2476 ASSERT((index >= 0) && (index < this->length())); | 2521 ASSERT((index >= 0) && (index < this->length())); |
2477 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); | 2522 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); |
2478 ptr[index] = value; | 2523 ptr[index] = value; |
2479 } | 2524 } |
2480 | 2525 |
2481 | 2526 |
2482 float ExternalFloatArray::get(int index) { | 2527 float ExternalFloatArray::get_scalar(int index) { |
2483 ASSERT((index >= 0) && (index < this->length())); | 2528 ASSERT((index >= 0) && (index < this->length())); |
2484 float* ptr = static_cast<float*>(external_pointer()); | 2529 float* ptr = static_cast<float*>(external_pointer()); |
2485 return ptr[index]; | 2530 return ptr[index]; |
2486 } | 2531 } |
2487 | 2532 |
2488 | 2533 |
| 2534 MaybeObject* ExternalFloatArray::get(int index) { |
| 2535 return GetHeap()->NumberFromDouble(get_scalar(index)); |
| 2536 } |
| 2537 |
| 2538 |
2489 void ExternalFloatArray::set(int index, float value) { | 2539 void ExternalFloatArray::set(int index, float value) { |
2490 ASSERT((index >= 0) && (index < this->length())); | 2540 ASSERT((index >= 0) && (index < this->length())); |
2491 float* ptr = static_cast<float*>(external_pointer()); | 2541 float* ptr = static_cast<float*>(external_pointer()); |
2492 ptr[index] = value; | 2542 ptr[index] = value; |
2493 } | 2543 } |
2494 | 2544 |
2495 | 2545 |
2496 double ExternalDoubleArray::get(int index) { | 2546 double ExternalDoubleArray::get_scalar(int index) { |
2497 ASSERT((index >= 0) && (index < this->length())); | 2547 ASSERT((index >= 0) && (index < this->length())); |
2498 double* ptr = static_cast<double*>(external_pointer()); | 2548 double* ptr = static_cast<double*>(external_pointer()); |
2499 return ptr[index]; | 2549 return ptr[index]; |
2500 } | 2550 } |
2501 | 2551 |
2502 | 2552 |
| 2553 MaybeObject* ExternalDoubleArray::get(int index) { |
| 2554 return GetHeap()->NumberFromDouble(get_scalar(index)); |
| 2555 } |
| 2556 |
| 2557 |
2503 void ExternalDoubleArray::set(int index, double value) { | 2558 void ExternalDoubleArray::set(int index, double value) { |
2504 ASSERT((index >= 0) && (index < this->length())); | 2559 ASSERT((index >= 0) && (index < this->length())); |
2505 double* ptr = static_cast<double*>(external_pointer()); | 2560 double* ptr = static_cast<double*>(external_pointer()); |
2506 ptr[index] = value; | 2561 ptr[index] = value; |
2507 } | 2562 } |
2508 | 2563 |
2509 | 2564 |
2510 int Map::visitor_id() { | 2565 int Map::visitor_id() { |
2511 return READ_BYTE_FIELD(this, kVisitorIdOffset); | 2566 return READ_BYTE_FIELD(this, kVisitorIdOffset); |
2512 } | 2567 } |
(...skipping 1461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3974 (kind == FAST_DOUBLE_ELEMENTS && | 4029 (kind == FAST_DOUBLE_ELEMENTS && |
3975 elements()->IsFixedDoubleArray()) || | 4030 elements()->IsFixedDoubleArray()) || |
3976 (kind == DICTIONARY_ELEMENTS && | 4031 (kind == DICTIONARY_ELEMENTS && |
3977 elements()->IsFixedArray() && | 4032 elements()->IsFixedArray() && |
3978 elements()->IsDictionary()) || | 4033 elements()->IsDictionary()) || |
3979 (kind > DICTIONARY_ELEMENTS)); | 4034 (kind > DICTIONARY_ELEMENTS)); |
3980 return kind; | 4035 return kind; |
3981 } | 4036 } |
3982 | 4037 |
3983 | 4038 |
| 4039 ElementsAccessor* JSObject::GetElementsAccessor() { |
| 4040 return ElementsAccessor::ForKind(GetElementsKind()); |
| 4041 } |
| 4042 |
| 4043 |
3984 bool JSObject::HasFastElements() { | 4044 bool JSObject::HasFastElements() { |
3985 return GetElementsKind() == FAST_ELEMENTS; | 4045 return GetElementsKind() == FAST_ELEMENTS; |
3986 } | 4046 } |
3987 | 4047 |
3988 | 4048 |
3989 bool JSObject::HasFastDoubleElements() { | 4049 bool JSObject::HasFastDoubleElements() { |
3990 return GetElementsKind() == FAST_DOUBLE_ELEMENTS; | 4050 return GetElementsKind() == FAST_DOUBLE_ELEMENTS; |
3991 } | 4051 } |
3992 | 4052 |
3993 | 4053 |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4543 #undef WRITE_INT_FIELD | 4603 #undef WRITE_INT_FIELD |
4544 #undef READ_SHORT_FIELD | 4604 #undef READ_SHORT_FIELD |
4545 #undef WRITE_SHORT_FIELD | 4605 #undef WRITE_SHORT_FIELD |
4546 #undef READ_BYTE_FIELD | 4606 #undef READ_BYTE_FIELD |
4547 #undef WRITE_BYTE_FIELD | 4607 #undef WRITE_BYTE_FIELD |
4548 | 4608 |
4549 | 4609 |
4550 } } // namespace v8::internal | 4610 } } // namespace v8::internal |
4551 | 4611 |
4552 #endif // V8_OBJECTS_INL_H_ | 4612 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |