1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ark_native_typed_array.h"
17
ArkNativeTypedArray(ArkNativeEngine * engine,Local<JSValueRef> value)18 ArkNativeTypedArray::ArkNativeTypedArray(ArkNativeEngine* engine, Local<JSValueRef> value)
19 : ArkNativeObject(engine, value)
20 {
21 }
22
ArkNativeTypedArray(ArkNativeEngine * engine,NativeTypedArrayType type,NativeValue * value,size_t length,size_t offset)23 ArkNativeTypedArray::ArkNativeTypedArray(ArkNativeEngine* engine,
24 NativeTypedArrayType type,
25 NativeValue* value,
26 size_t length,
27 size_t offset)
28 : ArkNativeTypedArray(engine, JSValueRef::Undefined(engine->GetEcmaVm()))
29 {
30 auto vm = engine_->GetEcmaVm();
31 LocalScope scope(vm);
32
33 Global<JSValueRef> globalValue = *value;
34 Local<JSValueRef> localValue = globalValue.ToLocal(vm);
35 Local<ArrayBufferRef> buffer(localValue);
36
37 Local<TypedArrayRef> typedArray(JSValueRef::Undefined(vm));
38 switch (type) {
39 case NATIVE_INT8_ARRAY:
40 typedArray = panda::Int8ArrayRef::New(vm, buffer, offset, length);
41 break;
42 case NATIVE_UINT8_ARRAY:
43 typedArray = panda::Uint8ArrayRef::New(vm, buffer, offset, length);
44 break;
45 case NATIVE_UINT8_CLAMPED_ARRAY:
46 typedArray = panda::Uint8ClampedArrayRef::New(vm, buffer, offset, length);
47 break;
48 case NATIVE_INT16_ARRAY:
49 typedArray = panda::Int16ArrayRef::New(vm, buffer, offset, length);
50 break;
51 case NATIVE_UINT16_ARRAY:
52 typedArray = panda::Uint16ArrayRef::New(vm, buffer, offset, length);
53 break;
54 case NATIVE_INT32_ARRAY:
55 typedArray = panda::Int32ArrayRef::New(vm, buffer, offset, length);
56 break;
57 case NATIVE_UINT32_ARRAY:
58 typedArray = panda::Uint32ArrayRef::New(vm, buffer, offset, length);
59 break;
60 case NATIVE_FLOAT32_ARRAY:
61 typedArray = panda::Float32ArrayRef::New(vm, buffer, offset, length);
62 break;
63 case NATIVE_FLOAT64_ARRAY:
64 typedArray = panda::Float64ArrayRef::New(vm, buffer, offset, length);
65 break;
66 case NATIVE_BIGINT64_ARRAY:
67 typedArray = panda::BigInt64ArrayRef::New(vm, buffer, offset, length);
68 break;
69 case NATIVE_BIGUINT64_ARRAY:
70 typedArray = panda::BigUint64ArrayRef::New(vm, buffer, offset, length);
71 break;
72 default:;
73 }
74 Global<JSValueRef> globalTypedArray(vm, typedArray);
75 value_ = globalTypedArray;
76 }
77
~ArkNativeTypedArray()78 ArkNativeTypedArray::~ArkNativeTypedArray() {}
79
GetInterface(int interfaceId)80 void* ArkNativeTypedArray::GetInterface(int interfaceId)
81 {
82 return (NativeTypedArray::INTERFACE_ID == interfaceId) ? (NativeTypedArray*)this
83 : ArkNativeObject::GetInterface(interfaceId);
84 }
85
GetTypedArrayType()86 NativeTypedArrayType ArkNativeTypedArray::GetTypedArrayType()
87 {
88 Global<TypedArrayRef> value = value_;
89 NativeTypedArrayType type = NATIVE_INT8_ARRAY;
90 if (value->IsInt8Array()) {
91 type = NATIVE_INT8_ARRAY;
92 } else if (value->IsUint8Array()) {
93 type = NATIVE_UINT8_ARRAY;
94 } else if (value->IsUint8ClampedArray()) {
95 type = NATIVE_UINT8_CLAMPED_ARRAY;
96 } else if (value->IsInt16Array()) {
97 type = NATIVE_INT16_ARRAY;
98 } else if (value->IsUint16Array()) {
99 type = NATIVE_UINT16_ARRAY;
100 } else if (value->IsInt32Array()) {
101 type = NATIVE_INT32_ARRAY;
102 } else if (value->IsUint32Array()) {
103 type = NATIVE_UINT32_ARRAY;
104 } else if (value->IsFloat32Array()) {
105 type = NATIVE_FLOAT32_ARRAY;
106 } else if (value->IsFloat64Array()) {
107 type = NATIVE_FLOAT64_ARRAY;
108 } else if (value->IsBigInt64Array()) {
109 type = NATIVE_BIGINT64_ARRAY;
110 } else if (value->IsBigUint64Array()) {
111 type = NATIVE_BIGUINT64_ARRAY;
112 }
113 return type;
114 }
115
GetLength()116 size_t ArkNativeTypedArray::GetLength()
117 {
118 auto vm = engine_->GetEcmaVm();
119 LocalScope scope(vm);
120 Global<TypedArrayRef> value = value_;
121
122 return value->ByteLength(vm);
123 }
124
GetArrayBuffer()125 NativeValue* ArkNativeTypedArray::GetArrayBuffer()
126 {
127 auto vm = engine_->GetEcmaVm();
128 LocalScope scope(vm);
129 Global<TypedArrayRef> value = value_;
130
131 return ArkNativeEngine::ArkValueToNativeValue(engine_, value->GetArrayBuffer(vm));
132 }
133
GetData()134 void* ArkNativeTypedArray::GetData()
135 {
136 auto vm = engine_->GetEcmaVm();
137 LocalScope scope(vm);
138 Global<TypedArrayRef> value = value_;
139
140 return value->GetArrayBuffer(vm)->GetBuffer();
141 }
142
GetOffset()143 size_t ArkNativeTypedArray::GetOffset()
144 {
145 auto vm = engine_->GetEcmaVm();
146 LocalScope scope(vm);
147 Global<TypedArrayRef> value = value_;
148
149 return value->ByteOffset(vm);
150 }
151