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 7903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7914 // directly to properties. | 7914 // directly to properties. |
7915 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; | 7915 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; |
7916 Handle<JSFunction> result = | 7916 Handle<JSFunction> result = |
7917 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, | 7917 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, |
7918 context, | 7918 context, |
7919 pretenure_flag); | 7919 pretenure_flag); |
7920 return *result; | 7920 return *result; |
7921 } | 7921 } |
7922 | 7922 |
7923 | 7923 |
7924 static SmartArrayPointer<Object**> GetNonBoundArguments(int bound_argc, | 7924 static SmartArrayPointer<Handle<Object> > GetNonBoundArguments( |
7925 int* total_argc) { | 7925 int bound_argc, |
| 7926 int* total_argc) { |
7926 // Find frame containing arguments passed to the caller. | 7927 // Find frame containing arguments passed to the caller. |
7927 JavaScriptFrameIterator it; | 7928 JavaScriptFrameIterator it; |
7928 JavaScriptFrame* frame = it.frame(); | 7929 JavaScriptFrame* frame = it.frame(); |
7929 List<JSFunction*> functions(2); | 7930 List<JSFunction*> functions(2); |
7930 frame->GetFunctions(&functions); | 7931 frame->GetFunctions(&functions); |
7931 if (functions.length() > 1) { | 7932 if (functions.length() > 1) { |
7932 int inlined_frame_index = functions.length() - 1; | 7933 int inlined_frame_index = functions.length() - 1; |
7933 JSFunction* inlined_function = functions[inlined_frame_index]; | 7934 JSFunction* inlined_function = functions[inlined_frame_index]; |
7934 int args_count = inlined_function->shared()->formal_parameter_count(); | 7935 int args_count = inlined_function->shared()->formal_parameter_count(); |
7935 ScopedVector<SlotRef> args_slots(args_count); | 7936 ScopedVector<SlotRef> args_slots(args_count); |
7936 SlotRef::ComputeSlotMappingForArguments(frame, | 7937 SlotRef::ComputeSlotMappingForArguments(frame, |
7937 inlined_frame_index, | 7938 inlined_frame_index, |
7938 &args_slots); | 7939 &args_slots); |
7939 | 7940 |
7940 *total_argc = bound_argc + args_count; | 7941 *total_argc = bound_argc + args_count; |
7941 SmartArrayPointer<Object**> param_data(NewArray<Object**>(*total_argc)); | 7942 SmartArrayPointer<Handle<Object> > param_data( |
| 7943 NewArray<Handle<Object> >(*total_argc)); |
7942 for (int i = 0; i < args_count; i++) { | 7944 for (int i = 0; i < args_count; i++) { |
7943 Handle<Object> val = args_slots[i].GetValue(); | 7945 Handle<Object> val = args_slots[i].GetValue(); |
7944 param_data[bound_argc + i] = val.location(); | 7946 param_data[bound_argc + i] = val; |
7945 } | 7947 } |
7946 return param_data; | 7948 return param_data; |
7947 } else { | 7949 } else { |
7948 it.AdvanceToArgumentsFrame(); | 7950 it.AdvanceToArgumentsFrame(); |
7949 frame = it.frame(); | 7951 frame = it.frame(); |
7950 int args_count = frame->ComputeParametersCount(); | 7952 int args_count = frame->ComputeParametersCount(); |
7951 | 7953 |
7952 *total_argc = bound_argc + args_count; | 7954 *total_argc = bound_argc + args_count; |
7953 SmartArrayPointer<Object**> param_data(NewArray<Object**>(*total_argc)); | 7955 SmartArrayPointer<Handle<Object> > param_data( |
| 7956 NewArray<Handle<Object> >(*total_argc)); |
7954 for (int i = 0; i < args_count; i++) { | 7957 for (int i = 0; i < args_count; i++) { |
7955 Handle<Object> val = Handle<Object>(frame->GetParameter(i)); | 7958 Handle<Object> val = Handle<Object>(frame->GetParameter(i)); |
7956 param_data[bound_argc + i] = val.location(); | 7959 param_data[bound_argc + i] = val; |
7957 } | 7960 } |
7958 return param_data; | 7961 return param_data; |
7959 } | 7962 } |
7960 } | 7963 } |
7961 | 7964 |
7962 | 7965 |
7963 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) { | 7966 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) { |
7964 HandleScope scope(isolate); | 7967 HandleScope scope(isolate); |
7965 ASSERT(args.length() == 2); | 7968 ASSERT(args.length() == 2); |
7966 // First argument is a function to use as a constructor. | 7969 // First argument is a function to use as a constructor. |
7967 CONVERT_ARG_CHECKED(JSFunction, function, 0); | 7970 CONVERT_ARG_CHECKED(JSFunction, function, 0); |
7968 | 7971 |
7969 // Second argument is either null or an array of bound arguments. | 7972 // Second argument is either null or an array of bound arguments. |
7970 Handle<FixedArray> bound_args; | 7973 Handle<FixedArray> bound_args; |
7971 int bound_argc = 0; | 7974 int bound_argc = 0; |
7972 if (!args[1]->IsNull()) { | 7975 if (!args[1]->IsNull()) { |
7973 CONVERT_ARG_CHECKED(JSArray, params, 1); | 7976 CONVERT_ARG_CHECKED(JSArray, params, 1); |
7974 RUNTIME_ASSERT(params->HasFastTypeElements()); | 7977 RUNTIME_ASSERT(params->HasFastTypeElements()); |
7975 bound_args = Handle<FixedArray>(FixedArray::cast(params->elements())); | 7978 bound_args = Handle<FixedArray>(FixedArray::cast(params->elements())); |
7976 bound_argc = Smi::cast(params->length())->value(); | 7979 bound_argc = Smi::cast(params->length())->value(); |
7977 } | 7980 } |
7978 | 7981 |
7979 int total_argc = 0; | 7982 int total_argc = 0; |
7980 SmartArrayPointer<Object**> param_data = | 7983 SmartArrayPointer<Handle<Object> > param_data = |
7981 GetNonBoundArguments(bound_argc, &total_argc); | 7984 GetNonBoundArguments(bound_argc, &total_argc); |
7982 for (int i = 0; i < bound_argc; i++) { | 7985 for (int i = 0; i < bound_argc; i++) { |
7983 Handle<Object> val = Handle<Object>(bound_args->get(i)); | 7986 Handle<Object> val = Handle<Object>(bound_args->get(i)); |
7984 param_data[i] = val.location(); | 7987 param_data[i] = val; |
7985 } | 7988 } |
7986 | 7989 |
7987 bool exception = false; | 7990 bool exception = false; |
7988 Handle<Object> result = | 7991 Handle<Object> result = |
7989 Execution::New(function, total_argc, *param_data, &exception); | 7992 Execution::New(function, total_argc, *param_data, &exception); |
7990 if (exception) { | 7993 if (exception) { |
7991 return Failure::Exception(); | 7994 return Failure::Exception(); |
7992 } | 7995 } |
7993 | 7996 |
7994 ASSERT(!result.is_null()); | 7997 ASSERT(!result.is_null()); |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8451 for (int i = 0; i < argc; ++i) { | 8454 for (int i = 0; i < argc; ++i) { |
8452 MaybeObject* maybe = arguments->GetElement(offset + i); | 8455 MaybeObject* maybe = arguments->GetElement(offset + i); |
8453 Object* object; | 8456 Object* object; |
8454 if (!maybe->To<Object>(&object)) return maybe; | 8457 if (!maybe->To<Object>(&object)) return maybe; |
8455 argv[i] = Handle<Object>(object); | 8458 argv[i] = Handle<Object>(object); |
8456 } | 8459 } |
8457 | 8460 |
8458 bool threw; | 8461 bool threw; |
8459 Handle<JSReceiver> hfun(fun); | 8462 Handle<JSReceiver> hfun(fun); |
8460 Handle<Object> hreceiver(receiver); | 8463 Handle<Object> hreceiver(receiver); |
8461 Handle<Object> result = Execution::Call( | 8464 Handle<Object> result = |
8462 hfun, hreceiver, argc, reinterpret_cast<Object***>(argv), &threw, true); | 8465 Execution::Call(hfun, hreceiver, argc, argv, &threw, true); |
8463 | 8466 |
8464 if (threw) return Failure::Exception(); | 8467 if (threw) return Failure::Exception(); |
8465 return *result; | 8468 return *result; |
8466 } | 8469 } |
8467 | 8470 |
8468 | 8471 |
8469 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionDelegate) { | 8472 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFunctionDelegate) { |
8470 HandleScope scope(isolate); | 8473 HandleScope scope(isolate); |
8471 ASSERT(args.length() == 1); | 8474 ASSERT(args.length() == 1); |
8472 RUNTIME_ASSERT(!args[0]->IsJSFunction()); | 8475 RUNTIME_ASSERT(!args[0]->IsJSFunction()); |
(...skipping 3369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11842 Execution::Call(compiled_function, receiver, 0, NULL, | 11845 Execution::Call(compiled_function, receiver, 0, NULL, |
11843 &has_pending_exception); | 11846 &has_pending_exception); |
11844 if (has_pending_exception) return Failure::Exception(); | 11847 if (has_pending_exception) return Failure::Exception(); |
11845 | 11848 |
11846 Handle<Object> arguments = GetArgumentsObject(isolate, | 11849 Handle<Object> arguments = GetArgumentsObject(isolate, |
11847 frame, inlined_frame_index, | 11850 frame, inlined_frame_index, |
11848 function, scope_info, | 11851 function, scope_info, |
11849 &sinfo, function_context); | 11852 &sinfo, function_context); |
11850 | 11853 |
11851 // Invoke the evaluation function and return the result. | 11854 // Invoke the evaluation function and return the result. |
11852 const int argc = 2; | 11855 Handle<Object> argv[] = { arguments, source }; |
11853 Object** argv[argc] = { arguments.location(), | |
11854 Handle<Object>::cast(source).location() }; | |
11855 Handle<Object> result = | 11856 Handle<Object> result = |
11856 Execution::Call(Handle<JSFunction>::cast(evaluation_function), receiver, | 11857 Execution::Call(Handle<JSFunction>::cast(evaluation_function), |
11857 argc, argv, &has_pending_exception); | 11858 receiver, |
| 11859 ARRAY_SIZE(argv), |
| 11860 argv, |
| 11861 &has_pending_exception); |
11858 if (has_pending_exception) return Failure::Exception(); | 11862 if (has_pending_exception) return Failure::Exception(); |
11859 | 11863 |
11860 // Skip the global proxy as it has no properties and always delegates to the | 11864 // Skip the global proxy as it has no properties and always delegates to the |
11861 // real global object. | 11865 // real global object. |
11862 if (result->IsJSGlobalProxy()) { | 11866 if (result->IsJSGlobalProxy()) { |
11863 result = Handle<JSObject>(JSObject::cast(result->GetPrototype())); | 11867 result = Handle<JSObject>(JSObject::cast(result->GetPrototype())); |
11864 } | 11868 } |
11865 | 11869 |
11866 return *result; | 11870 return *result; |
11867 } | 11871 } |
(...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12982 | 12986 |
12983 Handle<JSFunctionResultCache> cache_handle(cache); | 12987 Handle<JSFunctionResultCache> cache_handle(cache); |
12984 Handle<Object> key_handle(key); | 12988 Handle<Object> key_handle(key); |
12985 Handle<Object> value; | 12989 Handle<Object> value; |
12986 { | 12990 { |
12987 Handle<JSFunction> factory(JSFunction::cast( | 12991 Handle<JSFunction> factory(JSFunction::cast( |
12988 cache_handle->get(JSFunctionResultCache::kFactoryIndex))); | 12992 cache_handle->get(JSFunctionResultCache::kFactoryIndex))); |
12989 // TODO(antonm): consider passing a receiver when constructing a cache. | 12993 // TODO(antonm): consider passing a receiver when constructing a cache. |
12990 Handle<Object> receiver(isolate->global_context()->global()); | 12994 Handle<Object> receiver(isolate->global_context()->global()); |
12991 // This handle is nor shared, nor used later, so it's safe. | 12995 // This handle is nor shared, nor used later, so it's safe. |
12992 Object** argv[] = { key_handle.location() }; | 12996 Handle<Object> argv[] = { key_handle }; |
12993 bool pending_exception; | 12997 bool pending_exception; |
12994 value = Execution::Call(factory, | 12998 value = Execution::Call(factory, |
12995 receiver, | 12999 receiver, |
12996 1, | 13000 ARRAY_SIZE(argv), |
12997 argv, | 13001 argv, |
12998 &pending_exception); | 13002 &pending_exception); |
12999 if (pending_exception) return Failure::Exception(); | 13003 if (pending_exception) return Failure::Exception(); |
13000 } | 13004 } |
13001 | 13005 |
13002 #ifdef DEBUG | 13006 #ifdef DEBUG |
13003 cache_handle->JSFunctionResultCacheVerify(); | 13007 cache_handle->JSFunctionResultCacheVerify(); |
13004 #endif | 13008 #endif |
13005 | 13009 |
13006 // Function invocation may have cleared the cache. Reread all the data. | 13010 // Function invocation may have cleared the cache. Reread all the data. |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13239 } else { | 13243 } else { |
13240 // Handle last resort GC and make sure to allow future allocations | 13244 // Handle last resort GC and make sure to allow future allocations |
13241 // to grow the heap without causing GCs (if possible). | 13245 // to grow the heap without causing GCs (if possible). |
13242 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13246 isolate->counters()->gc_last_resort_from_js()->Increment(); |
13243 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 13247 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
13244 } | 13248 } |
13245 } | 13249 } |
13246 | 13250 |
13247 | 13251 |
13248 } } // namespace v8::internal | 13252 } } // namespace v8::internal |
OLD | NEW |