Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: src/runtime.cc

Issue 551189: Propagate receiver from initial call site to code generator. (Closed)
Patch Set: Created 10 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/compiler.h ('K') | « src/ic.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 1387 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 ASSERT(args.length() == 2); 1398 ASSERT(args.length() == 2);
1399 1399
1400 CONVERT_ARG_CHECKED(JSFunction, target, 0); 1400 CONVERT_ARG_CHECKED(JSFunction, target, 0);
1401 Handle<Object> code = args.at<Object>(1); 1401 Handle<Object> code = args.at<Object>(1);
1402 1402
1403 Handle<Context> context(target->context()); 1403 Handle<Context> context(target->context());
1404 1404
1405 if (!code->IsNull()) { 1405 if (!code->IsNull()) {
1406 RUNTIME_ASSERT(code->IsJSFunction()); 1406 RUNTIME_ASSERT(code->IsJSFunction());
1407 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); 1407 Handle<JSFunction> fun = Handle<JSFunction>::cast(code);
1408 SetExpectedNofProperties(target, fun->shared()->expected_nof_properties()); 1408 Handle<SharedFunctionInfo> shared(fun->shared());
1409 if (!fun->is_compiled() && !CompileLazy(fun, KEEP_EXCEPTION)) { 1409 SetExpectedNofProperties(target, shared->expected_nof_properties());
1410
1411 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) {
1410 return Failure::Exception(); 1412 return Failure::Exception();
1411 } 1413 }
1412 // Set the code, formal parameter count, and the length of the target 1414 // Set the code, formal parameter count, and the length of the target
1413 // function. 1415 // function.
1414 target->set_code(fun->code()); 1416 target->set_code(fun->code());
1415 target->shared()->set_length(fun->shared()->length()); 1417 target->shared()->set_length(shared->length());
1416 target->shared()->set_formal_parameter_count( 1418 target->shared()->set_formal_parameter_count(
1417 fun->shared()->formal_parameter_count()); 1419 shared->formal_parameter_count());
1418 // Set the source code of the target function to undefined. 1420 // Set the source code of the target function to undefined.
1419 // SetCode is only used for built-in constructors like String, 1421 // SetCode is only used for built-in constructors like String,
1420 // Array, and Object, and some web code 1422 // Array, and Object, and some web code
1421 // doesn't like seeing source code for constructors. 1423 // doesn't like seeing source code for constructors.
1422 target->shared()->set_script(Heap::undefined_value()); 1424 target->shared()->set_script(Heap::undefined_value());
1423 // Clear the optimization hints related to the compiled code as these are no 1425 // Clear the optimization hints related to the compiled code as these are no
1424 // longer valid when the code is overwritten. 1426 // longer valid when the code is overwritten.
1425 target->shared()->ClearThisPropertyAssignmentsInfo(); 1427 target->shared()->ClearThisPropertyAssignmentsInfo();
1426 context = Handle<Context>(fun->context()); 1428 context = Handle<Context>(fun->context());
1427 1429
(...skipping 3391 matching lines...) Expand 10 before | Expand all | Expand 10 after
4819 // the shared part of the function. Since the receiver is 4821 // the shared part of the function. Since the receiver is
4820 // ignored anyway, we use the global object as the receiver 4822 // ignored anyway, we use the global object as the receiver
4821 // instead of a new JSFunction object. This way, errors are 4823 // instead of a new JSFunction object. This way, errors are
4822 // reported the same way whether or not 'Function' is called 4824 // reported the same way whether or not 'Function' is called
4823 // using 'new'. 4825 // using 'new'.
4824 return Top::context()->global(); 4826 return Top::context()->global();
4825 } 4827 }
4826 } 4828 }
4827 4829
4828 // The function should be compiled for the optimization hints to be available. 4830 // The function should be compiled for the optimization hints to be available.
4829 if (!function->shared()->is_compiled()) { 4831 Handle<SharedFunctionInfo> shared(function->shared());
4830 CompileLazyShared(Handle<SharedFunctionInfo>(function->shared()), 4832 EnsureCompiled(shared, CLEAR_EXCEPTION);
4831 CLEAR_EXCEPTION,
4832 0);
4833 LOG(FunctionCreateEvent(*function));
4834 }
4835 4833
4836 bool first_allocation = !function->has_initial_map(); 4834 bool first_allocation = !function->has_initial_map();
4837 Handle<JSObject> result = Factory::NewJSObject(function); 4835 Handle<JSObject> result = Factory::NewJSObject(function);
4838 if (first_allocation) { 4836 if (first_allocation) {
4839 Handle<Map> map = Handle<Map>(function->initial_map()); 4837 Handle<Map> map = Handle<Map>(function->initial_map());
4840 Handle<Code> stub = Handle<Code>( 4838 Handle<Code> stub = Handle<Code>(
4841 ComputeConstructStub(Handle<SharedFunctionInfo>(function->shared()))); 4839 ComputeConstructStub(Handle<SharedFunctionInfo>(function->shared())));
4842 function->shared()->set_construct_stub(*stub); 4840 function->shared()->set_construct_stub(*stub);
4843 } 4841 }
4844 4842
(...skipping 18 matching lines...) Expand all
4863 #endif 4861 #endif
4864 4862
4865 // Compile the target function. Here we compile using CompileLazyInLoop in 4863 // Compile the target function. Here we compile using CompileLazyInLoop in
4866 // order to get the optimized version. This helps code like delta-blue 4864 // order to get the optimized version. This helps code like delta-blue
4867 // that calls performance-critical routines through constructors. A 4865 // that calls performance-critical routines through constructors. A
4868 // constructor call doesn't use a CallIC, it uses a LoadIC followed by a 4866 // constructor call doesn't use a CallIC, it uses a LoadIC followed by a
4869 // direct call. Since the in-loop tracking takes place through CallICs 4867 // direct call. Since the in-loop tracking takes place through CallICs
4870 // this means that things called through constructors are never known to 4868 // this means that things called through constructors are never known to
4871 // be in loops. We compile them as if they are in loops here just in case. 4869 // be in loops. We compile them as if they are in loops here just in case.
4872 ASSERT(!function->is_compiled()); 4870 ASSERT(!function->is_compiled());
4873 if (!CompileLazyInLoop(function, KEEP_EXCEPTION)) { 4871 if (!CompileLazyInLoop(function, Handle<Object>::null(), KEEP_EXCEPTION)) {
4874 return Failure::Exception(); 4872 return Failure::Exception();
4875 } 4873 }
4876 4874
4877 return function->code(); 4875 return function->code();
4878 } 4876 }
4879 4877
4880 4878
4881 static Object* Runtime_GetCalledFunction(Arguments args) { 4879 static Object* Runtime_GetCalledFunction(Arguments args) {
4882 HandleScope scope; 4880 HandleScope scope;
4883 ASSERT(args.length() == 0); 4881 ASSERT(args.length() == 0);
(...skipping 2387 matching lines...) Expand 10 before | Expand all | Expand 10 after
7271 } 7269 }
7272 } 7270 }
7273 7271
7274 // If the candidate found is compiled we are done. NOTE: when lazy 7272 // If the candidate found is compiled we are done. NOTE: when lazy
7275 // compilation of inner functions is introduced some additional checking 7273 // compilation of inner functions is introduced some additional checking
7276 // needs to be done here to compile inner functions. 7274 // needs to be done here to compile inner functions.
7277 done = target->is_compiled(); 7275 done = target->is_compiled();
7278 if (!done) { 7276 if (!done) {
7279 // If the candidate is not compiled compile it to reveal any inner 7277 // If the candidate is not compiled compile it to reveal any inner
7280 // functions which might contain the requested source position. 7278 // functions which might contain the requested source position.
7281 CompileLazyShared(target, KEEP_EXCEPTION, 0); 7279 CompileLazyShared(target, KEEP_EXCEPTION);
7282 } 7280 }
7283 } 7281 }
7284 7282
7285 return *target; 7283 return *target;
7286 } 7284 }
7287 7285
7288 7286
7289 // Change the state of a break point in a script. NOTE: Regarding performance 7287 // Change the state of a break point in a script. NOTE: Regarding performance
7290 // see the NOTE for GetScriptFromScriptData. 7288 // see the NOTE for GetScriptFromScriptData.
7291 // args[0]: script to set break point in 7289 // args[0]: script to set break point in
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
7857 return Heap::undefined_value(); 7855 return Heap::undefined_value();
7858 } 7856 }
7859 7857
7860 7858
7861 static Object* Runtime_DebugDisassembleFunction(Arguments args) { 7859 static Object* Runtime_DebugDisassembleFunction(Arguments args) {
7862 #ifdef DEBUG 7860 #ifdef DEBUG
7863 HandleScope scope; 7861 HandleScope scope;
7864 ASSERT(args.length() == 1); 7862 ASSERT(args.length() == 1);
7865 // Get the function and make sure it is compiled. 7863 // Get the function and make sure it is compiled.
7866 CONVERT_ARG_CHECKED(JSFunction, func, 0); 7864 CONVERT_ARG_CHECKED(JSFunction, func, 0);
7867 if (!func->is_compiled() && !CompileLazy(func, KEEP_EXCEPTION)) { 7865 Handle<SharedFunctionInfo> shared(func->shared());
7866 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) {
7868 return Failure::Exception(); 7867 return Failure::Exception();
7869 } 7868 }
7870 func->code()->PrintLn(); 7869 func->code()->PrintLn();
7871 #endif // DEBUG 7870 #endif // DEBUG
7872 return Heap::undefined_value(); 7871 return Heap::undefined_value();
7873 } 7872 }
7874 7873
7875 7874
7876 static Object* Runtime_DebugDisassembleConstructor(Arguments args) { 7875 static Object* Runtime_DebugDisassembleConstructor(Arguments args) {
7877 #ifdef DEBUG 7876 #ifdef DEBUG
7878 HandleScope scope; 7877 HandleScope scope;
7879 ASSERT(args.length() == 1); 7878 ASSERT(args.length() == 1);
7880 // Get the function and make sure it is compiled. 7879 // Get the function and make sure it is compiled.
7881 CONVERT_ARG_CHECKED(JSFunction, func, 0); 7880 CONVERT_ARG_CHECKED(JSFunction, func, 0);
7882 if (!func->is_compiled() && !CompileLazy(func, KEEP_EXCEPTION)) { 7881 Handle<SharedFunctionInfo> shared(func->shared());
7882 if (!EnsureCompiled(shared, KEEP_EXCEPTION)) {
7883 return Failure::Exception(); 7883 return Failure::Exception();
7884 } 7884 }
7885 func->shared()->construct_stub()->PrintLn(); 7885 shared->construct_stub()->PrintLn();
7886 #endif // DEBUG 7886 #endif // DEBUG
7887 return Heap::undefined_value(); 7887 return Heap::undefined_value();
7888 } 7888 }
7889 7889
7890 7890
7891 static Object* Runtime_FunctionGetInferredName(Arguments args) { 7891 static Object* Runtime_FunctionGetInferredName(Arguments args) {
7892 NoHandleAllocation ha; 7892 NoHandleAllocation ha;
7893 ASSERT(args.length() == 1); 7893 ASSERT(args.length() == 1);
7894 7894
7895 CONVERT_CHECKED(JSFunction, f, args[0]); 7895 CONVERT_CHECKED(JSFunction, f, args[0]);
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
8163 } else { 8163 } else {
8164 // Handle last resort GC and make sure to allow future allocations 8164 // Handle last resort GC and make sure to allow future allocations
8165 // to grow the heap without causing GCs (if possible). 8165 // to grow the heap without causing GCs (if possible).
8166 Counters::gc_last_resort_from_js.Increment(); 8166 Counters::gc_last_resort_from_js.Increment();
8167 Heap::CollectAllGarbage(false); 8167 Heap::CollectAllGarbage(false);
8168 } 8168 }
8169 } 8169 }
8170 8170
8171 8171
8172 } } // namespace v8::internal 8172 } } // namespace v8::internal
OLDNEW
« src/compiler.h ('K') | « src/ic.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698