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 3002 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3013 static Object* Runtime_LocalKeys(Arguments args) { | 3013 static Object* Runtime_LocalKeys(Arguments args) { |
3014 ASSERT_EQ(args.length(), 1); | 3014 ASSERT_EQ(args.length(), 1); |
3015 CONVERT_CHECKED(JSObject, raw_object, args[0]); | 3015 CONVERT_CHECKED(JSObject, raw_object, args[0]); |
3016 HandleScope scope; | 3016 HandleScope scope; |
3017 Handle<JSObject> object(raw_object); | 3017 Handle<JSObject> object(raw_object); |
3018 Handle<FixedArray> contents = GetKeysInFixedArrayFor(object, | 3018 Handle<FixedArray> contents = GetKeysInFixedArrayFor(object, |
3019 LOCAL_ONLY); | 3019 LOCAL_ONLY); |
3020 // Some fast paths through GetKeysInFixedArrayFor reuse a cached | 3020 // Some fast paths through GetKeysInFixedArrayFor reuse a cached |
3021 // property array and since the result is mutable we have to create | 3021 // property array and since the result is mutable we have to create |
3022 // a fresh clone on each invocation. | 3022 // a fresh clone on each invocation. |
3023 Handle<FixedArray> copy = Factory::NewFixedArray(contents->length()); | 3023 int length = contents->length(); |
3024 contents->CopyTo(0, *copy, 0, contents->length()); | 3024 Handle<FixedArray> copy = Factory::NewFixedArray(length); |
| 3025 for (int i = 0; i < length; i++) { |
| 3026 Object* entry = contents->get(i); |
| 3027 if (entry->IsString()) { |
| 3028 copy->set(i, entry); |
| 3029 } else { |
| 3030 ASSERT(entry->IsNumber()); |
| 3031 HandleScope scope; |
| 3032 Handle<Object> entry_handle(entry); |
| 3033 Handle<Object> entry_str = Factory::NumberToString(entry_handle); |
| 3034 copy->set(i, *entry_str); |
| 3035 } |
| 3036 } |
3025 return *Factory::NewJSArrayWithElements(copy); | 3037 return *Factory::NewJSArrayWithElements(copy); |
3026 } | 3038 } |
3027 | 3039 |
3028 | 3040 |
3029 static Object* Runtime_GetArgumentsProperty(Arguments args) { | 3041 static Object* Runtime_GetArgumentsProperty(Arguments args) { |
3030 NoHandleAllocation ha; | 3042 NoHandleAllocation ha; |
3031 ASSERT(args.length() == 1); | 3043 ASSERT(args.length() == 1); |
3032 | 3044 |
3033 // Compute the frame holding the arguments. | 3045 // Compute the frame holding the arguments. |
3034 JavaScriptFrameIterator it; | 3046 JavaScriptFrameIterator it; |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3580 } | 3592 } |
3581 | 3593 |
3582 | 3594 |
3583 static Object* Runtime_NumberToString(Arguments args) { | 3595 static Object* Runtime_NumberToString(Arguments args) { |
3584 NoHandleAllocation ha; | 3596 NoHandleAllocation ha; |
3585 ASSERT(args.length() == 1); | 3597 ASSERT(args.length() == 1); |
3586 | 3598 |
3587 Object* number = args[0]; | 3599 Object* number = args[0]; |
3588 RUNTIME_ASSERT(number->IsNumber()); | 3600 RUNTIME_ASSERT(number->IsNumber()); |
3589 | 3601 |
3590 Object* cached = Heap::GetNumberStringCache(number); | 3602 return Heap::NumberToString(number); |
3591 if (cached != Heap::undefined_value()) { | |
3592 return cached; | |
3593 } | |
3594 | |
3595 char arr[100]; | |
3596 Vector<char> buffer(arr, ARRAY_SIZE(arr)); | |
3597 const char* str; | |
3598 if (number->IsSmi()) { | |
3599 int num = Smi::cast(number)->value(); | |
3600 str = IntToCString(num, buffer); | |
3601 } else { | |
3602 double num = HeapNumber::cast(number)->value(); | |
3603 str = DoubleToCString(num, buffer); | |
3604 } | |
3605 Object* result = Heap::AllocateStringFromAscii(CStrVector(str)); | |
3606 | |
3607 if (!result->IsFailure()) { | |
3608 Heap::SetNumberStringCache(number, String::cast(result)); | |
3609 } | |
3610 return result; | |
3611 } | 3603 } |
3612 | 3604 |
3613 | 3605 |
3614 static Object* Runtime_NumberToInteger(Arguments args) { | 3606 static Object* Runtime_NumberToInteger(Arguments args) { |
3615 NoHandleAllocation ha; | 3607 NoHandleAllocation ha; |
3616 ASSERT(args.length() == 1); | 3608 ASSERT(args.length() == 1); |
3617 | 3609 |
3618 Object* obj = args[0]; | 3610 Object* obj = args[0]; |
3619 if (obj->IsSmi()) return obj; | 3611 if (obj->IsSmi()) return obj; |
3620 CONVERT_DOUBLE_CHECKED(number, obj); | 3612 CONVERT_DOUBLE_CHECKED(number, obj); |
(...skipping 4109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7730 } else { | 7722 } else { |
7731 // Handle last resort GC and make sure to allow future allocations | 7723 // Handle last resort GC and make sure to allow future allocations |
7732 // to grow the heap without causing GCs (if possible). | 7724 // to grow the heap without causing GCs (if possible). |
7733 Counters::gc_last_resort_from_js.Increment(); | 7725 Counters::gc_last_resort_from_js.Increment(); |
7734 Heap::CollectAllGarbage(false); | 7726 Heap::CollectAllGarbage(false); |
7735 } | 7727 } |
7736 } | 7728 } |
7737 | 7729 |
7738 | 7730 |
7739 } } // namespace v8::internal | 7731 } } // namespace v8::internal |
OLD | NEW |