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