Skip to content

Commit 5ab92c7

Browse files
authored
refactor: remove RefBase (#122)
* refactor: remove RefBase (nodejs/node#53590) * export ReferenceOwnership as runtime value
1 parent 6ac98c3 commit 5ab92c7

File tree

19 files changed

+307
-199
lines changed

19 files changed

+307
-199
lines changed

packages/core/src/emnapi/index.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import type { Context } from '@emnapi/runtime'
1+
import type { Context, ReferenceOwnership } from '@emnapi/runtime'
22
import type { ThreadManager, ThreadManagerOptionsMain, MainThreadBaseOptions } from '@emnapi/wasi-threads'
33

44
/** @public */
55
export declare interface PointerInfo {
66
address: number
7-
ownership: 0 | 1
7+
ownership: ReferenceOwnership
88
runtimeAllocated: 0 | 1
99
}
1010

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ export var napi_create_async_work = singleThreadAsyncWork
277277
if (!aw) return envObject.setLastError(napi_status.napi_generic_failure)
278278
new Uint8Array(wasmMemory.buffer).subarray(aw, aw + sizeofAW).fill(0)
279279
const s = envObject.ensureHandleId(resourceObject)
280-
const resourceRef = emnapiCtx.createReference(envObject, s, 1, Ownership.kUserland as any)
280+
const resourceRef = emnapiCtx.createReference(envObject, s, 1, ReferenceOwnership.kUserland as any)
281281
// eslint-disable-next-line @typescript-eslint/no-unused-vars
282282
const resource_ = resourceRef.id
283283
makeSetValue('aw', 0, 'resource_', '*')

packages/emnapi/src/emnapi.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,46 +45,46 @@ export function emnapi_create_memory_view (
4545
let viewDescriptor: MemoryViewDescriptor
4646
switch (typedarray_type) {
4747
case emnapi_memory_view_type.emnapi_int8_array:
48-
viewDescriptor = { Ctor: Int8Array, address: external_data, length: byte_length, ownership: Ownership.kUserland, runtimeAllocated: 0 }
48+
viewDescriptor = { Ctor: Int8Array, address: external_data, length: byte_length, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
4949
break
5050
case emnapi_memory_view_type.emnapi_uint8_array:
51-
viewDescriptor = { Ctor: Uint8Array, address: external_data, length: byte_length, ownership: Ownership.kUserland, runtimeAllocated: 0 }
51+
viewDescriptor = { Ctor: Uint8Array, address: external_data, length: byte_length, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
5252
break
5353
case emnapi_memory_view_type.emnapi_uint8_clamped_array:
54-
viewDescriptor = { Ctor: Uint8ClampedArray, address: external_data, length: byte_length, ownership: Ownership.kUserland, runtimeAllocated: 0 }
54+
viewDescriptor = { Ctor: Uint8ClampedArray, address: external_data, length: byte_length, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
5555
break
5656
case emnapi_memory_view_type.emnapi_int16_array:
57-
viewDescriptor = { Ctor: Int16Array, address: external_data, length: byte_length >> 1, ownership: Ownership.kUserland, runtimeAllocated: 0 }
57+
viewDescriptor = { Ctor: Int16Array, address: external_data, length: byte_length >> 1, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
5858
break
5959
case emnapi_memory_view_type.emnapi_uint16_array:
60-
viewDescriptor = { Ctor: Uint16Array, address: external_data, length: byte_length >> 1, ownership: Ownership.kUserland, runtimeAllocated: 0 }
60+
viewDescriptor = { Ctor: Uint16Array, address: external_data, length: byte_length >> 1, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
6161
break
6262
case emnapi_memory_view_type.emnapi_int32_array:
63-
viewDescriptor = { Ctor: Int32Array, address: external_data, length: byte_length >> 2, ownership: Ownership.kUserland, runtimeAllocated: 0 }
63+
viewDescriptor = { Ctor: Int32Array, address: external_data, length: byte_length >> 2, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
6464
break
6565
case emnapi_memory_view_type.emnapi_uint32_array:
66-
viewDescriptor = { Ctor: Uint32Array, address: external_data, length: byte_length >> 2, ownership: Ownership.kUserland, runtimeAllocated: 0 }
66+
viewDescriptor = { Ctor: Uint32Array, address: external_data, length: byte_length >> 2, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
6767
break
6868
case emnapi_memory_view_type.emnapi_float32_array:
69-
viewDescriptor = { Ctor: Float32Array, address: external_data, length: byte_length >> 2, ownership: Ownership.kUserland, runtimeAllocated: 0 }
69+
viewDescriptor = { Ctor: Float32Array, address: external_data, length: byte_length >> 2, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
7070
break
7171
case emnapi_memory_view_type.emnapi_float64_array:
72-
viewDescriptor = { Ctor: Float64Array, address: external_data, length: byte_length >> 3, ownership: Ownership.kUserland, runtimeAllocated: 0 }
72+
viewDescriptor = { Ctor: Float64Array, address: external_data, length: byte_length >> 3, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
7373
break
7474
case emnapi_memory_view_type.emnapi_bigint64_array:
75-
viewDescriptor = { Ctor: BigInt64Array, address: external_data, length: byte_length >> 3, ownership: Ownership.kUserland, runtimeAllocated: 0 }
75+
viewDescriptor = { Ctor: BigInt64Array, address: external_data, length: byte_length >> 3, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
7676
break
7777
case emnapi_memory_view_type.emnapi_biguint64_array:
78-
viewDescriptor = { Ctor: BigUint64Array, address: external_data, length: byte_length >> 3, ownership: Ownership.kUserland, runtimeAllocated: 0 }
78+
viewDescriptor = { Ctor: BigUint64Array, address: external_data, length: byte_length >> 3, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
7979
break
8080
case emnapi_memory_view_type.emnapi_data_view:
81-
viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: Ownership.kUserland, runtimeAllocated: 0 }
81+
viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
8282
break
8383
case emnapi_memory_view_type.emnapi_buffer: {
8484
if (!emnapiCtx.feature.Buffer) {
8585
throw emnapiCtx.createNotSupportBufferError('emnapi_create_memory_view', '')
8686
}
87-
viewDescriptor = { Ctor: emnapiCtx.feature.Buffer!, address: external_data, length: byte_length, ownership: Ownership.kUserland, runtimeAllocated: 0 }
87+
viewDescriptor = { Ctor: emnapiCtx.feature.Buffer!, address: external_data, length: byte_length, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0 }
8888
break
8989
}
9090
default: return envObject.setLastError(napi_status.napi_invalid_arg)

packages/emnapi/src/internal.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,14 @@ export function emnapiWrap (env: napi_env, js_object: napi_value, native_object:
143143
let reference: Reference
144144
if (result) {
145145
if (!finalize_cb) return envObject.setLastError(napi_status.napi_invalid_arg)
146-
reference = emnapiCtx.createReference(envObject, handle.id, 0, Ownership.kUserland as any, finalize_cb, native_object, finalize_hint)
146+
reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, ReferenceOwnership.kUserland as any, finalize_cb, native_object, finalize_hint)
147147
from64('result')
148148
referenceId = reference.id
149149
makeSetValue('result', 0, 'referenceId', '*')
150+
} else if (finalize_cb) {
151+
reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, ReferenceOwnership.kRuntime as any, finalize_cb, native_object, finalize_hint)
150152
} else {
151-
reference = emnapiCtx.createReference(envObject, handle.id, 0, Ownership.kRuntime as any, finalize_cb, native_object, !finalize_cb ? finalize_cb : finalize_hint)
153+
reference = emnapiCtx.createReferenceWithData(envObject, handle.id, 0, ReferenceOwnership.kRuntime as any, native_object)
152154
}
153155

154156
envObject.getObjectBinding(handle.value).wrapped = reference.id
@@ -181,7 +183,7 @@ export function emnapiUnwrap (env: napi_env, js_object: napi_value, result: void
181183
}
182184
if (action === UnwrapAction.RemoveWrap) {
183185
binding.wrapped = 0
184-
if (ref.ownership() === Ownership.kUserland) {
186+
if ((ref.ownership() as unknown as ReferenceOwnership) === ReferenceOwnership.kUserland) {
185187
// When the wrap is been removed, the finalizer should be reset.
186188
ref.resetFinalizer()
187189
} else {

packages/emnapi/src/life.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export function napi_create_reference (
8686
}
8787
}
8888
// eslint-disable-next-line @typescript-eslint/no-unused-vars
89-
const ref = emnapiCtx.createReference(envObject, handle.id, initial_refcount >>> 0, Ownership.kUserland as any)
89+
const ref = emnapiCtx.createReference(envObject, handle.id, initial_refcount >>> 0, ReferenceOwnership.kUserland as any)
9090
from64('result')
9191
makeSetValue('result', 0, 'ref.id', '*')
9292
return envObject.clearLastError()
@@ -129,7 +129,7 @@ export function napi_reference_unref (
129129
const envObject: Env = $CHECK_ENV_NOT_IN_GC!(env)
130130
$CHECK_ARG!(envObject, ref)
131131
const reference = emnapiCtx.refStore.get(ref)!
132-
const refcount = reference.refCount()
132+
const refcount = reference.refcount()
133133

134134
if (refcount === 0) {
135135
return envObject.setLastError(napi_status.napi_generic_failure)
@@ -154,7 +154,7 @@ export function napi_get_reference_value (
154154
$CHECK_ARG!(envObject, result)
155155
const reference = emnapiCtx.refStore.get(ref)!
156156
// eslint-disable-next-line @typescript-eslint/no-unused-vars
157-
const handleId = reference.get()
157+
const handleId = reference.get(envObject)
158158
from64('result')
159159
makeSetValue('result', 0, 'handleId', '*')
160160
return envObject.clearLastError()

packages/emnapi/src/memory.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export type ViewConstuctor =
1919

2020
export interface ArrayBufferPointer {
2121
address: void_p
22-
ownership: Ownership
22+
ownership: ReferenceOwnership
2323
runtimeAllocated: 0 | 1
2424
}
2525

@@ -75,7 +75,7 @@ export const emnapiExternalMemory: {
7575
getArrayBufferPointer: function (arrayBuffer: ArrayBuffer, shouldCopy: boolean): ArrayBufferPointer {
7676
const info: ArrayBufferPointer = {
7777
address: 0,
78-
ownership: Ownership.kRuntime,
78+
ownership: ReferenceOwnership.kRuntime,
7979
runtimeAllocated: 0
8080
}
8181
if (arrayBuffer === wasmMemory.buffer) {
@@ -89,7 +89,7 @@ export const emnapiExternalMemory: {
8989
cachedInfo.address = 0
9090
return cachedInfo
9191
}
92-
if (shouldCopy && cachedInfo.ownership === Ownership.kRuntime && cachedInfo.runtimeAllocated === 1) {
92+
if (shouldCopy && cachedInfo.ownership === ReferenceOwnership.kRuntime && cachedInfo.runtimeAllocated === 1) {
9393
new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), cachedInfo.address)
9494
}
9595
return cachedInfo
@@ -108,7 +108,7 @@ export const emnapiExternalMemory: {
108108
new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), pointer)
109109

110110
info.address = pointer
111-
info.ownership = emnapiExternalMemory.registry ? Ownership.kRuntime : Ownership.kUserland
111+
info.ownership = emnapiExternalMemory.registry ? ReferenceOwnership.kRuntime : ReferenceOwnership.kUserland
112112
info.runtimeAllocated = 1
113113

114114
emnapiExternalMemory.table.set(arrayBuffer, info)
@@ -123,7 +123,7 @@ export const emnapiExternalMemory: {
123123
Ctor: view.constructor as any,
124124
address: view.byteOffset,
125125
length: view instanceof DataView ? view.byteLength : (view as any).length,
126-
ownership: Ownership.kUserland,
126+
ownership: ReferenceOwnership.kUserland,
127127
runtimeAllocated: 0
128128
})
129129
}
@@ -156,7 +156,7 @@ export const emnapiExternalMemory: {
156156
const { address, ownership, runtimeAllocated } = emnapiExternalMemory.wasmMemoryViewTable.get(view)!
157157
return { address, ownership, runtimeAllocated, view }
158158
}
159-
return { address: view.byteOffset, ownership: Ownership.kUserland, runtimeAllocated: 0, view }
159+
return { address: view.byteOffset, ownership: ReferenceOwnership.kUserland, runtimeAllocated: 0, view }
160160
}
161161

162162
const { address, ownership, runtimeAllocated } = emnapiExternalMemory.getArrayBufferPointer(view.buffer, shouldCopy)

packages/emnapi/src/threadsafe-function.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ export function napi_create_threadsafe_function (
682682
return envObject.setLastError(napi_status.napi_invalid_arg)
683683
}
684684
// eslint-disable-next-line @typescript-eslint/no-unused-vars
685-
ref = emnapiCtx.createReference(envObject, func, 1, Ownership.kUserland as any).id
685+
ref = emnapiCtx.createReference(envObject, func, 1, ReferenceOwnership.kUserland as any).id
686686
}
687687

688688
let asyncResourceObject: any
@@ -709,7 +709,7 @@ export function napi_create_threadsafe_function (
709709
const tsfn = _malloc(to64('sizeofTSFN'))
710710
if (!tsfn) return envObject.setLastError(napi_status.napi_generic_failure)
711711
new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0)
712-
const resourceRef = emnapiCtx.createReference(envObject, resource, 1, Ownership.kUserland as any)
712+
const resourceRef = emnapiCtx.createReference(envObject, resource, 1, ReferenceOwnership.kUserland as any)
713713
// eslint-disable-next-line @typescript-eslint/no-unused-vars
714714
const resource_ = resourceRef.id
715715
makeSetValue('tsfn', 0, 'resource_', '*')

packages/emnapi/src/typings/enum.d.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
declare const enum UnwrapAction {
2-
KeepWrap,
3-
RemoveWrap
1+
import type { ReferenceOwnership as RuntimeReferenceOwnership } from '@emnapi/runtime'
2+
3+
declare global {
4+
export const enum UnwrapAction {
5+
KeepWrap,
6+
RemoveWrap
7+
}
8+
9+
export const enum ReferenceOwnership {
10+
kRuntime = RuntimeReferenceOwnership.kRuntime,
11+
kUserland = RuntimeReferenceOwnership.kUserland
12+
}
413
}

packages/emnapi/src/value/create.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export function napi_create_external (env: napi_env, data: void_p, finalize_cb:
9898
}
9999
const externalHandle = emnapiCtx.getCurrentScope()!.addExternal(envObject, data)
100100
if (finalize_cb) {
101-
emnapiCtx.createReference(envObject, externalHandle.id, 0, Ownership.kRuntime as any, finalize_cb, data, finalize_hint)
101+
emnapiCtx.createReferenceWithFinalizer(envObject, externalHandle.id, 0, ReferenceOwnership.kRuntime as any, finalize_cb, data, finalize_hint)
102102
}
103103
from64('result')
104104
value = externalHandle.id
@@ -151,7 +151,7 @@ export function napi_create_external_arraybuffer (
151151
u8arr.set(new Uint8Array(wasmMemory.buffer).subarray(external_data, external_data + byte_length))
152152
emnapiExternalMemory.table.set(arrayBuffer, {
153153
address: external_data,
154-
ownership: Ownership.kUserland,
154+
ownership: ReferenceOwnership.kUserland,
155155
runtimeAllocated: 0
156156
})
157157
}
@@ -262,7 +262,7 @@ export function napi_create_typedarray (
262262
Ctor: Type as any,
263263
address: byte_offset,
264264
length,
265-
ownership: Ownership.kUserland,
265+
ownership: ReferenceOwnership.kUserland,
266266
runtimeAllocated: 0
267267
})
268268
}
@@ -343,7 +343,7 @@ export function napi_create_buffer (
343343
Ctor: Buffer,
344344
address: pointer,
345345
length: size,
346-
ownership: emnapiExternalMemory.registry ? Ownership.kRuntime : Ownership.kUserland,
346+
ownership: emnapiExternalMemory.registry ? ReferenceOwnership.kRuntime : ReferenceOwnership.kUserland,
347347
runtimeAllocated: 1
348348
}
349349
emnapiExternalMemory.wasmMemoryViewTable.set(buffer, viewDescriptor)
@@ -451,7 +451,7 @@ export function napi_create_dataview (
451451
Ctor: DataView,
452452
address: byte_offset,
453453
length: byte_length,
454-
ownership: Ownership.kUserland,
454+
ownership: ReferenceOwnership.kUserland,
455455
runtimeAllocated: 0
456456
})
457457
}

packages/emnapi/src/wrap.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,11 @@ export function napi_add_finalizer (env: napi_env, js_object: napi_value, finali
194194
}
195195
const handle = handleResult.handle!
196196

197-
const ownership: Ownership = !result ? Ownership.kRuntime : Ownership.kUserland
197+
const ownership: ReferenceOwnership = !result ? ReferenceOwnership.kRuntime : ReferenceOwnership.kUserland
198198
from64('finalize_data')
199199
from64('finalize_cb')
200200
from64('finalize_hint')
201-
const reference = emnapiCtx.createReference(envObject, handle.id, 0, ownership as any, finalize_cb, finalize_data, finalize_hint)
201+
const reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, ownership as any, finalize_cb, finalize_data, finalize_hint)
202202
if (result) {
203203
from64('result')
204204
// eslint-disable-next-line @typescript-eslint/no-unused-vars

0 commit comments

Comments
 (0)