* Creaye return value of the packed func. The value us auto-tracked for dispose. * @param resultAnyPtr The location of rvalue * @param callbackArg Whether it is being used in callbackArg. * @returns The JS value.
(resultAnyPtr: Pointer, callbackArg: boolean)
| 2245 | * @returns The JS value. |
| 2246 | */ |
| 2247 | private retValueToJS(resultAnyPtr: Pointer, callbackArg: boolean): any { |
| 2248 | const typeIndex = this.memory.loadI32(resultAnyPtr); |
| 2249 | const valuePtr = resultAnyPtr + SizeOf.I32 * 2; |
| 2250 | switch (typeIndex) { |
| 2251 | case TypeIndex.kTVMFFINone: return undefined; |
| 2252 | case TypeIndex.kTVMFFIBool: |
| 2253 | return this.memory.loadI64(valuePtr) != 0; |
| 2254 | case TypeIndex.kTVMFFIInt: |
| 2255 | return this.memory.loadI64(valuePtr); |
| 2256 | case TypeIndex.kTVMFFIFloat: |
| 2257 | return this.memory.loadF64(valuePtr); |
| 2258 | case TypeIndex.kTVMFFIOpaquePtr: { |
| 2259 | return this.memory.loadPointer(valuePtr); |
| 2260 | } |
| 2261 | case TypeIndex.kTVMFFITensor: { |
| 2262 | return this.ctx.attachToCurrentScope( |
| 2263 | new Tensor(this.memory.loadPointer(valuePtr), this.lib, this.ctx, false) |
| 2264 | ); |
| 2265 | } |
| 2266 | case TypeIndex.kTVMFFIDLTensorPtr: { |
| 2267 | assert(callbackArg); |
| 2268 | // no need to attach as we are only looking at view |
| 2269 | return new Tensor(this.memory.loadPointer(valuePtr), this.lib, this.ctx, true); |
| 2270 | } |
| 2271 | case TypeIndex.kTVMFFIFunction: { |
| 2272 | return this.ctx.attachToCurrentScope( |
| 2273 | this.makePackedFunc(this.memory.loadPointer(valuePtr)) |
| 2274 | ); |
| 2275 | } |
| 2276 | case TypeIndex.kTVMFFIDevice: { |
| 2277 | const deviceType = this.memory.loadI32(valuePtr); |
| 2278 | const deviceId = this.memory.loadI32(valuePtr + SizeOf.I32); |
| 2279 | return this.device(deviceType, deviceId); |
| 2280 | } |
| 2281 | case TypeIndex.kTVMFFIDataType: { |
| 2282 | // simply return dtype as tring to keep things simple |
| 2283 | this.lib.checkCall( |
| 2284 | (this.lib.exports.TVMFFIDataTypeToString as ctypes.FTVMFFIDataTypeToString)(valuePtr, valuePtr) |
| 2285 | ); |
| 2286 | const strObjPtr = this.memory.loadPointer(valuePtr); |
| 2287 | const result = this.memory.loadByteArrayAsString(strObjPtr + SizeOf.ObjectHeader); |
| 2288 | this.lib.checkCall( |
| 2289 | (this.lib.exports.TVMFFIObjectDecRef as ctypes.FTVMFFIObjectDecRef)(strObjPtr) |
| 2290 | ); |
| 2291 | return result; |
| 2292 | } |
| 2293 | case TypeIndex.kTVMFFISmallStr: { |
| 2294 | return this.memory.loadSmallStr(resultAnyPtr); |
| 2295 | } |
| 2296 | case TypeIndex.kTVMFFIStr: { |
| 2297 | const strObjPtr = this.memory.loadPointer(valuePtr); |
| 2298 | const result = this.memory.loadByteArrayAsString(strObjPtr + SizeOf.ObjectHeader); |
| 2299 | this.lib.checkCall( |
| 2300 | (this.lib.exports.TVMFFIObjectDecRef as ctypes.FTVMFFIObjectDecRef)(strObjPtr) |
| 2301 | ); |
| 2302 | return result; |
| 2303 | } |
| 2304 | case TypeIndex.kTVMFFISmallBytes: { |
no test coverage detected