Skip to content

Commit f8428ff

Browse files
authored
refactor!: redesign runtime and context API (#141)
1 parent 02c74aa commit f8428ff

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1131
-1056
lines changed

packages/emnapi/cmake/wasm32.cmake

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
# Cmake toolchain description file for the Makefile
22

3-
# This is arbitrary, AFAIK, for now.
4-
cmake_minimum_required(VERSION 3.4.0)
5-
63
set(CMAKE_SYSTEM_NAME WASM)
74
set(CMAKE_SYSTEM_VERSION 1)
85
set(CMAKE_SYSTEM_PROCESSOR wasm32)

packages/emnapi/src/async-work.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export interface AsyncWork {
66
resource: object
77
asyncId: number
88
triggerAsyncId: number
9-
env: number
9+
env: napi_env
1010
data: number
1111
execute: number
1212
complete: number
@@ -91,7 +91,7 @@ export var emnapiAWST = {
9191
const data = work.data
9292
const callback = (): void => {
9393
if (!complete) return
94-
const envObject = emnapiCtx.envStore.get(env)!
94+
const envObject = emnapiCtx.getEnv(env)!
9595
const scope = emnapiCtx.openScope(envObject)
9696
try {
9797
(envObject as NodeEnv).callbackIntoModule(true, () => {
@@ -126,12 +126,12 @@ export var emnapiAWST = {
126126
const data = work.data
127127
const execute = work.execute
128128
work.status = 2
129-
emnapiCtx.feature.setImmediate(() => {
129+
emnapiCtx.features.setImmediate(() => {
130130
makeDynCall('vpp', 'execute')(env, data)
131131
emnapiAWST.queued.delete(id)
132132
work.status = 3
133133

134-
emnapiCtx.feature.setImmediate(() => {
134+
emnapiCtx.features.setImmediate(() => {
135135
emnapiAWST.callComplete(work, napi_status.napi_ok)
136136
})
137137

@@ -152,7 +152,7 @@ export var emnapiAWST = {
152152
work.status = 4
153153
emnapiAWST.pending.splice(index, 1)
154154

155-
emnapiCtx.feature.setImmediate(() => {
155+
emnapiCtx.features.setImmediate(() => {
156156
emnapiAWST.callComplete(work, napi_status.napi_cancelled)
157157
})
158158

packages/emnapi/src/core/async-work.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ var emnapiAWMT = {
188188
if (index !== -1) {
189189
emnapiAWMT.workQueue.splice(index, 1)
190190

191-
emnapiCtx.feature.setImmediate(() => {
191+
emnapiCtx.features.setImmediate(() => {
192192
_emnapi_runtime_keepalive_pop()
193193
emnapiCtx.decreaseWaitingRequestCounter()
194194
emnapiAWMT.checkIdleWorker()
@@ -203,7 +203,7 @@ var emnapiAWMT = {
203203
const complete = emnapiAWMT.getComplete(work)
204204
const env = emnapiAWMT.getEnv(work)
205205
const data = emnapiAWMT.getData(work)
206-
const envObject = emnapiCtx.envStore.get(env)!
206+
const envObject = emnapiCtx.getEnv(env)!
207207
const scope = emnapiCtx.openScope(envObject)
208208
const callback = (): void => {
209209
if (!complete) return
@@ -215,8 +215,8 @@ var emnapiAWMT = {
215215
try {
216216
if (emnapiNodeBinding) {
217217
const resource = emnapiAWMT.getResource(work)
218-
const resource_value = emnapiCtx.refStore.get(resource)!.get()
219-
const resourceObject = emnapiCtx.handleStore.get(resource_value)!.value
218+
const resource_value = emnapiCtx.getRef(resource)!.get()
219+
const resourceObject = emnapiCtx.jsValueFromNapiValue(resource_value)!
220220
const view = new DataView(wasmMemory.buffer)
221221
const asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true)
222222
const triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true)
@@ -242,14 +242,14 @@ export var napi_create_async_work = singleThreadAsyncWork
242242

243243
let resourceObject: any
244244
if (resource) {
245-
resourceObject = Object(emnapiCtx.handleStore.get(resource)!.value)
245+
resourceObject = Object(emnapiCtx.jsValueFromNapiValue(resource)!)
246246
} else {
247247
resourceObject = {}
248248
}
249249

250250
$CHECK_ARG!(envObject, resource_name)
251251

252-
const resourceName = String(emnapiCtx.handleStore.get(resource_name)!.value)
252+
const resourceName = String(emnapiCtx.jsValueFromNapiValue(resource_name)!)
253253

254254
const id = emnapiAWST.create(env, resourceObject, resourceName, execute, complete, data)
255255
makeSetValue('result', 0, 'id', '*')
@@ -262,23 +262,24 @@ export var napi_create_async_work = singleThreadAsyncWork
262262

263263
let resourceObject: any
264264
if (resource) {
265-
resourceObject = Object(emnapiCtx.handleStore.get(resource)!.value)
265+
resourceObject = Object(emnapiCtx.jsValueFromNapiValue(resource)!)
266266
} else {
267267
resourceObject = {}
268268
}
269269

270270
$CHECK_ARG!(envObject, resource_name)
271271

272272
const sizeofAW = emnapiAWMT.offset.end
273-
const aw = _malloc(to64('sizeofAW'))
273+
let aw = _malloc(to64('sizeofAW') as size_t)
274274
if (!aw) return envObject.setLastError(napi_status.napi_generic_failure)
275-
new Uint8Array(wasmMemory.buffer).subarray(aw, aw + sizeofAW).fill(0)
276-
const s = envObject.ensureHandleId(resourceObject)
275+
from64('aw')
276+
new Uint8Array(wasmMemory.buffer).subarray(aw as number, aw as number + sizeofAW).fill(0)
277+
const s = emnapiCtx.napiValueFromJsValue(resourceObject)
277278
const resourceRef = emnapiCtx.createReference(envObject, s, 1, ReferenceOwnership.kUserland as any)
278279

279280
const resource_ = resourceRef.id
280281
makeSetValue('aw', 0, 'resource_', '*')
281-
_emnapi_node_emit_async_init(s, resource_name, -1, aw + emnapiAWMT.offset.async_id)
282+
_emnapi_node_emit_async_init(s, resource_name, -1, aw as number + emnapiAWMT.offset.async_id)
282283
makeSetValue('aw', 'emnapiAWMT.offset.env', 'env', '*')
283284
makeSetValue('aw', 'emnapiAWMT.offset.execute', 'execute', '*')
284285
makeSetValue('aw', 'emnapiAWMT.offset.complete', 'complete', '*')
@@ -302,7 +303,7 @@ export var napi_delete_async_work = singleThreadAsyncWork
302303
$CHECK_ARG!(envObject, work)
303304

304305
const resource = emnapiAWMT.getResource(work)
305-
emnapiCtx.refStore.get(resource)!.dispose()
306+
emnapiCtx.getRef(resource)!.dispose()
306307

307308
if (emnapiNodeBinding) {
308309
const view = new DataView(wasmMemory.buffer)
@@ -319,15 +320,15 @@ export var napi_delete_async_work = singleThreadAsyncWork
319320
export var napi_queue_async_work = singleThreadAsyncWork
320321
? function (env: napi_env, work: number): napi_status {
321322
$CHECK_ENV!(env)
322-
const envObject = emnapiCtx.envStore.get(env)!
323+
const envObject = emnapiCtx.getEnv(env)!
323324
$CHECK_ARG!(envObject, work)
324325

325326
emnapiAWST.queue(work)
326327
return envObject.clearLastError()
327328
}
328329
: function (env: napi_env, work: number): napi_status {
329330
$CHECK_ENV!(env)
330-
const envObject = emnapiCtx.envStore.get(env)!
331+
const envObject = emnapiCtx.getEnv(env)!
331332
$CHECK_ARG!(envObject, work)
332333

333334
emnapiAWMT.scheduleWork(work)
@@ -338,7 +339,7 @@ export var napi_queue_async_work = singleThreadAsyncWork
338339
export var napi_cancel_async_work = singleThreadAsyncWork
339340
? function (env: napi_env, work: number): napi_status {
340341
$CHECK_ENV!(env)
341-
const envObject = emnapiCtx.envStore.get(env)!
342+
const envObject = emnapiCtx.getEnv(env)!
342343
$CHECK_ARG!(envObject, work)
343344

344345
const status = emnapiAWST.cancel(work)
@@ -347,7 +348,7 @@ export var napi_cancel_async_work = singleThreadAsyncWork
347348
}
348349
: function (env: napi_env, work: number): napi_status {
349350
$CHECK_ENV!(env)
350-
const envObject = emnapiCtx.envStore.get(env)!
351+
const envObject = emnapiCtx.getEnv(env)!
351352
$CHECK_ARG!(envObject, work)
352353

353354
const status = emnapiAWMT.cancelWork(work)

packages/emnapi/src/core/init.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ export var wasmMemory: WebAssembly.Memory
4141

4242
export var wasmTable: WebAssembly.Table
4343

44-
export var _malloc: any
45-
export var _free: any
44+
export var _malloc: (size: number | bigint) => void_p
45+
export var _free: (ptr: void_p) => void
4646

4747
export function abort (msg?: string): never {
4848
if (typeof WebAssembly.RuntimeError === 'function') {
@@ -91,8 +91,8 @@ export var napiModule: INapiModule = {
9191
wasmTable = table
9292
if (typeof exports.malloc !== 'function') throw new TypeError('malloc is not exported')
9393
if (typeof exports.free !== 'function') throw new TypeError('free is not exported')
94-
_malloc = exports.malloc
95-
_free = exports.free
94+
_malloc = exports.malloc as (size: number | bigint) => void_p
95+
_free = exports.free as (ptr: void_p) => void
9696

9797
if (!napiModule.childThread) {
9898
// main thread only
@@ -117,8 +117,8 @@ export var napiModule: INapiModule = {
117117
const exports = napiModule.exports
118118
const exportsHandle = scope.add(exports)
119119
const napi_register_wasm_v1 = instance.exports.napi_register_wasm_v1 as Function
120-
const napiValue = napi_register_wasm_v1(to64('_envObject.id'), to64('exportsHandle.id'))
121-
napiModule.exports = (!napiValue) ? exports : emnapiCtx.handleStore.get(napiValue)!.value
120+
const napiValue = napi_register_wasm_v1(to64('_envObject.id'), to64('exportsHandle'))
121+
napiModule.exports = (!napiValue) ? exports : emnapiCtx.jsValueFromNapiValue(napiValue)!
122122
})
123123
} finally {
124124
emnapiCtx.closeScope(envObject, scope)

packages/emnapi/src/core/memory.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export function napi_adjust_external_memory (
1111
adjusted_value: number
1212
): napi_status {
1313
$CHECK_ENV!(env)
14-
const envObject = emnapiCtx.envStore.get(env)!
14+
const envObject = emnapiCtx.getEnv(env)!
1515
$CHECK_ARG!(envObject, adjusted_value)
1616

1717
const change_in_bytes_number = Number(change_in_bytes)
@@ -28,7 +28,7 @@ export function napi_adjust_external_memory (
2828
}
2929

3030
from64('adjusted_value')
31-
if (emnapiCtx.feature.supportBigInt) {
31+
if (emnapiCtx.features.BigInt) {
3232
makeSetValue('adjusted_value', 0, 'wasmMemory.buffer.byteLength', 'i64')
3333
} else {
3434
emnapiSetValueI64(adjusted_value, wasmMemory.buffer.byteLength)

0 commit comments

Comments
 (0)