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

Side by Side Diff: runtime/vm/object.cc

Issue 8234016: Inline allocation of implicit closures. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years, 2 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 | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('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 (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/assert.h" 8 #include "vm/assert.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 2319 matching lines...) Expand 10 before | Expand all | Expand 10 after
2330 2330
2331 bool Function::IsInFactoryScope() const { 2331 bool Function::IsInFactoryScope() const {
2332 Function& outer_function = Function::Handle(raw()); 2332 Function& outer_function = Function::Handle(raw());
2333 while (outer_function.IsLocalFunction()) { 2333 while (outer_function.IsLocalFunction()) {
2334 outer_function = outer_function.parent_function(); 2334 outer_function = outer_function.parent_function();
2335 } 2335 }
2336 return outer_function.IsFactory(); 2336 return outer_function.IsFactory();
2337 } 2337 }
2338 2338
2339 2339
2340 bool Function::IsInStaticScope() const {
2341 Function& outer_function = Function::Handle(raw());
2342 while (outer_function.IsLocalFunction()) {
2343 outer_function = outer_function.parent_function();
2344 }
2345 return outer_function.is_static();
2346 }
2347
2348
2349 void Function::set_name(const String& value) const { 2340 void Function::set_name(const String& value) const {
2350 ASSERT(value.IsSymbol()); 2341 ASSERT(value.IsSymbol());
2351 StorePointer(&raw_ptr()->name_, value.raw()); 2342 StorePointer(&raw_ptr()->name_, value.raw());
2352 } 2343 }
2353 2344
2354 2345
2355 void Function::set_owner(const Class& value) const { 2346 void Function::set_owner(const Class& value) const {
2356 ASSERT(!value.IsNull()); 2347 ASSERT(!value.IsNull());
2357 StorePointer(&raw_ptr()->owner_, value.raw()); 2348 StorePointer(&raw_ptr()->owner_, value.raw());
2358 } 2349 }
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
2710 } 2701 }
2711 } 2702 }
2712 if (!found_param_name) { 2703 if (!found_param_name) {
2713 return false; 2704 return false;
2714 } 2705 }
2715 } 2706 }
2716 return true; 2707 return true;
2717 } 2708 }
2718 2709
2719 2710
2711 bool Function::IsImplicitClosureFunction() const {
2712 if (!IsClosureFunction()) {
2713 return false;
2714 }
2715 const Function& parent = Function::Handle(parent_function());
2716 return parent.raw_ptr()->implicit_closure_function_ == raw();
2717 }
2718
2719
2720 RawFunction* Function::New() { 2720 RawFunction* Function::New() {
2721 const Class& function_class = Class::Handle(Object::function_class()); 2721 const Class& function_class = Class::Handle(Object::function_class());
2722 RawObject* raw = Object::Allocate(function_class, 2722 RawObject* raw = Object::Allocate(function_class,
2723 Function::InstanceSize(), 2723 Function::InstanceSize(),
2724 Heap::kOld); 2724 Heap::kOld);
2725 return reinterpret_cast<RawFunction*>(raw); 2725 return reinterpret_cast<RawFunction*>(raw);
2726 } 2726 }
2727 2727
2728 2728
2729 RawFunction* Function::New(const String& name, 2729 RawFunction* Function::New(const String& name,
(...skipping 20 matching lines...) Expand all
2750 2750
2751 RawFunction* Function::NewClosureFunction(const String& name, 2751 RawFunction* Function::NewClosureFunction(const String& name,
2752 const Function& parent, 2752 const Function& parent,
2753 intptr_t token_index) { 2753 intptr_t token_index) {
2754 ASSERT(!parent.IsNull()); 2754 ASSERT(!parent.IsNull());
2755 const Class& parent_class = Class::Handle(parent.owner()); 2755 const Class& parent_class = Class::Handle(parent.owner());
2756 ASSERT(!parent_class.IsNull()); 2756 ASSERT(!parent_class.IsNull());
2757 const Function& result = Function::Handle( 2757 const Function& result = Function::Handle(
2758 Function::New(name, 2758 Function::New(name,
2759 RawFunction::kClosureFunction, 2759 RawFunction::kClosureFunction,
2760 /* is_static = */ true, 2760 /* is_static = */ parent.is_static(),
2761 /* is_const = */ false, 2761 /* is_const = */ false,
2762 token_index)); 2762 token_index));
2763 result.set_parent_function(parent); 2763 result.set_parent_function(parent);
2764 result.set_owner(parent_class); 2764 result.set_owner(parent_class);
2765 return result.raw(); 2765 return result.raw();
2766 } 2766 }
2767 2767
2768 2768
2769 RawFunction* Function::ImplicitClosureFunction() const { 2769 RawFunction* Function::ImplicitClosureFunction() const {
2770 // Return the existing implicit closure function if any. 2770 // Return the existing implicit closure function if any.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2823 signature_class = Class::NewSignatureClass(signature, 2823 signature_class = Class::NewSignatureClass(signature,
2824 closure_function, 2824 closure_function,
2825 script, 2825 script,
2826 token_index()); 2826 token_index());
2827 library.AddClass(signature_class); 2827 library.AddClass(signature_class);
2828 } 2828 }
2829 ASSERT(!Function::Handle(signature_class.signature_function()).IsNull()); 2829 ASSERT(!Function::Handle(signature_class.signature_function()).IsNull());
2830 ASSERT(Class::Handle(closure_function.signature_class()).IsNull()); 2830 ASSERT(Class::Handle(closure_function.signature_class()).IsNull());
2831 closure_function.set_signature_class(signature_class); 2831 closure_function.set_signature_class(signature_class);
2832 set_implicit_closure_function(closure_function); 2832 set_implicit_closure_function(closure_function);
2833 ASSERT(closure_function.IsImplicitClosureFunction());
2833 return closure_function.raw(); 2834 return closure_function.raw();
2834 } 2835 }
2835 2836
2836 2837
2837 template<typename T> 2838 template<typename T>
2838 static RawArray* NewArray(const GrowableArray<T*>& objs) { 2839 static RawArray* NewArray(const GrowableArray<T*>& objs) {
2839 Array& a = Array::Handle(Array::New(objs.length(), Heap::kOld)); 2840 Array& a = Array::Handle(Array::New(objs.length(), Heap::kOld));
2840 for (int i = 0; i < objs.length(); i++) { 2841 for (int i = 0; i < objs.length(); i++) {
2841 a.SetAt(i, *objs[i]); 2842 a.SetAt(i, *objs[i]);
2842 } 2843 }
(...skipping 3441 matching lines...) Expand 10 before | Expand all | Expand 10 after
6284 const String& str = String::Handle(pattern()); 6285 const String& str = String::Handle(pattern());
6285 const char* format = "JSRegExp: pattern=%s flags=%s"; 6286 const char* format = "JSRegExp: pattern=%s flags=%s";
6286 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 6287 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
6287 char* chars = reinterpret_cast<char*>( 6288 char* chars = reinterpret_cast<char*>(
6288 Isolate::Current()->current_zone()->Allocate(len + 1)); 6289 Isolate::Current()->current_zone()->Allocate(len + 1));
6289 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 6290 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
6290 return chars; 6291 return chars;
6291 } 6292 }
6292 6293
6293 } // namespace dart 6294 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698