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

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

Issue 11642003: Create and cache method extraction stub in the ICData. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: ready for review. Created 8 years 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
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 3211 matching lines...) Expand 10 before | Expand all | Expand 10 after
3222 if (IsClosureFunction()) { 3222 if (IsClosureFunction()) {
3223 const Object& obj = Object::Handle(raw_ptr()->data_); 3223 const Object& obj = Object::Handle(raw_ptr()->data_);
3224 ASSERT(!obj.IsNull()); 3224 ASSERT(!obj.IsNull());
3225 ClosureData::Cast(obj).set_closure_allocation_stub(value); 3225 ClosureData::Cast(obj).set_closure_allocation_stub(value);
3226 return; 3226 return;
3227 } 3227 }
3228 UNREACHABLE(); 3228 UNREACHABLE();
3229 } 3229 }
3230 3230
3231 3231
3232 RawFunction* Function::method_extractor() const {
3233 ASSERT(IsImplicitClosureFunction());
3234 const Object& obj = Object::Handle(raw_ptr()->data_);
3235 ASSERT(!obj.IsNull());
3236 return ClosureData::Cast(obj).method_extractor();
3237 }
3238
3239
3240 void Function::set_method_extractor(const Function& value) const {
3241 ASSERT(IsImplicitClosureFunction());
3242 const Object& obj = Object::Handle(raw_ptr()->data_);
3243 ASSERT(!obj.IsNull());
3244 ClosureData::Cast(obj).set_method_extractor(value);
3245 }
3246
3247
3248 RawFunction* Function::extracted_method_closure() const {
3249 ASSERT(kind() == RawFunction::kMethodExtractor);
3250 const Object& obj = Object::Handle(raw_ptr()->data_);
3251 ASSERT(obj.IsFunction());
3252 return Function::Cast(obj).raw();
3253 }
3254
3255
3256 void Function::set_extracted_method_closure(const Function& value) const {
3257 ASSERT(kind() == RawFunction::kMethodExtractor);
3258 ASSERT(raw_ptr()->data_ == Object::null());
3259 set_data(value);
3260 }
3261
3262
3232 RawFunction* Function::parent_function() const { 3263 RawFunction* Function::parent_function() const {
3233 if (IsClosureFunction()) { 3264 if (IsClosureFunction()) {
3234 const Object& obj = Object::Handle(raw_ptr()->data_); 3265 const Object& obj = Object::Handle(raw_ptr()->data_);
3235 ASSERT(!obj.IsNull()); 3266 ASSERT(!obj.IsNull());
3236 return ClosureData::Cast(obj).parent_function(); 3267 return ClosureData::Cast(obj).parent_function();
3237 } 3268 }
3238 return Function::null(); 3269 return Function::null();
3239 } 3270 }
3240 3271
3241 3272
(...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after
4326 break; 4357 break;
4327 case RawFunction::kImplicitGetter: 4358 case RawFunction::kImplicitGetter:
4328 kind_str = " getter"; 4359 kind_str = " getter";
4329 break; 4360 break;
4330 case RawFunction::kImplicitSetter: 4361 case RawFunction::kImplicitSetter:
4331 kind_str = " setter"; 4362 kind_str = " setter";
4332 break; 4363 break;
4333 case RawFunction::kConstImplicitGetter: 4364 case RawFunction::kConstImplicitGetter:
4334 kind_str = " const-getter"; 4365 kind_str = " const-getter";
4335 break; 4366 break;
4367 case RawFunction::kMethodExtractor:
4368 kind_str = " method-extractor";
4369 break;
4336 default: 4370 default:
4337 UNREACHABLE(); 4371 UNREACHABLE();
4338 } 4372 }
4339 const char* kFormat = "Function '%s':%s%s%s%s."; 4373 const char* kFormat = "Function '%s':%s%s%s%s.";
4340 const char* function_name = String::Handle(name()).ToCString(); 4374 const char* function_name = String::Handle(name()).ToCString();
4341 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, 4375 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name,
4342 static_str, abstract_str, kind_str, const_str) + 1; 4376 static_str, abstract_str, kind_str, const_str) + 1;
4343 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 4377 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
4344 OS::SNPrint(chars, len, kFormat, function_name, 4378 OS::SNPrint(chars, len, kFormat, function_name,
4345 static_str, abstract_str, kind_str, const_str); 4379 static_str, abstract_str, kind_str, const_str);
(...skipping 13 matching lines...) Expand all
4359 } 4393 }
4360 4394
4361 4395
4362 void ClosureData::set_closure_allocation_stub(const Code& value) const { 4396 void ClosureData::set_closure_allocation_stub(const Code& value) const {
4363 ASSERT(!value.IsNull()); 4397 ASSERT(!value.IsNull());
4364 ASSERT(raw_ptr()->closure_allocation_stub_ == Code::null()); 4398 ASSERT(raw_ptr()->closure_allocation_stub_ == Code::null());
4365 StorePointer(&raw_ptr()->closure_allocation_stub_, value.raw()); 4399 StorePointer(&raw_ptr()->closure_allocation_stub_, value.raw());
4366 } 4400 }
4367 4401
4368 4402
4403 void ClosureData::set_method_extractor(const Function& value) const {
4404 ASSERT(!value.IsNull());
4405 ASSERT(raw_ptr()->method_extractor_ == Function::null());
4406 StorePointer(&raw_ptr()->method_extractor_, value.raw());
4407 }
4408
4409
4369 void ClosureData::set_parent_function(const Function& value) const { 4410 void ClosureData::set_parent_function(const Function& value) const {
4370 StorePointer(&raw_ptr()->parent_function_, value.raw()); 4411 StorePointer(&raw_ptr()->parent_function_, value.raw());
4371 } 4412 }
4372 4413
4373 4414
4374 void ClosureData::set_signature_class(const Class& value) const { 4415 void ClosureData::set_signature_class(const Class& value) const {
4375 StorePointer(&raw_ptr()->signature_class_, value.raw()); 4416 StorePointer(&raw_ptr()->signature_class_, value.raw());
4376 } 4417 }
4377 4418
4378 4419
(...skipping 8104 matching lines...) Expand 10 before | Expand all | Expand 10 after
12483 } 12524 }
12484 return result.raw(); 12525 return result.raw();
12485 } 12526 }
12486 12527
12487 12528
12488 const char* WeakProperty::ToCString() const { 12529 const char* WeakProperty::ToCString() const {
12489 return "_WeakProperty"; 12530 return "_WeakProperty";
12490 } 12531 }
12491 12532
12492 } // namespace dart 12533 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698