forked from Samsung/escargot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDataViewObject.h
More file actions
101 lines (83 loc) · 3.99 KB
/
DataViewObject.h
File metadata and controls
101 lines (83 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
* Copyright (c) 2017-present Samsung Electronics Co., Ltd
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#ifndef __EscargotDataViewObject__
#define __EscargotDataViewObject__
#include "runtime/Object.h"
#include "runtime/ErrorObject.h"
#include "runtime/ArrayBufferObject.h"
#include "runtime/TypedArrayInlines.h"
namespace Escargot {
class DataViewObject : public ArrayBufferView {
public:
explicit DataViewObject(ExecutionState& state)
: ArrayBufferView(state, state.context()->globalObject()->dataViewPrototype())
{
}
explicit DataViewObject(ExecutionState& state, Object* proto)
: ArrayBufferView(state, proto)
{
}
virtual bool isDataViewObject() const
{
return true;
}
// https://www.ecma-international.org/ecma-262/#sec-getviewvalue
Value getViewValue(ExecutionState& state, Value index, Value _isLittleEndian, TypedArrayType type)
{
double numberIndex = index.toIndex(state);
if (numberIndex == Value::InvalidIndexValue) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().DataView.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_InvalidArrayBufferOffset);
}
bool isLittleEndian = _isLittleEndian.toBoolean(state);
ArrayBuffer* buffer = this->buffer();
buffer->throwTypeErrorIfDetached(state);
size_t viewOffset = byteOffset();
size_t viewSize = byteLength();
size_t elementSize = TypedArrayHelper::elementSize(type);
if (numberIndex + elementSize > viewSize) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().DataView.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_RangeError);
}
size_t bufferIndex = numberIndex + viewOffset;
return buffer->getValueFromBuffer(state, bufferIndex, type, isLittleEndian);
}
// https://www.ecma-international.org/ecma-262/#sec-setviewvalue
Value setViewValue(ExecutionState& state, Value index, Value _isLittleEndian, TypedArrayType type, Value val)
{
double numberIndex = index.toIndex(state);
if (numberIndex == Value::InvalidIndexValue) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().DataView.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_InvalidArrayBufferOffset);
}
auto numericValue = val.toNumeric(state);
UNUSED_VARIABLE(numericValue);
bool isLittleEndian = _isLittleEndian.toBoolean(state);
ArrayBuffer* buffer = this->buffer();
buffer->throwTypeErrorIfDetached(state);
size_t viewOffset = byteOffset();
size_t viewSize = byteLength();
size_t elementSize = TypedArrayHelper::elementSize(type);
if (numberIndex + elementSize > viewSize) {
ErrorObject::throwBuiltinError(state, ErrorObject::RangeError, state.context()->staticStrings().DataView.string(), false, String::emptyString, ErrorObject::Messages::GlobalObject_RangeError);
}
size_t bufferIndex = numberIndex + viewOffset;
buffer->setValueInBuffer(state, bufferIndex, type, val, isLittleEndian);
return Value();
}
};
} // namespace Escargot
#endif