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

Side by Side Diff: src/runtime.cc

Issue 669240: - Remove function boilerplate objects and use SharedFunctionInfos in... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Committed Created 10 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « src/rewriter.cc ('k') | src/x64/codegen-x64.h » ('j') | 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 770 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 const char* type = (is_read_only) ? "const" : "var"; 781 const char* type = (is_read_only) ? "const" : "var";
782 return ThrowRedeclarationError(type, name); 782 return ThrowRedeclarationError(type, name);
783 } 783 }
784 // The property already exists without conflicting: Go to 784 // The property already exists without conflicting: Go to
785 // the next declaration. 785 // the next declaration.
786 continue; 786 continue;
787 } 787 }
788 } 788 }
789 } else { 789 } else {
790 // Copy the function and update its context. Use it as value. 790 // Copy the function and update its context. Use it as value.
791 Handle<JSFunction> boilerplate = Handle<JSFunction>::cast(value); 791 Handle<SharedFunctionInfo> shared =
792 Handle<SharedFunctionInfo>::cast(value);
792 Handle<JSFunction> function = 793 Handle<JSFunction> function =
793 Factory::NewFunctionFromBoilerplate(boilerplate, context, TENURED); 794 Factory::NewFunctionFromSharedFunctionInfo(shared, context, TENURED);
794 value = function; 795 value = function;
795 } 796 }
796 797
797 LookupResult lookup; 798 LookupResult lookup;
798 global->LocalLookup(*name, &lookup); 799 global->LocalLookup(*name, &lookup);
799 800
800 PropertyAttributes attributes = is_const_property 801 PropertyAttributes attributes = is_const_property
801 ? static_cast<PropertyAttributes>(base | READ_ONLY) 802 ? static_cast<PropertyAttributes>(base | READ_ONLY)
802 : base; 803 : base;
803 804
(...skipping 5001 matching lines...) Expand 10 before | Expand all | Expand 10 after
5805 JSObject::cast(result)->set_elements(FixedArray::cast(obj)); 5806 JSObject::cast(result)->set_elements(FixedArray::cast(obj));
5806 } 5807 }
5807 return result; 5808 return result;
5808 } 5809 }
5809 5810
5810 5811
5811 static Object* Runtime_NewClosure(Arguments args) { 5812 static Object* Runtime_NewClosure(Arguments args) {
5812 HandleScope scope; 5813 HandleScope scope;
5813 ASSERT(args.length() == 2); 5814 ASSERT(args.length() == 2);
5814 CONVERT_ARG_CHECKED(Context, context, 0); 5815 CONVERT_ARG_CHECKED(Context, context, 0);
5815 CONVERT_ARG_CHECKED(JSFunction, boilerplate, 1); 5816 CONVERT_ARG_CHECKED(SharedFunctionInfo, shared, 1);
5816 5817
5817 PretenureFlag pretenure = (context->global_context() == *context) 5818 PretenureFlag pretenure = (context->global_context() == *context)
5818 ? TENURED // Allocate global closures in old space. 5819 ? TENURED // Allocate global closures in old space.
5819 : NOT_TENURED; // Allocate local closures in new space. 5820 : NOT_TENURED; // Allocate local closures in new space.
5820 Handle<JSFunction> result = 5821 Handle<JSFunction> result =
5821 Factory::NewFunctionFromBoilerplate(boilerplate, context, pretenure); 5822 Factory::NewFunctionFromSharedFunctionInfo(shared, context, pretenure);
5822 return *result; 5823 return *result;
5823 } 5824 }
5824 5825
5825 5826
5826 static Code* ComputeConstructStub(Handle<JSFunction> function) { 5827 static Code* ComputeConstructStub(Handle<JSFunction> function) {
5827 Handle<Object> prototype = Factory::null_value(); 5828 Handle<Object> prototype = Factory::null_value();
5828 if (function->has_instance_prototype()) { 5829 if (function->has_instance_prototype()) {
5829 prototype = Handle<Object>(function->instance_prototype()); 5830 prototype = Handle<Object>(function->instance_prototype());
5830 } 5831 }
5831 if (function->shared()->CanGenerateInlineConstructor(*prototype)) { 5832 if (function->shared()->CanGenerateInlineConstructor(*prototype)) {
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
6496 static Object* Runtime_CompileString(Arguments args) { 6497 static Object* Runtime_CompileString(Arguments args) {
6497 HandleScope scope; 6498 HandleScope scope;
6498 ASSERT_EQ(2, args.length()); 6499 ASSERT_EQ(2, args.length());
6499 CONVERT_ARG_CHECKED(String, source, 0); 6500 CONVERT_ARG_CHECKED(String, source, 0);
6500 CONVERT_ARG_CHECKED(Oddball, is_json, 1) 6501 CONVERT_ARG_CHECKED(Oddball, is_json, 1)
6501 6502
6502 // Compile source string in the global context. 6503 // Compile source string in the global context.
6503 Handle<Context> context(Top::context()->global_context()); 6504 Handle<Context> context(Top::context()->global_context());
6504 Compiler::ValidationState validate = (is_json->IsTrue()) 6505 Compiler::ValidationState validate = (is_json->IsTrue())
6505 ? Compiler::VALIDATE_JSON : Compiler::DONT_VALIDATE_JSON; 6506 ? Compiler::VALIDATE_JSON : Compiler::DONT_VALIDATE_JSON;
6506 Handle<JSFunction> boilerplate = Compiler::CompileEval(source, 6507 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(source,
6507 context, 6508 context,
6508 true, 6509 true,
6509 validate); 6510 validate);
6510 if (boilerplate.is_null()) return Failure::Exception(); 6511 if (shared.is_null()) return Failure::Exception();
6511 Handle<JSFunction> fun = 6512 Handle<JSFunction> fun =
6512 Factory::NewFunctionFromBoilerplate(boilerplate, context, NOT_TENURED); 6513 Factory::NewFunctionFromSharedFunctionInfo(shared, context, NOT_TENURED);
6513 return *fun; 6514 return *fun;
6514 } 6515 }
6515 6516
6516 6517
6517 static ObjectPair Runtime_ResolvePossiblyDirectEval(Arguments args) { 6518 static ObjectPair Runtime_ResolvePossiblyDirectEval(Arguments args) {
6518 ASSERT(args.length() == 3); 6519 ASSERT(args.length() == 3);
6519 if (!args[0]->IsJSFunction()) { 6520 if (!args[0]->IsJSFunction()) {
6520 return MakePair(Top::ThrowIllegalOperation(), NULL); 6521 return MakePair(Top::ThrowIllegalOperation(), NULL);
6521 } 6522 }
6522 6523
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
6575 // 'eval' is bound in the global context, but it may have been overwritten. 6576 // 'eval' is bound in the global context, but it may have been overwritten.
6576 // Compare it to the builtin 'GlobalEval' function to make sure. 6577 // Compare it to the builtin 'GlobalEval' function to make sure.
6577 if (*callee != Top::global_context()->global_eval_fun() || 6578 if (*callee != Top::global_context()->global_eval_fun() ||
6578 !args[1]->IsString()) { 6579 !args[1]->IsString()) {
6579 return MakePair(*callee, Top::context()->global()->global_receiver()); 6580 return MakePair(*callee, Top::context()->global()->global_receiver());
6580 } 6581 }
6581 6582
6582 // Deal with a normal eval call with a string argument. Compile it 6583 // Deal with a normal eval call with a string argument. Compile it
6583 // and return the compiled function bound in the local context. 6584 // and return the compiled function bound in the local context.
6584 Handle<String> source = args.at<String>(1); 6585 Handle<String> source = args.at<String>(1);
6585 Handle<JSFunction> boilerplate = Compiler::CompileEval( 6586 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(
6586 source, 6587 source,
6587 Handle<Context>(Top::context()), 6588 Handle<Context>(Top::context()),
6588 Top::context()->IsGlobalContext(), 6589 Top::context()->IsGlobalContext(),
6589 Compiler::DONT_VALIDATE_JSON); 6590 Compiler::DONT_VALIDATE_JSON);
6590 if (boilerplate.is_null()) return MakePair(Failure::Exception(), NULL); 6591 if (shared.is_null()) return MakePair(Failure::Exception(), NULL);
6591 callee = Factory::NewFunctionFromBoilerplate( 6592 callee = Factory::NewFunctionFromSharedFunctionInfo(
6592 boilerplate, 6593 shared,
6593 Handle<Context>(Top::context()), 6594 Handle<Context>(Top::context()),
6594 NOT_TENURED); 6595 NOT_TENURED);
6595 return MakePair(*callee, args[2]); 6596 return MakePair(*callee, args[2]);
6596 } 6597 }
6597 6598
6598 6599
6599 static Object* Runtime_SetNewFunctionAttributes(Arguments args) { 6600 static Object* Runtime_SetNewFunctionAttributes(Arguments args) {
6600 // This utility adjusts the property attributes for newly created Function 6601 // This utility adjusts the property attributes for newly created Function
6601 // object ("new Function(...)") by changing the map. 6602 // object ("new Function(...)") by changing the map.
6602 // All it does is changing the prototype property to enumerable 6603 // All it does is changing the prototype property to enumerable
(...skipping 1961 matching lines...) Expand 10 before | Expand all | Expand 10 after
8564 // created context. The function has one parameter which has to be called 8565 // created context. The function has one parameter which has to be called
8565 // 'arguments'. This it to have access to what would have been 'arguments' in 8566 // 'arguments'. This it to have access to what would have been 'arguments' in
8566 // the function being debugged. 8567 // the function being debugged.
8567 // function(arguments,__source__) {return eval(__source__);} 8568 // function(arguments,__source__) {return eval(__source__);}
8568 static const char* source_str = 8569 static const char* source_str =
8569 "(function(arguments,__source__){return eval(__source__);})"; 8570 "(function(arguments,__source__){return eval(__source__);})";
8570 static const int source_str_length = StrLength(source_str); 8571 static const int source_str_length = StrLength(source_str);
8571 Handle<String> function_source = 8572 Handle<String> function_source =
8572 Factory::NewStringFromAscii(Vector<const char>(source_str, 8573 Factory::NewStringFromAscii(Vector<const char>(source_str,
8573 source_str_length)); 8574 source_str_length));
8574 Handle<JSFunction> boilerplate = 8575 Handle<SharedFunctionInfo> shared =
8575 Compiler::CompileEval(function_source, 8576 Compiler::CompileEval(function_source,
8576 context, 8577 context,
8577 context->IsGlobalContext(), 8578 context->IsGlobalContext(),
8578 Compiler::DONT_VALIDATE_JSON); 8579 Compiler::DONT_VALIDATE_JSON);
8579 if (boilerplate.is_null()) return Failure::Exception(); 8580 if (shared.is_null()) return Failure::Exception();
8580 Handle<JSFunction> compiled_function = 8581 Handle<JSFunction> compiled_function =
8581 Factory::NewFunctionFromBoilerplate(boilerplate, context); 8582 Factory::NewFunctionFromSharedFunctionInfo(shared, context);
8582 8583
8583 // Invoke the result of the compilation to get the evaluation function. 8584 // Invoke the result of the compilation to get the evaluation function.
8584 bool has_pending_exception; 8585 bool has_pending_exception;
8585 Handle<Object> receiver(frame->receiver()); 8586 Handle<Object> receiver(frame->receiver());
8586 Handle<Object> evaluation_function = 8587 Handle<Object> evaluation_function =
8587 Execution::Call(compiled_function, receiver, 0, NULL, 8588 Execution::Call(compiled_function, receiver, 0, NULL,
8588 &has_pending_exception); 8589 &has_pending_exception);
8589 if (has_pending_exception) return Failure::Exception(); 8590 if (has_pending_exception) return Failure::Exception();
8590 8591
8591 Handle<Object> arguments = GetArgumentsObject(frame, function, code, &sinfo, 8592 Handle<Object> arguments = GetArgumentsObject(frame, function, code, &sinfo,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
8632 } 8633 }
8633 if (top != NULL) { 8634 if (top != NULL) {
8634 Top::set_context(*top->context()); 8635 Top::set_context(*top->context());
8635 } 8636 }
8636 8637
8637 // Get the global context now set to the top context from before the 8638 // Get the global context now set to the top context from before the
8638 // debugger was invoked. 8639 // debugger was invoked.
8639 Handle<Context> context = Top::global_context(); 8640 Handle<Context> context = Top::global_context();
8640 8641
8641 // Compile the source to be evaluated. 8642 // Compile the source to be evaluated.
8642 Handle<JSFunction> boilerplate = 8643 Handle<SharedFunctionInfo> shared =
8643 Handle<JSFunction>(Compiler::CompileEval(source, 8644 Compiler::CompileEval(source,
8644 context, 8645 context,
8645 true, 8646 true,
8646 Compiler::DONT_VALIDATE_JSON)); 8647 Compiler::DONT_VALIDATE_JSON);
8647 if (boilerplate.is_null()) return Failure::Exception(); 8648 if (shared.is_null()) return Failure::Exception();
8648 Handle<JSFunction> compiled_function = 8649 Handle<JSFunction> compiled_function =
8649 Handle<JSFunction>(Factory::NewFunctionFromBoilerplate(boilerplate, 8650 Handle<JSFunction>(Factory::NewFunctionFromSharedFunctionInfo(shared,
8650 context)); 8651 context));
8651 8652
8652 // Invoke the result of the compilation to get the evaluation function. 8653 // Invoke the result of the compilation to get the evaluation function.
8653 bool has_pending_exception; 8654 bool has_pending_exception;
8654 Handle<Object> receiver = Top::global(); 8655 Handle<Object> receiver = Top::global();
8655 Handle<Object> result = 8656 Handle<Object> result =
8656 Execution::Call(compiled_function, receiver, 0, NULL, 8657 Execution::Call(compiled_function, receiver, 0, NULL,
8657 &has_pending_exception); 8658 &has_pending_exception);
8658 if (has_pending_exception) return Failure::Exception(); 8659 if (has_pending_exception) return Failure::Exception();
8659 return *result; 8660 return *result;
8660 } 8661 }
(...skipping 763 matching lines...) Expand 10 before | Expand all | Expand 10 after
9424 } else { 9425 } else {
9425 // Handle last resort GC and make sure to allow future allocations 9426 // Handle last resort GC and make sure to allow future allocations
9426 // to grow the heap without causing GCs (if possible). 9427 // to grow the heap without causing GCs (if possible).
9427 Counters::gc_last_resort_from_js.Increment(); 9428 Counters::gc_last_resort_from_js.Increment();
9428 Heap::CollectAllGarbage(false); 9429 Heap::CollectAllGarbage(false);
9429 } 9430 }
9430 } 9431 }
9431 9432
9432 9433
9433 } } // namespace v8::internal 9434 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/rewriter.cc ('k') | src/x64/codegen-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698