@gtkx/runtime 1.6.0 → 2.0.0-beta.1
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 +2 -2
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -2
- package/dist/internal.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/properties.d.ts +1 -1
- package/dist/properties.d.ts.map +1 -1
- package/dist/properties.js +2 -11
- package/dist/properties.js.map +1 -1
- package/dist/register-class.d.ts +45 -249
- package/dist/register-class.d.ts.map +1 -1
- package/dist/register-class.js.map +1 -1
- package/dist/signal.d.ts.map +1 -1
- package/dist/signal.js +9 -22
- 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 +7 -1
- 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 +2 -2
- package/src/native-value.ts +24 -3
- package/src/properties.ts +3 -16
- package/src/register-class.ts +45 -249
- package/src/signal.ts +9 -34
- package/src/t.ts +5 -21
- package/src/type.ts +9 -1
- package/src/value.ts +9 -1
- package/src/variant.ts +2 -6
- package/src/vfunc-call.ts +3 -16
package/dist/variant.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant.js","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\n\n/** JavaScript type every GVariant basic type code unpacks to, with a nested variant held as `Nested`. */\ntype BasicValueMap<Nested> = {\n /** Boolean, held as a single byte reading 0 or 1. */\n b: boolean;\n /** Unsigned byte. */\n y: number;\n /** Signed 16-bit integer. */\n n: number;\n /** Unsigned 16-bit integer. */\n q: number;\n /** Signed 32-bit integer. */\n i: number;\n /** Unsigned 32-bit integer. */\n u: number;\n /** Index into the file descriptor list a message carries. */\n h: number;\n /** Double precision floating point number. */\n d: number;\n /** Signed 64-bit integer. */\n x: bigint;\n /** Unsigned 64-bit integer. */\n t: bigint;\n /** UTF-8 string, under no further constraint on what it holds. */\n s: string;\n /** D-Bus object path. */\n o: string;\n /** GVariant type signature. */\n g: string;\n /** Boxed variant holding a value of any type. */\n v: Nested;\n};\n\n/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */\ntype BasicCode = keyof BasicValueMap<unknown>;\n/**\n * JavaScript type a byte array (`ay`) unpacks to: the same one the generated bindings use for byte sequences, so a\n * `Uint8Array` under the `v2ByteArrays` future flag and a `number[]` otherwise.\n */\ntype ByteArray = ReturnType<GLib.Bytes[\"unrefToArray\"]>;\n/** Values a byte array (`ay`) packs from. */\ntype ByteArrayInput = Uint8Array | number[];\n\n/**\n * Parses the element type of an array, yielding the array type it produces and the rest of the string. An array of\n * bytes yields the byte array type instead of `number[]`.\n */\ntype ParseArray<S extends string, Bytes, Nested> = S extends `y${infer Rest}`\n ? [Bytes, Rest]\n : Parse<S, Bytes, Nested> extends [infer V, infer R extends string]\n ? [V[], R]\n : never;\n\n/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */\ntype ParseMaybe<S extends string, Bytes, Nested> =\n Parse<S, Bytes, Nested> extends [infer V, infer R extends string] ? [V | null, R] : never;\n\n/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */\ntype ParseTuple<S extends string, Bytes, Nested, Acc extends unknown[]> = S extends `)${infer Rest}`\n ? [Acc, Rest]\n : [Parse<S, Bytes, Nested>] extends [never]\n ? never\n : Parse<S, Bytes, Nested> extends [infer V, infer R extends string]\n ? ParseTuple<R, Bytes, Nested, [...Acc, V]>\n : never;\n\n/** Types a dictionary entry key can hold. */\ntype DictKey = string | number | bigint | boolean;\n\n/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */\ntype ParsePair<S extends string, Bytes, Nested> =\n Parse<S, Bytes, Nested> extends [infer K, infer R1 extends string]\n ? Parse<R1, Bytes, Nested> extends [infer V, infer R2 extends string]\n ? R2 extends `}${infer R3}`\n ? [K] extends [DictKey]\n ? [K, V, R3]\n : never\n : never\n : never\n : never;\n\n/**\n * Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a\n * `Map` otherwise, plus the rest of the string.\n */\ntype ParseDict<S extends string, Bytes, Nested> =\n ParsePair<S, Bytes, Nested> extends [infer K, infer V, infer R extends string]\n ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R]\n : never;\n\n/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */\ntype ParseEntry<S extends string, Bytes, Nested> =\n ParsePair<S, Bytes, Nested> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;\n\n/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */\ntype ParseArrayOrDict<S extends string, Bytes, Nested> = S extends `{${infer Rest}`\n ? ParseDict<Rest, Bytes, Nested>\n : ParseArray<S, Bytes, Nested>;\n\n/**\n * Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or\n * `never` when the string is malformed.\n */\ntype Parse<S extends string, Bytes, Nested> = S extends `a${infer Rest}`\n ? ParseArrayOrDict<Rest, Bytes, Nested>\n : S extends `m${infer Rest}`\n ? ParseMaybe<Rest, Bytes, Nested>\n : S extends `(${infer Rest}`\n ? ParseTuple<Rest, Bytes, Nested, []>\n : S extends `{${infer Rest}`\n ? ParseEntry<Rest, Bytes, Nested>\n : S extends `${infer C}${infer Rest}`\n ? C extends BasicCode\n ? [BasicValueMap<Nested>[C], Rest]\n : never\n : never;\n\n/** JavaScript type a type string `S` describes, or `unknown` when `S` is not one complete type. */\ntype ParsedValue<S extends string, Bytes, Nested> = [Parse<S, Bytes, Nested>] extends [never]\n ? unknown\n : Parse<S, Bytes, Nested> extends [infer V, \"\"]\n ? V\n : unknown;\n\n/**\n * JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. A byte\n * array (`ay`) unpacks to {@link ByteArray} and a nested variant (`v`) to the `GLib.Variant` itself.\n */\ntype VariantValue<S extends string> = ParsedValue<S, ByteArray, GLib.Variant>;\n/**\n * JavaScript type {@link toVariant} packs into a variant of type string `S`, or `unknown` when `S` is not one\n * complete type. The same as {@link VariantValue}, except that a byte array (`ay`) also packs from a `number[]`.\n */\ntype VariantInput<S extends string> = ParsedValue<S, ByteArrayInput, GLib.Variant>;\n/**\n * JavaScript type a variant of type string `S` unpacks to when every nested variant is unwrapped as well, so a `v`\n * reads as `unknown`.\n */\ntype RecursiveVariantValue<S extends string> = ParsedValue<S, ByteArray, unknown>;\n\n/** Options {@link fromVariant} reads. */\ntype FromVariantOptions = {\n /**\n * Whether to unwrap every nested variant (`v`) into the value it holds, all the way down, instead of handing back\n * the `GLib.Variant` itself. Discards the type information those variants carry.\n */\n recursive?: boolean;\n};\n\n/** {@link FromVariantOptions} with recursive unwrapping selected, typing the result accordingly. */\ntype RecursiveFromVariantOptions = {\n /** Unwraps every nested variant (`v`) into the value it holds, all the way down. */\n recursive: true;\n};\n\ntype VariantTypeNode =\n | { kind: \"basic\"; code: BasicCode } |\n { kind: \"array\"; elementTypeString: string; element: VariantTypeNode } |\n { kind: \"dict\"; entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"entry\"; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"tuple\"; items: VariantTypeNode[] } |\n { kind: \"maybe\"; elementTypeString: string; element: VariantTypeNode };\n\nconst BASIC_CODES = \"bynqiuxthdsogv\";\nconst STRING_KEY_CODES: Set<string> = new Set([\"s\", \"o\", \"g\"]);\n\nconst CONTAINER_PARSERS: Record<string, (source: string, start: number) => [VariantTypeNode, number]> = {\n a: parseArrayNode,\n m: parseMaybeNode,\n \"(\": parseTupleNode,\n \"{\": parseEntryNode,\n};\n\nconst parsedTypes: Map<string, VariantTypeNode> = new Map();\nconst BYTE_ARRAY_TYPE_STRING = \"ay\";\n\nconst unpackBasic: Record<BasicCode, (variant: GLib.Variant) => unknown> = {\n b: (variant) => variant.getBoolean(),\n y: (variant) => variant.getByte(),\n n: (variant) => variant.getInt16(),\n q: (variant) => variant.getUint16(),\n i: (variant) => variant.getInt32(),\n u: (variant) => variant.getUint32(),\n h: (variant) => variant.getHandle(),\n d: (variant) => variant.getDouble(),\n x: (variant) => variant.getInt64(),\n t: (variant) => variant.getUint64(),\n s: (variant) => variant.getString()[0],\n o: (variant) => variant.getString()[0],\n g: (variant) => variant.getString()[0],\n v: (variant) => variant.getVariant(),\n};\n\nconst packBasic: Record<BasicCode, (value: unknown) => GLib.Variant> = {\n b: (value) => GLib.Variant.newBoolean(value as boolean),\n y: (value) => GLib.Variant.newByte(value as number),\n n: (value) => GLib.Variant.newInt16(value as number),\n q: (value) => GLib.Variant.newUint16(value as number),\n i: (value) => GLib.Variant.newInt32(value as number),\n u: (value) => GLib.Variant.newUint32(value as number),\n h: (value) => GLib.Variant.newHandle(value as number),\n d: (value) => GLib.Variant.newDouble(value as number),\n x: (value) => GLib.Variant.newInt64(value as bigint),\n t: (value) => GLib.Variant.newUint64(value as bigint),\n s: (value) => GLib.Variant.newString(value as string),\n o: packObjectPath,\n g: packSignature,\n v: (value) => GLib.Variant.newVariant(value as GLib.Variant),\n};\n\nconst isBasicCode = (code: string): code is BasicCode => BASIC_CODES.includes(code);\nconst isStringKeyed = (key: VariantTypeNode): boolean => key.kind === \"basic\" && STRING_KEY_CODES.has(key.code);\nconst invalidType = (source: string): Error => new Error(`Invalid GVariant type string \"${source}\"`);\n\nconst parsePair = (source: string, start: number): [VariantTypeNode, VariantTypeNode, number] => {\n const [key, keyEnd] = parseNode(source, start);\n\n if (key.kind !== \"basic\" || key.code === \"v\") {\n throw invalidType(source);\n }\n\n const [value, valueEnd] = parseNode(source, keyEnd);\n\n if (source[valueEnd] !== \"}\") {\n throw invalidType(source);\n }\n\n return [key, value, valueEnd + 1];\n};\n\nfunction parseArrayNode(source: string, start: number): [VariantTypeNode, number] {\n if (source[start] === \"{\") {\n const [key, value, end] = parsePair(source, start + 1);\n\n return [{ kind: \"dict\", entryTypeString: source.slice(start, end), key, value }, end];\n }\n\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"array\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseMaybeNode(source: string, start: number): [VariantTypeNode, number] {\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"maybe\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseTupleNode(source: string, start: number): [VariantTypeNode, number] {\n const items: VariantTypeNode[] = [];\n let position = start;\n\n while (source[position] !== \")\") {\n if (position >= source.length) {\n throw invalidType(source);\n }\n\n const [item, end] = parseNode(source, position);\n items.push(item);\n position = end;\n }\n\n return [{ kind: \"tuple\", items }, position + 1];\n}\n\nfunction parseEntryNode(source: string, start: number): [VariantTypeNode, number] {\n const [key, value, end] = parsePair(source, start);\n\n return [{ kind: \"entry\", key, value }, end];\n}\n\nconst parseNode = (source: string, start: number): [VariantTypeNode, number] => {\n const code = source[start];\n\n if (code === undefined) {\n throw invalidType(source);\n }\n\n const container = CONTAINER_PARSERS[code];\n\n if (container !== undefined) {\n return container(source, start + 1);\n }\n\n if (isBasicCode(code)) {\n return [{ kind: \"basic\", code }, start + 1];\n }\n\n throw invalidType(source);\n};\n\nconst parseVariantType = (typeString: string): VariantTypeNode => {\n const cached = parsedTypes.get(typeString);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const [node, end] = parseNode(typeString, 0);\n\n if (end !== typeString.length) {\n throw invalidType(typeString);\n }\n\n parsedTypes.set(typeString, node);\n\n return node;\n};\n\nconst isByteArray = (node: VariantTypeNode): boolean =>\n node.kind === \"array\" && node.element.kind === \"basic\" && node.element.code === \"y\";\n\nconst unpackChildren = (variant: GLib.Variant, unpackChild: (child: GLib.Variant) => unknown): unknown[] => {\n const children: unknown[] = [];\n const count = variant.nChildren();\n\n for (let index = 0; index < count; index += 1) {\n children.push(unpackChild(variant.getChildValue(index)));\n }\n\n return children;\n};\n\nconst unpackPair = (\n key: VariantTypeNode,\n value: VariantTypeNode,\n entry: GLib.Variant,\n isRecursive: boolean,\n): [unknown, unknown] => [\n unpackNode(key, entry.getChildValue(0), isRecursive),\n unpackNode(value, entry.getChildValue(1), isRecursive),\n];\n\nconst unpackDict = (\n node: { key: VariantTypeNode; value: VariantTypeNode },\n variant: GLib.Variant,\n isRecursive: boolean,\n): Record<string, unknown> | Map<unknown, unknown> => {\n const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry, isRecursive)) as [\n unknown,\n unknown,\n ][];\n\n if (!isStringKeyed(node.key)) {\n return new Map(entries);\n }\n\n const stringEntries: [string, unknown][] = entries.map(([key, value]) => [key as string, value]);\n\n return Object.fromEntries(stringEntries);\n};\n\nconst unpackMaybe = (element: VariantTypeNode, variant: GLib.Variant, isRecursive: boolean): unknown => {\n const child = variant.getMaybe();\n\n return child === null ? null : unpackNode(element, child, isRecursive);\n};\n\nconst unpackNested = (variant: GLib.Variant, isRecursive: boolean): unknown => {\n const held = variant.getVariant();\n\n return isRecursive ? unpackNode(parseVariantType(held.getTypeString()), held, true) : held;\n};\n\nconst unpackNode = (node: VariantTypeNode, variant: GLib.Variant, isRecursive: boolean): unknown => {\n switch (node.kind) {\n case \"basic\": {\n return node.code === \"v\" ? unpackNested(variant, isRecursive) : unpackBasic[node.code](variant);\n }\n case \"array\": {\n return isByteArray(node)\n ? variant.getDataAsBytes().unrefToArray()\n : unpackChildren(variant, (child) => unpackNode(node.element, child, isRecursive));\n }\n case \"dict\": {\n return unpackDict(node, variant, isRecursive);\n }\n case \"entry\": {\n return unpackPair(node.key, node.value, variant, isRecursive);\n }\n case \"tuple\": {\n return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index), isRecursive));\n }\n case \"maybe\": {\n return unpackMaybe(node.element, variant, isRecursive);\n }\n }\n};\n\nconst packValidatedString = (\n value: unknown,\n isValid: (value: string) => boolean,\n description: string,\n construct: (value: string) => GLib.Variant,\n): GLib.Variant => {\n if (typeof value !== \"string\" || !isValid(value)) {\n throw new Error(`\"${String(value)}\" is not a valid GVariant ${description}`);\n }\n\n return construct(value);\n};\n\nfunction packObjectPath(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (path) => GLib.Variant.isObjectPath(path),\n \"object path\",\n (path) => GLib.Variant.newObjectPath(path),\n );\n}\n\nfunction packSignature(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (signature) => GLib.Variant.isSignature(signature),\n \"type signature\",\n (signature) => GLib.Variant.newSignature(signature),\n );\n}\n\nconst packEntry = (key: VariantTypeNode, value: VariantTypeNode, pair: [unknown, unknown]): GLib.Variant =>\n GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));\n\nconst dictEntries = (value: unknown): [unknown, unknown][] =>\n value instanceof Map ? [...value] : Object.entries(value as Record<string, unknown>);\n\nconst packDict = (\n node: { entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode },\n value: unknown,\n): GLib.Variant =>\n GLib.Variant.newArray(\n GLib.VariantType.new(node.entryTypeString),\n dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)),\n );\n\nconst packMaybe = (node: { elementTypeString: string; element: VariantTypeNode }, value: unknown): GLib.Variant =>\n GLib.Variant.newMaybe(\n GLib.VariantType.new(node.elementTypeString),\n value === null ? null : packNode(node.element, value),\n );\n\nconst packByteArray = (value: unknown): GLib.Variant => {\n if (!(value instanceof Uint8Array) && !Array.isArray(value)) {\n throw new TypeError(\"Expected a Uint8Array or an array of byte values for a byte array (ay)\");\n }\n\n return GLib.Variant.newFromBytes(\n GLib.VariantType.new(BYTE_ARRAY_TYPE_STRING),\n GLib.Bytes.new(value as ByteArrayInput),\n true,\n );\n};\n\nconst packNode = (node: VariantTypeNode, value: unknown): GLib.Variant => {\n switch (node.kind) {\n case \"basic\": {\n return packBasic[node.code](value);\n }\n case \"array\": {\n if (isByteArray(node)) {\n return packByteArray(value);\n }\n\n return GLib.Variant.newArray(\n GLib.VariantType.new(node.elementTypeString),\n (value as unknown[]).map((item) => packNode(node.element, item)),\n );\n }\n case \"dict\": {\n return packDict(node, value);\n }\n case \"entry\": {\n return packEntry(node.key, node.value, value as [unknown, unknown]);\n }\n case \"tuple\": {\n return GLib.Variant.newTuple(\n node.items.map((item, index) => packNode(item, (value as unknown[])[index])),\n );\n }\n case \"maybe\": {\n return packMaybe(node, value);\n }\n }\n};\n\n/**\n * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the\n * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a\n * literal also types `value`, so `\"as\"` takes an array of strings, `\"a{sv}\"` a record of variants,\n * `\"(si)\"` a string and a number pair, a 64-bit type a `bigint`, and `\"ay\"` a `Uint8Array` or an\n * array of byte values.\n * @param typeString GVariant type of the variant to build, such as `\"a{sv}\"`.\n * @param value Value to pack, shaped the way `typeString` describes.\n * @returns The packed variant.\n * @throws {Error} When the type string is not one complete GVariant type, when a value packed as\n * an object path or a type signature is not a valid one, or when a byte array is packed from\n * anything but a `Uint8Array` or an array of byte values.\n */\nconst toVariant = <S extends string>(typeString: S, value: VariantInput<S>): GLib.Variant =>\n packNode(parseVariantType(typeString), value);\n\n/**\n * Unpacks a `GLib.Variant` into the JavaScript value its GVariant type describes, the inverse of\n * {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything\n * else to a `Map`, an array to an array, a byte array (`ay`) to the byte array type the generated\n * bindings use (`Uint8Array` under the `v2ByteArrays` future flag, `number[]` otherwise), a tuple\n * to an array of its members, a maybe to its value or `null`, and a nested variant to the\n * `GLib.Variant` itself unless `recursive` is set, in which case it is unwrapped all the way down.\n *\n * The type string is optional: without one the variant's own type is read, and the result is\n * `unknown`. With one given as a literal, the result is typed from it.\n * @param typeString GVariant type the variant holds, such as `\"a{sv}\"`.\n * @param variant Variant to read, which has to hold that type.\n * @param options Whether to unwrap nested variants recursively.\n * @returns The unpacked value.\n * @throws {Error} When the type string is not one complete GVariant type.\n */\nfunction fromVariant<S extends string>(typeString: S, variant: GLib.Variant): VariantValue<S>;\n\nfunction fromVariant<S extends string>(\n typeString: S,\n variant: GLib.Variant,\n options: RecursiveFromVariantOptions,\n): RecursiveVariantValue<S>;\n\nfunction fromVariant<S extends string>(\n typeString: S,\n variant: GLib.Variant,\n options: FromVariantOptions,\n): VariantValue<S> | RecursiveVariantValue<S>;\n\nfunction fromVariant(variant: GLib.Variant, options?: FromVariantOptions): unknown;\n\nfunction fromVariant(\n first: string | GLib.Variant,\n second?: GLib.Variant | FromVariantOptions,\n third?: FromVariantOptions,\n): unknown {\n if (typeof first === \"string\") {\n return unpackNode(parseVariantType(first), second as GLib.Variant, third?.recursive === true);\n }\n\n const options = second as FromVariantOptions | undefined;\n\n return unpackNode(parseVariantType(first.getTypeString()), first, options?.recursive === true);\n}\n\nexport {\n type ByteArray,\n type FromVariantOptions,\n fromVariant,\n type RecursiveFromVariantOptions,\n type RecursiveVariantValue,\n toVariant,\n type VariantInput,\n type VariantValue,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"variant.js","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\n\n/** JavaScript type every GVariant basic type code unpacks to, with a nested variant held as `Nested`. */\ntype BasicValueMap<Nested> = {\n /** Boolean, held as a single byte reading 0 or 1. */\n b: boolean;\n /** Unsigned byte. */\n y: number;\n /** Signed 16-bit integer. */\n n: number;\n /** Unsigned 16-bit integer. */\n q: number;\n /** Signed 32-bit integer. */\n i: number;\n /** Unsigned 32-bit integer. */\n u: number;\n /** Index into the file descriptor list a message carries. */\n h: number;\n /** Double precision floating point number. */\n d: number;\n /** Signed 64-bit integer. */\n x: bigint;\n /** Unsigned 64-bit integer. */\n t: bigint;\n /** UTF-8 string, under no further constraint on what it holds. */\n s: string;\n /** D-Bus object path. */\n o: string;\n /** GVariant type signature. */\n g: string;\n /** Boxed variant holding a value of any type. */\n v: Nested;\n};\n\n/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */\ntype BasicCode = keyof BasicValueMap<unknown>;\n/** JavaScript type a byte array (`ay`) unpacks to. */\ntype ByteArray = ReturnType<GLib.Bytes[\"unrefToArray\"]>;\n/** Values a byte array (`ay`) packs from. */\ntype ByteArrayInput = Uint8Array | number[];\n\n/**\n * Parses the element type of an array, yielding the array type it produces and the rest of the string. An array of\n * bytes yields the byte array type instead of `number[]`.\n */\ntype ParseArray<S extends string, Bytes, Nested> = S extends `y${infer Rest}`\n ? [Bytes, Rest]\n : Parse<S, Bytes, Nested> extends [infer V, infer R extends string]\n ? [V[], R]\n : never;\n\n/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */\ntype ParseMaybe<S extends string, Bytes, Nested> =\n Parse<S, Bytes, Nested> extends [infer V, infer R extends string] ? [V | null, R] : never;\n\n/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */\ntype ParseTuple<S extends string, Bytes, Nested, Acc extends unknown[]> = S extends `)${infer Rest}`\n ? [Acc, Rest]\n : [Parse<S, Bytes, Nested>] extends [never]\n ? never\n : Parse<S, Bytes, Nested> extends [infer V, infer R extends string]\n ? ParseTuple<R, Bytes, Nested, [...Acc, V]>\n : never;\n\n/** Types a dictionary entry key can hold. */\ntype DictKey = string | number | bigint | boolean;\n\n/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */\ntype ParsePair<S extends string, Bytes, Nested> =\n Parse<S, Bytes, Nested> extends [infer K, infer R1 extends string]\n ? Parse<R1, Bytes, Nested> extends [infer V, infer R2 extends string]\n ? R2 extends `}${infer R3}`\n ? [K] extends [DictKey]\n ? [K, V, R3]\n : never\n : never\n : never\n : never;\n\n/**\n * Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a\n * `Map` otherwise, plus the rest of the string.\n */\ntype ParseDict<S extends string, Bytes, Nested> =\n ParsePair<S, Bytes, Nested> extends [infer K, infer V, infer R extends string]\n ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R]\n : never;\n\n/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */\ntype ParseEntry<S extends string, Bytes, Nested> =\n ParsePair<S, Bytes, Nested> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;\n\n/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */\ntype ParseArrayOrDict<S extends string, Bytes, Nested> = S extends `{${infer Rest}`\n ? ParseDict<Rest, Bytes, Nested>\n : ParseArray<S, Bytes, Nested>;\n\n/**\n * Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or\n * `never` when the string is malformed.\n */\ntype Parse<S extends string, Bytes, Nested> = S extends `a${infer Rest}`\n ? ParseArrayOrDict<Rest, Bytes, Nested>\n : S extends `m${infer Rest}`\n ? ParseMaybe<Rest, Bytes, Nested>\n : S extends `(${infer Rest}`\n ? ParseTuple<Rest, Bytes, Nested, []>\n : S extends `{${infer Rest}`\n ? ParseEntry<Rest, Bytes, Nested>\n : S extends `${infer C}${infer Rest}`\n ? C extends BasicCode\n ? [BasicValueMap<Nested>[C], Rest]\n : never\n : never;\n\n/** JavaScript type a type string `S` describes, or `unknown` when `S` is not one complete type. */\ntype ParsedValue<S extends string, Bytes, Nested> = [Parse<S, Bytes, Nested>] extends [never]\n ? unknown\n : Parse<S, Bytes, Nested> extends [infer V, \"\"]\n ? V\n : unknown;\n\n/**\n * JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. A byte\n * array (`ay`) unpacks to {@link ByteArray} and a nested variant (`v`) to the `GLib.Variant` itself.\n */\ntype VariantValue<S extends string> = ParsedValue<S, ByteArray, GLib.Variant>;\n/**\n * JavaScript type {@link toVariant} packs into a variant of type string `S`, or `unknown` when `S` is not one\n * complete type. The same as {@link VariantValue}, except that a byte array (`ay`) also packs from a `number[]`.\n */\ntype VariantInput<S extends string> = ParsedValue<S, ByteArrayInput, GLib.Variant>;\n/**\n * JavaScript type a variant of type string `S` unpacks to when every nested variant is unwrapped as well, so a `v`\n * reads as `unknown`.\n */\ntype RecursiveVariantValue<S extends string> = ParsedValue<S, ByteArray, unknown>;\n\n/** Options {@link fromVariant} reads. */\ntype FromVariantOptions = {\n /**\n * Whether to unwrap every nested variant (`v`) into the value it holds, all the way down, instead of handing back\n * the `GLib.Variant` itself. Discards the type information those variants carry.\n */\n recursive?: boolean;\n};\n\n/** {@link FromVariantOptions} with recursive unwrapping selected, typing the result accordingly. */\ntype RecursiveFromVariantOptions = {\n /** Unwraps every nested variant (`v`) into the value it holds, all the way down. */\n recursive: true;\n};\n\ntype VariantTypeNode =\n | { kind: \"basic\"; code: BasicCode } |\n { kind: \"array\"; elementTypeString: string; element: VariantTypeNode } |\n { kind: \"dict\"; entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"entry\"; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"tuple\"; items: VariantTypeNode[] } |\n { kind: \"maybe\"; elementTypeString: string; element: VariantTypeNode };\n\nconst BASIC_CODES = \"bynqiuxthdsogv\";\nconst STRING_KEY_CODES: Set<string> = new Set([\"s\", \"o\", \"g\"]);\n\nconst CONTAINER_PARSERS: Record<string, (source: string, start: number) => [VariantTypeNode, number]> = {\n a: parseArrayNode,\n m: parseMaybeNode,\n \"(\": parseTupleNode,\n \"{\": parseEntryNode,\n};\n\nconst parsedTypes: Map<string, VariantTypeNode> = new Map();\nconst BYTE_ARRAY_TYPE_STRING = \"ay\";\n\nconst unpackBasic: Record<BasicCode, (variant: GLib.Variant) => unknown> = {\n b: (variant) => variant.getBoolean(),\n y: (variant) => variant.getByte(),\n n: (variant) => variant.getInt16(),\n q: (variant) => variant.getUint16(),\n i: (variant) => variant.getInt32(),\n u: (variant) => variant.getUint32(),\n h: (variant) => variant.getHandle(),\n d: (variant) => variant.getDouble(),\n x: (variant) => variant.getInt64(),\n t: (variant) => variant.getUint64(),\n s: (variant) => variant.getString()[0],\n o: (variant) => variant.getString()[0],\n g: (variant) => variant.getString()[0],\n v: (variant) => variant.getVariant(),\n};\n\nconst packBasic: Record<BasicCode, (value: unknown) => GLib.Variant> = {\n b: (value) => GLib.Variant.newBoolean(value as boolean),\n y: (value) => GLib.Variant.newByte(value as number),\n n: (value) => GLib.Variant.newInt16(value as number),\n q: (value) => GLib.Variant.newUint16(value as number),\n i: (value) => GLib.Variant.newInt32(value as number),\n u: (value) => GLib.Variant.newUint32(value as number),\n h: (value) => GLib.Variant.newHandle(value as number),\n d: (value) => GLib.Variant.newDouble(value as number),\n x: (value) => GLib.Variant.newInt64(value as bigint),\n t: (value) => GLib.Variant.newUint64(value as bigint),\n s: (value) => GLib.Variant.newString(value as string),\n o: packObjectPath,\n g: packSignature,\n v: (value) => GLib.Variant.newVariant(value as GLib.Variant),\n};\n\nconst isBasicCode = (code: string): code is BasicCode => BASIC_CODES.includes(code);\nconst isStringKeyed = (key: VariantTypeNode): boolean => key.kind === \"basic\" && STRING_KEY_CODES.has(key.code);\nconst invalidType = (source: string): Error => new Error(`Invalid GVariant type string \"${source}\"`);\n\nconst parsePair = (source: string, start: number): [VariantTypeNode, VariantTypeNode, number] => {\n const [key, keyEnd] = parseNode(source, start);\n\n if (key.kind !== \"basic\" || key.code === \"v\") {\n throw invalidType(source);\n }\n\n const [value, valueEnd] = parseNode(source, keyEnd);\n\n if (source[valueEnd] !== \"}\") {\n throw invalidType(source);\n }\n\n return [key, value, valueEnd + 1];\n};\n\nfunction parseArrayNode(source: string, start: number): [VariantTypeNode, number] {\n if (source[start] === \"{\") {\n const [key, value, end] = parsePair(source, start + 1);\n\n return [{ kind: \"dict\", entryTypeString: source.slice(start, end), key, value }, end];\n }\n\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"array\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseMaybeNode(source: string, start: number): [VariantTypeNode, number] {\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"maybe\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseTupleNode(source: string, start: number): [VariantTypeNode, number] {\n const items: VariantTypeNode[] = [];\n let position = start;\n\n while (source[position] !== \")\") {\n if (position >= source.length) {\n throw invalidType(source);\n }\n\n const [item, end] = parseNode(source, position);\n items.push(item);\n position = end;\n }\n\n return [{ kind: \"tuple\", items }, position + 1];\n}\n\nfunction parseEntryNode(source: string, start: number): [VariantTypeNode, number] {\n const [key, value, end] = parsePair(source, start);\n\n return [{ kind: \"entry\", key, value }, end];\n}\n\nconst parseNode = (source: string, start: number): [VariantTypeNode, number] => {\n const code = source[start];\n\n if (code === undefined) {\n throw invalidType(source);\n }\n\n const container = CONTAINER_PARSERS[code];\n\n if (container !== undefined) {\n return container(source, start + 1);\n }\n\n if (isBasicCode(code)) {\n return [{ kind: \"basic\", code }, start + 1];\n }\n\n throw invalidType(source);\n};\n\nconst parseVariantType = (typeString: string): VariantTypeNode => {\n const cached = parsedTypes.get(typeString);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const [node, end] = parseNode(typeString, 0);\n\n if (end !== typeString.length) {\n throw invalidType(typeString);\n }\n\n parsedTypes.set(typeString, node);\n\n return node;\n};\n\nconst isByteArray = (node: VariantTypeNode): boolean =>\n node.kind === \"array\" && node.element.kind === \"basic\" && node.element.code === \"y\";\n\nconst unpackChildren = (variant: GLib.Variant, unpackChild: (child: GLib.Variant) => unknown): unknown[] => {\n const children: unknown[] = [];\n const count = variant.nChildren();\n\n for (let index = 0; index < count; index += 1) {\n children.push(unpackChild(variant.getChildValue(index)));\n }\n\n return children;\n};\n\nconst unpackPair = (\n key: VariantTypeNode,\n value: VariantTypeNode,\n entry: GLib.Variant,\n isRecursive: boolean,\n): [unknown, unknown] => [\n unpackNode(key, entry.getChildValue(0), isRecursive),\n unpackNode(value, entry.getChildValue(1), isRecursive),\n];\n\nconst unpackDict = (\n node: { key: VariantTypeNode; value: VariantTypeNode },\n variant: GLib.Variant,\n isRecursive: boolean,\n): Record<string, unknown> | Map<unknown, unknown> => {\n const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry, isRecursive)) as [\n unknown,\n unknown,\n ][];\n\n if (!isStringKeyed(node.key)) {\n return new Map(entries);\n }\n\n const stringEntries: [string, unknown][] = entries.map(([key, value]) => [key as string, value]);\n\n return Object.fromEntries(stringEntries);\n};\n\nconst unpackMaybe = (element: VariantTypeNode, variant: GLib.Variant, isRecursive: boolean): unknown => {\n const child = variant.getMaybe();\n\n return child === null ? null : unpackNode(element, child, isRecursive);\n};\n\nconst unpackNested = (variant: GLib.Variant, isRecursive: boolean): unknown => {\n const held = variant.getVariant();\n\n return isRecursive ? unpackNode(parseVariantType(held.getTypeString()), held, true) : held;\n};\n\nconst unpackNode = (node: VariantTypeNode, variant: GLib.Variant, isRecursive: boolean): unknown => {\n switch (node.kind) {\n case \"basic\": {\n return node.code === \"v\" ? unpackNested(variant, isRecursive) : unpackBasic[node.code](variant);\n }\n case \"array\": {\n return isByteArray(node)\n ? variant.getDataAsBytes().unrefToArray()\n : unpackChildren(variant, (child) => unpackNode(node.element, child, isRecursive));\n }\n case \"dict\": {\n return unpackDict(node, variant, isRecursive);\n }\n case \"entry\": {\n return unpackPair(node.key, node.value, variant, isRecursive);\n }\n case \"tuple\": {\n return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index), isRecursive));\n }\n case \"maybe\": {\n return unpackMaybe(node.element, variant, isRecursive);\n }\n }\n};\n\nconst packValidatedString = (\n value: unknown,\n isValid: (value: string) => boolean,\n description: string,\n construct: (value: string) => GLib.Variant,\n): GLib.Variant => {\n if (typeof value !== \"string\" || !isValid(value)) {\n throw new Error(`\"${String(value)}\" is not a valid GVariant ${description}`);\n }\n\n return construct(value);\n};\n\nfunction packObjectPath(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (path) => GLib.Variant.isObjectPath(path),\n \"object path\",\n (path) => GLib.Variant.newObjectPath(path),\n );\n}\n\nfunction packSignature(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (signature) => GLib.Variant.isSignature(signature),\n \"type signature\",\n (signature) => GLib.Variant.newSignature(signature),\n );\n}\n\nconst packEntry = (key: VariantTypeNode, value: VariantTypeNode, pair: [unknown, unknown]): GLib.Variant =>\n GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));\n\nconst dictEntries = (value: unknown): [unknown, unknown][] =>\n value instanceof Map ? [...value] : Object.entries(value as Record<string, unknown>);\n\nconst packDict = (\n node: { entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode },\n value: unknown,\n): GLib.Variant =>\n GLib.Variant.newArray(\n GLib.VariantType.new(node.entryTypeString),\n dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)),\n );\n\nconst packMaybe = (node: { elementTypeString: string; element: VariantTypeNode }, value: unknown): GLib.Variant =>\n GLib.Variant.newMaybe(\n GLib.VariantType.new(node.elementTypeString),\n value === null ? null : packNode(node.element, value),\n );\n\nconst packByteArray = (value: unknown): GLib.Variant => {\n if (!(value instanceof Uint8Array) && !Array.isArray(value)) {\n throw new TypeError(\"Expected a Uint8Array or an array of byte values for a byte array (ay)\");\n }\n\n return GLib.Variant.newFromBytes(\n GLib.VariantType.new(BYTE_ARRAY_TYPE_STRING),\n GLib.Bytes.new(value as ByteArrayInput),\n true,\n );\n};\n\nconst packNode = (node: VariantTypeNode, value: unknown): GLib.Variant => {\n switch (node.kind) {\n case \"basic\": {\n return packBasic[node.code](value);\n }\n case \"array\": {\n if (isByteArray(node)) {\n return packByteArray(value);\n }\n\n return GLib.Variant.newArray(\n GLib.VariantType.new(node.elementTypeString),\n (value as unknown[]).map((item) => packNode(node.element, item)),\n );\n }\n case \"dict\": {\n return packDict(node, value);\n }\n case \"entry\": {\n return packEntry(node.key, node.value, value as [unknown, unknown]);\n }\n case \"tuple\": {\n return GLib.Variant.newTuple(\n node.items.map((item, index) => packNode(item, (value as unknown[])[index])),\n );\n }\n case \"maybe\": {\n return packMaybe(node, value);\n }\n }\n};\n\n/**\n * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the\n * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a\n * literal also types `value`, so `\"as\"` takes an array of strings, `\"a{sv}\"` a record of variants,\n * `\"(si)\"` a string and a number pair, a 64-bit type a `bigint`, and `\"ay\"` a `Uint8Array` or an\n * array of byte values.\n * @param typeString GVariant type of the variant to build, such as `\"a{sv}\"`.\n * @param value Value to pack, shaped the way `typeString` describes.\n * @returns The packed variant.\n * @throws {Error} When the type string is not one complete GVariant type, when a value packed as\n * an object path or a type signature is not a valid one, or when a byte array is packed from\n * anything but a `Uint8Array` or an array of byte values.\n */\nconst toVariant = <S extends string>(typeString: S, value: VariantInput<S>): GLib.Variant =>\n packNode(parseVariantType(typeString), value);\n\n/**\n * Unpacks a `GLib.Variant` into the JavaScript value its GVariant type describes, the inverse of\n * {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything\n * else to a `Map`, an array to an array, a byte array (`ay`) to a `Uint8Array`, a tuple\n * to an array of its members, a maybe to its value or `null`, and a nested variant to the\n * `GLib.Variant` itself unless `recursive` is set, in which case it is unwrapped all the way down.\n *\n * The type string is optional: without one the variant's own type is read, and the result is\n * `unknown`. With one given as a literal, the result is typed from it.\n * @param typeString GVariant type the variant holds, such as `\"a{sv}\"`.\n * @param variant Variant to read, which has to hold that type.\n * @param options Whether to unwrap nested variants recursively.\n * @returns The unpacked value.\n * @throws {Error} When the type string is not one complete GVariant type.\n */\nfunction fromVariant<S extends string>(typeString: S, variant: GLib.Variant): VariantValue<S>;\n\nfunction fromVariant<S extends string>(\n typeString: S,\n variant: GLib.Variant,\n options: RecursiveFromVariantOptions,\n): RecursiveVariantValue<S>;\n\nfunction fromVariant<S extends string>(\n typeString: S,\n variant: GLib.Variant,\n options: FromVariantOptions,\n): VariantValue<S> | RecursiveVariantValue<S>;\n\nfunction fromVariant(variant: GLib.Variant, options?: FromVariantOptions): unknown;\n\nfunction fromVariant(\n first: string | GLib.Variant,\n second?: GLib.Variant | FromVariantOptions,\n third?: FromVariantOptions,\n): unknown {\n if (typeof first === \"string\") {\n return unpackNode(parseVariantType(first), second as GLib.Variant, third?.recursive === true);\n }\n\n const options = second as FromVariantOptions | undefined;\n\n return unpackNode(parseVariantType(first.getTypeString()), first, options?.recursive === true);\n}\n\nexport {\n type ByteArray,\n type FromVariantOptions,\n fromVariant,\n type RecursiveFromVariantOptions,\n type RecursiveVariantValue,\n toVariant,\n type VariantInput,\n type VariantValue,\n};\n"]}
|
package/dist/vfunc-call.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vfunc-call.d.ts","sourceRoot":"","sources":["../src/vfunc-call.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vfunc-call.d.ts","sourceRoot":"","sources":["../src/vfunc-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAyJ5C;;;;;;;;;;;;;GAaG;AACH,iBAAS,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAIxG;AAkCD;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAQ7F;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/vfunc-call.js
CHANGED
|
@@ -63,17 +63,8 @@ function buildInvoker(slot, instanceType, caller) {
|
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
65
|
function cachedInvoker(cache, owner, key, build) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
byKey = new Map();
|
|
69
|
-
cache.set(owner, byKey);
|
|
70
|
-
}
|
|
71
|
-
let invoker = byKey.get(key);
|
|
72
|
-
if (invoker === undefined) {
|
|
73
|
-
invoker = build();
|
|
74
|
-
byKey.set(key, invoker);
|
|
75
|
-
}
|
|
76
|
-
return invoker;
|
|
66
|
+
const byKey = cache.getOrInsertComputed(owner, () => new Map());
|
|
67
|
+
return byKey.getOrInsertComputed(key, build);
|
|
77
68
|
}
|
|
78
69
|
function resolveParentSlot(klass, parentType, methodName) {
|
|
79
70
|
const classDescriptor = findClassVfuncDescriptor(klass, methodName);
|
package/dist/vfunc-call.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vfunc-call.js","sourceRoot":"","sources":["../src/vfunc-call.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAY,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACH,YAAY,EACZ,SAAS,EACT,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GAErB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAiB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM/F,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC;AAEvB,MAAM,YAAY,GAA6B;IAC3C,4BAA4B,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3E,qBAAqB,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;CACvE,CAAC;AAEF,MAAM,cAAc,GAAiB,IAAI,OAAO,EAAE,CAAC;AACnD,MAAM,aAAa,GAAiB,IAAI,OAAO,EAAE,CAAC;AAElD,SAAS,aAAa,CAAC,GAAQ,EAAE,KAAc;IAC3C,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,cAAc,CACnB,IAAkB,EAClB,YAAgC,EAChC,IAAW,EACX,KAAa;IAEb,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAE3C,MAAM,OAAO,GAAqB;QAC9B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,KAAK;QACL,cAAc,EAAE,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;QACvE,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;KAChD,CAAC;IAEF,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IAC/C,CAAC;IAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;IACxC,CAAC;IAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;IAC1C,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,IAAkB,EAAE,YAAgC,EAAE,MAAc;IACtF,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;IAChE,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,YAAkC,CAAC;IAEvC,MAAM,YAAY,GAAG,GAAyB,EAAE;QAC5C,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,YAAY,GAAG,SAAS,CAAC;QAEzB,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,kBAAkB,CAC7B,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAC1D;QACI,IAAI;QACJ,OAAO,EAAE,UAAU,CAAC,gBAAgB;QACpC,QAAQ;KACX,EACD,YAAY,CACf,CAAC;IAEF,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QACxB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACX,GAAG,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc;gBACrE,YAAY,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACtC,CAAC;QACN,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtF,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAEpF,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC;IACxD,CAAC,CAAC;AACN,CAAC;AAED,SAAS,aAAa,CAAC,KAAmB,EAAE,KAAe,EAAE,GAAW,EAAE,KAAoB;IAC1F,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,GAAG,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe,EAAE,UAAkB,EAAE,UAAkB;IAC9E,MAAM,eAAe,GAAG,wBAAwB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEpE,IAAI,eAAe,EAAE,CAAC;QAClB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,MAAM,aAAa,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,MAAM,UAAU,GAAG,4BAA4B,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAE3E,IAAI,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;QACzC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe,EAAE,UAAkB;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAElC,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACX,4BAA4B,UAAU,aAAa,KAAK,CAAC,IAAI,oCAAoC,CACpG,CAAC;IACN,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAe,EAAE,UAAkB;IAC3D,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAE9D,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,iBAAiB,UAAU,eAAe,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,UAAU,CAAC,KAAe,EAAE,UAAkB,EAAE,QAAgB,EAAE,GAAG,MAAiB;IAC3F,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAE9G,OAAO,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe,EAAE,GAAW;IAClD,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAEvD,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,yBAAyB,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAEnE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,iBAAiB,GAAG,eAAe,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAkB,EAAE,YAAoB;IACnE,OAAO,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW,EAAE,QAAgB,EAAE,IAAkB;IAC1E,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAElD,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,aAAa,IAAI,4CAA4C,CAAC,CAAC;IACjH,CAAC;IAED,OAAO,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AAChF,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,SAAS,CAAC,KAAe,EAAE,GAAW,EAAE,QAAgB,EAAE,MAAiB;IAChF,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,CACvF,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAEnD,OAAO,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { BindVfuncOptions } from \"@gtkx/native\";\nimport type { AnyClass } from \"@gtkx/utils\";\nimport { bindVfunc } from \"@gtkx/native\";\nimport { type Arg, isCallerAllocatedArg, requiresInputArg } from \"./arg.js\";\nimport { buildNativeArgTypes, fromNativeCallable } from \"./fn.js\";\nimport { toNative } from \"./native-value.js\";\nimport {\n getClassType,\n getHandle,\n getInterfaceVfuncRegistry,\n getVfuncRegistry,\n instanceClassName,\n resolveWrapperType,\n type VfuncDescriptor,\n} from \"./registry.js\";\nimport { TYPE_INVALID, typeInterfaces, typeIsA, typeParent } from \"./type.js\";\nimport { type RefSeeds, seedsFor } from \"./vfunc-seeds.js\";\nimport { findClassVfuncDescriptor, findInterfaceVfuncDescriptor, vfuncArgs } from \"./vfunc.js\";\n\ntype Invoker = (instance: object, inputs: unknown[]) => unknown;\ntype InvokerCache = WeakMap<AnyClass, Map<string, Invoker>>;\ntype ResolvedSlot = { descriptor: VfuncDescriptor; interfaceType?: bigint };\n\nconst NO_BASELINE = -1;\n\nconst SEEDED_SLOTS: Record<string, RefSeeds> = {\n \"LayoutManagerClass.measure\": new Map([[6, NO_BASELINE], [7, NO_BASELINE]]),\n \"WidgetClass.measure\": new Map([[5, NO_BASELINE], [6, NO_BASELINE]]),\n};\n\nconst parentInvokers: InvokerCache = new WeakMap();\nconst vfuncInvokers: InvokerCache = new WeakMap();\n\nfunction toNativeInput(arg: Arg, input: unknown): unknown {\n return isCallerAllocatedArg(arg) ? input : toNative(arg.type, input);\n}\n\nfunction bindOptionsFor(\n slot: ResolvedSlot,\n instanceType: bigint | undefined,\n args: Arg[],\n label: string,\n): BindVfuncOptions {\n const { descriptor, interfaceType } = slot;\n\n const options: BindVfuncOptions = {\n byteOffset: descriptor.byteOffset,\n label,\n argDescriptors: buildNativeArgTypes(args, descriptor.canThrow === true),\n returnDescriptor: descriptor.returnDescriptor,\n };\n\n if (descriptor.vtableSize !== undefined) {\n options.vtableSize = descriptor.vtableSize;\n }\n\n if (instanceType !== undefined) {\n options.instanceType = instanceType;\n }\n\n if (interfaceType !== undefined) {\n options.interfaceType = interfaceType;\n }\n\n return options;\n}\n\nfunction buildInvoker(slot: ResolvedSlot, instanceType: bigint | undefined, caller: string): Invoker {\n const { descriptor } = slot;\n const args = vfuncArgs(descriptor);\n const canThrow = descriptor.canThrow === true;\n const label = `${descriptor.className}.${descriptor.vfuncName}`;\n const [, ...inputArgs] = args.filter(requiresInputArg);\n let pendingSeeds: RefSeeds | undefined;\n\n const takeRefSeeds = (): RefSeeds | undefined => {\n const seeds = pendingSeeds;\n pendingSeeds = undefined;\n\n return seeds;\n };\n\n const shaped = fromNativeCallable(\n bindVfunc(bindOptionsFor(slot, instanceType, args, label)),\n {\n args,\n returns: descriptor.returnDescriptor,\n canThrow,\n },\n takeRefSeeds,\n );\n\n return (instance, inputs) => {\n if (inputs.length !== inputArgs.length) {\n throw new Error(\n `${caller}: ${label} expects ${String(inputArgs.length)} arguments, ` +\n `received ${String(inputs.length)}`,\n );\n }\n\n const nativeInputs = inputArgs.map((arg, index) => toNativeInput(arg, inputs[index]));\n pendingSeeds = SEEDED_SLOTS[label] ?? seedsFor(descriptor.argDescriptors, instance);\n\n return shaped(getHandle(instance), ...nativeInputs);\n };\n}\n\nfunction cachedInvoker(cache: InvokerCache, owner: AnyClass, key: string, build: () => Invoker): Invoker {\n let byKey = cache.get(owner);\n\n if (byKey === undefined) {\n byKey = new Map();\n cache.set(owner, byKey);\n }\n\n let invoker = byKey.get(key);\n\n if (invoker === undefined) {\n invoker = build();\n byKey.set(key, invoker);\n }\n\n return invoker;\n}\n\nfunction resolveParentSlot(klass: AnyClass, parentType: bigint, methodName: string): ResolvedSlot | undefined {\n const classDescriptor = findClassVfuncDescriptor(klass, methodName);\n\n if (classDescriptor) {\n return { descriptor: classDescriptor };\n }\n\n for (const interfaceType of typeInterfaces(parentType)) {\n const descriptor = findInterfaceVfuncDescriptor(interfaceType, methodName);\n\n if (descriptor) {\n return { descriptor, interfaceType };\n }\n }\n\n return undefined;\n}\n\nfunction resolveParentType(klass: AnyClass, methodName: string): bigint {\n const gtype = getClassType(klass);\n\n if (gtype === TYPE_INVALID) {\n throw new Error(\n `callParent: cannot call '${methodName}' because ${klass.name} was never passed to registerClass`,\n );\n }\n\n return typeParent(gtype);\n}\n\nfunction buildParentInvoker(klass: AnyClass, methodName: string): Invoker {\n const parentType = resolveParentType(klass, methodName);\n const slot = resolveParentSlot(klass, parentType, methodName);\n\n if (!slot) {\n throw new Error(`callParent: ${klass.name} inherits no '${methodName}' vtable slot`);\n }\n\n return buildInvoker(slot, parentType, \"callParent\");\n}\n\n/**\n * Calls the implementation of a virtual function that the parent type of `klass` provides, so an\n * override can chain up to the behavior it replaces. `klass` is the class whose override is\n * running, named lexically rather than taken from `instance`, so each level of a hierarchy reaches\n * exactly one level up. Arguments and the return value follow the same convention the override\n * itself uses: pure out parameters are left out and returned instead, and a slot with several\n * outputs returns them as a tuple. Throws if `klass` was never registered, inherits no such slot,\n * or the parent type leaves the slot empty.\n *\n * @param klass The registered class whose override is chaining up.\n * @param methodName Name of the overridden method, such as `vfuncMeasure`.\n * @param instance The instance the override was invoked on.\n * @param inputs The arguments the override received.\n */\nfunction callParent(klass: AnyClass, methodName: string, instance: object, ...inputs: unknown[]): unknown {\n const invoker = cachedInvoker(parentInvokers, klass, methodName, () => buildParentInvoker(klass, methodName));\n\n return invoker(instance, inputs);\n}\n\nfunction resolveOwnerSlot(owner: AnyClass, key: string): ResolvedSlot {\n const classDescriptor = getVfuncRegistry(owner)?.[key];\n\n if (classDescriptor !== undefined) {\n return { descriptor: classDescriptor };\n }\n\n const interfaceType = getClassType(owner);\n const descriptor = getInterfaceVfuncRegistry(interfaceType)?.[key];\n\n if (descriptor === undefined) {\n throw new Error(`callVfunc: ${owner.name} declares no '${key}' vtable slot`);\n }\n\n return { descriptor, interfaceType };\n}\n\nfunction requiresDefaultVtable(slot: ResolvedSlot, instanceType: bigint): boolean {\n return slot.interfaceType !== undefined && !typeIsA(instanceType, slot.interfaceType);\n}\n\nfunction resolveInstanceType(key: string, instance: object, slot: ResolvedSlot): bigint | undefined {\n const instanceType = resolveWrapperType(instance);\n\n if (instanceType === TYPE_INVALID) {\n const name = instanceClassName(instance);\n throw new Error(`callVfunc: cannot call '${key}' because ${name} descends from no registered wrapper class`);\n }\n\n return requiresDefaultVtable(slot, instanceType) ? undefined : instanceType;\n}\n\n/**\n * Calls the implementation of a virtual function a wrapper class or interface declares, backing the\n * `vfunc`-prefixed members the generated bindings emit. The slot is read from the nearest generated\n * wrapper class in the instance's class chain rather than from the instance's own type, so an\n * override reaching it through `super` runs the implementation it replaced instead of re-entering\n * itself. When that wrapper class does not carry the interface the slot belongs to, because a class\n * registered below it adopted the interface, the slot comes from the interface's own default vtable\n * instead, which holds exactly what the adopting class replaced. Arguments and the return value\n * follow the same convention an override uses: pure out parameters are left out and returned\n * instead, and a slot with several outputs returns them as a tuple. Throws if the owner declares no\n * such slot, the instance descends from no wrapper class, or the resolved vtable leaves the slot\n * empty.\n *\n * @param owner The wrapper class or interface declaring the slot.\n * @param key Name of the generated member, such as `vfuncMeasure`.\n * @param instance The instance to invoke the slot on.\n * @param inputs The arguments the slot receives.\n */\nfunction callVfunc(owner: AnyClass, key: string, instance: object, inputs: unknown[]): unknown {\n const slot = resolveOwnerSlot(owner, key);\n const instanceType = resolveInstanceType(key, instance, slot);\n\n const invoker = cachedInvoker(vfuncInvokers, owner, `${key}:${String(instanceType)}`, () =>\n buildInvoker(slot, instanceType, \"callVfunc\"));\n\n return invoker(instance, inputs);\n}\n\nexport { callParent, callVfunc };\n"]}
|
|
1
|
+
{"version":3,"file":"vfunc-call.js","sourceRoot":"","sources":["../src/vfunc-call.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnyClass } from \"@gtkx/utils\";\nimport { bindVfunc, type BindVfuncOptions } from \"@gtkx/native\";\nimport { type Arg, isCallerAllocatedArg, requiresInputArg } from \"./arg.js\";\nimport { buildNativeArgTypes, fromNativeCallable } from \"./fn.js\";\nimport { toNative } from \"./native-value.js\";\nimport {\n getClassType,\n getHandle,\n getInterfaceVfuncRegistry,\n getVfuncRegistry,\n instanceClassName,\n resolveWrapperType,\n type VfuncDescriptor,\n} from \"./registry.js\";\nimport { TYPE_INVALID, typeInterfaces, typeIsA, typeParent } from \"./type.js\";\nimport { type RefSeeds, seedsFor } from \"./vfunc-seeds.js\";\nimport { findClassVfuncDescriptor, findInterfaceVfuncDescriptor, vfuncArgs } from \"./vfunc.js\";\n\ntype Invoker = (instance: object, inputs: unknown[]) => unknown;\ntype InvokerCache = WeakMap<AnyClass, Map<string, Invoker>>;\ntype ResolvedSlot = { descriptor: VfuncDescriptor; interfaceType?: bigint };\n\nconst NO_BASELINE = -1;\n\nconst SEEDED_SLOTS: Record<string, RefSeeds> = {\n \"LayoutManagerClass.measure\": new Map([[6, NO_BASELINE], [7, NO_BASELINE]]),\n \"WidgetClass.measure\": new Map([[5, NO_BASELINE], [6, NO_BASELINE]]),\n};\n\nconst parentInvokers: InvokerCache = new WeakMap();\nconst vfuncInvokers: InvokerCache = new WeakMap();\n\nfunction toNativeInput(arg: Arg, input: unknown): unknown {\n return isCallerAllocatedArg(arg) ? input : toNative(arg.type, input);\n}\n\nfunction bindOptionsFor(\n slot: ResolvedSlot,\n instanceType: bigint | undefined,\n args: Arg[],\n label: string,\n): BindVfuncOptions {\n const { descriptor, interfaceType } = slot;\n\n const options: BindVfuncOptions = {\n byteOffset: descriptor.byteOffset,\n label,\n argDescriptors: buildNativeArgTypes(args, descriptor.canThrow === true),\n returnDescriptor: descriptor.returnDescriptor,\n };\n\n if (descriptor.vtableSize !== undefined) {\n options.vtableSize = descriptor.vtableSize;\n }\n\n if (instanceType !== undefined) {\n options.instanceType = instanceType;\n }\n\n if (interfaceType !== undefined) {\n options.interfaceType = interfaceType;\n }\n\n return options;\n}\n\nfunction buildInvoker(slot: ResolvedSlot, instanceType: bigint | undefined, caller: string): Invoker {\n const { descriptor } = slot;\n const args = vfuncArgs(descriptor);\n const canThrow = descriptor.canThrow === true;\n const label = `${descriptor.className}.${descriptor.vfuncName}`;\n const [, ...inputArgs] = args.filter(requiresInputArg);\n let pendingSeeds: RefSeeds | undefined;\n\n const takeRefSeeds = (): RefSeeds | undefined => {\n const seeds = pendingSeeds;\n pendingSeeds = undefined;\n\n return seeds;\n };\n\n const shaped = fromNativeCallable(\n bindVfunc(bindOptionsFor(slot, instanceType, args, label)),\n {\n args,\n returns: descriptor.returnDescriptor,\n canThrow,\n },\n takeRefSeeds,\n );\n\n return (instance, inputs) => {\n if (inputs.length !== inputArgs.length) {\n throw new Error(\n `${caller}: ${label} expects ${String(inputArgs.length)} arguments, ` +\n `received ${String(inputs.length)}`,\n );\n }\n\n const nativeInputs = inputArgs.map((arg, index) => toNativeInput(arg, inputs[index]));\n pendingSeeds = SEEDED_SLOTS[label] ?? seedsFor(descriptor.argDescriptors, instance);\n\n return shaped(getHandle(instance), ...nativeInputs);\n };\n}\n\nfunction cachedInvoker(cache: InvokerCache, owner: AnyClass, key: string, build: () => Invoker): Invoker {\n const byKey = cache.getOrInsertComputed(owner, () => new Map<string, Invoker>());\n\n return byKey.getOrInsertComputed(key, build);\n}\n\nfunction resolveParentSlot(klass: AnyClass, parentType: bigint, methodName: string): ResolvedSlot | undefined {\n const classDescriptor = findClassVfuncDescriptor(klass, methodName);\n\n if (classDescriptor) {\n return { descriptor: classDescriptor };\n }\n\n for (const interfaceType of typeInterfaces(parentType)) {\n const descriptor = findInterfaceVfuncDescriptor(interfaceType, methodName);\n\n if (descriptor) {\n return { descriptor, interfaceType };\n }\n }\n\n return undefined;\n}\n\nfunction resolveParentType(klass: AnyClass, methodName: string): bigint {\n const gtype = getClassType(klass);\n\n if (gtype === TYPE_INVALID) {\n throw new Error(\n `callParent: cannot call '${methodName}' because ${klass.name} was never passed to registerClass`,\n );\n }\n\n return typeParent(gtype);\n}\n\nfunction buildParentInvoker(klass: AnyClass, methodName: string): Invoker {\n const parentType = resolveParentType(klass, methodName);\n const slot = resolveParentSlot(klass, parentType, methodName);\n\n if (!slot) {\n throw new Error(`callParent: ${klass.name} inherits no '${methodName}' vtable slot`);\n }\n\n return buildInvoker(slot, parentType, \"callParent\");\n}\n\n/**\n * Calls the implementation of a virtual function that the parent type of `klass` provides, so an\n * override can chain up to the behavior it replaces. `klass` is the class whose override is\n * running, named lexically rather than taken from `instance`, so each level of a hierarchy reaches\n * exactly one level up. Arguments and the return value follow the same convention the override\n * itself uses: pure out parameters are left out and returned instead, and a slot with several\n * outputs returns them as a tuple. Throws if `klass` was never registered, inherits no such slot,\n * or the parent type leaves the slot empty.\n *\n * @param klass The registered class whose override is chaining up.\n * @param methodName Name of the overridden method, such as `vfuncMeasure`.\n * @param instance The instance the override was invoked on.\n * @param inputs The arguments the override received.\n */\nfunction callParent(klass: AnyClass, methodName: string, instance: object, ...inputs: unknown[]): unknown {\n const invoker = cachedInvoker(parentInvokers, klass, methodName, () => buildParentInvoker(klass, methodName));\n\n return invoker(instance, inputs);\n}\n\nfunction resolveOwnerSlot(owner: AnyClass, key: string): ResolvedSlot {\n const classDescriptor = getVfuncRegistry(owner)?.[key];\n\n if (classDescriptor !== undefined) {\n return { descriptor: classDescriptor };\n }\n\n const interfaceType = getClassType(owner);\n const descriptor = getInterfaceVfuncRegistry(interfaceType)?.[key];\n\n if (descriptor === undefined) {\n throw new Error(`callVfunc: ${owner.name} declares no '${key}' vtable slot`);\n }\n\n return { descriptor, interfaceType };\n}\n\nfunction requiresDefaultVtable(slot: ResolvedSlot, instanceType: bigint): boolean {\n return slot.interfaceType !== undefined && !typeIsA(instanceType, slot.interfaceType);\n}\n\nfunction resolveInstanceType(key: string, instance: object, slot: ResolvedSlot): bigint | undefined {\n const instanceType = resolveWrapperType(instance);\n\n if (instanceType === TYPE_INVALID) {\n const name = instanceClassName(instance);\n throw new Error(`callVfunc: cannot call '${key}' because ${name} descends from no registered wrapper class`);\n }\n\n return requiresDefaultVtable(slot, instanceType) ? undefined : instanceType;\n}\n\n/**\n * Calls the implementation of a virtual function a wrapper class or interface declares, backing the\n * `vfunc`-prefixed members the generated bindings emit. The slot is read from the nearest generated\n * wrapper class in the instance's class chain rather than from the instance's own type, so an\n * override reaching it through `super` runs the implementation it replaced instead of re-entering\n * itself. When that wrapper class does not carry the interface the slot belongs to, because a class\n * registered below it adopted the interface, the slot comes from the interface's own default vtable\n * instead, which holds exactly what the adopting class replaced. Arguments and the return value\n * follow the same convention an override uses: pure out parameters are left out and returned\n * instead, and a slot with several outputs returns them as a tuple. Throws if the owner declares no\n * such slot, the instance descends from no wrapper class, or the resolved vtable leaves the slot\n * empty.\n *\n * @param owner The wrapper class or interface declaring the slot.\n * @param key Name of the generated member, such as `vfuncMeasure`.\n * @param instance The instance to invoke the slot on.\n * @param inputs The arguments the slot receives.\n */\nfunction callVfunc(owner: AnyClass, key: string, instance: object, inputs: unknown[]): unknown {\n const slot = resolveOwnerSlot(owner, key);\n const instanceType = resolveInstanceType(key, instance, slot);\n\n const invoker = cachedInvoker(vfuncInvokers, owner, `${key}:${String(instanceType)}`, () =>\n buildInvoker(slot, instanceType, \"callVfunc\"));\n\n return invoker(instance, inputs);\n}\n\nexport { callParent, callVfunc };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/runtime",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-beta.1",
|
|
4
4
|
"description": "FFI runtime for the generated GTK bindings: types, GValues, signals.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -34,10 +34,14 @@
|
|
|
34
34
|
"./package.json": "./package.json",
|
|
35
35
|
".": {
|
|
36
36
|
"types": "./dist/index.d.ts",
|
|
37
|
+
"import": "./dist/index.js",
|
|
38
|
+
"require": null,
|
|
37
39
|
"default": "./dist/index.js"
|
|
38
40
|
},
|
|
39
41
|
"./internal": {
|
|
40
42
|
"types": "./dist/internal.d.ts",
|
|
43
|
+
"import": "./dist/internal.js",
|
|
44
|
+
"require": null,
|
|
41
45
|
"default": "./dist/internal.js"
|
|
42
46
|
}
|
|
43
47
|
},
|
|
@@ -57,14 +61,14 @@
|
|
|
57
61
|
}
|
|
58
62
|
},
|
|
59
63
|
"engines": {
|
|
60
|
-
"node": ">=
|
|
64
|
+
"node": ">=26.7.0"
|
|
61
65
|
},
|
|
62
66
|
"dependencies": {
|
|
63
|
-
"@gtkx/
|
|
64
|
-
"@gtkx/
|
|
67
|
+
"@gtkx/native": "2.0.0-beta.1",
|
|
68
|
+
"@gtkx/utils": "2.0.0-beta.1"
|
|
65
69
|
},
|
|
66
70
|
"devDependencies": {
|
|
67
|
-
"@gtkx/vitest": "
|
|
71
|
+
"@gtkx/vitest": "2.0.0-beta.1"
|
|
68
72
|
},
|
|
69
73
|
"scripts": {
|
|
70
74
|
"release": "tsx ../../scripts/release-package.ts"
|
package/src/application-class.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AnyClass } from "@gtkx/utils";
|
|
2
2
|
import { releaseDefaultApplication } from "./default-application.js";
|
|
3
3
|
import { registerClass } from "./register-class.js";
|
|
4
4
|
import { getClassType } from "./registry.js";
|
|
@@ -93,7 +93,7 @@ const shutDownThroughRun = (application: ShutdownApplication): void => {
|
|
|
93
93
|
};
|
|
94
94
|
|
|
95
95
|
const deriveApplicationClass = <T extends CommandLineApplication>(base: AnyClass<T>): AnyClass<T> =>
|
|
96
|
-
|
|
96
|
+
derivedClasses.getOrInsertComputed(base, () => buildApplicationClass(base)) as AnyClass<T>;
|
|
97
97
|
|
|
98
98
|
/**
|
|
99
99
|
* Constructs an application GTKX can shut down. GLib parses an application's command line at most
|
package/src/arg.ts
CHANGED
|
@@ -12,7 +12,10 @@ type Arg = {
|
|
|
12
12
|
isConsumed?: boolean;
|
|
13
13
|
/** When true, the argument is a `GValue` the callee fills in, packed into the result as what it holds. */
|
|
14
14
|
isUnpacked?: boolean;
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* When true, the caller must provide the argument: `undefined` is rejected instead of reaching
|
|
17
|
+
* C as `NULL`, and so is `null` for a type that reaches C as a pointer.
|
|
18
|
+
*/
|
|
16
19
|
isRequired?: boolean;
|
|
17
20
|
};
|
|
18
21
|
|
package/src/bind.ts
CHANGED
|
@@ -25,18 +25,7 @@ function bind(
|
|
|
25
25
|
function createBindCache(): (key: string, ...args: Parameters<typeof bind>) => ReturnType<typeof bind> {
|
|
26
26
|
const cache: Map<string, ReturnType<typeof bind>> = new Map();
|
|
27
27
|
|
|
28
|
-
return (key, ...args) =>
|
|
29
|
-
const existing = cache.get(key);
|
|
30
|
-
|
|
31
|
-
if (existing !== undefined) {
|
|
32
|
-
return existing;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const bound = bind(...args);
|
|
36
|
-
cache.set(key, bound);
|
|
37
|
-
|
|
38
|
-
return bound;
|
|
39
|
-
};
|
|
28
|
+
return (key, ...args) => cache.getOrInsertComputed(key, () => bind(...args));
|
|
40
29
|
}
|
|
41
30
|
|
|
42
31
|
export { bind, createBindCache };
|
package/src/callback.ts
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
import { copy, type Descriptor } from "@gtkx/native";
|
|
2
2
|
import type { CallbackDescriptor, RefDescriptor } from "./descriptors.js";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
foldedLengthArgIndices,
|
|
5
|
+
foldedLengthSources,
|
|
6
|
+
type LengthSource,
|
|
7
|
+
type LengthSources,
|
|
8
|
+
} from "./folded-lengths.js";
|
|
4
9
|
import { fromNative, toNative } from "./native-value.js";
|
|
5
|
-
import { getHandle } from "./registry.js";
|
|
10
|
+
import { describeValueKind, getHandle } from "./registry.js";
|
|
6
11
|
import { splitTupleResult } from "./tuple.js";
|
|
7
12
|
import { copyValue } from "./value.js";
|
|
8
13
|
import { popSeedFrame, pushSeedFrame, type RefSeeds } from "./vfunc-seeds.js";
|
|
9
14
|
|
|
10
15
|
type Callback = (...args: unknown[]) => unknown;
|
|
11
16
|
type CallbackKind = "vfunc" | "signal" | "callback";
|
|
12
|
-
type CallbackTraits = {
|
|
17
|
+
type CallbackTraits = {
|
|
18
|
+
isInstanceBound: boolean;
|
|
19
|
+
hasInstanceArg: boolean;
|
|
20
|
+
hasFoldedLengths: boolean;
|
|
21
|
+
hasFoldedInputs: boolean;
|
|
22
|
+
};
|
|
13
23
|
type OutParam = { value: unknown; descriptor: Descriptor; argIndex: number };
|
|
24
|
+
type CollectedArgs = { params: OutParam[]; argIndex: number; isFolded: boolean };
|
|
25
|
+
type PartitionedArgs = { inputs: unknown[]; outParams: OutParam[] };
|
|
14
26
|
type LengthLink = { target: OutParam; sources: LengthSource[] };
|
|
15
27
|
type OutParamGroups = { lengthLinks: LengthLink[]; valueParams: OutParam[] };
|
|
16
28
|
type OutValues = Map<number, unknown>;
|
|
@@ -31,12 +43,13 @@ type CallbackPlan = {
|
|
|
31
43
|
lengthSources: LengthSources;
|
|
32
44
|
hasOutParams: boolean;
|
|
33
45
|
hasRefOutParams: boolean;
|
|
46
|
+
foldedInputIndices: ReadonlySet<number>;
|
|
34
47
|
};
|
|
35
48
|
|
|
36
49
|
const CALLBACK_TRAITS: Record<CallbackKind, CallbackTraits> = {
|
|
37
|
-
callback: { isInstanceBound: false, hasInstanceArg: false, hasFoldedLengths: true },
|
|
38
|
-
signal: { isInstanceBound: false, hasInstanceArg: true, hasFoldedLengths: false },
|
|
39
|
-
vfunc: { isInstanceBound: true, hasInstanceArg: true, hasFoldedLengths: true },
|
|
50
|
+
callback: { isInstanceBound: false, hasInstanceArg: false, hasFoldedLengths: true, hasFoldedInputs: true },
|
|
51
|
+
signal: { isInstanceBound: false, hasInstanceArg: true, hasFoldedLengths: false, hasFoldedInputs: false },
|
|
52
|
+
vfunc: { isInstanceBound: true, hasInstanceArg: true, hasFoldedLengths: true, hasFoldedInputs: false },
|
|
40
53
|
};
|
|
41
54
|
|
|
42
55
|
const fillCallerAllocatedBuffer = (descriptor: Descriptor, target: object, source: object): void => {
|
|
@@ -62,9 +75,9 @@ const collectRefArg = (
|
|
|
62
75
|
descriptor: RefDescriptor,
|
|
63
76
|
wrappedValue: unknown,
|
|
64
77
|
inputs: unknown[],
|
|
65
|
-
out:
|
|
78
|
+
out: CollectedArgs,
|
|
66
79
|
): void => {
|
|
67
|
-
if (descriptor.inout === true) {
|
|
80
|
+
if (descriptor.inout === true && !out.isFolded) {
|
|
68
81
|
inputs.push((wrappedValue as { value: unknown }).value);
|
|
69
82
|
}
|
|
70
83
|
|
|
@@ -75,7 +88,7 @@ const collectCallbackArg = (
|
|
|
75
88
|
descriptor: Descriptor | undefined,
|
|
76
89
|
wrappedValue: unknown,
|
|
77
90
|
inputs: unknown[],
|
|
78
|
-
out:
|
|
91
|
+
out: CollectedArgs,
|
|
79
92
|
): void => {
|
|
80
93
|
if (descriptor?.kind === "ref") {
|
|
81
94
|
collectRefArg(descriptor, wrappedValue, inputs, out);
|
|
@@ -83,25 +96,24 @@ const collectCallbackArg = (
|
|
|
83
96
|
return;
|
|
84
97
|
}
|
|
85
98
|
|
|
86
|
-
|
|
99
|
+
if (!out.isFolded) {
|
|
100
|
+
inputs.push(wrappedValue);
|
|
101
|
+
}
|
|
87
102
|
|
|
88
103
|
if (descriptor !== undefined && isCallerAllocatedOut(descriptor)) {
|
|
89
104
|
out.params.push({ value: wrappedValue, descriptor, argIndex: out.argIndex });
|
|
90
105
|
}
|
|
91
106
|
};
|
|
92
107
|
|
|
93
|
-
const partitionCallbackArgs = (
|
|
94
|
-
effectiveTypes: Descriptor[],
|
|
95
|
-
wrapped: unknown[],
|
|
96
|
-
start: number,
|
|
97
|
-
): { inputs: unknown[]; outParams: OutParam[] } => {
|
|
108
|
+
const partitionCallbackArgs = (plan: CallbackPlan, wrapped: unknown[]): PartitionedArgs => {
|
|
98
109
|
const inputs: unknown[] = [];
|
|
99
110
|
const params: OutParam[] = [];
|
|
100
|
-
const collected = { params, argIndex: start };
|
|
111
|
+
const collected: CollectedArgs = { params, argIndex: plan.start, isFolded: false };
|
|
101
112
|
|
|
102
|
-
for (let i = start; i < effectiveTypes.length; i++) {
|
|
113
|
+
for (let i = plan.start; i < plan.effectiveTypes.length; i++) {
|
|
103
114
|
collected.argIndex = i;
|
|
104
|
-
|
|
115
|
+
collected.isFolded = plan.foldedInputIndices.has(i);
|
|
116
|
+
collectCallbackArg(plan.effectiveTypes[i], wrapped[i], inputs, collected);
|
|
105
117
|
}
|
|
106
118
|
|
|
107
119
|
return { inputs, outParams: params };
|
|
@@ -215,17 +227,15 @@ const wrapCallbackArgs = (effectiveTypes: Descriptor[], rawArgs: unknown[]): voi
|
|
|
215
227
|
};
|
|
216
228
|
|
|
217
229
|
const trimCallbackInputs = (plan: CallbackPlan, wrapped: unknown[]): unknown[] => {
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
if (wrapped.length > count) {
|
|
221
|
-
wrapped.length = count;
|
|
222
|
-
}
|
|
230
|
+
const inputs: unknown[] = [];
|
|
223
231
|
|
|
224
|
-
for (let index =
|
|
225
|
-
|
|
232
|
+
for (let index = plan.start; index < plan.effectiveTypes.length; index++) {
|
|
233
|
+
if (!plan.foldedInputIndices.has(index)) {
|
|
234
|
+
inputs.push(wrapped[index]);
|
|
235
|
+
}
|
|
226
236
|
}
|
|
227
237
|
|
|
228
|
-
return
|
|
238
|
+
return inputs;
|
|
229
239
|
};
|
|
230
240
|
|
|
231
241
|
const nativeReturn = (plan: CallbackPlan, primary: unknown): unknown =>
|
|
@@ -240,7 +250,7 @@ const runCallback = (plan: CallbackPlan, rawArgs: unknown[]): unknown => {
|
|
|
240
250
|
return nativeReturn(plan, plan.fn.apply(thisArg, trimCallbackInputs(plan, rawArgs)));
|
|
241
251
|
}
|
|
242
252
|
|
|
243
|
-
const { inputs, outParams } = partitionCallbackArgs(
|
|
253
|
+
const { inputs, outParams } = partitionCallbackArgs(plan, rawArgs);
|
|
244
254
|
const result = applyCallback(plan, thisArg, inputs, outParams);
|
|
245
255
|
|
|
246
256
|
if (outParams.length === 0) {
|
|
@@ -270,9 +280,22 @@ const getEffectiveTypes = (spec: CallbackSpec): Descriptor[] => {
|
|
|
270
280
|
const wrapCallbackValue = (spec: CallbackDescriptor, callback: unknown): unknown =>
|
|
271
281
|
callback == null ? callback : wrapCallback(callback as Callback, spec, "callback");
|
|
272
282
|
|
|
283
|
+
const planFoldedInputIndices = (spec: CallbackSpec, hasFoldedInputs: boolean): ReadonlySet<number> =>
|
|
284
|
+
hasFoldedInputs ? foldedLengthArgIndices(spec) : new Set<number>();
|
|
285
|
+
|
|
286
|
+
/** Thrown when a value passed where a callback, signal handler or vfunc is expected cannot be called. */
|
|
287
|
+
class CallbackMarshalError extends TypeError {
|
|
288
|
+
/** Name callers match on when the error is caught as a plain `TypeError`. */
|
|
289
|
+
public override name = "CallbackMarshalError";
|
|
290
|
+
}
|
|
291
|
+
|
|
273
292
|
function wrapCallback(fn: Callback, spec: CallbackSpec, kind: CallbackKind): Callback {
|
|
293
|
+
if (typeof fn !== "function") {
|
|
294
|
+
throw new CallbackMarshalError(`Cannot marshal ${describeValueKind(fn)} into a ${kind}`);
|
|
295
|
+
}
|
|
296
|
+
|
|
274
297
|
const effectiveTypes = getEffectiveTypes(spec);
|
|
275
|
-
const { isInstanceBound, hasInstanceArg, hasFoldedLengths } = CALLBACK_TRAITS[kind];
|
|
298
|
+
const { isInstanceBound, hasInstanceArg, hasFoldedLengths, hasFoldedInputs } = CALLBACK_TRAITS[kind];
|
|
276
299
|
const start = hasInstanceArg ? 1 : 0;
|
|
277
300
|
|
|
278
301
|
const plan: CallbackPlan = {
|
|
@@ -285,9 +308,10 @@ function wrapCallback(fn: Callback, spec: CallbackSpec, kind: CallbackKind): Cal
|
|
|
285
308
|
lengthSources: planLengthSources(spec, hasFoldedLengths),
|
|
286
309
|
hasOutParams: haveOutParamArgs(effectiveTypes, start),
|
|
287
310
|
hasRefOutParams: haveRefOutParamArgs(effectiveTypes, start),
|
|
311
|
+
foldedInputIndices: planFoldedInputIndices(spec, hasFoldedInputs),
|
|
288
312
|
};
|
|
289
313
|
|
|
290
314
|
return (...rawArgs: unknown[]): unknown => runCallback(plan, rawArgs);
|
|
291
315
|
}
|
|
292
316
|
|
|
293
|
-
export { isCallerAllocatedOut, wrapCallbackValue, wrapCallback };
|
|
317
|
+
export { CallbackMarshalError, isCallerAllocatedOut, wrapCallbackValue, wrapCallback };
|
package/src/closure.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
import { type ExternalObject, type Handle, read } from "@gtkx/native";
|
|
1
|
+
import { type ExternalObject, type Handle, read, symbolAddress } from "@gtkx/native";
|
|
2
2
|
import { type AnyClass } from "@gtkx/utils";
|
|
3
|
-
import { bind } from "./bind.js";
|
|
4
|
-
import {
|
|
3
|
+
import { bind, createBindCache } from "./bind.js";
|
|
4
|
+
import {
|
|
5
|
+
biguint64T,
|
|
6
|
+
boxedT,
|
|
7
|
+
type CallbackDescriptor,
|
|
8
|
+
callbackT,
|
|
9
|
+
sizedArrayT,
|
|
10
|
+
structT,
|
|
11
|
+
uint32T,
|
|
12
|
+
uint64T,
|
|
13
|
+
voidT,
|
|
14
|
+
} from "./descriptors.js";
|
|
5
15
|
import { CLOSURE_SIZE, LIB, VALUE_SIZE, VALUE_T } from "./library.js";
|
|
6
16
|
import { describeValueKind, getClassType, getHandle, getWrapperClass, wrapHandle } from "./registry.js";
|
|
7
17
|
import { resolveBoxedType, typeIsA } from "./type.js";
|
|
@@ -59,7 +69,12 @@ const gCclosureNew = bind(LIB, "g_cclosure_new", [MARSHAL_T], OWNED_CLOSURE_T);
|
|
|
59
69
|
const gValueGetBoxed = bind(LIB, "g_value_get_boxed", [VALUE_T], NESTED_VALUE_T);
|
|
60
70
|
const gClosureRef = bind(LIB, "g_closure_ref", [CLOSURE_T], uint64T);
|
|
61
71
|
const gClosureSink = bind(LIB, "g_closure_sink", [CLOSURE_T], voidT);
|
|
62
|
-
const gClosureSetMarshal = bind(LIB, "g_closure_set_marshal", [CLOSURE_T,
|
|
72
|
+
const gClosureSetMarshal = bind(LIB, "g_closure_set_marshal", [CLOSURE_T, biguint64T], voidT);
|
|
73
|
+
const cclosureNewCache = createBindCache();
|
|
74
|
+
const genericMarshal: { address?: bigint } = {};
|
|
75
|
+
|
|
76
|
+
const genericClosureMarshal = (): bigint =>
|
|
77
|
+
(genericMarshal.address ??= symbolAddress(LIB, "g_cclosure_marshal_generic"));
|
|
63
78
|
|
|
64
79
|
const isClosureInstance = (value: object): boolean =>
|
|
65
80
|
typeIsA(getClassType(value.constructor as AnyClass), resolveBoxedType(CLOSURE_T));
|
|
@@ -84,7 +99,7 @@ function marshalFor(callback: ClosureCallback): (...args: unknown[]) => void {
|
|
|
84
99
|
|
|
85
100
|
function newClosure(callback: ClosureCallback): ExternalObject<Handle> {
|
|
86
101
|
const handle = gCclosureNew(marshalFor(callback)) as ExternalObject<Handle>;
|
|
87
|
-
const marshal = read(handle,
|
|
102
|
+
const marshal = read(handle, biguint64T, CCLOSURE_CALLBACK_OFFSET);
|
|
88
103
|
gClosureRef(handle);
|
|
89
104
|
gClosureSink(handle);
|
|
90
105
|
gClosureSetMarshal(handle, marshal);
|
|
@@ -92,6 +107,16 @@ function newClosure(callback: ClosureCallback): ExternalObject<Handle> {
|
|
|
92
107
|
return handle;
|
|
93
108
|
}
|
|
94
109
|
|
|
110
|
+
function newCCallbackClosure(key: string, callback: CallbackDescriptor, fn: unknown): ExternalObject<Handle> {
|
|
111
|
+
const create = cclosureNewCache(key, LIB, "g_cclosure_new", [callback], OWNED_CLOSURE_T);
|
|
112
|
+
const handle = create(fn) as ExternalObject<Handle>;
|
|
113
|
+
gClosureRef(handle);
|
|
114
|
+
gClosureSink(handle);
|
|
115
|
+
gClosureSetMarshal(handle, genericClosureMarshal());
|
|
116
|
+
|
|
117
|
+
return handle;
|
|
118
|
+
}
|
|
119
|
+
|
|
95
120
|
/**
|
|
96
121
|
* Marshals a value passed where a `GObject.Closure` is expected into a closure handle: a function
|
|
97
122
|
* becomes a new `GClosure` dispatching into it, and an existing closure yields its own handle.
|
|
@@ -121,4 +146,4 @@ class ClosureMarshalError extends TypeError {
|
|
|
121
146
|
public override name = "ClosureMarshalError";
|
|
122
147
|
}
|
|
123
148
|
|
|
124
|
-
export { type ClosureCallback, ClosureMarshalError, toClosure, tryToClosure };
|
|
149
|
+
export { type ClosureCallback, ClosureMarshalError, newCCallbackClosure, toClosure, tryToClosure };
|