Home | History | Annotate | Download | only in cctest
      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