• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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