1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "JSDataView.h" 28 29#include "ArrayBufferView.h" 30#include "DataView.h" 31#include "Error.h" 32#include "JSCInlines.h" 33 34namespace JSC { 35 36const ClassInfo JSDataView::s_info = { 37 "DataView", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSDataView)}; 38 39JSDataView::JSDataView(VM& vm, ConstructionContext& context, ArrayBuffer* buffer) 40 : Base(vm, context) 41 , m_buffer(buffer) 42{ 43} 44 45JSDataView* JSDataView::create( 46 ExecState* exec, Structure* structure, PassRefPtr<ArrayBuffer> passedBuffer, 47 unsigned byteOffset, unsigned byteLength) 48{ 49 RefPtr<ArrayBuffer> buffer = passedBuffer; 50 if (!ArrayBufferView::verifySubRange<uint8_t>(buffer, byteOffset, byteLength)) { 51 throwVMError( 52 exec, createRangeError(exec, "Byte offset and length out of range of buffer")); 53 return 0; 54 } 55 VM& vm = exec->vm(); 56 ConstructionContext context( 57 structure, buffer, byteOffset, byteLength, ConstructionContext::DataView); 58 ASSERT(context); 59 JSDataView* result = 60 new (NotNull, allocateCell<JSDataView>(vm.heap)) JSDataView(vm, context, buffer.get()); 61 result->finishCreation(vm); 62 return result; 63} 64 65JSDataView* JSDataView::createUninitialized(ExecState*, Structure*, unsigned) 66{ 67 UNREACHABLE_FOR_PLATFORM(); 68 return 0; 69} 70 71JSDataView* JSDataView::create(ExecState*, Structure*, unsigned) 72{ 73 UNREACHABLE_FOR_PLATFORM(); 74 return 0; 75} 76 77bool JSDataView::set(ExecState*, JSObject*, unsigned, unsigned) 78{ 79 UNREACHABLE_FOR_PLATFORM(); 80 return false; 81} 82 83PassRefPtr<DataView> JSDataView::typedImpl() 84{ 85 return DataView::create(buffer(), byteOffset(), length()); 86} 87 88bool JSDataView::getOwnPropertySlot( 89 JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot) 90{ 91 JSDataView* thisObject = jsCast<JSDataView*>(object); 92 if (propertyName == exec->propertyNames().byteLength) { 93 slot.setValue(thisObject, DontEnum | ReadOnly, jsNumber(thisObject->m_length)); 94 return true; 95 } 96 97 return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot); 98} 99 100ArrayBuffer* JSDataView::slowDownAndWasteMemory(JSArrayBufferView*) 101{ 102 UNREACHABLE_FOR_PLATFORM(); 103 return 0; 104} 105 106PassRefPtr<ArrayBufferView> JSDataView::getTypedArrayImpl(JSArrayBufferView* object) 107{ 108 JSDataView* thisObject = jsCast<JSDataView*>(object); 109 return thisObject->typedImpl(); 110} 111 112Structure* JSDataView::createStructure( 113 VM& vm, JSGlobalObject* globalObject, JSValue prototype) 114{ 115 return Structure::create( 116 vm, globalObject, prototype, TypeInfo(DataViewType, StructureFlags), info(), 117 NonArray); 118} 119 120} // namespace JSC 121 122