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

Side by Side Diff: src/api.cc

Issue 1542963002: [runtime] Introduce dedicated JSBoundFunction to represent bound functions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@FunctionConstructor
Patch Set: [arm64] Poke does not preserve flags with --debug-code. Created 4 years, 11 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
« no previous file with comments | « src/accessors.cc ('k') | src/api-natives.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 4394 matching lines...) Expand 10 before | Expand all | Expand 10 after
4405 void Function::SetName(v8::Local<v8::String> name) { 4405 void Function::SetName(v8::Local<v8::String> name) {
4406 auto self = Utils::OpenHandle(this); 4406 auto self = Utils::OpenHandle(this);
4407 if (!self->IsJSFunction()) return; 4407 if (!self->IsJSFunction()) return;
4408 auto func = i::Handle<i::JSFunction>::cast(self); 4408 auto func = i::Handle<i::JSFunction>::cast(self);
4409 func->shared()->set_name(*Utils::OpenHandle(*name)); 4409 func->shared()->set_name(*Utils::OpenHandle(*name));
4410 } 4410 }
4411 4411
4412 4412
4413 Local<Value> Function::GetName() const { 4413 Local<Value> Function::GetName() const {
4414 auto self = Utils::OpenHandle(this); 4414 auto self = Utils::OpenHandle(this);
4415 if (!self->IsJSFunction()) { 4415 if (self->IsJSBoundFunction()) {
4416 return ToApiHandle<Primitive>( 4416 auto func = i::Handle<i::JSBoundFunction>::cast(self);
4417 self->GetIsolate()->factory()->undefined_value()); 4417 return Utils::ToLocal(handle(func->name(), func->GetIsolate()));
4418 } 4418 }
4419 auto func = i::Handle<i::JSFunction>::cast(self); 4419 if (self->IsJSFunction()) {
4420 return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name(), 4420 auto func = i::Handle<i::JSFunction>::cast(self);
4421 func->GetIsolate())); 4421 return Utils::ToLocal(handle(func->shared()->name(), func->GetIsolate()));
4422 }
4423 return ToApiHandle<Primitive>(
4424 self->GetIsolate()->factory()->undefined_value());
4422 } 4425 }
4423 4426
4424 4427
4425 Local<Value> Function::GetInferredName() const { 4428 Local<Value> Function::GetInferredName() const {
4426 auto self = Utils::OpenHandle(this); 4429 auto self = Utils::OpenHandle(this);
4427 if (!self->IsJSFunction()) { 4430 if (!self->IsJSFunction()) {
4428 return ToApiHandle<Primitive>( 4431 return ToApiHandle<Primitive>(
4429 self->GetIsolate()->factory()->undefined_value()); 4432 self->GetIsolate()->factory()->undefined_value());
4430 } 4433 }
4431 auto func = i::Handle<i::JSFunction>::cast(self); 4434 auto func = i::Handle<i::JSFunction>::cast(self);
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
4530 if (!func->shared()->script()->IsScript()) { 4533 if (!func->shared()->script()->IsScript()) {
4531 return v8::UnboundScript::kNoScriptId; 4534 return v8::UnboundScript::kNoScriptId;
4532 } 4535 }
4533 i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); 4536 i::Handle<i::Script> script(i::Script::cast(func->shared()->script()));
4534 return script->id(); 4537 return script->id();
4535 } 4538 }
4536 4539
4537 4540
4538 Local<v8::Value> Function::GetBoundFunction() const { 4541 Local<v8::Value> Function::GetBoundFunction() const {
4539 auto self = Utils::OpenHandle(this); 4542 auto self = Utils::OpenHandle(this);
4540 if (!self->IsJSFunction()) { 4543 if (self->IsJSBoundFunction()) {
4541 return v8::Undefined(reinterpret_cast<v8::Isolate*>(self->GetIsolate())); 4544 auto bound_function = i::Handle<i::JSBoundFunction>::cast(self);
4545 auto bound_target_function = i::handle(
4546 bound_function->bound_target_function(), bound_function->GetIsolate());
4547 return Utils::CallableToLocal(bound_target_function);
4542 } 4548 }
4543 auto func = i::Handle<i::JSFunction>::cast(self); 4549 return v8::Undefined(reinterpret_cast<v8::Isolate*>(self->GetIsolate()));
4544 if (!func->shared()->bound()) {
4545 return v8::Undefined(reinterpret_cast<v8::Isolate*>(func->GetIsolate()));
4546 }
4547 i::Handle<i::BindingsArray> bound_args = i::Handle<i::BindingsArray>(
4548 i::BindingsArray::cast(func->function_bindings()));
4549 i::Handle<i::Object> original(bound_args->bound_function(),
4550 func->GetIsolate());
4551 return Utils::CallableToLocal(i::Handle<i::JSFunction>::cast(original));
4552 } 4550 }
4553 4551
4554 4552
4555 int Name::GetIdentityHash() { 4553 int Name::GetIdentityHash() {
4556 auto self = Utils::OpenHandle(this); 4554 auto self = Utils::OpenHandle(this);
4557 return static_cast<int>(self->Hash()); 4555 return static_cast<int>(self->Hash());
4558 } 4556 }
4559 4557
4560 4558
4561 int String::Length() const { 4559 int String::Length() const {
(...skipping 3977 matching lines...) Expand 10 before | Expand all | Expand 10 after
8539 Address callback_address = 8537 Address callback_address =
8540 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8538 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8541 VMState<EXTERNAL> state(isolate); 8539 VMState<EXTERNAL> state(isolate);
8542 ExternalCallbackScope call_scope(isolate, callback_address); 8540 ExternalCallbackScope call_scope(isolate, callback_address);
8543 callback(info); 8541 callback(info);
8544 } 8542 }
8545 8543
8546 8544
8547 } // namespace internal 8545 } // namespace internal
8548 } // namespace v8 8546 } // namespace v8
OLDNEW
« no previous file with comments | « src/accessors.cc ('k') | src/api-natives.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698