OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 3118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3129 // Compute the frame holding the arguments. | 3129 // Compute the frame holding the arguments. |
3130 JavaScriptFrameIterator it; | 3130 JavaScriptFrameIterator it; |
3131 it.AdvanceToArgumentsFrame(); | 3131 it.AdvanceToArgumentsFrame(); |
3132 JavaScriptFrame* frame = it.frame(); | 3132 JavaScriptFrame* frame = it.frame(); |
3133 | 3133 |
3134 const int length = frame->GetProvidedParametersCount(); | 3134 const int length = frame->GetProvidedParametersCount(); |
3135 Object* result = Heap::AllocateArgumentsObject(callee, length); | 3135 Object* result = Heap::AllocateArgumentsObject(callee, length); |
3136 if (result->IsFailure()) return result; | 3136 if (result->IsFailure()) return result; |
3137 FixedArray* array = FixedArray::cast(JSObject::cast(result)->elements()); | 3137 FixedArray* array = FixedArray::cast(JSObject::cast(result)->elements()); |
3138 ASSERT(array->length() == length); | 3138 ASSERT(array->length() == length); |
3139 FixedArray::WriteBarrierMode mode = array->GetWriteBarrierMode(); | 3139 WriteBarrierMode mode = array->GetWriteBarrierMode(); |
3140 for (int i = 0; i < length; i++) { | 3140 for (int i = 0; i < length; i++) { |
3141 array->set(i, frame->GetParameter(i), mode); | 3141 array->set(i, frame->GetParameter(i), mode); |
3142 } | 3142 } |
3143 return result; | 3143 return result; |
3144 } | 3144 } |
3145 | 3145 |
3146 | 3146 |
3147 static Object* Runtime_NewArgumentsFast(Arguments args) { | 3147 static Object* Runtime_NewArgumentsFast(Arguments args) { |
3148 NoHandleAllocation ha; | 3148 NoHandleAllocation ha; |
3149 ASSERT(args.length() == 3); | 3149 ASSERT(args.length() == 3); |
3150 | 3150 |
3151 JSFunction* callee = JSFunction::cast(args[0]); | 3151 JSFunction* callee = JSFunction::cast(args[0]); |
3152 Object** parameters = reinterpret_cast<Object**>(args[1]); | 3152 Object** parameters = reinterpret_cast<Object**>(args[1]); |
3153 const int length = Smi::cast(args[2])->value(); | 3153 const int length = Smi::cast(args[2])->value(); |
3154 | 3154 |
3155 Object* result = Heap::AllocateArgumentsObject(callee, length); | 3155 Object* result = Heap::AllocateArgumentsObject(callee, length); |
3156 if (result->IsFailure()) return result; | 3156 if (result->IsFailure()) return result; |
3157 FixedArray* array = FixedArray::cast(JSObject::cast(result)->elements()); | 3157 FixedArray* array = FixedArray::cast(JSObject::cast(result)->elements()); |
3158 ASSERT(array->length() == length); | 3158 ASSERT(array->length() == length); |
3159 FixedArray::WriteBarrierMode mode = array->GetWriteBarrierMode(); | 3159 WriteBarrierMode mode = array->GetWriteBarrierMode(); |
3160 for (int i = 0; i < length; i++) { | 3160 for (int i = 0; i < length; i++) { |
3161 array->set(i, *--parameters, mode); | 3161 array->set(i, *--parameters, mode); |
3162 } | 3162 } |
3163 return result; | 3163 return result; |
3164 } | 3164 } |
3165 | 3165 |
3166 | 3166 |
3167 static Object* Runtime_NewClosure(Arguments args) { | 3167 static Object* Runtime_NewClosure(Arguments args) { |
3168 HandleScope scope; | 3168 HandleScope scope; |
3169 ASSERT(args.length() == 2); | 3169 ASSERT(args.length() == 2); |
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4012 uint32_t index; | 4012 uint32_t index; |
4013 if (!Array::IndexFromObject(key, &index) || index >= length) { | 4013 if (!Array::IndexFromObject(key, &index) || index >= length) { |
4014 // Zap invalid keys. | 4014 // Zap invalid keys. |
4015 keys->set_undefined(i); | 4015 keys->set_undefined(i); |
4016 } | 4016 } |
4017 } | 4017 } |
4018 return *Factory::NewJSArrayWithElements(keys); | 4018 return *Factory::NewJSArrayWithElements(keys); |
4019 } else { | 4019 } else { |
4020 Handle<FixedArray> single_interval = Factory::NewFixedArray(2); | 4020 Handle<FixedArray> single_interval = Factory::NewFixedArray(2); |
4021 // -1 means start of array. | 4021 // -1 means start of array. |
4022 single_interval->set(0, Smi::FromInt(-1)); | 4022 single_interval->set(0, |
| 4023 Smi::FromInt(-1), |
| 4024 SKIP_WRITE_BARRIER); |
4023 Handle<Object> length_object = | 4025 Handle<Object> length_object = |
4024 Factory::NewNumber(static_cast<double>(length)); | 4026 Factory::NewNumber(static_cast<double>(length)); |
4025 single_interval->set(1, *length_object); | 4027 single_interval->set(1, *length_object); |
4026 return *Factory::NewJSArrayWithElements(single_interval); | 4028 return *Factory::NewJSArrayWithElements(single_interval); |
4027 } | 4029 } |
4028 } | 4030 } |
4029 | 4031 |
4030 | 4032 |
4031 // DefineAccessor takes an optional final argument which is the | 4033 // DefineAccessor takes an optional final argument which is the |
4032 // property attributes (eg, DONT_ENUM, DONT_DELETE). IMPORTANT: due | 4034 // property attributes (eg, DONT_ENUM, DONT_DELETE). IMPORTANT: due |
(...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4862 NULL); | 4864 NULL); |
4863 if (index != -1) { | 4865 if (index != -1) { |
4864 return Handle<Object>(function_context->get(index)); | 4866 return Handle<Object>(function_context->get(index)); |
4865 } | 4867 } |
4866 } | 4868 } |
4867 | 4869 |
4868 const int length = frame->GetProvidedParametersCount(); | 4870 const int length = frame->GetProvidedParametersCount(); |
4869 Handle<Object> arguments = Factory::NewArgumentsObject(function, length); | 4871 Handle<Object> arguments = Factory::NewArgumentsObject(function, length); |
4870 FixedArray* array = FixedArray::cast(JSObject::cast(*arguments)->elements()); | 4872 FixedArray* array = FixedArray::cast(JSObject::cast(*arguments)->elements()); |
4871 ASSERT(array->length() == length); | 4873 ASSERT(array->length() == length); |
4872 FixedArray::WriteBarrierMode mode = array->GetWriteBarrierMode(); | 4874 WriteBarrierMode mode = array->GetWriteBarrierMode(); |
4873 for (int i = 0; i < length; i++) { | 4875 for (int i = 0; i < length; i++) { |
4874 array->set(i, frame->GetParameter(i), mode); | 4876 array->set(i, frame->GetParameter(i), mode); |
4875 } | 4877 } |
4876 return arguments; | 4878 return arguments; |
4877 } | 4879 } |
4878 | 4880 |
4879 | 4881 |
4880 // Evaluate a piece of JavaScript in the context of a stack frame for | 4882 // Evaluate a piece of JavaScript in the context of a stack frame for |
4881 // debugging. This is acomplished by creating a new context which in its | 4883 // debugging. This is acomplished by creating a new context which in its |
4882 // extension part has all the parameters and locals of the function on the | 4884 // extension part has all the parameters and locals of the function on the |
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5477 | 5479 |
5478 void Runtime::PerformGC(Object* result) { | 5480 void Runtime::PerformGC(Object* result) { |
5479 Failure* failure = Failure::cast(result); | 5481 Failure* failure = Failure::cast(result); |
5480 // Try to do a garbage collection; ignore it if it fails. The C | 5482 // Try to do a garbage collection; ignore it if it fails. The C |
5481 // entry stub will throw an out-of-memory exception in that case. | 5483 // entry stub will throw an out-of-memory exception in that case. |
5482 Heap::CollectGarbage(failure->requested(), failure->allocation_space()); | 5484 Heap::CollectGarbage(failure->requested(), failure->allocation_space()); |
5483 } | 5485 } |
5484 | 5486 |
5485 | 5487 |
5486 } } // namespace v8::internal | 5488 } } // namespace v8::internal |
OLD | NEW |