@gtkx/runtime 1.6.0 → 2.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/application-class.d.ts +1 -1
- package/dist/application-class.d.ts.map +1 -1
- package/dist/application-class.js +1 -2
- package/dist/application-class.js.map +1 -1
- package/dist/arg.d.ts +4 -1
- package/dist/arg.d.ts.map +1 -1
- package/dist/arg.js.map +1 -1
- package/dist/bind.d.ts.map +1 -1
- package/dist/bind.js +1 -9
- package/dist/bind.js.map +1 -1
- package/dist/callback.d.ts +6 -1
- package/dist/callback.d.ts.map +1 -1
- package/dist/callback.js +33 -21
- package/dist/callback.js.map +1 -1
- package/dist/closure.d.ts +3 -1
- package/dist/closure.d.ts.map +1 -1
- package/dist/closure.js +17 -6
- package/dist/closure.js.map +1 -1
- package/dist/descriptors.d.ts +22 -51
- package/dist/descriptors.d.ts.map +1 -1
- package/dist/descriptors.js +53 -27
- package/dist/descriptors.js.map +1 -1
- package/dist/fn.d.ts.map +1 -1
- package/dist/fn.js +23 -9
- package/dist/fn.js.map +1 -1
- package/dist/folded-lengths.d.ts +2 -1
- package/dist/folded-lengths.d.ts.map +1 -1
- package/dist/folded-lengths.js +17 -7
- package/dist/folded-lengths.js.map +1 -1
- package/dist/index.d.ts +2 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -24
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +18 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +14 -2
- package/dist/internal.js.map +1 -1
- package/dist/listeners.d.ts +3 -13
- package/dist/listeners.d.ts.map +1 -1
- package/dist/listeners.js +12 -12
- package/dist/listeners.js.map +1 -1
- package/dist/mixin.d.ts +5 -3
- package/dist/mixin.d.ts.map +1 -1
- package/dist/mixin.js +36 -9
- package/dist/mixin.js.map +1 -1
- package/dist/native-value.d.ts +9 -1
- package/dist/native-value.d.ts.map +1 -1
- package/dist/native-value.js +20 -3
- package/dist/native-value.js.map +1 -1
- package/dist/object.d.ts +11 -0
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +18 -25
- package/dist/object.js.map +1 -1
- package/dist/properties.d.ts +5 -3
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +67 -23
- package/dist/properties.js.map +1 -1
- package/dist/property-brand.d.ts +5 -0
- package/dist/property-brand.d.ts.map +1 -0
- package/dist/property-brand.js +5 -0
- package/dist/property-brand.js.map +1 -0
- package/dist/register-class.d.ts +142 -264
- package/dist/register-class.d.ts.map +1 -1
- package/dist/register-class.js +19 -37
- package/dist/register-class.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -4
- package/dist/registry.js.map +1 -1
- package/dist/signal-brand.d.ts +12 -0
- package/dist/signal-brand.d.ts.map +1 -0
- package/dist/signal-brand.js +6 -0
- package/dist/signal-brand.js.map +1 -0
- package/dist/signal.d.ts +39 -2
- package/dist/signal.d.ts.map +1 -1
- package/dist/signal.js +84 -27
- package/dist/signal.js.map +1 -1
- package/dist/t.d.ts +5 -21
- package/dist/t.d.ts.map +1 -1
- package/dist/t.js +1 -5
- package/dist/t.js.map +1 -1
- package/dist/type.d.ts.map +1 -1
- package/dist/type.js +8 -2
- package/dist/type.js.map +1 -1
- package/dist/value.d.ts.map +1 -1
- package/dist/value.js +7 -1
- package/dist/value.js.map +1 -1
- package/dist/variant.d.ts +2 -6
- package/dist/variant.d.ts.map +1 -1
- package/dist/variant.js.map +1 -1
- package/dist/vfunc-call.d.ts.map +1 -1
- package/dist/vfunc-call.js +2 -11
- package/dist/vfunc-call.js.map +1 -1
- package/package.json +9 -5
- package/src/application-class.ts +2 -2
- package/src/arg.ts +4 -1
- package/src/bind.ts +1 -12
- package/src/callback.ts +53 -29
- package/src/closure.ts +31 -6
- package/src/descriptors.ts +95 -59
- package/src/fn.ts +31 -10
- package/src/folded-lengths.ts +23 -10
- package/src/index.ts +2 -24
- package/src/internal.ts +43 -2
- package/src/listeners.ts +21 -26
- package/src/mixin.ts +55 -9
- package/src/native-value.ts +24 -3
- package/src/object.ts +55 -5
- package/src/properties.ts +90 -26
- package/src/property-brand.ts +5 -0
- package/src/register-class.ts +338 -341
- package/src/registry.ts +4 -4
- package/src/signal-brand.ts +29 -0
- package/src/signal.ts +185 -39
- package/src/t.ts +5 -21
- package/src/type.ts +10 -2
- package/src/value.ts +9 -1
- package/src/variant.ts +2 -6
- package/src/vfunc-call.ts +3 -16
package/dist/mixin.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { getParentClass } from "@gtkx/utils";
|
|
2
|
+
const syntheticSignalMembers = new WeakMap();
|
|
3
|
+
function markSyntheticSignalMembers(klass, names) {
|
|
4
|
+
syntheticSignalMembers.set(klass.prototype, new Set(names));
|
|
5
|
+
}
|
|
2
6
|
function isDefinedInClassChain(prototype, key) {
|
|
3
7
|
let current = prototype;
|
|
4
8
|
while (current !== null && current !== Object.prototype) {
|
|
@@ -9,11 +13,22 @@ function isDefinedInClassChain(prototype, key) {
|
|
|
9
13
|
}
|
|
10
14
|
return false;
|
|
11
15
|
}
|
|
12
|
-
function
|
|
16
|
+
function isNaturalInClassChain(prototype, key) {
|
|
17
|
+
let current = prototype;
|
|
18
|
+
while (current !== null && current !== Object.prototype) {
|
|
19
|
+
if (Object.hasOwn(current, key)) {
|
|
20
|
+
return syntheticSignalMembers.get(current)?.has(key) !== true;
|
|
21
|
+
}
|
|
22
|
+
current = Reflect.getPrototypeOf(current);
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
function copyLayerMember(target, layer, key, inheritedOverrides) {
|
|
13
27
|
if (key === "constructor") {
|
|
14
28
|
return;
|
|
15
29
|
}
|
|
16
|
-
|
|
30
|
+
const isProtectedInherited = !inheritedOverrides.has(key) && isDefinedInClassChain(target.prototype, key);
|
|
31
|
+
if (isProtectedInherited || Object.hasOwn(target.prototype, key)) {
|
|
17
32
|
return;
|
|
18
33
|
}
|
|
19
34
|
const descriptor = Object.getOwnPropertyDescriptor(layer, key);
|
|
@@ -21,9 +36,9 @@ function copyLayerMember(target, layer, key) {
|
|
|
21
36
|
Object.defineProperty(target.prototype, key, descriptor);
|
|
22
37
|
}
|
|
23
38
|
}
|
|
24
|
-
function copyLayerMembers(target, layer) {
|
|
39
|
+
function copyLayerMembers(target, layer, inheritedOverrides = new Set()) {
|
|
25
40
|
for (const key of Object.getOwnPropertyNames(layer)) {
|
|
26
|
-
copyLayerMember(target, layer, key);
|
|
41
|
+
copyLayerMember(target, layer, key, inheritedOverrides);
|
|
27
42
|
}
|
|
28
43
|
}
|
|
29
44
|
/**
|
|
@@ -33,7 +48,8 @@ function copyLayerMembers(target, layer) {
|
|
|
33
48
|
* @param target The class whose prototype receives the mixin members.
|
|
34
49
|
* @param mixins The mixins to apply, in order.
|
|
35
50
|
*/
|
|
36
|
-
function installMixins(target, mixins) {
|
|
51
|
+
function installMixins(target, mixins, inheritedOverrideNames = []) {
|
|
52
|
+
const inheritedOverrides = new Set(inheritedOverrideNames);
|
|
37
53
|
const empty = class {
|
|
38
54
|
connect() {
|
|
39
55
|
return 0;
|
|
@@ -43,7 +59,7 @@ function installMixins(target, mixins) {
|
|
|
43
59
|
}
|
|
44
60
|
};
|
|
45
61
|
for (const mixin of mixins) {
|
|
46
|
-
copyLayerMembers(target, mixin(empty).prototype);
|
|
62
|
+
copyLayerMembers(target, mixin(empty).prototype, inheritedOverrides);
|
|
47
63
|
}
|
|
48
64
|
}
|
|
49
65
|
function dropLayerMembers(layer, names) {
|
|
@@ -51,11 +67,22 @@ function dropLayerMembers(layer, names) {
|
|
|
51
67
|
Reflect.deleteProperty(layer.prototype, name);
|
|
52
68
|
}
|
|
53
69
|
}
|
|
70
|
+
function createMixinLayer(parent, mixin, inheritedNames) {
|
|
71
|
+
const layer = mixin(parent);
|
|
72
|
+
const protectedNames = new Set(inheritedNames);
|
|
73
|
+
for (const key of Object.getOwnPropertyNames(layer.prototype)) {
|
|
74
|
+
if (key !== "constructor" && isNaturalInClassChain(parent.prototype, key)) {
|
|
75
|
+
protectedNames.add(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
dropLayerMembers(layer, protectedNames);
|
|
79
|
+
return layer;
|
|
80
|
+
}
|
|
54
81
|
function insertMixinLayer(target, mixin, inheritedNames) {
|
|
55
|
-
const
|
|
56
|
-
|
|
82
|
+
const parent = getParentClass(target);
|
|
83
|
+
const layer = createMixinLayer(parent, mixin, inheritedNames);
|
|
57
84
|
Object.setPrototypeOf(target.prototype, layer.prototype);
|
|
58
85
|
Object.setPrototypeOf(target, layer);
|
|
59
86
|
}
|
|
60
|
-
export { copyLayerMembers, insertMixinLayer, installMixins };
|
|
87
|
+
export { copyLayerMembers, createMixinLayer, insertMixinLayer, installMixins, markSyntheticSignalMembers, };
|
|
61
88
|
//# sourceMappingURL=mixin.js.map
|
package/dist/mixin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mixin.js","sourceRoot":"","sources":["../src/mixin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,cAAc,EAAE,MAAM,aAAa,CAAC;AAmB5D,SAAS,qBAAqB,CAAC,SAAiB,EAAE,GAAW;IACzD,IAAI,OAAO,GAAkB,SAAS,CAAC;IAEvC,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,MAAgB,EAAE,KAAa,EAAE,GAAW;
|
|
1
|
+
{"version":3,"file":"mixin.js","sourceRoot":"","sources":["../src/mixin.ts"],"names":[],"mappings":"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","sourcesContent":["import { type AnyClass, getParentClass } from \"@gtkx/utils\";\n\n/**\n * The signal plumbing every base class passed to a {@link Mixin} provides, so mixed-in interface\n * members can connect and emit without knowing the concrete class.\n */\ntype MixinReceiver = {\n /** Connects a handler to a signal and returns its handler id. */\n connect(signal: string, handler: (...args: unknown[]) => unknown, isAfter?: boolean): number;\n /** Emits a signal with the given arguments and returns whatever the emission produced. */\n emit(signal: string, ...args: unknown[]): unknown;\n};\n\n/**\n * A factory that, given a base class, returns a subclass adding extra members to\n * be merged onto a target prototype.\n */\ntype Mixin = (base: AnyClass<MixinReceiver>) => AnyClass;\n\nconst syntheticSignalMembers: WeakMap<object, ReadonlySet<string>> = new WeakMap();\n\nfunction markSyntheticSignalMembers(klass: AnyClass, names: readonly string[]): void {\n syntheticSignalMembers.set(klass.prototype, new Set(names));\n}\n\nfunction isDefinedInClassChain(prototype: object, key: string): boolean {\n let current: object | null = prototype;\n\n while (current !== null && current !== Object.prototype) {\n if (Object.hasOwn(current, key)) {\n return true;\n }\n\n current = Reflect.getPrototypeOf(current);\n }\n\n return false;\n}\n\nfunction isNaturalInClassChain(prototype: object, key: string): boolean {\n let current: object | null = prototype;\n\n while (current !== null && current !== Object.prototype) {\n if (Object.hasOwn(current, key)) {\n return syntheticSignalMembers.get(current)?.has(key) !== true;\n }\n\n current = Reflect.getPrototypeOf(current);\n }\n\n return false;\n}\n\nfunction copyLayerMember(target: AnyClass, layer: object, key: string, inheritedOverrides: Set<string>): void {\n if (key === \"constructor\") {\n return;\n }\n\n const isProtectedInherited = !inheritedOverrides.has(key) && isDefinedInClassChain(target.prototype, key);\n\n if (isProtectedInherited || Object.hasOwn(target.prototype, key)) {\n return;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(layer, key);\n\n if (descriptor !== undefined) {\n Object.defineProperty(target.prototype, key, descriptor);\n }\n}\n\nfunction copyLayerMembers(target: AnyClass, layer: object, inheritedOverrides: Set<string> = new Set()): void {\n for (const key of Object.getOwnPropertyNames(layer)) {\n copyLayerMember(target, layer, key, inheritedOverrides);\n }\n}\n\n/**\n * Copies each mixin's prototype members onto the target class prototype, skipping\n * any member already defined anywhere in the target's class chain.\n *\n * @param target The class whose prototype receives the mixin members.\n * @param mixins The mixins to apply, in order.\n */\nfunction installMixins(target: AnyClass, mixins: Mixin[], inheritedOverrideNames: Iterable<string> = []): void {\n const inheritedOverrides = new Set(inheritedOverrideNames);\n const empty: AnyClass<MixinReceiver> = class {\n connect(): number {\n return 0;\n }\n\n emit(): unknown {\n return undefined;\n }\n };\n\n for (const mixin of mixins) {\n copyLayerMembers(target, mixin(empty).prototype, inheritedOverrides);\n }\n}\n\nfunction dropLayerMembers(layer: AnyClass, names: Set<string>): void {\n for (const name of names) {\n Reflect.deleteProperty(layer.prototype, name);\n }\n}\n\nfunction createMixinLayer(parent: AnyClass<MixinReceiver>, mixin: Mixin, inheritedNames: Set<string>): AnyClass {\n const layer = mixin(parent);\n const protectedNames = new Set(inheritedNames);\n\n for (const key of Object.getOwnPropertyNames(layer.prototype)) {\n if (key !== \"constructor\" && isNaturalInClassChain(parent.prototype, key)) {\n protectedNames.add(key);\n }\n }\n\n dropLayerMembers(layer, protectedNames);\n\n return layer;\n}\n\nfunction insertMixinLayer(target: AnyClass, mixin: Mixin, inheritedNames: Set<string>): void {\n const parent = getParentClass(target) as AnyClass<MixinReceiver>;\n const layer = createMixinLayer(parent, mixin, inheritedNames);\n Object.setPrototypeOf(target.prototype, layer.prototype);\n Object.setPrototypeOf(target, layer);\n}\n\nexport {\n copyLayerMembers,\n createMixinLayer,\n insertMixinLayer,\n installMixins,\n markSyntheticSignalMembers,\n type MixinReceiver,\n type Mixin,\n};\n"]}
|
package/dist/native-value.d.ts
CHANGED
|
@@ -13,6 +13,14 @@ import { type Descriptor } from "@gtkx/native";
|
|
|
13
13
|
* @param value The raw native value to convert.
|
|
14
14
|
*/
|
|
15
15
|
declare function fromNative(descriptor: Descriptor, value: unknown): unknown;
|
|
16
|
+
/**
|
|
17
|
+
* Normalises the JavaScript form of a hash table argument into its entry list. A `Map` is the
|
|
18
|
+
* expected form and any other iterable of pairs is accepted; anything else is rejected, a plain
|
|
19
|
+
* object above all, which `Array.from` would quietly flatten into an empty table.
|
|
20
|
+
*
|
|
21
|
+
* @param value The JavaScript value passed for a hash table argument.
|
|
22
|
+
*/
|
|
23
|
+
declare function toHashTableEntries(value: unknown): [unknown, unknown][] | null;
|
|
16
24
|
/**
|
|
17
25
|
* Converts a JavaScript value into the raw form native code expects, unwrapping
|
|
18
26
|
* object, struct, boxed, and fundamental wrappers back to their handles,
|
|
@@ -23,5 +31,5 @@ declare function fromNative(descriptor: Descriptor, value: unknown): unknown;
|
|
|
23
31
|
* @param value The JavaScript value to convert.
|
|
24
32
|
*/
|
|
25
33
|
declare function toNative(descriptor: Descriptor, value: unknown): unknown;
|
|
26
|
-
export { fromNative, toNative };
|
|
34
|
+
export { fromNative, toHashTableEntries, toNative };
|
|
27
35
|
//# sourceMappingURL=native-value.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-value.d.ts","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"AACA,OAAO,EAIH,KAAK,UAAU,EAKlB,MAAM,cAAc,CAAC;AAmMtB;;;;;;;;;;;;GAYG;AACH,iBAAS,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAiCnE;
|
|
1
|
+
{"version":3,"file":"native-value.d.ts","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"AACA,OAAO,EAIH,KAAK,UAAU,EAKlB,MAAM,cAAc,CAAC;AAmMtB;;;;;;;;;;;;GAYG;AACH,iBAAS,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAiCnE;AAMD;;;;;;GAMG;AACH,iBAAS,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAUvE;AAeD;;;;;;;;GAQG;AACH,iBAAS,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAyBjE;AAED,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/native-value.js
CHANGED
|
@@ -165,11 +165,28 @@ function fromNative(descriptor, value) {
|
|
|
165
165
|
function collectionToNative(descriptor, value) {
|
|
166
166
|
return value == null ? null : mapCollection(descriptor, value, toNative);
|
|
167
167
|
}
|
|
168
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Normalises the JavaScript form of a hash table argument into its entry list. A `Map` is the
|
|
170
|
+
* expected form and any other iterable of pairs is accepted; anything else is rejected, a plain
|
|
171
|
+
* object above all, which `Array.from` would quietly flatten into an empty table.
|
|
172
|
+
*
|
|
173
|
+
* @param value The JavaScript value passed for a hash table argument.
|
|
174
|
+
*/
|
|
175
|
+
function toHashTableEntries(value) {
|
|
169
176
|
if (value == null) {
|
|
170
177
|
return null;
|
|
171
178
|
}
|
|
172
|
-
|
|
179
|
+
if (typeof value[Symbol.iterator] !== "function") {
|
|
180
|
+
throw new TypeError("A hash table argument must be a Map or an iterable of [key, value] pairs");
|
|
181
|
+
}
|
|
182
|
+
return [...value];
|
|
183
|
+
}
|
|
184
|
+
function hashTableToNative(descriptor, value) {
|
|
185
|
+
const entries = toHashTableEntries(value);
|
|
186
|
+
if (entries === null) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
return entries.map(([key, val]) => [
|
|
173
190
|
toNative(descriptor.keyDescriptor, key),
|
|
174
191
|
toNative(descriptor.valueDescriptor, val),
|
|
175
192
|
]);
|
|
@@ -206,5 +223,5 @@ function toNative(descriptor, value) {
|
|
|
206
223
|
}
|
|
207
224
|
}
|
|
208
225
|
}
|
|
209
|
-
export { fromNative, toNative };
|
|
226
|
+
export { fromNative, toHashTableEntries, toNative };
|
|
210
227
|
//# sourceMappingURL=native-value.js.map
|
package/dist/native-value.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-value.js","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnyClass } from \"@gtkx/utils\";\nimport {\n bindFunctionPointer,\n call,\n type CallDescriptor,\n type Descriptor,\n type ExternalObject,\n getType,\n type Handle,\n type Ref,\n} from \"@gtkx/native\";\nimport {\n type ArrayDescriptor,\n type BoxedDescriptor,\n boxedT,\n type CallbackDescriptor,\n type FundamentalDescriptor,\n type HashTableDescriptor,\n isGtypeDescriptor,\n type ObjectDescriptor,\n refT,\n type StructDescriptor,\n} from \"./descriptors.js\";\nimport { checkError } from \"./error.js\";\nimport { LIB } from \"./library.js\";\nimport {\n coerceGType,\n getHandle,\n getWrapperClass,\n resolveWrapperClass,\n wrapCallScopedObject,\n wrapFundamentalHandle,\n wrapHandle,\n wrapObject,\n} from \"./registry.js\";\nimport { resolveDescriptorType } from \"./type.js\";\n\ntype MarshalledKind = \"object\" | \"struct\" | \"boxed\" | \"fundamental\" | \"array\" | \"hashtable\";\ntype MarshalledDescriptor = Extract<Descriptor, { kind: MarshalledKind }>;\ntype DecodedCallbackTarget = { fnPtr: bigint; userData?: bigint | undefined };\n\nconst MARSHALLED_KINDS: Set<Descriptor[\"kind\"]> = new Set<MarshalledKind>([\n \"object\",\n \"struct\",\n \"boxed\",\n \"fundamental\",\n \"array\",\n \"hashtable\",\n]);\n\nconst NULL_POINTER = 0n;\n\nfunction isMarshalledDescriptor(descriptor: Descriptor): descriptor is MarshalledDescriptor {\n return MARSHALLED_KINDS.has(descriptor.kind);\n}\n\nfunction mapCollection(\n descriptor: ArrayDescriptor,\n value: unknown,\n convert: (itemDescriptor: Descriptor, item: unknown) => unknown,\n): unknown[] {\n return (value as unknown[]).map((item) => convert(descriptor.itemDescriptor, item));\n}\n\nfunction collectionFromNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value === null ? null : mapCollection(descriptor, value, fromNative);\n}\n\nfunction boxedFromNative(descriptor: Descriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n const type = resolveDescriptorType(descriptor);\n const registered = resolveWrapperClass(type);\n\n if (registered !== null) {\n return wrapHandle(handle, registered);\n }\n\n const fallback = (descriptor as BoxedDescriptor).fallbackClass?.();\n\n if (fallback !== undefined) {\n return wrapHandle(handle, fallback);\n }\n\n return wrapHandle(handle, getWrapperClass(type));\n}\n\nfunction fundamentalWrapperClass(descriptor: FundamentalDescriptor, handle: ExternalObject<Handle>): AnyClass {\n if (descriptor.wrapperClass !== undefined) {\n return descriptor.wrapperClass;\n }\n\n const declaredType = resolveDescriptorType(descriptor);\n const registered = resolveWrapperClass(getType(handle, declaredType));\n\n if (registered !== null) {\n return registered;\n }\n\n const fallback = descriptor.fallbackClass?.();\n\n if (fallback !== undefined) {\n return fallback;\n }\n\n return getWrapperClass(declaredType);\n}\n\nfunction fundamentalFromNative(descriptor: FundamentalDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n\n return wrapFundamentalHandle(handle, fundamentalWrapperClass(descriptor, handle));\n}\n\nconst errorRefDescriptor = (): Descriptor =>\n refT(boxedT(\"GError\", { ownership: \"full\", sharedLibrary: LIB, getTypeFnName: \"g_error_get_type\" }));\n\nfunction decodedCallbackValues(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n inputs: unknown[],\n): unknown[] {\n const values: unknown[] = [];\n let cursor = 0;\n\n for (const [index, argDescriptor] of descriptor.argDescriptors.entries()) {\n if (index === descriptor.userDataIndex) {\n values.push(target.userData ?? NULL_POINTER);\n } else {\n values.push(toNative(argDescriptor, inputs[cursor]));\n cursor += 1;\n }\n }\n\n return values;\n}\n\nfunction decodedCallbackCallable(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n): (...inputs: unknown[]) => unknown {\n const canThrow = descriptor.canThrow === true;\n const isOneShot = descriptor.scope === \"async\";\n const argDescriptors = canThrow ? [...descriptor.argDescriptors, errorRefDescriptor()] : descriptor.argDescriptors;\n let bound: ExternalObject<CallDescriptor> | undefined;\n let isSpent = false;\n\n return (...inputs) => {\n if (isSpent) {\n throw new Error(\"An async-scoped callback was already invoked; its native caller has released it\");\n }\n\n bound ??= bindFunctionPointer(target.fnPtr, argDescriptors, descriptor.returnDescriptor, \"decoded callback\");\n const values = decodedCallbackValues(descriptor, target, inputs);\n isSpent = isOneShot;\n\n if (!canThrow) {\n return fromNative(descriptor.returnDescriptor, call(bound, values));\n }\n\n const errorRef: Ref = { value: null };\n values.push(errorRef);\n const result = call(bound, values);\n checkError(errorRef);\n\n return fromNative(descriptor.returnDescriptor, result);\n };\n}\n\nfunction callbackFromNative(descriptor: CallbackDescriptor, value: unknown): unknown {\n if (value == null) {\n return value;\n }\n\n const target = value as Partial<DecodedCallbackTarget>;\n\n if (typeof target.fnPtr !== \"bigint\") {\n return value;\n }\n\n return decodedCallbackCallable(descriptor, { fnPtr: target.fnPtr, userData: target.userData });\n}\n\nfunction hashTableFromNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value === null) {\n return null;\n }\n\n const entries = value as [unknown, unknown][];\n\n return new Map(\n entries.map(([key, val]): [unknown, unknown] => [\n fromNative(descriptor.keyDescriptor, key),\n fromNative(descriptor.valueDescriptor, val),\n ]),\n );\n}\n\n/**\n * Converts a raw value returned from native code into its JavaScript form,\n * wrapping object, struct, boxed, and fundamental handles and recursively\n * converting arrays and hash tables according to the descriptor. A callback\n * decoded from a native function pointer and its bound user data becomes a\n * callable function that invokes the native callback; it stays valid only as\n * long as the native caller keeps the pointer pair alive, which for an\n * async-scoped callback means until the first invocation — calling one a\n * second time throws instead of reaching the released native closure.\n *\n * @param descriptor Describes the native type of the value.\n * @param value The raw native value to convert.\n */\nfunction fromNative(descriptor: Descriptor, value: unknown): unknown {\n if (descriptor.kind === \"callback\") {\n return callbackFromNative(descriptor, value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\": {\n const fallbackClass = (descriptor as ObjectDescriptor).fallbackClass;\n\n return descriptor.isCallScoped === true\n ? wrapCallScopedObject(value, fallbackClass)\n : wrapObject(value, fallbackClass);\n }\n case \"struct\": {\n return wrapHandle(value as ExternalObject<Handle> | null, (descriptor as StructDescriptor).wrapperClass);\n }\n case \"boxed\": {\n return boxedFromNative(descriptor, value);\n }\n case \"fundamental\": {\n return fundamentalFromNative(descriptor, value);\n }\n case \"array\": {\n return collectionFromNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableFromNative(descriptor, value);\n }\n }\n}\n\nfunction collectionToNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value == null ? null : mapCollection(descriptor, value, toNative);\n}\n\nfunction hashTableToNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n return [...(value as Map<unknown, unknown>)].map(([key, val]): [unknown, unknown] => [\n toNative(descriptor.keyDescriptor, key),\n toNative(descriptor.valueDescriptor, val),\n ]);\n}\n\n/**\n * Converts a JavaScript value into the raw form native code expects, unwrapping\n * object, struct, boxed, and fundamental wrappers back to their handles,\n * resolving a class passed for a GType to the GType it was registered under, and\n * recursively converting arrays and maps according to the descriptor.\n *\n * @param descriptor Describes the native type to convert to.\n * @param value The JavaScript value to convert.\n */\nfunction toNative(descriptor: Descriptor, value: unknown): unknown {\n if (isGtypeDescriptor(descriptor)) {\n return coerceGType(value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\":\n case \"struct\":\n case \"boxed\":\n case \"fundamental\": {\n const instance = value as object | null | undefined;\n\n return instance == null ? null : getHandle(instance);\n }\n case \"array\": {\n return collectionToNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableToNative(descriptor, value);\n }\n }\n}\n\nexport { fromNative, toNative };\n"]}
|
|
1
|
+
{"version":3,"file":"native-value.js","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"AACA,OAAO,EACH,mBAAmB,EACnB,IAAI,EAIJ,OAAO,GAGV,MAAM,cAAc,CAAC;AACtB,OAAO,EAGH,MAAM,EAIN,iBAAiB,EAEjB,IAAI,GAEP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EACH,WAAW,EACX,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,UAAU,EACV,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAMlD,MAAM,gBAAgB,GAA4B,IAAI,GAAG,CAAiB;IACtE,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,aAAa;IACb,OAAO;IACP,WAAW;CACd,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,SAAS,sBAAsB,CAAC,UAAsB;IAClD,OAAO,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CAClB,UAA2B,EAC3B,KAAc,EACd,OAA+D;IAE/D,OAAQ,KAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,oBAAoB,CAAC,UAA2B,EAAE,KAAc;IACrE,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,eAAe,CAAC,UAAsB,EAAE,KAAc;IAC3D,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,KAA+B,CAAC;IAC/C,MAAM,IAAI,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAI,UAA8B,CAAC,aAAa,EAAE,EAAE,CAAC;IAEnE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAiC,EAAE,MAA8B;IAC9F,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,UAAU,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,MAAM,YAAY,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC;IAE9C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,eAAe,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAiC,EAAE,KAAc;IAC5E,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,KAA+B,CAAC;IAE/C,OAAO,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,kBAAkB,GAAG,GAAe,EAAE,CACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;AAEzG,SAAS,qBAAqB,CAC1B,UAA8B,EAC9B,MAA6B,EAC7B,MAAiB;IAEjB,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;QACvE,IAAI,KAAK,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,YAAY,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,uBAAuB,CAC5B,UAA8B,EAC9B,MAA6B;IAE7B,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,KAAK,OAAO,CAAC;IAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC;IACnH,IAAI,KAAiD,CAAC;IACtD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE;QACjB,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACvG,CAAC;QAED,KAAK,KAAK,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,UAAU,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjE,OAAO,GAAG,SAAS,CAAC;QAEpB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,QAAQ,GAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAErB,OAAO,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA8B,EAAE,KAAc;IACtE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,KAAuC,CAAC;IAEvD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,uBAAuB,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA+B,EAAE,KAAc;IACxE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,KAA6B,CAAC;IAE9C,OAAO,IAAI,GAAG,CACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAsB,EAAE,CAAC;QAC5C,UAAU,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC;QACzC,UAAU,CAAC,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC;KAC9C,CAAC,CACL,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,UAAU,CAAC,UAAsB,EAAE,KAAc;IACtD,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,MAAM,aAAa,GAAI,UAA+B,CAAC,aAAa,CAAC;YAErE,OAAO,UAAU,CAAC,YAAY,KAAK,IAAI;gBACnC,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,aAAa,CAAC;gBAC5C,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,OAAO,UAAU,CAAC,KAAsC,EAAG,UAA+B,CAAC,YAAY,CAAC,CAAC;QAC7G,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,OAAO,eAAe,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACjB,OAAO,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,OAAO,oBAAoB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACf,OAAO,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA2B,EAAE,KAAc;IACnE,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,KAAc;IACtC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,OAAQ,KAAoC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,UAAU,EAAE,CAAC;QAC/E,MAAM,IAAI,SAAS,CAAC,0EAA0E,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,CAAC,GAAI,KAAsC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,iBAAiB,CAAC,UAA+B,EAAE,KAAc;IACtE,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAsB,EAAE,CAAC;QACnD,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC;QACvC,QAAQ,CAAC,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC;KAC5C,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,QAAQ,CAAC,UAAsB,EAAE,KAAc;IACpD,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,aAAa,CAAC,CAAC,CAAC;YACjB,MAAM,QAAQ,GAAG,KAAkC,CAAC;YAEpD,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACf,OAAO,iBAAiB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;AACL,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import type { AnyClass } from \"@gtkx/utils\";\nimport {\n bindFunctionPointer,\n call,\n type CallDescriptor,\n type Descriptor,\n type ExternalObject,\n getType,\n type Handle,\n type Ref,\n} from \"@gtkx/native\";\nimport {\n type ArrayDescriptor,\n type BoxedDescriptor,\n boxedT,\n type CallbackDescriptor,\n type FundamentalDescriptor,\n type HashTableDescriptor,\n isGtypeDescriptor,\n type ObjectDescriptor,\n refT,\n type StructDescriptor,\n} from \"./descriptors.js\";\nimport { checkError } from \"./error.js\";\nimport { LIB } from \"./library.js\";\nimport {\n coerceGType,\n getHandle,\n getWrapperClass,\n resolveWrapperClass,\n wrapCallScopedObject,\n wrapFundamentalHandle,\n wrapHandle,\n wrapObject,\n} from \"./registry.js\";\nimport { resolveDescriptorType } from \"./type.js\";\n\ntype MarshalledKind = \"object\" | \"struct\" | \"boxed\" | \"fundamental\" | \"array\" | \"hashtable\";\ntype MarshalledDescriptor = Extract<Descriptor, { kind: MarshalledKind }>;\ntype DecodedCallbackTarget = { fnPtr: bigint; userData?: bigint | undefined };\n\nconst MARSHALLED_KINDS: Set<Descriptor[\"kind\"]> = new Set<MarshalledKind>([\n \"object\",\n \"struct\",\n \"boxed\",\n \"fundamental\",\n \"array\",\n \"hashtable\",\n]);\n\nconst NULL_POINTER = 0n;\n\nfunction isMarshalledDescriptor(descriptor: Descriptor): descriptor is MarshalledDescriptor {\n return MARSHALLED_KINDS.has(descriptor.kind);\n}\n\nfunction mapCollection(\n descriptor: ArrayDescriptor,\n value: unknown,\n convert: (itemDescriptor: Descriptor, item: unknown) => unknown,\n): unknown[] {\n return (value as unknown[]).map((item) => convert(descriptor.itemDescriptor, item));\n}\n\nfunction collectionFromNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value === null ? null : mapCollection(descriptor, value, fromNative);\n}\n\nfunction boxedFromNative(descriptor: Descriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n const type = resolveDescriptorType(descriptor);\n const registered = resolveWrapperClass(type);\n\n if (registered !== null) {\n return wrapHandle(handle, registered);\n }\n\n const fallback = (descriptor as BoxedDescriptor).fallbackClass?.();\n\n if (fallback !== undefined) {\n return wrapHandle(handle, fallback);\n }\n\n return wrapHandle(handle, getWrapperClass(type));\n}\n\nfunction fundamentalWrapperClass(descriptor: FundamentalDescriptor, handle: ExternalObject<Handle>): AnyClass {\n if (descriptor.wrapperClass !== undefined) {\n return descriptor.wrapperClass;\n }\n\n const declaredType = resolveDescriptorType(descriptor);\n const registered = resolveWrapperClass(getType(handle, declaredType));\n\n if (registered !== null) {\n return registered;\n }\n\n const fallback = descriptor.fallbackClass?.();\n\n if (fallback !== undefined) {\n return fallback;\n }\n\n return getWrapperClass(declaredType);\n}\n\nfunction fundamentalFromNative(descriptor: FundamentalDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n\n return wrapFundamentalHandle(handle, fundamentalWrapperClass(descriptor, handle));\n}\n\nconst errorRefDescriptor = (): Descriptor =>\n refT(boxedT(\"GError\", { ownership: \"full\", sharedLibrary: LIB, getTypeFnName: \"g_error_get_type\" }));\n\nfunction decodedCallbackValues(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n inputs: unknown[],\n): unknown[] {\n const values: unknown[] = [];\n let cursor = 0;\n\n for (const [index, argDescriptor] of descriptor.argDescriptors.entries()) {\n if (index === descriptor.userDataIndex) {\n values.push(target.userData ?? NULL_POINTER);\n } else {\n values.push(toNative(argDescriptor, inputs[cursor]));\n cursor += 1;\n }\n }\n\n return values;\n}\n\nfunction decodedCallbackCallable(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n): (...inputs: unknown[]) => unknown {\n const canThrow = descriptor.canThrow === true;\n const isOneShot = descriptor.scope === \"async\";\n const argDescriptors = canThrow ? [...descriptor.argDescriptors, errorRefDescriptor()] : descriptor.argDescriptors;\n let bound: ExternalObject<CallDescriptor> | undefined;\n let isSpent = false;\n\n return (...inputs) => {\n if (isSpent) {\n throw new Error(\"An async-scoped callback was already invoked; its native caller has released it\");\n }\n\n bound ??= bindFunctionPointer(target.fnPtr, argDescriptors, descriptor.returnDescriptor, \"decoded callback\");\n const values = decodedCallbackValues(descriptor, target, inputs);\n isSpent = isOneShot;\n\n if (!canThrow) {\n return fromNative(descriptor.returnDescriptor, call(bound, values));\n }\n\n const errorRef: Ref = { value: null };\n values.push(errorRef);\n const result = call(bound, values);\n checkError(errorRef);\n\n return fromNative(descriptor.returnDescriptor, result);\n };\n}\n\nfunction callbackFromNative(descriptor: CallbackDescriptor, value: unknown): unknown {\n if (value == null) {\n return value;\n }\n\n const target = value as Partial<DecodedCallbackTarget>;\n\n if (typeof target.fnPtr !== \"bigint\") {\n return value;\n }\n\n return decodedCallbackCallable(descriptor, { fnPtr: target.fnPtr, userData: target.userData });\n}\n\nfunction hashTableFromNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value === null) {\n return null;\n }\n\n const entries = value as [unknown, unknown][];\n\n return new Map(\n entries.map(([key, val]): [unknown, unknown] => [\n fromNative(descriptor.keyDescriptor, key),\n fromNative(descriptor.valueDescriptor, val),\n ]),\n );\n}\n\n/**\n * Converts a raw value returned from native code into its JavaScript form,\n * wrapping object, struct, boxed, and fundamental handles and recursively\n * converting arrays and hash tables according to the descriptor. A callback\n * decoded from a native function pointer and its bound user data becomes a\n * callable function that invokes the native callback; it stays valid only as\n * long as the native caller keeps the pointer pair alive, which for an\n * async-scoped callback means until the first invocation — calling one a\n * second time throws instead of reaching the released native closure.\n *\n * @param descriptor Describes the native type of the value.\n * @param value The raw native value to convert.\n */\nfunction fromNative(descriptor: Descriptor, value: unknown): unknown {\n if (descriptor.kind === \"callback\") {\n return callbackFromNative(descriptor, value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\": {\n const fallbackClass = (descriptor as ObjectDescriptor).fallbackClass;\n\n return descriptor.isCallScoped === true\n ? wrapCallScopedObject(value, fallbackClass)\n : wrapObject(value, fallbackClass);\n }\n case \"struct\": {\n return wrapHandle(value as ExternalObject<Handle> | null, (descriptor as StructDescriptor).wrapperClass);\n }\n case \"boxed\": {\n return boxedFromNative(descriptor, value);\n }\n case \"fundamental\": {\n return fundamentalFromNative(descriptor, value);\n }\n case \"array\": {\n return collectionFromNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableFromNative(descriptor, value);\n }\n }\n}\n\nfunction collectionToNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value == null ? null : mapCollection(descriptor, value, toNative);\n}\n\n/**\n * Normalises the JavaScript form of a hash table argument into its entry list. A `Map` is the\n * expected form and any other iterable of pairs is accepted; anything else is rejected, a plain\n * object above all, which `Array.from` would quietly flatten into an empty table.\n *\n * @param value The JavaScript value passed for a hash table argument.\n */\nfunction toHashTableEntries(value: unknown): [unknown, unknown][] | null {\n if (value == null) {\n return null;\n }\n\n if (typeof (value as Partial<Iterable<unknown>>)[Symbol.iterator] !== \"function\") {\n throw new TypeError(\"A hash table argument must be a Map or an iterable of [key, value] pairs\");\n }\n\n return [...(value as Iterable<[unknown, unknown]>)];\n}\n\nfunction hashTableToNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n const entries = toHashTableEntries(value);\n\n if (entries === null) {\n return null;\n }\n\n return entries.map(([key, val]): [unknown, unknown] => [\n toNative(descriptor.keyDescriptor, key),\n toNative(descriptor.valueDescriptor, val),\n ]);\n}\n\n/**\n * Converts a JavaScript value into the raw form native code expects, unwrapping\n * object, struct, boxed, and fundamental wrappers back to their handles,\n * resolving a class passed for a GType to the GType it was registered under, and\n * recursively converting arrays and maps according to the descriptor.\n *\n * @param descriptor Describes the native type to convert to.\n * @param value The JavaScript value to convert.\n */\nfunction toNative(descriptor: Descriptor, value: unknown): unknown {\n if (isGtypeDescriptor(descriptor)) {\n return coerceGType(value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\":\n case \"struct\":\n case \"boxed\":\n case \"fundamental\": {\n const instance = value as object | null | undefined;\n\n return instance == null ? null : getHandle(instance);\n }\n case \"array\": {\n return collectionToNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableToNative(descriptor, value);\n }\n }\n}\n\nexport { fromNative, toHashTableEntries, toNative };\n"]}
|
package/dist/object.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Descriptor } from "@gtkx/native";
|
|
2
2
|
import { type AnyClass } from "@gtkx/utils";
|
|
3
|
+
import { propertyMapOverride, writablePropertyMapOverride } from "./property-brand.js";
|
|
3
4
|
/**
|
|
4
5
|
* One construct property a wrapper class accepts: the canonical `GObject` name it is set under,
|
|
5
6
|
* and the descriptor its value is marshalled through.
|
|
@@ -54,6 +55,11 @@ declare function newObjectWithProperties<T extends object>(gtype: bigint, props:
|
|
|
54
55
|
* @param propertyName The property name.
|
|
55
56
|
* @param descriptor Describes the property's type.
|
|
56
57
|
*/
|
|
58
|
+
declare function getObjectProperty<TObject extends {
|
|
59
|
+
__properties__: object;
|
|
60
|
+
}, TPropertyMap extends object = TObject extends {
|
|
61
|
+
[propertyMapOverride]?: infer TResolver;
|
|
62
|
+
} ? TResolver extends () => infer TMap ? Extract<NonNullable<TMap>, object> : TObject["__properties__"] : TObject["__properties__"], TName extends Extract<keyof NoInfer<TPropertyMap>, string> = Extract<keyof NoInfer<TPropertyMap>, string>>(obj: TObject, propertyName: TName): NoInfer<TPropertyMap>[TName];
|
|
57
63
|
declare function getObjectProperty(obj: object, propertyName: string, descriptor: Descriptor): unknown;
|
|
58
64
|
/**
|
|
59
65
|
* Writes a JavaScript value to a GObject property, converting it to native form
|
|
@@ -68,6 +74,11 @@ declare function getObjectProperty(obj: object, propertyName: string, descriptor
|
|
|
68
74
|
* @param descriptor Describes the property's type.
|
|
69
75
|
* @param jsValue The value to set.
|
|
70
76
|
*/
|
|
77
|
+
declare function setObjectProperty<TObject extends {
|
|
78
|
+
__writableProperties__: object;
|
|
79
|
+
}, TPropertyMap extends object = TObject extends {
|
|
80
|
+
[writablePropertyMapOverride]?: infer TResolver;
|
|
81
|
+
} ? TResolver extends () => infer TMap ? Extract<NonNullable<TMap>, object> : TObject["__writableProperties__"] : TObject["__writableProperties__"], TName extends Extract<keyof NoInfer<TPropertyMap>, string> = Extract<keyof NoInfer<TPropertyMap>, string>>(obj: TObject, propertyName: TName, jsValue: NoInfer<TPropertyMap>[TName]): void;
|
|
71
82
|
declare function setObjectProperty(obj: object, propertyName: string, descriptor: Descriptor, jsValue: unknown): void;
|
|
72
83
|
export { newObjectWithProperties, getObjectProperty, registerConstructProperties, setObjectProperty, type ConstructBinding, type ConstructBindings, };
|
|
73
84
|
//# sourceMappingURL=object.d.ts.map
|
package/dist/object.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAA+C,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAA+C,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAW5D,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAIvF;;;GAGG;AACH,KAAK,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC/D,wGAAwG;AACxG,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAmE1D;;;;;;;;;GASG;AACH,iBAAS,2BAA2B,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAGrF;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,iBAAS,uBAAuB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAsB9F;AAED;;;;;;;GAOG;AACH,iBAAS,iBAAiB,CACtB,OAAO,SAAS;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,EAC1C,YAAY,SAAS,MAAM,GAAG,OAAO,SAAS;IAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,MAAM,SAAS,CAAA;CAAE,GACnF,SAAS,SAAS,MAAM,MAAM,IAAI,GAC9B,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,gBAAgB,CAAC,GAC7B,OAAO,CAAC,gBAAgB,CAAC,EAC/B,KAAK,SAAS,OAAO,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,EAC3G,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC;AACnE,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC;AAmB/F;;;;;;;;;;;;GAYG;AACH,iBAAS,iBAAiB,CACtB,OAAO,SAAS;IAAE,sBAAsB,EAAE,MAAM,CAAA;CAAE,EAClD,YAAY,SAAS,MAAM,GAAG,OAAO,SAAS;IAAE,CAAC,2BAA2B,CAAC,CAAC,EAAE,MAAM,SAAS,CAAA;CAAE,GAC3F,SAAS,SAAS,MAAM,MAAM,IAAI,GAC9B,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,wBAAwB,CAAC,GACrC,OAAO,CAAC,wBAAwB,CAAC,EACvC,KAAK,SAAS,OAAO,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,EAC3G,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;AAClF,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;AAiB9G,OAAO,EACH,uBAAuB,EACvB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACzB,CAAC"}
|
package/dist/object.js
CHANGED
|
@@ -3,9 +3,10 @@ import { getParentClass } from "@gtkx/utils";
|
|
|
3
3
|
import { bind } from "./bind.js";
|
|
4
4
|
import { objectT, stringT, voidT } from "./descriptors.js";
|
|
5
5
|
import { LIB, VALUE_T } from "./library.js";
|
|
6
|
-
import { coercePropertyValue, constructPropertyFor } from "./properties.js";
|
|
6
|
+
import { coercePropertyValue, constructPropertyFor, readableObjectPropertyFor, writableObjectPropertyFor, } from "./properties.js";
|
|
7
|
+
import { propertyMapOverride, writablePropertyMapOverride } from "./property-brand.js";
|
|
7
8
|
import { getHandle, registerWrapper } from "./registry.js";
|
|
8
|
-
import { fromValueForDescriptor, newValueForDescriptor, toValue } from "./value.js";
|
|
9
|
+
import { fromValue, fromValueForDescriptor, newValueForDescriptor, toValue } from "./value.js";
|
|
9
10
|
const declaredBindings = new WeakMap();
|
|
10
11
|
const resolvedBindings = new WeakMap();
|
|
11
12
|
const declarations = { generation: 0 };
|
|
@@ -113,34 +114,26 @@ function newObjectWithProperties(gtype, props, wrapper) {
|
|
|
113
114
|
}
|
|
114
115
|
return wrapper;
|
|
115
116
|
}
|
|
116
|
-
/**
|
|
117
|
-
* Reads a GObject property and converts it to its JavaScript value using the
|
|
118
|
-
* descriptor.
|
|
119
|
-
*
|
|
120
|
-
* @param obj The object to read from.
|
|
121
|
-
* @param propertyName The property name.
|
|
122
|
-
* @param descriptor Describes the property's type.
|
|
123
|
-
*/
|
|
124
117
|
function getObjectProperty(obj, propertyName, descriptor) {
|
|
118
|
+
if (arguments.length === 2) {
|
|
119
|
+
const property = readableObjectPropertyFor(obj, propertyName);
|
|
120
|
+
gObjectGetProperty(getHandle(obj), property.name, property.value);
|
|
121
|
+
return fromValue(property.value);
|
|
122
|
+
}
|
|
123
|
+
if (descriptor === undefined) {
|
|
124
|
+
throw new TypeError("getObjectProperty requires a property descriptor when called with three arguments");
|
|
125
|
+
}
|
|
125
126
|
const value = newValueForDescriptor(descriptor);
|
|
126
127
|
gObjectGetProperty(getHandle(obj), propertyName, value);
|
|
127
128
|
return fromValueForDescriptor(descriptor, value);
|
|
128
129
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
*
|
|
137
|
-
* @param obj The object to write to.
|
|
138
|
-
* @param propertyName The property name.
|
|
139
|
-
* @param descriptor Describes the property's type.
|
|
140
|
-
* @param jsValue The value to set.
|
|
141
|
-
*/
|
|
142
|
-
function setObjectProperty(obj, propertyName, descriptor, jsValue) {
|
|
143
|
-
gObjectSetProperty(getHandle(obj), propertyName, toValue(descriptor, jsValue));
|
|
130
|
+
function setObjectProperty(obj, propertyName, descriptorOrValue, jsValue) {
|
|
131
|
+
if (arguments.length === 3) {
|
|
132
|
+
const property = writableObjectPropertyFor(obj, propertyName, descriptorOrValue);
|
|
133
|
+
gObjectSetProperty(getHandle(obj), property.name, property.value);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
gObjectSetProperty(getHandle(obj), propertyName, toValue(descriptorOrValue, jsValue));
|
|
144
137
|
}
|
|
145
138
|
export { newObjectWithProperties, getObjectProperty, registerConstructProperties, setObjectProperty, };
|
|
146
139
|
//# sourceMappingURL=object.js.map
|
package/dist/object.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.js","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Descriptor, type ExternalObject, type Handle, newObject } from \"@gtkx/native\";\nimport { type AnyClass, getParentClass } from \"@gtkx/utils\";\nimport { bind } from \"./bind.js\";\nimport { objectT, stringT, voidT } from \"./descriptors.js\";\nimport { LIB, VALUE_T } from \"./library.js\";\nimport { coercePropertyValue, type ConstructProperty, constructPropertyFor } from \"./properties.js\";\nimport { getHandle, registerWrapper } from \"./registry.js\";\nimport { fromValueForDescriptor, newValueForDescriptor, toValue } from \"./value.js\";\n\n/**\n * One construct property a wrapper class accepts: the canonical `GObject` name it is set under,\n * and the descriptor its value is marshalled through.\n */\ntype ConstructBinding = [name: string, descriptor: Descriptor];\n/** The construct properties a wrapper class accepts, keyed by the camelCased name callers give them. */\ntype ConstructBindings = Record<string, ConstructBinding>;\ntype ResolvedBindings = { generation: number; bindings: ConstructBindings };\n\nconst declaredBindings: WeakMap<AnyClass, ConstructBindings> = new WeakMap();\nconst resolvedBindings: WeakMap<AnyClass, ResolvedBindings> = new WeakMap();\nconst declarations = { generation: 0 };\nconst NO_BINDINGS: ConstructBindings = Object.create(null) as ConstructBindings;\n\nconst gObjectGetProperty = bind(\n LIB,\n \"g_object_get_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\n\nconst gObjectSetProperty = bind(\n LIB,\n \"g_object_set_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\n\nfunction collectDeclaredBindings(cls: AnyClass): ConstructBindings[] {\n const declared: ConstructBindings[] = [];\n let current: AnyClass | null = cls;\n\n while (current !== null) {\n const own = declaredBindings.get(current);\n\n if (own !== undefined) {\n declared.push(own);\n }\n\n current = getParentClass(current);\n }\n\n return declared;\n}\n\nfunction mergeDeclaredBindings(cls: AnyClass): ConstructBindings {\n const declared = collectDeclaredBindings(cls);\n const merged: ConstructBindings = Object.create(null) as ConstructBindings;\n\n for (let index = declared.length - 1; index >= 0; index--) {\n Object.assign(merged, declared[index]);\n }\n\n return merged;\n}\n\nfunction constructBindingsFor(cls: AnyClass | undefined): ConstructBindings {\n if (cls === undefined) {\n return NO_BINDINGS;\n }\n\n const cached = resolvedBindings.get(cls);\n\n if (cached?.generation === declarations.generation) {\n return cached.bindings;\n }\n\n const bindings = mergeDeclaredBindings(cls);\n resolvedBindings.set(cls, { generation: declarations.generation, bindings });\n\n return bindings;\n}\n\n/**\n * Declares the construct properties a wrapper class accepts, so `newObjectWithProperties`\n * marshals each one through its descriptor rather than resolving it from the\n * `GObject.ParamSpec` the type installs. A class inherits the declarations of its ancestors.\n * Registering takes effect immediately, including for classes already constructed from and for\n * subclasses that already inherited an earlier declaration.\n *\n * @param cls The wrapper class the properties are declared on.\n * @param bindings CamelCased property names mapped to their canonical name and descriptor.\n */\nfunction registerConstructProperties(cls: AnyClass, bindings: ConstructBindings): void {\n declaredBindings.set(cls, bindings);\n declarations.generation += 1;\n}\n\nfunction constructPropertyForEntry(\n source: { gtype: bigint; bindings: ConstructBindings; wrapper: object },\n name: string,\n value: unknown,\n): ConstructProperty | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const binding = source.bindings[name];\n\n if (binding === undefined) {\n return constructPropertyFor(source.gtype, name, value, source.wrapper);\n }\n\n return { name: binding[0], value: toValue(binding[1], coercePropertyValue(source.gtype, binding[0], value)) };\n}\n\n/**\n * Constructs a new GObject of the given type, setting the supplied construct\n * properties, and binds `wrapper` to it. A property the wrapper's class declares\n * through `registerConstructProperties` is marshalled through its descriptor; any\n * other one is marshalled through the `GObject.ParamSpec` the type installs under\n * that name, dashed or camelCased, and is skipped when the type installs none.\n * A value that ParamSpec would refuse throws before GObject sees it: a `TypeError`\n * for a read-only property and for a value of a type the property cannot hold, and\n * a `RangeError` for a value the ParamSpec rejects. A value marshalled through a\n * declared descriptor is converted rather than checked, so a `null` handed to a\n * numeric one of those lands 0 rather than being refused, and a number is fitted to\n * the property first, as `coerceObjectProperty` does: truncated toward zero for a\n * whole-number property and clamped to the range its `GObject.ParamSpec` allows.\n * Properties whose value is `undefined` are skipped. A type registered with\n * `registerClass` binds the wrapper before its `constructed` slot runs, so an\n * override of that slot already sees a usable instance.\n * When construction returns an object that already has a wrapper — it reached\n * JavaScript and was wrapped before `g_object_new` returned, for example a\n * `Gtk.Window` observed through the toplevels list — that existing wrapper is\n * returned instead of binding `wrapper`, so both references stay one object.\n *\n * @param gtype The GType of the object to construct.\n * @param props Property names mapped to the values to set them to.\n * @param wrapper The wrapper instance to bind to the new object.\n * @returns The wrapper bound to the constructed object: `wrapper` itself, or\n * the wrapper the object already had.\n */\nfunction newObjectWithProperties<T extends object>(gtype: bigint, props: object, wrapper: T): T {\n const names: string[] = [];\n const values: ExternalObject<Handle>[] = [];\n const bindings = constructBindingsFor(wrapper.constructor as AnyClass | undefined);\n const source = { gtype, bindings, wrapper };\n\n for (const name of Object.keys(props)) {\n const property = constructPropertyForEntry(source, name, Reflect.get(props, name));\n\n if (property !== undefined) {\n names.push(property.name);\n values.push(property.value);\n }\n }\n\n const existing = newObject(gtype, names, values, wrapper, registerWrapper);\n\n if (existing !== null) {\n return existing as T;\n }\n\n return wrapper;\n}\n\n/**\n * Reads a GObject property and converts it to its JavaScript value using the\n * descriptor.\n *\n * @param obj The object to read from.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n */\nfunction getObjectProperty(obj: object, propertyName: string, descriptor: Descriptor): unknown {\n const value = newValueForDescriptor(descriptor);\n gObjectGetProperty(getHandle(obj), propertyName, value);\n\n return fromValueForDescriptor(descriptor, value);\n}\n\n/**\n * Writes a JavaScript value to a GObject property, converting it to native form\n * using the descriptor. The descriptor converts what it is given rather than checking it against\n * the property's `GObject.ParamSpec`, so `null` and `undefined` written to a numeric or enum\n * property land 0, and a fractional number written to a whole-number property is truncated toward\n * zero, where the same writes to a property installed through `registerClass` are refused with a\n * `TypeError`.\n *\n * @param obj The object to write to.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n * @param jsValue The value to set.\n */\nfunction setObjectProperty(obj: object, propertyName: string, descriptor: Descriptor, jsValue: unknown): void {\n gObjectSetProperty(getHandle(obj), propertyName, toValue(descriptor, jsValue));\n}\n\nexport {\n newObjectWithProperties,\n getObjectProperty,\n registerConstructProperties,\n setObjectProperty,\n type ConstructBinding,\n type ConstructBindings,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"object.js","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Descriptor, type ExternalObject, type Handle, newObject } from \"@gtkx/native\";\nimport { type AnyClass, getParentClass } from \"@gtkx/utils\";\nimport { bind } from \"./bind.js\";\nimport { objectT, stringT, voidT } from \"./descriptors.js\";\nimport { LIB, VALUE_T } from \"./library.js\";\nimport {\n coercePropertyValue,\n type ConstructProperty,\n constructPropertyFor,\n readableObjectPropertyFor,\n writableObjectPropertyFor,\n} from \"./properties.js\";\nimport { propertyMapOverride, writablePropertyMapOverride } from \"./property-brand.js\";\nimport { getHandle, registerWrapper } from \"./registry.js\";\nimport { fromValue, fromValueForDescriptor, newValueForDescriptor, toValue } from \"./value.js\";\n\n/**\n * One construct property a wrapper class accepts: the canonical `GObject` name it is set under,\n * and the descriptor its value is marshalled through.\n */\ntype ConstructBinding = [name: string, descriptor: Descriptor];\n/** The construct properties a wrapper class accepts, keyed by the camelCased name callers give them. */\ntype ConstructBindings = Record<string, ConstructBinding>;\ntype ResolvedBindings = { generation: number; bindings: ConstructBindings };\n\nconst declaredBindings: WeakMap<AnyClass, ConstructBindings> = new WeakMap();\nconst resolvedBindings: WeakMap<AnyClass, ResolvedBindings> = new WeakMap();\nconst declarations = { generation: 0 };\nconst NO_BINDINGS: ConstructBindings = Object.create(null) as ConstructBindings;\n\nconst gObjectGetProperty = bind(\n LIB,\n \"g_object_get_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\n\nconst gObjectSetProperty = bind(\n LIB,\n \"g_object_set_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\n\nfunction collectDeclaredBindings(cls: AnyClass): ConstructBindings[] {\n const declared: ConstructBindings[] = [];\n let current: AnyClass | null = cls;\n\n while (current !== null) {\n const own = declaredBindings.get(current);\n\n if (own !== undefined) {\n declared.push(own);\n }\n\n current = getParentClass(current);\n }\n\n return declared;\n}\n\nfunction mergeDeclaredBindings(cls: AnyClass): ConstructBindings {\n const declared = collectDeclaredBindings(cls);\n const merged: ConstructBindings = Object.create(null) as ConstructBindings;\n\n for (let index = declared.length - 1; index >= 0; index--) {\n Object.assign(merged, declared[index]);\n }\n\n return merged;\n}\n\nfunction constructBindingsFor(cls: AnyClass | undefined): ConstructBindings {\n if (cls === undefined) {\n return NO_BINDINGS;\n }\n\n const cached = resolvedBindings.get(cls);\n\n if (cached?.generation === declarations.generation) {\n return cached.bindings;\n }\n\n const bindings = mergeDeclaredBindings(cls);\n resolvedBindings.set(cls, { generation: declarations.generation, bindings });\n\n return bindings;\n}\n\n/**\n * Declares the construct properties a wrapper class accepts, so `newObjectWithProperties`\n * marshals each one through its descriptor rather than resolving it from the\n * `GObject.ParamSpec` the type installs. A class inherits the declarations of its ancestors.\n * Registering takes effect immediately, including for classes already constructed from and for\n * subclasses that already inherited an earlier declaration.\n *\n * @param cls The wrapper class the properties are declared on.\n * @param bindings CamelCased property names mapped to their canonical name and descriptor.\n */\nfunction registerConstructProperties(cls: AnyClass, bindings: ConstructBindings): void {\n declaredBindings.set(cls, bindings);\n declarations.generation += 1;\n}\n\nfunction constructPropertyForEntry(\n source: { gtype: bigint; bindings: ConstructBindings; wrapper: object },\n name: string,\n value: unknown,\n): ConstructProperty | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const binding = source.bindings[name];\n\n if (binding === undefined) {\n return constructPropertyFor(source.gtype, name, value, source.wrapper);\n }\n\n return { name: binding[0], value: toValue(binding[1], coercePropertyValue(source.gtype, binding[0], value)) };\n}\n\n/**\n * Constructs a new GObject of the given type, setting the supplied construct\n * properties, and binds `wrapper` to it. A property the wrapper's class declares\n * through `registerConstructProperties` is marshalled through its descriptor; any\n * other one is marshalled through the `GObject.ParamSpec` the type installs under\n * that name, dashed or camelCased, and is skipped when the type installs none.\n * A value that ParamSpec would refuse throws before GObject sees it: a `TypeError`\n * for a read-only property and for a value of a type the property cannot hold, and\n * a `RangeError` for a value the ParamSpec rejects. A value marshalled through a\n * declared descriptor is converted rather than checked, so a `null` handed to a\n * numeric one of those lands 0 rather than being refused, and a number is fitted to\n * the property first, as `coerceObjectProperty` does: truncated toward zero for a\n * whole-number property and clamped to the range its `GObject.ParamSpec` allows.\n * Properties whose value is `undefined` are skipped. A type registered with\n * `registerClass` binds the wrapper before its `constructed` slot runs, so an\n * override of that slot already sees a usable instance.\n * When construction returns an object that already has a wrapper — it reached\n * JavaScript and was wrapped before `g_object_new` returned, for example a\n * `Gtk.Window` observed through the toplevels list — that existing wrapper is\n * returned instead of binding `wrapper`, so both references stay one object.\n *\n * @param gtype The GType of the object to construct.\n * @param props Property names mapped to the values to set them to.\n * @param wrapper The wrapper instance to bind to the new object.\n * @returns The wrapper bound to the constructed object: `wrapper` itself, or\n * the wrapper the object already had.\n */\nfunction newObjectWithProperties<T extends object>(gtype: bigint, props: object, wrapper: T): T {\n const names: string[] = [];\n const values: ExternalObject<Handle>[] = [];\n const bindings = constructBindingsFor(wrapper.constructor as AnyClass | undefined);\n const source = { gtype, bindings, wrapper };\n\n for (const name of Object.keys(props)) {\n const property = constructPropertyForEntry(source, name, Reflect.get(props, name));\n\n if (property !== undefined) {\n names.push(property.name);\n values.push(property.value);\n }\n }\n\n const existing = newObject(gtype, names, values, wrapper, registerWrapper);\n\n if (existing !== null) {\n return existing as T;\n }\n\n return wrapper;\n}\n\n/**\n * Reads a GObject property and converts it to its JavaScript value using the\n * descriptor.\n *\n * @param obj The object to read from.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n */\nfunction getObjectProperty<\n TObject extends { __properties__: object },\n TPropertyMap extends object = TObject extends { [propertyMapOverride]?: infer TResolver }\n ? TResolver extends () => infer TMap\n ? Extract<NonNullable<TMap>, object>\n : TObject[\"__properties__\"]\n : TObject[\"__properties__\"],\n TName extends Extract<keyof NoInfer<TPropertyMap>, string> = Extract<keyof NoInfer<TPropertyMap>, string>,\n>(obj: TObject, propertyName: TName): NoInfer<TPropertyMap>[TName];\nfunction getObjectProperty(obj: object, propertyName: string, descriptor: Descriptor): unknown;\nfunction getObjectProperty(obj: object, propertyName: string, descriptor?: Descriptor): unknown {\n if (arguments.length === 2) {\n const property = readableObjectPropertyFor(obj, propertyName);\n gObjectGetProperty(getHandle(obj), property.name, property.value);\n\n return fromValue(property.value);\n }\n\n if (descriptor === undefined) {\n throw new TypeError(\"getObjectProperty requires a property descriptor when called with three arguments\");\n }\n\n const value = newValueForDescriptor(descriptor);\n gObjectGetProperty(getHandle(obj), propertyName, value);\n\n return fromValueForDescriptor(descriptor, value);\n}\n\n/**\n * Writes a JavaScript value to a GObject property, converting it to native form\n * using the descriptor. The descriptor converts what it is given rather than checking it against\n * the property's `GObject.ParamSpec`, so `null` and `undefined` written to a numeric or enum\n * property land 0, and a fractional number written to a whole-number property is truncated toward\n * zero, where the same writes to a property installed through `registerClass` are refused with a\n * `TypeError`.\n *\n * @param obj The object to write to.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n * @param jsValue The value to set.\n */\nfunction setObjectProperty<\n TObject extends { __writableProperties__: object },\n TPropertyMap extends object = TObject extends { [writablePropertyMapOverride]?: infer TResolver }\n ? TResolver extends () => infer TMap\n ? Extract<NonNullable<TMap>, object>\n : TObject[\"__writableProperties__\"]\n : TObject[\"__writableProperties__\"],\n TName extends Extract<keyof NoInfer<TPropertyMap>, string> = Extract<keyof NoInfer<TPropertyMap>, string>,\n>(obj: TObject, propertyName: TName, jsValue: NoInfer<TPropertyMap>[TName]): void;\nfunction setObjectProperty(obj: object, propertyName: string, descriptor: Descriptor, jsValue: unknown): void;\nfunction setObjectProperty(\n obj: object,\n propertyName: string,\n descriptorOrValue: unknown,\n jsValue?: unknown,\n): void {\n if (arguments.length === 3) {\n const property = writableObjectPropertyFor(obj, propertyName, descriptorOrValue);\n gObjectSetProperty(getHandle(obj), property.name, property.value);\n\n return;\n }\n\n gObjectSetProperty(getHandle(obj), propertyName, toValue(descriptorOrValue as Descriptor, jsValue));\n}\n\nexport {\n newObjectWithProperties,\n getObjectProperty,\n registerConstructProperties,\n setObjectProperty,\n type ConstructBinding,\n type ConstructBindings,\n};\n"]}
|
package/dist/properties.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ExternalObject, Handle, RegisterClassProperty } from "@gtkx/native";
|
|
2
|
-
import type
|
|
2
|
+
import { type AnyClass } from "@gtkx/utils";
|
|
3
3
|
import { type ValueGuard } from "./param-spec.js";
|
|
4
4
|
import { type InterfaceProperty } from "./registry.js";
|
|
5
5
|
import { type ValueNarrower, type ValueWriter } from "./value.js";
|
|
@@ -21,7 +21,7 @@ type AccessorBase = PropertyCheck & {
|
|
|
21
21
|
type DeclaredAccessor = AccessorBase & {
|
|
22
22
|
isInterfaceProperty?: false;
|
|
23
23
|
memberName: string;
|
|
24
|
-
|
|
24
|
+
hasMemberAccessor: boolean;
|
|
25
25
|
};
|
|
26
26
|
type InterfaceAccessor = AccessorBase & {
|
|
27
27
|
isInterfaceProperty: true;
|
|
@@ -61,6 +61,8 @@ declare const newParamSpecOverride: (name: string, source: bigint | AnyClass) =>
|
|
|
61
61
|
* rather than looking for a generated accessor, which codegen omits when a method shares the name.
|
|
62
62
|
*/
|
|
63
63
|
declare function isReadableProperty(gtype: bigint, propertyName: string): boolean;
|
|
64
|
+
declare function readableObjectPropertyFor(instance: object, name: string): ConstructProperty;
|
|
65
|
+
declare function writableObjectPropertyFor(instance: object, name: string, value: unknown): ConstructProperty;
|
|
64
66
|
declare function coercePropertyValue(gtype: bigint, propertyName: string, value: unknown): unknown;
|
|
65
67
|
/**
|
|
66
68
|
* Fits a number to what a GObject property accepts, the way an animation writing a value on every
|
|
@@ -86,5 +88,5 @@ declare function buildPropertyDispatch(source: PropertyDispatchSource): Property
|
|
|
86
88
|
*/
|
|
87
89
|
declare function getDeclaredPropertyName(object: object, accessor: string): string | undefined;
|
|
88
90
|
declare function toNativeProperties(properties: Record<string, PropertySpec>): RegisterClassProperty[];
|
|
89
|
-
export { buildPropertyDispatch, coerceObjectProperty, getDeclaredPropertyName, isReadableProperty, coercePropertyValue, constructPropertyFor, GET_PROPERTY_VFUNC, makeGetProperty, makeSetProperty, newParamSpecOverride, SET_PROPERTY_VFUNC, toNativeProperties, type ConstructProperty, type PropertyDispatch, type PropertySpec, };
|
|
91
|
+
export { buildPropertyDispatch, coerceObjectProperty, getDeclaredPropertyName, isReadableProperty, coercePropertyValue, constructPropertyFor, GET_PROPERTY_VFUNC, makeGetProperty, makeSetProperty, newParamSpecOverride, readableObjectPropertyFor, SET_PROPERTY_VFUNC, toNativeProperties, writableObjectPropertyFor, type ConstructProperty, type PropertyDispatch, type PropertySpec, };
|
|
90
92
|
//# sourceMappingURL=properties.d.ts.map
|
package/dist/properties.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"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"}
|