1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <stdlib.h> 6 7 #include "include/v8-experimental.h" 8 #include "src/v8.h" 9 #include "test/cctest/cctest.h" 10 11 namespace { 12 13 14 static void SlowCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { 15 info.GetReturnValue().Set(41); 16 } 17 18 19 TEST(CompatibleReceiverBuiltin) { 20 // Check that the HandleFastApiCall builtin visits the hidden prototypes 21 // during the compatible receiver check. 22 LocalContext context; 23 v8::Isolate* isolate = context->GetIsolate(); 24 v8::HandleScope handle_scope(isolate); 25 v8::Local<v8::Context> current_context = isolate->GetCurrentContext(); 26 27 v8::Local<v8::FunctionTemplate> constructor_template = 28 v8::FunctionTemplate::New(isolate); 29 v8::Local<v8::FunctionTemplate> prototype_template = 30 v8::FunctionTemplate::New(isolate); 31 prototype_template->SetHiddenPrototype(true); 32 33 v8::Local<v8::ObjectTemplate> proto_instance_template = 34 prototype_template->InstanceTemplate(); 35 36 v8::experimental::FastAccessorBuilder* fast_accessor_builder = 37 v8::experimental::FastAccessorBuilder::New(isolate); 38 fast_accessor_builder->ReturnValue( 39 fast_accessor_builder->IntegerConstant(42)); 40 v8::Local<v8::FunctionTemplate> accessor_template = 41 v8::FunctionTemplate::NewWithFastHandler( 42 isolate, SlowCallback, fast_accessor_builder, v8::Local<v8::Value>(), 43 v8::Signature::New(isolate, prototype_template)); 44 45 proto_instance_template->SetAccessorProperty( 46 v8_str("bar"), accessor_template, v8::Local<v8::FunctionTemplate>(), 47 v8::ReadOnly); 48 49 v8::Local<v8::Object> object = 50 constructor_template->GetFunction(current_context) 51 .ToLocalChecked() 52 ->NewInstance(current_context) 53 .ToLocalChecked(); 54 55 v8::Local<v8::Object> hidden_prototype = 56 prototype_template->GetFunction(current_context) 57 .ToLocalChecked() 58 ->NewInstance(current_context) 59 .ToLocalChecked(); 60 61 CHECK(object->SetPrototype(current_context, hidden_prototype).FromJust()); 62 63 context->Global() 64 ->Set(current_context, v8_str("object"), object) 65 .FromMaybe(false); 66 67 CHECK_EQ(42, CompileRun("var getter = object.__lookupGetter__('bar');" 68 "getter.call(object)") 69 ->Int32Value(current_context) 70 .FromJust()); 71 } 72 73 } // namespace 74