@gtkx/codegen 1.2.1 → 1.2.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/dist/store/gi/callables.d.ts +1 -1
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +3 -3
- package/dist/store/gi/callables.js.map +1 -1
- package/dist/store/gi/class.d.ts.map +1 -1
- package/dist/store/gi/class.js +8 -15
- package/dist/store/gi/class.js.map +1 -1
- package/dist/store/gi/gtype-binding.d.ts +1 -2
- package/dist/store/gi/gtype-binding.d.ts.map +1 -1
- package/dist/store/gi/gtype-binding.js +1 -13
- package/dist/store/gi/gtype-binding.js.map +1 -1
- package/dist/store/gi/interface.js +2 -2
- package/dist/store/gi/interface.js.map +1 -1
- package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
- package/dist/store/gi/record-field-accessor.js +133 -13
- package/dist/store/gi/record-field-accessor.js.map +1 -1
- package/dist/store/gi/record-layout.d.ts +5 -2
- package/dist/store/gi/record-layout.d.ts.map +1 -1
- package/dist/store/gi/record-layout.js +2 -1
- package/dist/store/gi/record-layout.js.map +1 -1
- package/dist/store/gi/record.d.ts.map +1 -1
- package/dist/store/gi/record.js +9 -5
- package/dist/store/gi/record.js.map +1 -1
- package/package.json +3 -3
- package/src/store/gi/callables.ts +4 -4
- package/src/store/gi/class.ts +14 -33
- package/src/store/gi/gtype-binding.ts +1 -16
- package/src/store/gi/interface.ts +2 -2
- package/src/store/gi/record-field-accessor.ts +198 -14
- package/src/store/gi/record-layout.ts +11 -1
- package/src/store/gi/record.ts +17 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-layout.js","sourceRoot":"","sources":["../../../src/store/gi/record-layout.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GirField } from \"../../gir/field.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { EntityType, GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport {\n computeFieldSlots,\n type FieldLayout,\n type FieldLayoutInput,\n type FieldSlot,\n layoutOfPrimitive,\n} from \"../../gir/size.js\";\n\ntype ResolvedRecordValue = Extract<EntityType, { kind: \"record\" }>[\"value\"];\n\ntype RecordFieldSlot = {\n field: GirField;\n slot: FieldSlot;\n};\n\nconst POINTER_LAYOUT: FieldLayout = { size: 8, align: 8 };\nconst recordLayoutCache: Map<string, FieldLayout> = new Map();\n\nconst ALIGNMENT_OVERRIDES: Map<string, FieldLayout> = new Map([\n [\"graphene_simd4f_t\", { size: 16, align: 16 }],\n [\"graphene_simd4x4f_t\", { size: 64, align: 16 }],\n]);\n\nconst computeRecordFieldSlots = (\n context: ModuleContext,\n fields: GirField[],\n isUnion = false,\n): { slots: RecordFieldSlot[]; size: number } => {\n const inputs: FieldLayoutInput[] = Array.from(fields, (field) => fieldLayoutInput(context, field, new Set()));\n const result = computeFieldSlots(inputs, isUnion);\n\n const slots = result.slots.map((slot, index) => {\n const field = fields[index];\n\n if (field === undefined) {\n throw new Error(\"computeRecordFieldSlots: parallel arrays diverged\");\n }\n\n return { field, slot };\n });\n\n return { slots, size: result.size };\n};\n\nconst recordInlineSize = (context: ModuleContext, record: ResolvedRecordValue): number | undefined => {\n if (record.opaque || record.disguised || record.fields.length === 0) {\n return undefined;\n }\n\n const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);\n\n return size > 0 ? size : undefined;\n};\n\nconst bitMask = (width: number): number => {\n if (width >= 32) {\n return 0xFF_FF_FF_FF;\n }\n\n return (1 << width) - 1;\n};\n\nconst mergeBitfield = (readExpr: string, valueExpr: string, mask: number, shift: number): string => {\n const maskExpr = String(mask);\n const shiftExpr = String(shift);\n\n return (\n `((${readExpr} & ~(${maskExpr} << ${shiftExpr})) | ` +\n `((Number(${valueExpr}) & ${maskExpr}) << ${shiftExpr})) >>> 0`\n );\n};\n\nconst fieldLayoutInput = (context: ModuleContext, field: GirField, visited: Set<string>): FieldLayoutInput => {\n if (field.inlineMembers !== undefined) {\n const layout = inlineMemberLayout(context, field.inlineMembers, field.isInlineUnion, visited);\n\n return { layout, bits: undefined };\n }\n\n if (field.type === undefined) {\n return { layout: POINTER_LAYOUT, bits: undefined };\n }\n\n return { layout: layoutOfType(context, field.type, field.cType, visited), bits: field.bits };\n};\n\nconst inlineMemberLayout = (\n context: ModuleContext,\n members: GirField[],\n isUnion: boolean,\n visited: Set<string>,\n): FieldLayout => {\n const inputs = Array.from(members, (member) => fieldLayoutInput(context, member, visited));\n\n if (inputs.length === 0) {\n return { size: 0, align: 1 };\n }\n\n const { size } = computeFieldSlots(inputs, isUnion);\n\n return { size, align: Math.max(1, ...inputs.map((input) => input.layout.align)) };\n};\n\nconst pointerOr = (occurrenceCType: string | undefined, otherwise: () => FieldLayout): FieldLayout =>\n occurrenceCType?.endsWith(\"*\") === true ? POINTER_LAYOUT : otherwise();\n\nconst layoutOfType = (\n context: ModuleContext,\n ref: TypeId,\n occurrenceCType: string | undefined,\n visited: Set<string>,\n): FieldLayout => {\n const type = context.library.typeFor(ref);\n\n if (type === undefined) {\n return POINTER_LAYOUT;\n }\n\n switch (type.kind) {\n case \"primitive\": {\n return pointerOr(occurrenceCType, () => layoutOfPrimitive(type.category));\n }\n case \"carray\": {\n return arrayLayout(context, type, visited);\n }\n case \"list\":\n case \"hashtable\":\n case \"callback\":\n case \"varargs\":\n case \"class\":\n case \"interface\": {\n return POINTER_LAYOUT;\n }\n case \"enum\": {\n return pointerOr(occurrenceCType, () => layoutOfPrimitive(\"int32\"));\n }\n case \"record\": {\n return pointerOr(occurrenceCType, () => layoutOfRecord(context, type, visited));\n }\n case \"alias\": {\n return pointerOr(occurrenceCType, () => resolveAliasLayout(context, type, visited));\n }\n }\n};\n\nconst arrayLayout = (\n context: ModuleContext,\n ref: Extract<GirType, { kind: \"carray\" }>,\n visited: Set<string>,\n): FieldLayout => {\n if (ref.fixedSize === undefined) {\n return POINTER_LAYOUT;\n }\n\n const elementLayout = layoutOfType(context, ref.element, ref.elementCType, visited);\n\n return { size: elementLayout.size * ref.fixedSize, align: elementLayout.align };\n};\n\nconst declaredLayout = (record: ResolvedRecordValue): FieldLayout | undefined => {\n if (record.cType?.endsWith(\"*\") === true) {\n return POINTER_LAYOUT;\n }\n\n return record.cType === undefined ? undefined : ALIGNMENT_OVERRIDES.get(record.cType);\n};\n\nconst layoutOfRecord = (\n context: ModuleContext,\n resolved: Extract<EntityType, { kind: \"record\" }>,\n visited: Set<string>,\n): FieldLayout => {\n const declared = declaredLayout(resolved.value);\n\n if (declared !== undefined) {\n return declared;\n }\n\n const key = `${resolved.namespace.name}.${resolved.value.name}`;\n\n if (visited.has(key)) {\n return POINTER_LAYOUT;\n }\n\n const cached = recordLayoutCache.get(key);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const nextVisited = new Set(visited);\n nextVisited.add(key);\n\n const inputs: FieldLayoutInput[] = Array.from(resolved.value.fields, (field) =>\n fieldLayoutInput(context, field, nextVisited));\n\n if (inputs.length === 0) {\n return POINTER_LAYOUT;\n }\n\n const { size } = computeFieldSlots(inputs, resolved.value.isUnion);\n const align = Math.max(1, ...inputs.map((input) => input.layout.align));\n const layout: FieldLayout = { size, align };\n recordLayoutCache.set(key, layout);\n\n return layout;\n};\n\nconst resolveAliasLayout = (\n context: ModuleContext,\n resolved: Extract<EntityType, { kind: \"alias\" }>,\n visited: Set<string>,\n): FieldLayout => {\n const ref = resolved.value.target;\n\n if (ref === undefined) {\n return POINTER_LAYOUT;\n }\n\n return layoutOfType(context, ref, resolved.value.targetCType, visited);\n};\n\nexport { computeRecordFieldSlots, recordInlineSize, bitMask, mergeBitfield, type RecordFieldSlot };\n"]}
|
|
1
|
+
{"version":3,"file":"record-layout.js","sourceRoot":"","sources":["../../../src/store/gi/record-layout.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GirField } from \"../../gir/field.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { EntityType, GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport {\n computeFieldSlots,\n type FieldLayout,\n type FieldLayoutInput,\n type FieldSlot,\n layoutOfPrimitive,\n} from \"../../gir/size.js\";\n\ntype ResolvedRecordValue = Extract<EntityType, { kind: \"record\" }>[\"value\"];\n\ntype RecordFieldSlot = {\n field: GirField;\n slot: FieldSlot;\n};\n\nconst POINTER_LAYOUT: FieldLayout = { size: 8, align: 8 };\nconst recordLayoutCache: Map<string, FieldLayout> = new Map();\n\nconst ALIGNMENT_OVERRIDES: Map<string, FieldLayout> = new Map([\n [\"graphene_simd4f_t\", { size: 16, align: 16 }],\n [\"graphene_simd4x4f_t\", { size: 64, align: 16 }],\n]);\n\nconst computeRecordFieldSlots = (\n context: ModuleContext,\n fields: GirField[],\n isUnion = false,\n): { slots: RecordFieldSlot[]; size: number } => {\n const inputs: FieldLayoutInput[] = Array.from(fields, (field) => fieldLayoutInput(context, field, new Set()));\n const result = computeFieldSlots(inputs, isUnion);\n\n const slots = result.slots.map((slot, index) => {\n const field = fields[index];\n\n if (field === undefined) {\n throw new Error(\"computeRecordFieldSlots: parallel arrays diverged\");\n }\n\n return { field, slot };\n });\n\n return { slots, size: result.size };\n};\n\nconst recordInlineSize = (context: ModuleContext, record: ResolvedRecordValue): number | undefined => {\n if (record.opaque || record.disguised || record.fields.length === 0) {\n return undefined;\n }\n\n const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);\n\n return size > 0 ? size : undefined;\n};\n\nconst inlineArrayStride = (context: ModuleContext, array: Extract<GirType, { kind: \"carray\" }>): number =>\n layoutOfType(context, array.element, array.elementCType, new Set()).size;\n\nconst bitMask = (width: number): number => {\n if (width >= 32) {\n return 0xFF_FF_FF_FF;\n }\n\n return (1 << width) - 1;\n};\n\nconst mergeBitfield = (readExpr: string, valueExpr: string, mask: number, shift: number): string => {\n const maskExpr = String(mask);\n const shiftExpr = String(shift);\n\n return (\n `((${readExpr} & ~(${maskExpr} << ${shiftExpr})) | ` +\n `((Number(${valueExpr}) & ${maskExpr}) << ${shiftExpr})) >>> 0`\n );\n};\n\nconst fieldLayoutInput = (context: ModuleContext, field: GirField, visited: Set<string>): FieldLayoutInput => {\n if (field.inlineMembers !== undefined) {\n const layout = inlineMemberLayout(context, field.inlineMembers, field.isInlineUnion, visited);\n\n return { layout, bits: undefined };\n }\n\n if (field.type === undefined) {\n return { layout: POINTER_LAYOUT, bits: undefined };\n }\n\n return { layout: layoutOfType(context, field.type, field.cType, visited), bits: field.bits };\n};\n\nconst inlineMemberLayout = (\n context: ModuleContext,\n members: GirField[],\n isUnion: boolean,\n visited: Set<string>,\n): FieldLayout => {\n const inputs = Array.from(members, (member) => fieldLayoutInput(context, member, visited));\n\n if (inputs.length === 0) {\n return { size: 0, align: 1 };\n }\n\n const { size } = computeFieldSlots(inputs, isUnion);\n\n return { size, align: Math.max(1, ...inputs.map((input) => input.layout.align)) };\n};\n\nconst pointerOr = (occurrenceCType: string | undefined, otherwise: () => FieldLayout): FieldLayout =>\n occurrenceCType?.endsWith(\"*\") === true ? POINTER_LAYOUT : otherwise();\n\nconst layoutOfType = (\n context: ModuleContext,\n ref: TypeId,\n occurrenceCType: string | undefined,\n visited: Set<string>,\n): FieldLayout => {\n const type = context.library.typeFor(ref);\n\n if (type === undefined) {\n return POINTER_LAYOUT;\n }\n\n switch (type.kind) {\n case \"primitive\": {\n return pointerOr(occurrenceCType, () => layoutOfPrimitive(type.category));\n }\n case \"carray\": {\n return arrayLayout(context, type, visited);\n }\n case \"list\":\n case \"hashtable\":\n case \"callback\":\n case \"varargs\":\n case \"class\":\n case \"interface\": {\n return POINTER_LAYOUT;\n }\n case \"enum\": {\n return pointerOr(occurrenceCType, () => layoutOfPrimitive(\"int32\"));\n }\n case \"record\": {\n return pointerOr(occurrenceCType, () => layoutOfRecord(context, type, visited));\n }\n case \"alias\": {\n return pointerOr(occurrenceCType, () => resolveAliasLayout(context, type, visited));\n }\n }\n};\n\nconst arrayLayout = (\n context: ModuleContext,\n ref: Extract<GirType, { kind: \"carray\" }>,\n visited: Set<string>,\n): FieldLayout => {\n if (ref.fixedSize === undefined) {\n return POINTER_LAYOUT;\n }\n\n const elementLayout = layoutOfType(context, ref.element, ref.elementCType, visited);\n\n return { size: elementLayout.size * ref.fixedSize, align: elementLayout.align };\n};\n\nconst declaredLayout = (record: ResolvedRecordValue): FieldLayout | undefined => {\n if (record.cType?.endsWith(\"*\") === true) {\n return POINTER_LAYOUT;\n }\n\n return record.cType === undefined ? undefined : ALIGNMENT_OVERRIDES.get(record.cType);\n};\n\nconst layoutOfRecord = (\n context: ModuleContext,\n resolved: Extract<EntityType, { kind: \"record\" }>,\n visited: Set<string>,\n): FieldLayout => {\n const declared = declaredLayout(resolved.value);\n\n if (declared !== undefined) {\n return declared;\n }\n\n const key = `${resolved.namespace.name}.${resolved.value.name}`;\n\n if (visited.has(key)) {\n return POINTER_LAYOUT;\n }\n\n const cached = recordLayoutCache.get(key);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const nextVisited = new Set(visited);\n nextVisited.add(key);\n\n const inputs: FieldLayoutInput[] = Array.from(resolved.value.fields, (field) =>\n fieldLayoutInput(context, field, nextVisited));\n\n if (inputs.length === 0) {\n return POINTER_LAYOUT;\n }\n\n const { size } = computeFieldSlots(inputs, resolved.value.isUnion);\n const align = Math.max(1, ...inputs.map((input) => input.layout.align));\n const layout: FieldLayout = { size, align };\n recordLayoutCache.set(key, layout);\n\n return layout;\n};\n\nconst resolveAliasLayout = (\n context: ModuleContext,\n resolved: Extract<EntityType, { kind: \"alias\" }>,\n visited: Set<string>,\n): FieldLayout => {\n const ref = resolved.value.target;\n\n if (ref === undefined) {\n return POINTER_LAYOUT;\n }\n\n return layoutOfType(context, ref, resolved.value.targetCType, visited);\n};\n\nexport {\n computeRecordFieldSlots,\n inlineArrayStride,\n recordInlineSize,\n bitMask,\n mergeBitfield,\n type RecordFieldSlot,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/store/gi/record.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAe7D,QAAA,MAAM,cAAc,GAAI,SAAS,aAAa,EAAE,QAAQ,SAAS,KAAG,IAyCnE,CAAC;AAmCF,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/store/gi/record.js
CHANGED
|
@@ -22,8 +22,7 @@ const generateRecord = (context, record) => {
|
|
|
22
22
|
methods: dedupeCallables(record.methods),
|
|
23
23
|
};
|
|
24
24
|
generateBindings(context, callables);
|
|
25
|
-
const
|
|
26
|
-
const members = renderRecordMembers({ context, record, className, callables, gtypeExpr });
|
|
25
|
+
const members = renderRecordMembers(context, record, className, callables);
|
|
27
26
|
const body = indentMembers(members);
|
|
28
27
|
const heritage = isErrorSubclass ? " extends globalThis.Error" : "";
|
|
29
28
|
const doc = getDoc(record);
|
|
@@ -40,15 +39,20 @@ const generateRecord = (context, record) => {
|
|
|
40
39
|
code: renderRecordConstructorPropsInterface(context, record, className),
|
|
41
40
|
});
|
|
42
41
|
}
|
|
42
|
+
const gtypeExpr = renderSourceGtype(context, record);
|
|
43
43
|
appendWrapperClassRegistration(context, {
|
|
44
44
|
className,
|
|
45
45
|
gtypeExpr,
|
|
46
46
|
});
|
|
47
47
|
};
|
|
48
|
-
const renderRecordMembers = (
|
|
49
|
-
const { context, record, className, callables, gtypeExpr } = options;
|
|
48
|
+
const renderRecordMembers = (context, record, className, callables) => {
|
|
50
49
|
const isErrorSubclass = isGErrorRecord(context, record);
|
|
51
|
-
const { members, claimedNames } = renderPlainTypeMembers({
|
|
50
|
+
const { members, claimedNames } = renderPlainTypeMembers({
|
|
51
|
+
context,
|
|
52
|
+
className,
|
|
53
|
+
callables,
|
|
54
|
+
hasGtype: record.glibGetType !== undefined,
|
|
55
|
+
});
|
|
52
56
|
members.unshift(renderRecordConstructor(context, { record, className, callables, isErrorSubclass }));
|
|
53
57
|
const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
54
58
|
for (const slot of slots) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/store/gi/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAkB,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC3G,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,qCAAqC,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/store/gi/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAkB,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC3G,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,qCAAqC,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAE,MAAiB,EAAW,EAAE,CAC1E,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,kBAAkB,CAAC;AAEnF,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAE,MAAiB,EAAQ,EAAE;IACvE,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAExD,MAAM,SAAS,GAAc;QACzB,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC;QAClD,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;QAC5C,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC;KAC3C,CAAC;IAEF,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAEpD,OAAO,CAAC,OAAO,CAAC;QACZ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,GAAG,GAAG,UAAU,QAAQ,SAAS,SAAS,GAAG,QAAQ,OAAO,IAAI,KAAK;QAC3E,KAAK,EAAE,MAAM,CAAC,IAAI;KACrB,CAAC,CAAC;IAEH,IAAI,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,OAAO,CAAC;YACZ,IAAI,EAAE,GAAG,SAAS,kBAAkB;YACpC,IAAI,EAAE,qCAAqC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;SAC1E,CAAC,CAAC;IACP,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAErD,8BAA8B,CAAC,OAAO,EAAE;QACpC,SAAS;QACT,SAAS;KACZ,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CACxB,OAAsB,EACtB,MAAiB,EACjB,SAAiB,EACjB,SAAoB,EACZ,EAAE;IACV,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAExD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,sBAAsB,CAAC;QACrD,OAAO;QACP,SAAS;QACT,SAAS;QACT,QAAQ,EAAE,MAAM,CAAC,WAAW,KAAK,SAAS;KAC7C,CAAC,CAAC;IAEH,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IACrG,MAAM,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAElF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { sanitizeTypeIdentifier } from \"@gtkx/utils\";\nimport type { GirRecord } from \"../../gir/record.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport { isEmittableEntity } from \"../../gir/emittable.js\";\nimport { indentMembers } from \"../../writer/emit.js\";\nimport { type Callables, dedupeCallables, generateBindings, renderPlainTypeMembers } from \"./callables.js\";\nimport { getDoc } from \"./doc-spec.js\";\nimport { renderSourceGtype } from \"./gtype-binding.js\";\nimport { renderRecordConstructor, renderRecordConstructorPropsInterface } from \"./record-constructor.js\";\nimport { renderRecordFieldAccessor } from \"./record-field-accessor.js\";\nimport { computeRecordFieldSlots } from \"./record-layout.js\";\nimport { appendWrapperClassRegistration } from \"./registration.js\";\nimport { isConstructibleRecord } from \"./value-marshalable.js\";\n\nconst isGErrorRecord = (context: ModuleContext, record: GirRecord): boolean =>\n context.namespace.name === \"GLib\" && record.glibGetType === \"g_error_get_type\";\n\nconst generateRecord = (context: ModuleContext, record: GirRecord): void => {\n if (!isEmittableEntity(record)) {\n return;\n }\n\n const className = sanitizeTypeIdentifier(record.name);\n const isErrorSubclass = isGErrorRecord(context, record);\n\n const callables: Callables = {\n constructors: dedupeCallables(record.constructors),\n functions: dedupeCallables(record.functions),\n methods: dedupeCallables(record.methods),\n };\n\n generateBindings(context, callables);\n const members = renderRecordMembers(context, record, className, callables);\n const body = indentMembers(members);\n const heritage = isErrorSubclass ? \" extends globalThis.Error\" : \"\";\n const doc = getDoc(record);\n const isConstructible = isConstructibleRecord(context, context.namespace.name, record);\n const modifier = isConstructible ? \"\" : \"abstract \";\n\n context.declare({\n name: className,\n code: `${doc}export ${modifier}class ${className}${heritage} {\\n${body}\\n}`,\n owner: record.name,\n });\n\n if (isConstructible) {\n context.declare({\n name: `${className}ConstructorProps`,\n code: renderRecordConstructorPropsInterface(context, record, className),\n });\n }\n\n const gtypeExpr = renderSourceGtype(context, record);\n\n appendWrapperClassRegistration(context, {\n className,\n gtypeExpr,\n });\n};\n\nconst renderRecordMembers = (\n context: ModuleContext,\n record: GirRecord,\n className: string,\n callables: Callables,\n): string[] => {\n const isErrorSubclass = isGErrorRecord(context, record);\n\n const { members, claimedNames } = renderPlainTypeMembers({\n context,\n className,\n callables,\n hasGtype: record.glibGetType !== undefined,\n });\n\n members.unshift(renderRecordConstructor(context, { record, className, callables, isErrorSubclass }));\n const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);\n\n for (const slot of slots) {\n const block = renderRecordFieldAccessor(context, slot, claimedNames, record.fields);\n\n if (block !== undefined) {\n members.push(block);\n }\n }\n\n if (isErrorSubclass) {\n members.push('get name(): string {\\n return \"GLib.Error\";\\n}');\n }\n\n return members;\n};\n\nexport { generateRecord };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/codegen",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Generates the typed GTKX bindings and API reference from GIR and OpenGL registry data",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
"fast-xml-parser": "^5.10.1",
|
|
59
59
|
"fast-xml-validator": "^1.4.1",
|
|
60
60
|
"typescript": "^6.0.3",
|
|
61
|
-
"@gtkx/
|
|
62
|
-
"@gtkx/
|
|
61
|
+
"@gtkx/utils": "1.2.2",
|
|
62
|
+
"@gtkx/react": "1.2.2"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"release": "tsx ../../scripts/release-package.ts"
|
|
@@ -7,7 +7,7 @@ import { renderBlock } from "../../writer/emit.js";
|
|
|
7
7
|
import { matchAsyncFinish } from "./async.js";
|
|
8
8
|
import { callableDoc, callableSpec } from "./callable-doc.js";
|
|
9
9
|
import { renderFnExpression } from "./function.js";
|
|
10
|
-
import { gtypeMemberDeclaration
|
|
10
|
+
import { gtypeMemberDeclaration } from "./gtype-binding.js";
|
|
11
11
|
import {
|
|
12
12
|
finishCallExpression,
|
|
13
13
|
memberName,
|
|
@@ -66,7 +66,7 @@ type PlainTypeMembersOptions = {
|
|
|
66
66
|
context: ModuleContext;
|
|
67
67
|
className: string;
|
|
68
68
|
callables: Callables;
|
|
69
|
-
|
|
69
|
+
hasGtype: boolean;
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
const RUNTIME_OWNED_LIFETIME_METHODS: Set<string> = new Set([
|
|
@@ -514,11 +514,11 @@ const renderPlainInstanceMethods = (
|
|
|
514
514
|
const renderPlainTypeMembers = (
|
|
515
515
|
options: PlainTypeMembersOptions,
|
|
516
516
|
): { members: string[]; claimedNames: Set<string> } => {
|
|
517
|
-
const { context, className, callables,
|
|
517
|
+
const { context, className, callables, hasGtype } = options;
|
|
518
518
|
const claimedNames: Set<string> = new Set();
|
|
519
519
|
|
|
520
520
|
const members: string[] = [
|
|
521
|
-
...(
|
|
521
|
+
...(hasGtype ? [gtypeMemberDeclaration(context)] : []),
|
|
522
522
|
...renderStaticHead(context, callables, className),
|
|
523
523
|
...renderPlainInstanceMethods(context, callables.methods, claimedNames),
|
|
524
524
|
];
|
package/src/store/gi/class.ts
CHANGED
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
} from "./callables.js";
|
|
35
35
|
import { renderClassConstructor, renderConstructorPropsInterface } from "./constructor-props.js";
|
|
36
36
|
import { getDoc } from "./doc-spec.js";
|
|
37
|
-
import { gtypeMemberDeclaration,
|
|
37
|
+
import { gtypeMemberDeclaration, renderSourceGtype } from "./gtype-binding.js";
|
|
38
38
|
import { methodExportName } from "./method.js";
|
|
39
39
|
import { renderPropertyDeclarations } from "./properties.js";
|
|
40
40
|
import { renderResolvedPropertyAccessor, resolveAccessor, type ResolvedAccessor } from "./property-accessor.js";
|
|
@@ -60,14 +60,6 @@ type MemberDeclarationsOptions = {
|
|
|
60
60
|
|
|
61
61
|
type ClassMembers = { members: string[]; accessors: ResolvedAccessor[] };
|
|
62
62
|
|
|
63
|
-
type ClassMembersOptions = {
|
|
64
|
-
context: ModuleContext;
|
|
65
|
-
klass: GirClass;
|
|
66
|
-
callables: Callables;
|
|
67
|
-
gtypeExpr: string | undefined;
|
|
68
|
-
hasParent: boolean;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
63
|
type ImplementedRefOptions = {
|
|
72
64
|
context: ModuleContext;
|
|
73
65
|
klass: GirClass;
|
|
@@ -105,16 +97,7 @@ const generateClass = (context: ModuleContext, klass: GirClass): void => {
|
|
|
105
97
|
const implemented = resolveImplementedRefs(context, klass);
|
|
106
98
|
const typeRefs = implemented.map((ref) => omittedTypeRef(ref.typeRef, ref.conflicts));
|
|
107
99
|
const implementsClause = typeRefs.length === 0 ? "" : ` implements ${typeRefs.join(", ")}`;
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
const { members, accessors } = renderClassMembers({
|
|
111
|
-
context,
|
|
112
|
-
klass,
|
|
113
|
-
callables,
|
|
114
|
-
gtypeExpr,
|
|
115
|
-
hasParent: parentExpression !== undefined,
|
|
116
|
-
});
|
|
117
|
-
|
|
100
|
+
const { members, accessors } = renderClassMembers(context, klass, callables, parentExpression !== undefined);
|
|
118
101
|
const body = indentMembers(members);
|
|
119
102
|
const doc = getDoc(klass);
|
|
120
103
|
const modifier = klass.isAbstract ? "abstract " : "";
|
|
@@ -132,7 +115,7 @@ const generateClass = (context: ModuleContext, klass: GirClass): void => {
|
|
|
132
115
|
|
|
133
116
|
appendMemberDeclarations({ context, klass, className, accessors, implemented });
|
|
134
117
|
appendInstallMixins(context, className, implemented);
|
|
135
|
-
appendClassRegistrations(context, klass, className
|
|
118
|
+
appendClassRegistrations(context, klass, className);
|
|
136
119
|
};
|
|
137
120
|
|
|
138
121
|
const appendMemberDeclarations = (options: MemberDeclarationsOptions): void => {
|
|
@@ -167,14 +150,15 @@ const appendInterfaceMerge = (
|
|
|
167
150
|
});
|
|
168
151
|
};
|
|
169
152
|
|
|
170
|
-
const renderClassMembers = (
|
|
171
|
-
|
|
153
|
+
const renderClassMembers = (
|
|
154
|
+
context: ModuleContext,
|
|
155
|
+
klass: GirClass,
|
|
156
|
+
callables: Callables,
|
|
157
|
+
hasParent: boolean,
|
|
158
|
+
): ClassMembers => {
|
|
172
159
|
const className = sanitizeTypeIdentifier(klass.name);
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
gtypeExpr === undefined ? [] : [gtypeMemberDeclaration(context), gtypeStaticMember(context)];
|
|
176
|
-
|
|
177
|
-
const constructorBlock = renderClassConstructor(context, klass, className, options.hasParent);
|
|
160
|
+
const members: string[] = [gtypeMemberDeclaration(context)];
|
|
161
|
+
const constructorBlock = renderClassConstructor(context, klass, className, hasParent);
|
|
178
162
|
|
|
179
163
|
if (constructorBlock !== undefined) {
|
|
180
164
|
members.push(constructorBlock);
|
|
@@ -255,12 +239,9 @@ const appendInstallMixins = (context: ModuleContext, className: string, implemen
|
|
|
255
239
|
]);
|
|
256
240
|
};
|
|
257
241
|
|
|
258
|
-
const appendClassRegistrations = (
|
|
259
|
-
context
|
|
260
|
-
|
|
261
|
-
className: string,
|
|
262
|
-
gtypeExpr: string | undefined,
|
|
263
|
-
): void => {
|
|
242
|
+
const appendClassRegistrations = (context: ModuleContext, klass: GirClass, className: string): void => {
|
|
243
|
+
const gtypeExpr = renderSourceGtype(context, klass);
|
|
244
|
+
|
|
264
245
|
appendWrapperClassRegistration(context, {
|
|
265
246
|
className,
|
|
266
247
|
gtypeExpr,
|
|
@@ -1,32 +1,17 @@
|
|
|
1
1
|
import { sourceStringLiteral } from "@gtkx/utils";
|
|
2
2
|
import type { ModuleContext } from "../../writer/context.js";
|
|
3
3
|
import { PRIMITIVE_TS_TYPE } from "../../gir/primitives.js";
|
|
4
|
-
import { renderJsDoc } from "../../writer/doc.js";
|
|
5
|
-
import { renderBlock } from "../../writer/emit.js";
|
|
6
4
|
|
|
7
5
|
type TypeSource = {
|
|
8
6
|
glibGetType: string | undefined;
|
|
9
7
|
glibTypeName: string | undefined;
|
|
10
8
|
};
|
|
11
9
|
|
|
12
|
-
const GTYPE_NOTE = [
|
|
13
|
-
"The GType this class is registered under, read off the class it is accessed on rather than",
|
|
14
|
-
"inherited, so a subclass `registerClass` created reports its own type and one that never went",
|
|
15
|
-
"through `registerClass` reports the invalid type.",
|
|
16
|
-
].join("\n");
|
|
17
|
-
|
|
18
10
|
const gtypeTsType = (context: ModuleContext): string =>
|
|
19
11
|
context.namespace.name === "GObject" ? "Type" : PRIMITIVE_TS_TYPE.gtype;
|
|
20
12
|
|
|
21
13
|
const gtypeMemberDeclaration = (context: ModuleContext): string => `declare __type__: ${gtypeTsType(context)};`;
|
|
22
14
|
|
|
23
|
-
const gtypeStaticMember = (context: ModuleContext): string => {
|
|
24
|
-
context.addRuntimeImport("getClassType");
|
|
25
|
-
const block = renderBlock(`static get __gtype__(): ${gtypeTsType(context)}`, "return getClassType(this);");
|
|
26
|
-
|
|
27
|
-
return `${renderJsDoc(undefined, GTYPE_NOTE)}${block}`;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
15
|
const renderInternGtype = (context: ModuleContext, typeName: string | undefined): string | undefined => {
|
|
31
16
|
if (typeName === undefined) {
|
|
32
17
|
return undefined;
|
|
@@ -63,4 +48,4 @@ const renderSourceGtype = (context: ModuleContext, source: TypeSource): string |
|
|
|
63
48
|
? undefined
|
|
64
49
|
: renderGtypeExpression(context, source.glibGetType, source.glibTypeName);
|
|
65
50
|
|
|
66
|
-
export { gtypeTsType, gtypeMemberDeclaration,
|
|
51
|
+
export { gtypeTsType, gtypeMemberDeclaration, renderSourceGtype };
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
renderStaticHead,
|
|
22
22
|
} from "./callables.js";
|
|
23
23
|
import { annotationSpec, getDoc } from "./doc-spec.js";
|
|
24
|
-
import {
|
|
24
|
+
import { gtypeMemberDeclaration, renderSourceGtype } from "./gtype-binding.js";
|
|
25
25
|
import { methodExportName } from "./method.js";
|
|
26
26
|
import {
|
|
27
27
|
type PropertyAccessorArgs,
|
|
@@ -378,7 +378,7 @@ const renderInterfaceClass = (context: ModuleContext, options: InterfaceClassOpt
|
|
|
378
378
|
const members: string[] = [];
|
|
379
379
|
|
|
380
380
|
if (gtypeExpr !== undefined) {
|
|
381
|
-
members.push(renderInterfaceHasInstance(context, className, gtypeExpr)
|
|
381
|
+
members.push(gtypeMemberDeclaration(context), renderInterfaceHasInstance(context, className, gtypeExpr));
|
|
382
382
|
}
|
|
383
383
|
|
|
384
384
|
members.push(...renderStaticHead(context, callables, className), renderInterfaceBrand(context, implRef));
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { toCamelIdentifier } from "@gtkx/utils";
|
|
2
2
|
import type { GirAnnotations } from "../../gir/annotations.js";
|
|
3
3
|
import type { GirField } from "../../gir/field.js";
|
|
4
|
+
import type { PrimitiveCategory } from "../../gir/primitives.js";
|
|
4
5
|
import type { GirRecord } from "../../gir/record.js";
|
|
5
6
|
import type { FieldSlot } from "../../gir/size.js";
|
|
6
7
|
import type { TypeId } from "../../gir/type-id.js";
|
|
@@ -9,10 +10,16 @@ import type { ModuleContext } from "../../writer/context.js";
|
|
|
9
10
|
import { isInlineCallbackRef, renderDescriptor } from "../../analysis/descriptor-render.js";
|
|
10
11
|
import { tStruct } from "../../analysis/descriptor.js";
|
|
11
12
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
12
|
-
import { isUnboundedArray } from "../../analysis/type-shape.js";
|
|
13
|
+
import { isByteSequence, isUnboundedArray } from "../../analysis/type-shape.js";
|
|
13
14
|
import { indent, renderBlock } from "../../writer/emit.js";
|
|
14
15
|
import { getDoc } from "./doc-spec.js";
|
|
15
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
bitMask,
|
|
18
|
+
computeRecordFieldSlots,
|
|
19
|
+
inlineArrayStride,
|
|
20
|
+
mergeBitfield,
|
|
21
|
+
type RecordFieldSlot,
|
|
22
|
+
} from "./record-layout.js";
|
|
16
23
|
import { wrapReturnValue } from "./return-wrap.js";
|
|
17
24
|
import { isValueMarshalable } from "./value-marshalable.js";
|
|
18
25
|
|
|
@@ -99,6 +106,22 @@ type AccessorOptions = {
|
|
|
99
106
|
fieldType: TypeId;
|
|
100
107
|
};
|
|
101
108
|
|
|
109
|
+
type InlineArrayResolution = {
|
|
110
|
+
element: TypeId;
|
|
111
|
+
count: number;
|
|
112
|
+
stride: number;
|
|
113
|
+
isTypedByteArray: boolean;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
type InlineArrayAccessorOptions = {
|
|
117
|
+
context: ModuleContext;
|
|
118
|
+
jsName: string;
|
|
119
|
+
tsType: string;
|
|
120
|
+
descriptor: string;
|
|
121
|
+
offset: number;
|
|
122
|
+
resolution: InlineArrayResolution;
|
|
123
|
+
};
|
|
124
|
+
|
|
102
125
|
const isMarshalableField = (context: ModuleContext, field: GirField): boolean => {
|
|
103
126
|
if (field.cType?.endsWith("*") === true) {
|
|
104
127
|
return true;
|
|
@@ -187,6 +210,9 @@ const isStorableFieldType = (context: ModuleContext, ref: TypeId): boolean => {
|
|
|
187
210
|
return kind !== "carray" && kind !== "list" && kind !== "hashtable";
|
|
188
211
|
};
|
|
189
212
|
|
|
213
|
+
const hasArrayAccessor = (context: ModuleContext, target: StructArrayTarget): boolean =>
|
|
214
|
+
resolveInlineArray(context, target) !== undefined || resolveStructArray(context, target) !== undefined;
|
|
215
|
+
|
|
190
216
|
const admitAccessibleField = (
|
|
191
217
|
context: ModuleContext,
|
|
192
218
|
slot: RecordFieldSlot,
|
|
@@ -201,9 +227,9 @@ const admitAccessibleField = (
|
|
|
201
227
|
|
|
202
228
|
const { field, jsName } = admitted;
|
|
203
229
|
const target: StructArrayTarget = { field, jsName, slot: slot.slot, siblingFields };
|
|
204
|
-
const
|
|
205
|
-
const hasAccessor =
|
|
206
|
-
const isSettable = field.writable && (
|
|
230
|
+
const hasArray = hasArrayAccessor(context, target);
|
|
231
|
+
const hasAccessor = hasArray || isAccessibleFieldType(context, field.type);
|
|
232
|
+
const isSettable = field.writable && (hasArray || isStorableFieldType(context, field.type));
|
|
207
233
|
|
|
208
234
|
return hasAccessor ? { ...admitted, isSettable } : undefined;
|
|
209
235
|
};
|
|
@@ -243,10 +269,11 @@ const renderRecordFieldAccessor = (
|
|
|
243
269
|
|
|
244
270
|
const { field, jsName } = admitted;
|
|
245
271
|
const doc = getDoc(field);
|
|
246
|
-
const
|
|
272
|
+
const target: StructArrayTarget = { field, jsName, slot: slot.slot, siblingFields };
|
|
273
|
+
const arrayAccessor = renderInlineArrayAccessor(context, target) ?? renderStructArrayAccessor(context, target);
|
|
247
274
|
|
|
248
|
-
if (
|
|
249
|
-
return `${doc}${
|
|
275
|
+
if (arrayAccessor !== undefined) {
|
|
276
|
+
return `${doc}${arrayAccessor}`;
|
|
250
277
|
}
|
|
251
278
|
|
|
252
279
|
const descriptor = context.hoistDescriptor(
|
|
@@ -295,7 +322,7 @@ const isAccessorEligibleType = (context: ModuleContext, ref: TypeId): boolean =>
|
|
|
295
322
|
return context.library.nameFor(ref) !== undefined;
|
|
296
323
|
}
|
|
297
324
|
case "carray": {
|
|
298
|
-
return type.fixedSize !== undefined;
|
|
325
|
+
return type.fixedSize !== undefined && type.arrayCType?.endsWith("*") === true;
|
|
299
326
|
}
|
|
300
327
|
case "list":
|
|
301
328
|
case "hashtable":
|
|
@@ -338,15 +365,96 @@ const resolveInlineStructFields = (
|
|
|
338
365
|
return type.value.fields;
|
|
339
366
|
};
|
|
340
367
|
|
|
368
|
+
const isInlineScalarCategory = (category: PrimitiveCategory, isBehindPointer: boolean): boolean => {
|
|
369
|
+
if (category === "pointer") {
|
|
370
|
+
return true;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
return !isBehindPointer && category !== "void" && category !== "unichar" && category !== "string";
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
const isInlineArrayElement = (context: ModuleContext, ref: TypeId | undefined, cType: string | undefined): boolean => {
|
|
377
|
+
const type = ref === undefined ? undefined : context.library.typeFor(ref);
|
|
378
|
+
|
|
379
|
+
if (type === undefined) {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const isBehindPointer = cType?.endsWith("*") === true;
|
|
384
|
+
|
|
385
|
+
switch (type.kind) {
|
|
386
|
+
case "primitive": {
|
|
387
|
+
return isInlineScalarCategory(type.category, isBehindPointer);
|
|
388
|
+
}
|
|
389
|
+
case "enum": {
|
|
390
|
+
return !isBehindPointer;
|
|
391
|
+
}
|
|
392
|
+
case "record": {
|
|
393
|
+
return (
|
|
394
|
+
resolveInlineStructFields(context, ref, cType) !== undefined &&
|
|
395
|
+
isValueMarshalable(context, type.namespace.name, type.value)
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
case "alias": {
|
|
399
|
+
return isInlineArrayElement(context, type.value.target, cType ?? type.value.targetCType);
|
|
400
|
+
}
|
|
401
|
+
case "callback":
|
|
402
|
+
case "carray":
|
|
403
|
+
case "class":
|
|
404
|
+
case "hashtable":
|
|
405
|
+
case "interface":
|
|
406
|
+
case "list":
|
|
407
|
+
case "varargs": {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
const inlineArrayType = (
|
|
414
|
+
context: ModuleContext,
|
|
415
|
+
target: StructArrayTarget,
|
|
416
|
+
): Extract<GirType, { kind: "carray" }> | undefined => {
|
|
417
|
+
const { field, slot } = target;
|
|
418
|
+
|
|
419
|
+
if (field.type === undefined || slot.bitWidth !== undefined) {
|
|
420
|
+
return undefined;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
const type = context.library.typeFor(field.type);
|
|
424
|
+
|
|
425
|
+
if (type?.kind !== "carray" || type.fixedSize === undefined) {
|
|
426
|
+
return undefined;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return type.arrayCType?.endsWith("*") === true ? undefined : type;
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
const resolveInlineArray = (context: ModuleContext, target: StructArrayTarget): InlineArrayResolution | undefined => {
|
|
433
|
+
const type = inlineArrayType(context, target);
|
|
434
|
+
|
|
435
|
+
if (type?.fixedSize === undefined || !isInlineArrayElement(context, type.element, type.elementCType)) {
|
|
436
|
+
return undefined;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const stride = inlineArrayStride(context, type);
|
|
440
|
+
|
|
441
|
+
if (stride === 0) {
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return {
|
|
446
|
+
element: type.element,
|
|
447
|
+
count: type.fixedSize,
|
|
448
|
+
stride,
|
|
449
|
+
isTypedByteArray: context.library.isByteArrayTyped && isByteSequence(context.library, type),
|
|
450
|
+
};
|
|
451
|
+
};
|
|
452
|
+
|
|
341
453
|
const arrayLengthExpression = (
|
|
342
454
|
arrayRef: Extract<GirType, { kind: "carray" }>,
|
|
343
455
|
siblingFields: GirField[],
|
|
344
456
|
): string | undefined => {
|
|
345
|
-
if (arrayRef.fixedSize !== undefined) {
|
|
346
|
-
return String(arrayRef.fixedSize);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if (arrayRef.lengthParameterIndex === undefined) {
|
|
457
|
+
if (arrayRef.fixedSize !== undefined || arrayRef.lengthParameterIndex === undefined) {
|
|
350
458
|
return undefined;
|
|
351
459
|
}
|
|
352
460
|
|
|
@@ -606,6 +714,82 @@ const resolveStructArray = (context: ModuleContext, target: StructArrayTarget):
|
|
|
606
714
|
};
|
|
607
715
|
};
|
|
608
716
|
|
|
717
|
+
const inlineArrayElementOffset = (options: InlineArrayAccessorOptions): string =>
|
|
718
|
+
`${String(options.offset)} + __index * ${String(options.resolution.stride)}`;
|
|
719
|
+
|
|
720
|
+
const inlineArrayGetterBlock = (options: InlineArrayAccessorOptions): string => {
|
|
721
|
+
const { context, jsName, tsType, descriptor, resolution } = options;
|
|
722
|
+
const container = resolution.isTypedByteArray ? `new ${tsType}(${String(resolution.count)})` : "[]";
|
|
723
|
+
|
|
724
|
+
const element = wrapReturnValue(context, {
|
|
725
|
+
ref: resolution.element,
|
|
726
|
+
isNullable: false,
|
|
727
|
+
valueExpression: `read(getHandle(this), ${descriptor}, ${inlineArrayElementOffset(options)})`,
|
|
728
|
+
});
|
|
729
|
+
|
|
730
|
+
const body = [
|
|
731
|
+
`const __result: ${tsType} = ${container};`,
|
|
732
|
+
`for (let __index = 0; __index < ${String(resolution.count)}; __index++) {`,
|
|
733
|
+
indent(`__result[__index] = ${element};`, 1),
|
|
734
|
+
"}",
|
|
735
|
+
"return __result;",
|
|
736
|
+
].join("\n");
|
|
737
|
+
|
|
738
|
+
return renderBlock(`get ${jsName}(): ${tsType}`, body);
|
|
739
|
+
};
|
|
740
|
+
|
|
741
|
+
const inlineArraySetterBlock = (options: InlineArrayAccessorOptions): string => {
|
|
742
|
+
const { jsName, tsType, descriptor, resolution } = options;
|
|
743
|
+
|
|
744
|
+
const write =
|
|
745
|
+
`write(getHandle(this), ${descriptor}, ${inlineArrayElementOffset(options)}, ` +
|
|
746
|
+
`toNative(${descriptor}, __element));`;
|
|
747
|
+
|
|
748
|
+
const body = [
|
|
749
|
+
"for (const [__index, __element] of __value.entries()) {",
|
|
750
|
+
indent(`if (__index >= ${String(resolution.count)}) {\n break;\n}\n\n${write}`, 1),
|
|
751
|
+
"}",
|
|
752
|
+
].join("\n");
|
|
753
|
+
|
|
754
|
+
return renderBlock(`set ${jsName}(__value: ${tsType})`, body);
|
|
755
|
+
};
|
|
756
|
+
|
|
757
|
+
const renderInlineArrayAccessor = (context: ModuleContext, target: StructArrayTarget): string | undefined => {
|
|
758
|
+
const resolution = resolveInlineArray(context, target);
|
|
759
|
+
|
|
760
|
+
if (resolution === undefined) {
|
|
761
|
+
return undefined;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
const { field, jsName, slot } = target;
|
|
765
|
+
context.addRuntimeImport("read");
|
|
766
|
+
context.addRuntimeImport("getHandle");
|
|
767
|
+
context.addRuntimeImport("t");
|
|
768
|
+
|
|
769
|
+
const options: InlineArrayAccessorOptions = {
|
|
770
|
+
context,
|
|
771
|
+
jsName,
|
|
772
|
+
tsType: renderTsType(context, field.type, false),
|
|
773
|
+
descriptor: context.hoistDescriptor(renderDescriptor(context, resolution.element, "none", { isInline: true })),
|
|
774
|
+
offset: slot.byteOffset,
|
|
775
|
+
resolution,
|
|
776
|
+
};
|
|
777
|
+
|
|
778
|
+
const blocks: string[] = [];
|
|
779
|
+
|
|
780
|
+
if (field.readable) {
|
|
781
|
+
blocks.push(inlineArrayGetterBlock(options));
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
if (field.writable) {
|
|
785
|
+
context.addRuntimeImport("write");
|
|
786
|
+
context.addRuntimeImport("toNative");
|
|
787
|
+
blocks.push(inlineArraySetterBlock(options));
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
return blocks.length === 0 ? undefined : blocks.join("\n\n");
|
|
791
|
+
};
|
|
792
|
+
|
|
609
793
|
const renderStructArrayAccessor = (context: ModuleContext, target: StructArrayTarget): string | undefined => {
|
|
610
794
|
const resolution = resolveStructArray(context, target);
|
|
611
795
|
|
|
@@ -56,6 +56,9 @@ const recordInlineSize = (context: ModuleContext, record: ResolvedRecordValue):
|
|
|
56
56
|
return size > 0 ? size : undefined;
|
|
57
57
|
};
|
|
58
58
|
|
|
59
|
+
const inlineArrayStride = (context: ModuleContext, array: Extract<GirType, { kind: "carray" }>): number =>
|
|
60
|
+
layoutOfType(context, array.element, array.elementCType, new Set()).size;
|
|
61
|
+
|
|
59
62
|
const bitMask = (width: number): number => {
|
|
60
63
|
if (width >= 32) {
|
|
61
64
|
return 0xFF_FF_FF_FF;
|
|
@@ -224,4 +227,11 @@ const resolveAliasLayout = (
|
|
|
224
227
|
return layoutOfType(context, ref, resolved.value.targetCType, visited);
|
|
225
228
|
};
|
|
226
229
|
|
|
227
|
-
export {
|
|
230
|
+
export {
|
|
231
|
+
computeRecordFieldSlots,
|
|
232
|
+
inlineArrayStride,
|
|
233
|
+
recordInlineSize,
|
|
234
|
+
bitMask,
|
|
235
|
+
mergeBitfield,
|
|
236
|
+
type RecordFieldSlot,
|
|
237
|
+
};
|