1750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Redistribution and use in source and binary forms, with or without
3750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// modification, are permitted provided that the following conditions are
4750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// met:
5750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
6750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions of source code must retain the above copyright
7750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       notice, this list of conditions and the following disclaimer.
8750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions in binary form must reproduce the above
9750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       copyright notice, this list of conditions and the following
10750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       disclaimer in the documentation and/or other materials provided
11750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       with the distribution.
12750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Neither the name of Google Inc. nor the names of its
13750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       contributors may be used to endorse or promote products derived
14750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       from this software without specific prior written permission.
15750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
16750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
28750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org#include <stdlib.h>
29750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
31750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
33750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
34750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgusing namespace v8::internal;
35750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
36750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
37750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass HandleArray : public Malloced {
38750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
39750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static const unsigned kArraySize = 200;
405e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  HandleArray() {}
41e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  ~HandleArray() { Reset(); }
42e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org  void Reset() {
43750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    for (unsigned i = 0; i < kArraySize; i++) {
44750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      if (handles_[i].IsEmpty()) continue;
45f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      handles_[i].Reset();
46750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    }
47750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
48750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Persistent<v8::Value> handles_[kArraySize];
49750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
50750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DISALLOW_COPY_AND_ASSIGN(HandleArray);
51750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
52750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
53750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
54750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// An aligned character array of size 1024.
55750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass AlignedArray : public Malloced {
56750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
57750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static const unsigned kArraySize = 1024/sizeof(uint64_t);
58750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  AlignedArray() { Reset(); }
59750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
60750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void Reset() {
61750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    for (unsigned i = 0; i < kArraySize; i++) {
62750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      data_[i] = 0;
63750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    }
64750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
65750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
66750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  template<typename T>
67750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  T As() { return reinterpret_cast<T>(data_); }
68750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
69750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
70750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  uint64_t data_[kArraySize];
71750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DISALLOW_COPY_AND_ASSIGN(AlignedArray);
72750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
73750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
74750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
75750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass DescriptorTestHelper {
76750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
77750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DescriptorTestHelper() :
78750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      isolate_(NULL), array_(new AlignedArray), handle_array_(new HandleArray) {
79750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    v8::V8::Initialize();
80528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    isolate_ = CcTest::isolate();
81750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
82750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Isolate* isolate_;
83750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // Data objects.
84750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  SmartPointer<AlignedArray> array_;
85750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  SmartPointer<HandleArray> handle_array_;
86750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org private:
87750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DISALLOW_COPY_AND_ASSIGN(DescriptorTestHelper);
88750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
89750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
90750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
91750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic v8::Local<v8::ObjectTemplate> CreateConstructor(
92750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    v8::Handle<v8::Context> context,
93750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    const char* class_name,
94750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    int internal_field,
95750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    const char* descriptor_name = NULL,
96750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    v8::Handle<v8::DeclaredAccessorDescriptor> descriptor =
97750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org        v8::Handle<v8::DeclaredAccessorDescriptor>()) {
984f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  v8::Local<v8::FunctionTemplate> constructor =
994f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      v8::FunctionTemplate::New(context->GetIsolate());
100750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Local<v8::ObjectTemplate> obj_template = constructor->InstanceTemplate();
101750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // Setup object template.
102750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (descriptor_name != NULL && !descriptor.IsEmpty()) {
103750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    bool added_accessor =
1043d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org        obj_template->SetDeclaredAccessor(v8_str(descriptor_name), descriptor);
105750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    CHECK(added_accessor);
106750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
107750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  obj_template->SetInternalFieldCount((internal_field+1)*2 + 7);
108750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  context->Global()->Set(v8_str(class_name), constructor->GetFunction());
109750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return obj_template;
110750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
111750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
112750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
113750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic void VerifyRead(v8::Handle<v8::DeclaredAccessorDescriptor> descriptor,
114750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       int internal_field,
115750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       void* internal_object,
116750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                       v8::Handle<v8::Value> expected_value) {
117750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  LocalContext local_context;
1182bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope scope(local_context->GetIsolate());
119750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::Context> context = local_context.local();
120750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CreateConstructor(context, "Accessible", internal_field, "x", descriptor);
121750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // Setup object.
122750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CompileRun("var accessible = new Accessible();");
123f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(
124f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org      context->Global()->Get(v8_str("accessible")));
125750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  obj->SetAlignedPointerInInternalField(internal_field, internal_object);
126750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  bool added_accessor;
1273d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  added_accessor = obj->SetDeclaredAccessor(v8_str("y"), descriptor);
128750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK(added_accessor);
1293d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  added_accessor = obj->SetDeclaredAccessor(v8_str("13"), descriptor);
130750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK(added_accessor);
131750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // Test access from template getter.
132750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Local<v8::Value> value;
133750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  value = CompileRun("accessible.x;");
134750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK_EQ(expected_value, value);
135750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  value = CompileRun("accessible['x'];");
136750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK_EQ(expected_value, value);
137750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // Test access from object getter.
138750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  value = CompileRun("accessible.y;");
139750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK_EQ(expected_value, value);
140750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  value = CompileRun("accessible['y'];");
141750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK_EQ(expected_value, value);
142750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  value = CompileRun("accessible[13];");
143750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK_EQ(expected_value, value);
144750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  value = CompileRun("accessible['13'];");
145750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  CHECK_EQ(expected_value, value);
146750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
147750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
148750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
149750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic v8::Handle<v8::Value> Convert(int32_t value, v8::Isolate* isolate) {
1500f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  return v8::Integer::New(isolate, value);
151750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
152750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
153750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1540f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.orgstatic v8::Handle<v8::Value> Convert(float value, v8::Isolate* isolate) {
1550f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  return v8::Number::New(isolate, value);
156750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
157750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
158750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1590f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.orgstatic v8::Handle<v8::Value> Convert(double value, v8::Isolate* isolate) {
1600f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  return v8::Number::New(isolate, value);
161750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
162750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
163750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
164750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgtypedef v8::ObjectOperationDescriptor OOD;
165750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
166750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgtemplate<typename T>
167750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic void TestPrimitiveValue(
168750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    T value,
169750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    v8::DeclaredAccessorDescriptorDataType data_type,
170750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    DescriptorTestHelper* helper) {
1712bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope handle_scope(helper->isolate_);
172750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int index = 17;
173750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int internal_field = 6;
174750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::DeclaredAccessorDescriptor> descriptor =
175750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      OOD::NewInternalFieldDereference(helper->isolate_, internal_field)
176750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewRawShift(helper->isolate_, static_cast<uint16_t>(index*sizeof(T)))
177750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewPrimitiveValue(helper->isolate_, data_type, 0);
178750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::Value> expected = Convert(value, helper->isolate_);
179750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  helper->array_->Reset();
180750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  helper->array_->As<T*>()[index] = value;
181afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  VerifyRead(descriptor, internal_field, helper->array_.get(), expected);
182750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
183750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
184750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
185750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgTEST(PrimitiveValueRead) {
186750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DescriptorTestHelper helper;
187750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  TestPrimitiveValue<int32_t>(203, v8::kDescriptorInt32Type, &helper);
188750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  TestPrimitiveValue<float>(23.7f, v8::kDescriptorFloatType, &helper);
189750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  TestPrimitiveValue<double>(23.7, v8::kDescriptorDoubleType, &helper);
190750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
191750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
192750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
193750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgtemplate<typename T>
194750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic void TestBitmaskCompare(T bitmask,
195750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                               T compare_value,
196750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                               DescriptorTestHelper* helper) {
1972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope handle_scope(helper->isolate_);
198750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int index = 13;
199750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int internal_field = 4;
200750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::RawOperationDescriptor> raw_descriptor =
201750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      OOD::NewInternalFieldDereference(helper->isolate_, internal_field)
202750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewRawShift(helper->isolate_, static_cast<uint16_t>(index*sizeof(T)));
203750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::DeclaredAccessorDescriptor> descriptor;
204750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  switch (sizeof(T)) {
205750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    case 1:
206750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      descriptor = raw_descriptor->NewBitmaskCompare8(
207750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org            helper->isolate_,
208750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org            static_cast<uint8_t>(bitmask),
209750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org            static_cast<uint8_t>(compare_value));
210750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      break;
211750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    case 2:
212750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      descriptor = raw_descriptor->NewBitmaskCompare16(
213750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          helper->isolate_,
214750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          static_cast<uint16_t>(bitmask),
215750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          static_cast<uint16_t>(compare_value));
216750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      break;
217750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    case 4:
218750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      descriptor = raw_descriptor->NewBitmaskCompare32(
219750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          helper->isolate_,
220750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          static_cast<uint32_t>(bitmask),
221750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          static_cast<uint32_t>(compare_value));
222750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      break;
223750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    default:
224750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      CHECK(false);
225750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      break;
226750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
227afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  AlignedArray* array = helper->array_.get();
228750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  array->Reset();
229750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  VerifyRead(descriptor, internal_field, array, v8::False(helper->isolate_));
230750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  array->As<T*>()[index] = compare_value;
231750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  VerifyRead(descriptor, internal_field, array, v8::True(helper->isolate_));
232750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  helper->array_->As<T*>()[index] = compare_value & bitmask;
233750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  VerifyRead(descriptor, internal_field, array, v8::True(helper->isolate_));
234750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
235750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
236750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
237750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgTEST(BitmaskCompareRead) {
238750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DescriptorTestHelper helper;
239750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  TestBitmaskCompare<uint8_t>(0xf3, 0xa8, &helper);
240750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  TestBitmaskCompare<uint16_t>(0xfefe, 0x7d42, &helper);
241750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  TestBitmaskCompare<uint32_t>(0xfefeab18, 0x1234fdec, &helper);
242750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
243750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
244750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
245750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgTEST(PointerCompareRead) {
246750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DescriptorTestHelper helper;
2472bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope handle_scope(helper.isolate_);
248750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int index = 35;
249750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int internal_field = 3;
250750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  void* ptr = helper.isolate_;
251750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::DeclaredAccessorDescriptor> descriptor =
252750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      OOD::NewInternalFieldDereference(helper.isolate_, internal_field)
253750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewRawShift(helper.isolate_, static_cast<uint16_t>(index*sizeof(ptr)))
254750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewPointerCompare(helper.isolate_, ptr);
255afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  AlignedArray* array = helper.array_.get();
256750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  VerifyRead(descriptor, internal_field, array, v8::False(helper.isolate_));
257750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  array->As<uintptr_t*>()[index] = reinterpret_cast<uintptr_t>(ptr);
258750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  VerifyRead(descriptor, internal_field, array, v8::True(helper.isolate_));
259750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
260750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
261750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
262750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgTEST(PointerDereferenceRead) {
263750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DescriptorTestHelper helper;
2642bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope handle_scope(helper.isolate_);
265750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int first_index = 13;
266750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int internal_field = 7;
267750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int second_index = 11;
268750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int pointed_to_index = 75;
269750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  uint16_t expected = 0x1425;
270750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::DeclaredAccessorDescriptor> descriptor =
271750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      OOD::NewInternalFieldDereference(helper.isolate_, internal_field)
272750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewRawShift(helper.isolate_, first_index*kPointerSize)
273750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewRawDereference(helper.isolate_)
274750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewRawShift(helper.isolate_,
275750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                    static_cast<uint16_t>(second_index*sizeof(int16_t)))
276750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewPrimitiveValue(helper.isolate_, v8::kDescriptorInt16Type, 0);
277afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  AlignedArray* array = helper.array_.get();
278750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  array->As<uintptr_t**>()[first_index] =
279750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      &array->As<uintptr_t*>()[pointed_to_index];
2800f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  VerifyRead(descriptor, internal_field, array,
2810f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org             v8::Integer::New(helper.isolate_, 0));
282750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  second_index += pointed_to_index*sizeof(uintptr_t)/sizeof(uint16_t);
283750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  array->As<uint16_t*>()[second_index] = expected;
2840f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  VerifyRead(descriptor, internal_field, array,
2850f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org             v8::Integer::New(helper.isolate_, expected));
286750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
287750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
288750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
289750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgTEST(HandleDereferenceRead) {
290750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DescriptorTestHelper helper;
2912bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  v8::HandleScope handle_scope(helper.isolate_);
292750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int index = 13;
293750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  int internal_field = 0;
294750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::DeclaredAccessorDescriptor> descriptor =
295750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      OOD::NewInternalFieldDereference(helper.isolate_, internal_field)
296750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewRawShift(helper.isolate_, index*kPointerSize)
297750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      ->NewHandleDereference(helper.isolate_);
298afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  HandleArray* array = helper.handle_array_.get();
299750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  v8::Handle<v8::String> expected = v8_str("whatever");
300c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  array->handles_[index].Reset(helper.isolate_, expected);
301750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  VerifyRead(descriptor, internal_field, array, expected);
302750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
303