@gtkx/runtime 1.4.0 → 1.6.0

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.
Files changed (50) hide show
  1. package/README.md +1 -1
  2. package/dist/descriptors.d.ts +36 -7
  3. package/dist/descriptors.d.ts.map +1 -1
  4. package/dist/descriptors.js +18 -5
  5. package/dist/descriptors.js.map +1 -1
  6. package/dist/element-metadata.d.ts +9 -0
  7. package/dist/element-metadata.d.ts.map +1 -0
  8. package/dist/element-metadata.js +14 -0
  9. package/dist/element-metadata.js.map +1 -0
  10. package/dist/fn.d.ts +8 -2
  11. package/dist/fn.d.ts.map +1 -1
  12. package/dist/fn.js +20 -4
  13. package/dist/fn.js.map +1 -1
  14. package/dist/index.d.ts +2 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/internal.d.ts +4 -1
  19. package/dist/internal.d.ts.map +1 -1
  20. package/dist/internal.js +4 -1
  21. package/dist/internal.js.map +1 -1
  22. package/dist/native-value.d.ts.map +1 -1
  23. package/dist/native-value.js +21 -2
  24. package/dist/native-value.js.map +1 -1
  25. package/dist/register-class.d.ts +2 -2
  26. package/dist/register-class.d.ts.map +1 -1
  27. package/dist/register-class.js +38 -1
  28. package/dist/register-class.js.map +1 -1
  29. package/dist/registry.d.ts +26 -3
  30. package/dist/registry.d.ts.map +1 -1
  31. package/dist/registry.js +75 -20
  32. package/dist/registry.js.map +1 -1
  33. package/dist/type.d.ts +10 -1
  34. package/dist/type.d.ts.map +1 -1
  35. package/dist/type.js +14 -1
  36. package/dist/type.js.map +1 -1
  37. package/dist/value.d.ts.map +1 -1
  38. package/dist/value.js +19 -3
  39. package/dist/value.js.map +1 -1
  40. package/package.json +10 -5
  41. package/src/descriptors.ts +55 -9
  42. package/src/element-metadata.ts +24 -0
  43. package/src/fn.ts +33 -5
  44. package/src/index.ts +3 -0
  45. package/src/internal.ts +8 -1
  46. package/src/native-value.ts +30 -2
  47. package/src/register-class.ts +61 -2
  48. package/src/registry.ts +110 -19
  49. package/src/type.ts +25 -0
  50. package/src/value.ts +28 -4
package/dist/index.js CHANGED
@@ -28,13 +28,13 @@ export { matchAllRegex, matchRegex } from "./regex.js";
28
28
  /** @public */
29
29
  export { registerClass } from "./register-class.js";
30
30
  /** @public */
31
- export { getClassType, getHandle, getInstanceType, getWrapperClass, peekTypeClass, registerClassStruct, registerInterface, registerWrapperClass, registerWrapperClassResolver, setHandle, wrapHandle, } from "./registry.js";
31
+ export { getClassType, getHandle, getInstanceType, getWrapperClass, installInterfaces, peekTypeClass, registerClassStruct, registerInterface, registerWrapperClass, registerWrapperClassResolver, setHandle, wrapHandle, } from "./registry.js";
32
32
  /** @public */
33
33
  export { connectSignal, disconnectSignal, emitSignal, getSignalBaseName, signalForHandlerName, } from "./signal.js";
34
34
  /** @public */
35
35
  export { t } from "./t.js";
36
36
  /** @public */
37
- export { resolveType, TYPE_BOOLEAN, TYPE_BOXED, TYPE_CHAR, TYPE_DOUBLE, TYPE_ENUM, TYPE_FLAGS, TYPE_FLOAT, TYPE_GTYPE, TYPE_INT, TYPE_INT64, TYPE_INTERFACE, TYPE_INVALID, TYPE_LONG, TYPE_NONE, TYPE_OBJECT, TYPE_PARAM, TYPE_POINTER, TYPE_STRING, TYPE_UCHAR, TYPE_UINT, TYPE_UINT64, TYPE_ULONG, TYPE_UNICHAR, TYPE_VARIANT, typeFromName, typeInterfaces, typeIsA, typeName, typeParent, valueIsA, } from "./type.js";
37
+ export { resolveType, TYPE_BOOLEAN, TYPE_BOXED, TYPE_CHAR, TYPE_DOUBLE, TYPE_ENUM, TYPE_FLAGS, TYPE_FLOAT, TYPE_GTYPE, TYPE_INT, TYPE_INT64, TYPE_INTERFACE, TYPE_INVALID, TYPE_LONG, TYPE_NONE, TYPE_OBJECT, TYPE_PARAM, TYPE_POINTER, TYPE_STRING, TYPE_UCHAR, TYPE_UINT, TYPE_UINT64, TYPE_ULONG, TYPE_UNICHAR, TYPE_VARIANT, retainWrapperClasses, typeFromName, typeInterfaces, typeIsA, typeName, typeParent, valueIsA, } from "./type.js";
38
38
  /** @public */
39
39
  export { fromValue, getBoxedValue, setBoxedValue, toValueHandle, tryToValueHandle, ValueMarshalError, } from "./value.js";
40
40
  /** @public */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAsD,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/G,cAAc;AACd,OAAO,EAAwB,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClG,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AACjE,cAAc;AACd,OAAO,EAAiC,MAAM,YAAY,CAAC;AAC3D,cAAc;AACd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAA6B,MAAM,gBAAgB,CAAC;AAC1G,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,cAAc;AACd,OAAO,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AACvD,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc;AACd,OAAO,EAGH,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,GACpB,MAAM,aAAa,CAAC;AACrB,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAClG,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvD,cAAc;AACd,OAAO,EACH,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACvB,MAAM,iBAAiB,CAAC;AACzB,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,cAAc;AACd,OAAO,EAAkB,aAAa,EAAqC,MAAM,qBAAqB,CAAC;AACvG,cAAc;AACd,OAAO,EACH,YAAY,EACZ,SAAS,EACT,eAAe,EACf,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,4BAA4B,EAE5B,SAAS,EACT,UAAU,GAEb,MAAM,eAAe,CAAC;AACvB,cAAc;AACd,OAAO,EACH,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EAEjB,oBAAoB,GACvB,MAAM,aAAa,CAAC;AACrB,cAAc;AACd,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,cAAc;AACd,OAAO,EACH,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,MAAM,WAAW,CAAC;AACnB,cAAc;AACd,OAAO,EACH,SAAS,EACT,aAAa,EAEb,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GACpB,MAAM,YAAY,CAAC;AACpB,cAAc;AACd,OAAO,EAGH,WAAW,EAGX,SAAS,GAGZ,MAAM,cAAc,CAAC;AACtB,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc;AACd,OAAO,EAAE,KAAK,EAAoC,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACpF,cAAc;AACd,OAAO,EAAiB,MAAM,aAAa,CAAC","sourcesContent":["import \"./exit-hook.js\";\n\n/** @public */\nexport { type ApplicationClass, type CommandLineApplication, createApplication } from \"./application-class.js\";\n/** @public */\nexport { type ClosureCallback, ClosureMarshalError, toClosure, tryToClosure } from \"./closure.js\";\n/** @public */\nexport { createErrorDomain, type ErrorDomain } from \"./error.js\";\n/** @public */\nexport { type Field, type StridedField } from \"./field.js\";\n/** @public */\nexport { onExit, quit, quitApplication, runApplication, type RunApplicationResult } from \"./lifecycle.js\";\n/** @public */\nexport { offSignal, onceSignal, onSignal } from \"./listeners.js\";\n/** @public */\nexport { installMixins, type Mixin } from \"./mixin.js\";\n/** @public */\nexport { fromNative, toNative } from \"./native-value.js\";\n/** @public */\nexport {\n type ConstructBinding,\n type ConstructBindings,\n getObjectProperty,\n newObjectWithProperties,\n registerConstructProperties,\n setObjectProperty,\n} from \"./object.js\";\n/** @public */\nexport { getParamSpecFlags, getParamSpecOwnerType, getParamSpecValueType } from \"./param-spec.js\";\n/** @public */\nexport { promisify, trimFinish } from \"./promisify.js\";\n/** @public */\nexport {\n coerceObjectProperty,\n getDeclaredPropertyName,\n isReadableProperty,\n newParamSpecOverride,\n} from \"./properties.js\";\n/** @public */\nexport { matchAllRegex, matchRegex } from \"./regex.js\";\n/** @public */\nexport { type Interface, registerClass, type SignalGType, type SignalSpec } from \"./register-class.js\";\n/** @public */\nexport {\n getClassType,\n getHandle,\n getInstanceType,\n getWrapperClass,\n peekTypeClass,\n registerClassStruct,\n registerInterface,\n registerWrapperClass,\n registerWrapperClassResolver,\n type StaticBase,\n setHandle,\n wrapHandle,\n type WrapperClassResolver,\n} from \"./registry.js\";\n/** @public */\nexport {\n connectSignal,\n disconnectSignal,\n emitSignal,\n getSignalBaseName,\n type SignalHandler,\n signalForHandlerName,\n} from \"./signal.js\";\n/** @public */\nexport { t } from \"./t.js\";\n/** @public */\nexport {\n resolveType,\n TYPE_BOOLEAN,\n TYPE_BOXED,\n TYPE_CHAR,\n TYPE_DOUBLE,\n TYPE_ENUM,\n TYPE_FLAGS,\n TYPE_FLOAT,\n TYPE_GTYPE,\n TYPE_INT,\n TYPE_INT64,\n TYPE_INTERFACE,\n TYPE_INVALID,\n TYPE_LONG,\n TYPE_NONE,\n TYPE_OBJECT,\n TYPE_PARAM,\n TYPE_POINTER,\n TYPE_STRING,\n TYPE_UCHAR,\n TYPE_UINT,\n TYPE_UINT64,\n TYPE_ULONG,\n TYPE_UNICHAR,\n TYPE_VARIANT,\n type TypedClass,\n typeFromName,\n typeInterfaces,\n typeIsA,\n typeName,\n typeParent,\n valueIsA,\n} from \"./type.js\";\n/** @public */\nexport {\n fromValue,\n getBoxedValue,\n type JsValue,\n setBoxedValue,\n toValueHandle,\n tryToValueHandle,\n ValueMarshalError,\n} from \"./value.js\";\n/** @public */\nexport {\n type ByteArray,\n type FromVariantOptions,\n fromVariant,\n type RecursiveFromVariantOptions,\n type RecursiveVariantValue,\n toVariant,\n type VariantInput,\n type VariantValue,\n} from \"./variant.js\";\n/** @public */\nexport { callParent, callVfunc } from \"./vfunc-call.js\";\n/** @public */\nexport { alloc, type ExternalObject, type Handle, read, write } from \"@gtkx/native\";\n/** @public */\nexport { type AnyClass } from \"@gtkx/utils\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./exit-hook.js\";\n\n/** @public */\nexport { type ApplicationClass, type CommandLineApplication, createApplication } from \"./application-class.js\";\n/** @public */\nexport { type ClosureCallback, ClosureMarshalError, toClosure, tryToClosure } from \"./closure.js\";\n/** @public */\nexport { createErrorDomain, type ErrorDomain } from \"./error.js\";\n/** @public */\nexport { type Field, type StridedField } from \"./field.js\";\n/** @public */\nexport { onExit, quit, quitApplication, runApplication, type RunApplicationResult } from \"./lifecycle.js\";\n/** @public */\nexport { offSignal, onceSignal, onSignal } from \"./listeners.js\";\n/** @public */\nexport { installMixins, type Mixin } from \"./mixin.js\";\n/** @public */\nexport { fromNative, toNative } from \"./native-value.js\";\n/** @public */\nexport {\n type ConstructBinding,\n type ConstructBindings,\n getObjectProperty,\n newObjectWithProperties,\n registerConstructProperties,\n setObjectProperty,\n} from \"./object.js\";\n/** @public */\nexport { getParamSpecFlags, getParamSpecOwnerType, getParamSpecValueType } from \"./param-spec.js\";\n/** @public */\nexport { promisify, trimFinish } from \"./promisify.js\";\n/** @public */\nexport {\n coerceObjectProperty,\n getDeclaredPropertyName,\n isReadableProperty,\n newParamSpecOverride,\n} from \"./properties.js\";\n/** @public */\nexport { matchAllRegex, matchRegex } from \"./regex.js\";\n/** @public */\nexport { type Interface, registerClass, type SignalGType, type SignalSpec } from \"./register-class.js\";\n/** @public */\nexport {\n getClassType,\n getHandle,\n getInstanceType,\n getWrapperClass,\n installInterfaces,\n peekTypeClass,\n registerClassStruct,\n registerInterface,\n registerWrapperClass,\n registerWrapperClassResolver,\n type StaticBase,\n setHandle,\n wrapHandle,\n type WrapperClass,\n type WrapperClassResolver,\n} from \"./registry.js\";\n/** @public */\nexport {\n connectSignal,\n disconnectSignal,\n emitSignal,\n getSignalBaseName,\n type SignalHandler,\n signalForHandlerName,\n} from \"./signal.js\";\n/** @public */\nexport { t } from \"./t.js\";\n/** @public */\nexport {\n resolveType,\n TYPE_BOOLEAN,\n TYPE_BOXED,\n TYPE_CHAR,\n TYPE_DOUBLE,\n TYPE_ENUM,\n TYPE_FLAGS,\n TYPE_FLOAT,\n TYPE_GTYPE,\n TYPE_INT,\n TYPE_INT64,\n TYPE_INTERFACE,\n TYPE_INVALID,\n TYPE_LONG,\n TYPE_NONE,\n TYPE_OBJECT,\n TYPE_PARAM,\n TYPE_POINTER,\n TYPE_STRING,\n TYPE_UCHAR,\n TYPE_UINT,\n TYPE_UINT64,\n TYPE_ULONG,\n TYPE_UNICHAR,\n TYPE_VARIANT,\n type TypedClass,\n retainWrapperClasses,\n typeFromName,\n typeInterfaces,\n typeIsA,\n typeName,\n typeParent,\n valueIsA,\n} from \"./type.js\";\n/** @public */\nexport {\n fromValue,\n getBoxedValue,\n type JsValue,\n setBoxedValue,\n toValueHandle,\n tryToValueHandle,\n ValueMarshalError,\n} from \"./value.js\";\n/** @public */\nexport {\n type ByteArray,\n type FromVariantOptions,\n fromVariant,\n type RecursiveFromVariantOptions,\n type RecursiveVariantValue,\n toVariant,\n type VariantInput,\n type VariantValue,\n} from \"./variant.js\";\n/** @public */\nexport { callParent, callVfunc } from \"./vfunc-call.js\";\n/** @public */\nexport { alloc, type ExternalObject, type Handle, read, write } from \"@gtkx/native\";\n/** @public */\nexport { type AnyClass } from \"@gtkx/utils\";\n"]}
@@ -1,6 +1,9 @@
1
+ /** @internal */
2
+ export { registerElementMetadata } from "./element-metadata.js";
3
+ export { elementMetadataVersion, registeredElementProperties, registeredElementSignals, } from "./element-metadata.js";
1
4
  export { checkError, createErrorDomain } from "./error.js";
2
5
  export { type ApplicationInstance, getApplicationInstance } from "./lifecycle.js";
3
- export { registerClassType, resolveWrapperClass, wrapHandle } from "./registry.js";
6
+ export { getExactWrapperClass, registerClassType, resolveWrapperClass, wrapHandle } from "./registry.js";
4
7
  export { hasSignalListener } from "./signal.js";
5
8
  export { resolveType } from "./type.js";
6
9
  export { fromValue, getBoxedValue, getValueType, inoutValueForBoxedDescriptor, newValueForDescriptor, outValueForBoxedDescriptor, toValue, } from "./value.js";
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,KAAK,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACH,SAAS,EACT,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,qBAAqB,EACrB,0BAA0B,EAC1B,OAAO,GACV,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EACH,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,KAAK,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACH,SAAS,EACT,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,qBAAqB,EACrB,0BAA0B,EAC1B,OAAO,GACV,MAAM,YAAY,CAAC"}
package/dist/internal.js CHANGED
@@ -1,6 +1,9 @@
1
+ /** @internal */
2
+ export { registerElementMetadata } from "./element-metadata.js";
3
+ export { elementMetadataVersion, registeredElementProperties, registeredElementSignals, } from "./element-metadata.js";
1
4
  export { checkError, createErrorDomain } from "./error.js";
2
5
  export { getApplicationInstance } from "./lifecycle.js";
3
- export { registerClassType, resolveWrapperClass, wrapHandle } from "./registry.js";
6
+ export { getExactWrapperClass, registerClassType, resolveWrapperClass, wrapHandle } from "./registry.js";
4
7
  export { hasSignalListener } from "./signal.js";
5
8
  export { resolveType } from "./type.js";
6
9
  export { fromValue, getBoxedValue, getValueType, inoutValueForBoxedDescriptor, newValueForDescriptor, outValueForBoxedDescriptor, toValue, } from "./value.js";
@@ -1 +1 @@
1
- {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAA4B,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACH,SAAS,EACT,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,qBAAqB,EACrB,0BAA0B,EAC1B,OAAO,GACV,MAAM,YAAY,CAAC","sourcesContent":["export { checkError, createErrorDomain } from \"./error.js\";\nexport { type ApplicationInstance, getApplicationInstance } from \"./lifecycle.js\";\nexport { registerClassType, resolveWrapperClass, wrapHandle } from \"./registry.js\";\nexport { hasSignalListener } from \"./signal.js\";\nexport { resolveType } from \"./type.js\";\nexport {\n fromValue,\n getBoxedValue,\n getValueType,\n inoutValueForBoxedDescriptor,\n newValueForDescriptor,\n outValueForBoxedDescriptor,\n toValue,\n} from \"./value.js\";\n"]}
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EACH,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAA4B,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACH,SAAS,EACT,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,qBAAqB,EACrB,0BAA0B,EAC1B,OAAO,GACV,MAAM,YAAY,CAAC","sourcesContent":["/** @internal */\nexport { registerElementMetadata } from \"./element-metadata.js\";\nexport {\n elementMetadataVersion,\n registeredElementProperties,\n registeredElementSignals,\n} from \"./element-metadata.js\";\nexport { checkError, createErrorDomain } from \"./error.js\";\nexport { type ApplicationInstance, getApplicationInstance } from \"./lifecycle.js\";\nexport { getExactWrapperClass, registerClassType, resolveWrapperClass, wrapHandle } from \"./registry.js\";\nexport { hasSignalListener } from \"./signal.js\";\nexport { resolveType } from \"./type.js\";\nexport {\n fromValue,\n getBoxedValue,\n getValueType,\n inoutValueForBoxedDescriptor,\n newValueForDescriptor,\n outValueForBoxedDescriptor,\n toValue,\n} from \"./value.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"native-value.d.ts","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"AACA,OAAO,EAIH,KAAK,UAAU,EAKlB,MAAM,cAAc,CAAC;AA2KtB;;;;;;;;;;;;GAYG;AACH,iBAAS,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CA6BnE;AAiBD;;;;;;;;GAQG;AACH,iBAAS,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAyBjE;AAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"native-value.d.ts","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"AACA,OAAO,EAIH,KAAK,UAAU,EAKlB,MAAM,cAAc,CAAC;AAmMtB;;;;;;;;;;;;GAYG;AACH,iBAAS,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAiCnE;AAiBD;;;;;;;;GAQG;AACH,iBAAS,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAyBjE;AAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC"}
@@ -28,6 +28,14 @@ function boxedFromNative(descriptor, value) {
28
28
  }
29
29
  const handle = value;
30
30
  const type = resolveDescriptorType(descriptor);
31
+ const registered = resolveWrapperClass(type);
32
+ if (registered !== null) {
33
+ return wrapHandle(handle, registered);
34
+ }
35
+ const fallback = descriptor.fallbackClass?.();
36
+ if (fallback !== undefined) {
37
+ return wrapHandle(handle, fallback);
38
+ }
31
39
  return wrapHandle(handle, getWrapperClass(type));
32
40
  }
33
41
  function fundamentalWrapperClass(descriptor, handle) {
@@ -35,7 +43,15 @@ function fundamentalWrapperClass(descriptor, handle) {
35
43
  return descriptor.wrapperClass;
36
44
  }
37
45
  const declaredType = resolveDescriptorType(descriptor);
38
- return resolveWrapperClass(getType(handle, declaredType)) ?? getWrapperClass(declaredType);
46
+ const registered = resolveWrapperClass(getType(handle, declaredType));
47
+ if (registered !== null) {
48
+ return registered;
49
+ }
50
+ const fallback = descriptor.fallbackClass?.();
51
+ if (fallback !== undefined) {
52
+ return fallback;
53
+ }
54
+ return getWrapperClass(declaredType);
39
55
  }
40
56
  function fundamentalFromNative(descriptor, value) {
41
57
  if (value == null) {
@@ -124,7 +140,10 @@ function fromNative(descriptor, value) {
124
140
  }
125
141
  switch (descriptor.kind) {
126
142
  case "object": {
127
- return descriptor.isCallScoped === true ? wrapCallScopedObject(value) : wrapObject(value);
143
+ const fallbackClass = descriptor.fallbackClass;
144
+ return descriptor.isCallScoped === true
145
+ ? wrapCallScopedObject(value, fallbackClass)
146
+ : wrapObject(value, fallbackClass);
128
147
  }
129
148
  case "struct": {
130
149
  return wrapHandle(value, descriptor.wrapperClass);
@@ -1 +1 @@
1
- {"version":3,"file":"native-value.js","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnyClass } from \"@gtkx/utils\";\nimport {\n bindFunctionPointer,\n call,\n type CallDescriptor,\n type Descriptor,\n type ExternalObject,\n getType,\n type Handle,\n type Ref,\n} from \"@gtkx/native\";\nimport {\n type ArrayDescriptor,\n boxedT,\n type CallbackDescriptor,\n type FundamentalDescriptor,\n type HashTableDescriptor,\n isGtypeDescriptor,\n refT,\n type StructDescriptor,\n} from \"./descriptors.js\";\nimport { checkError } from \"./error.js\";\nimport { LIB } from \"./library.js\";\nimport {\n coerceGType,\n getHandle,\n getWrapperClass,\n resolveWrapperClass,\n wrapCallScopedObject,\n wrapFundamentalHandle,\n wrapHandle,\n wrapObject,\n} from \"./registry.js\";\nimport { resolveDescriptorType } from \"./type.js\";\n\ntype MarshalledKind = \"object\" | \"struct\" | \"boxed\" | \"fundamental\" | \"array\" | \"hashtable\";\ntype MarshalledDescriptor = Extract<Descriptor, { kind: MarshalledKind }>;\ntype DecodedCallbackTarget = { fnPtr: bigint; userData?: bigint | undefined };\n\nconst MARSHALLED_KINDS: Set<Descriptor[\"kind\"]> = new Set<MarshalledKind>([\n \"object\",\n \"struct\",\n \"boxed\",\n \"fundamental\",\n \"array\",\n \"hashtable\",\n]);\n\nconst NULL_POINTER = 0n;\n\nfunction isMarshalledDescriptor(descriptor: Descriptor): descriptor is MarshalledDescriptor {\n return MARSHALLED_KINDS.has(descriptor.kind);\n}\n\nfunction mapCollection(\n descriptor: ArrayDescriptor,\n value: unknown,\n convert: (itemDescriptor: Descriptor, item: unknown) => unknown,\n): unknown[] {\n return (value as unknown[]).map((item) => convert(descriptor.itemDescriptor, item));\n}\n\nfunction collectionFromNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value === null ? null : mapCollection(descriptor, value, fromNative);\n}\n\nfunction boxedFromNative(descriptor: Descriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n const type = resolveDescriptorType(descriptor);\n\n return wrapHandle(handle, getWrapperClass(type));\n}\n\nfunction fundamentalWrapperClass(descriptor: FundamentalDescriptor, handle: ExternalObject<Handle>): AnyClass {\n if (descriptor.wrapperClass !== undefined) {\n return descriptor.wrapperClass;\n }\n\n const declaredType = resolveDescriptorType(descriptor);\n\n return resolveWrapperClass(getType(handle, declaredType)) ?? getWrapperClass(declaredType);\n}\n\nfunction fundamentalFromNative(descriptor: FundamentalDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n\n return wrapFundamentalHandle(handle, fundamentalWrapperClass(descriptor, handle));\n}\n\nconst errorRefDescriptor = (): Descriptor =>\n refT(boxedT(\"GError\", { ownership: \"full\", sharedLibrary: LIB, getTypeFnName: \"g_error_get_type\" }));\n\nfunction decodedCallbackValues(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n inputs: unknown[],\n): unknown[] {\n const values: unknown[] = [];\n let cursor = 0;\n\n for (const [index, argDescriptor] of descriptor.argDescriptors.entries()) {\n if (index === descriptor.userDataIndex) {\n values.push(target.userData ?? NULL_POINTER);\n } else {\n values.push(toNative(argDescriptor, inputs[cursor]));\n cursor += 1;\n }\n }\n\n return values;\n}\n\nfunction decodedCallbackCallable(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n): (...inputs: unknown[]) => unknown {\n const canThrow = descriptor.canThrow === true;\n const isOneShot = descriptor.scope === \"async\";\n const argDescriptors = canThrow ? [...descriptor.argDescriptors, errorRefDescriptor()] : descriptor.argDescriptors;\n let bound: ExternalObject<CallDescriptor> | undefined;\n let isSpent = false;\n\n return (...inputs) => {\n if (isSpent) {\n throw new Error(\"An async-scoped callback was already invoked; its native caller has released it\");\n }\n\n bound ??= bindFunctionPointer(target.fnPtr, argDescriptors, descriptor.returnDescriptor, \"decoded callback\");\n const values = decodedCallbackValues(descriptor, target, inputs);\n isSpent = isOneShot;\n\n if (!canThrow) {\n return fromNative(descriptor.returnDescriptor, call(bound, values));\n }\n\n const errorRef: Ref = { value: null };\n values.push(errorRef);\n const result = call(bound, values);\n checkError(errorRef);\n\n return fromNative(descriptor.returnDescriptor, result);\n };\n}\n\nfunction callbackFromNative(descriptor: CallbackDescriptor, value: unknown): unknown {\n if (value == null) {\n return value;\n }\n\n const target = value as Partial<DecodedCallbackTarget>;\n\n if (typeof target.fnPtr !== \"bigint\") {\n return value;\n }\n\n return decodedCallbackCallable(descriptor, { fnPtr: target.fnPtr, userData: target.userData });\n}\n\nfunction hashTableFromNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value === null) {\n return null;\n }\n\n const entries = value as [unknown, unknown][];\n\n return new Map(\n entries.map(([key, val]): [unknown, unknown] => [\n fromNative(descriptor.keyDescriptor, key),\n fromNative(descriptor.valueDescriptor, val),\n ]),\n );\n}\n\n/**\n * Converts a raw value returned from native code into its JavaScript form,\n * wrapping object, struct, boxed, and fundamental handles and recursively\n * converting arrays and hash tables according to the descriptor. A callback\n * decoded from a native function pointer and its bound user data becomes a\n * callable function that invokes the native callback; it stays valid only as\n * long as the native caller keeps the pointer pair alive, which for an\n * async-scoped callback means until the first invocation — calling one a\n * second time throws instead of reaching the released native closure.\n *\n * @param descriptor Describes the native type of the value.\n * @param value The raw native value to convert.\n */\nfunction fromNative(descriptor: Descriptor, value: unknown): unknown {\n if (descriptor.kind === \"callback\") {\n return callbackFromNative(descriptor, value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\": {\n return descriptor.isCallScoped === true ? wrapCallScopedObject(value) : wrapObject(value);\n }\n case \"struct\": {\n return wrapHandle(value as ExternalObject<Handle> | null, (descriptor as StructDescriptor).wrapperClass);\n }\n case \"boxed\": {\n return boxedFromNative(descriptor, value);\n }\n case \"fundamental\": {\n return fundamentalFromNative(descriptor, value);\n }\n case \"array\": {\n return collectionFromNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableFromNative(descriptor, value);\n }\n }\n}\n\nfunction collectionToNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value == null ? null : mapCollection(descriptor, value, toNative);\n}\n\nfunction hashTableToNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n return [...(value as Map<unknown, unknown>)].map(([key, val]): [unknown, unknown] => [\n toNative(descriptor.keyDescriptor, key),\n toNative(descriptor.valueDescriptor, val),\n ]);\n}\n\n/**\n * Converts a JavaScript value into the raw form native code expects, unwrapping\n * object, struct, boxed, and fundamental wrappers back to their handles,\n * resolving a class passed for a GType to the GType it was registered under, and\n * recursively converting arrays and maps according to the descriptor.\n *\n * @param descriptor Describes the native type to convert to.\n * @param value The JavaScript value to convert.\n */\nfunction toNative(descriptor: Descriptor, value: unknown): unknown {\n if (isGtypeDescriptor(descriptor)) {\n return coerceGType(value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\":\n case \"struct\":\n case \"boxed\":\n case \"fundamental\": {\n const instance = value as object | null | undefined;\n\n return instance == null ? null : getHandle(instance);\n }\n case \"array\": {\n return collectionToNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableToNative(descriptor, value);\n }\n }\n}\n\nexport { fromNative, toNative };\n"]}
1
+ {"version":3,"file":"native-value.js","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnyClass } from \"@gtkx/utils\";\nimport {\n bindFunctionPointer,\n call,\n type CallDescriptor,\n type Descriptor,\n type ExternalObject,\n getType,\n type Handle,\n type Ref,\n} from \"@gtkx/native\";\nimport {\n type ArrayDescriptor,\n type BoxedDescriptor,\n boxedT,\n type CallbackDescriptor,\n type FundamentalDescriptor,\n type HashTableDescriptor,\n isGtypeDescriptor,\n type ObjectDescriptor,\n refT,\n type StructDescriptor,\n} from \"./descriptors.js\";\nimport { checkError } from \"./error.js\";\nimport { LIB } from \"./library.js\";\nimport {\n coerceGType,\n getHandle,\n getWrapperClass,\n resolveWrapperClass,\n wrapCallScopedObject,\n wrapFundamentalHandle,\n wrapHandle,\n wrapObject,\n} from \"./registry.js\";\nimport { resolveDescriptorType } from \"./type.js\";\n\ntype MarshalledKind = \"object\" | \"struct\" | \"boxed\" | \"fundamental\" | \"array\" | \"hashtable\";\ntype MarshalledDescriptor = Extract<Descriptor, { kind: MarshalledKind }>;\ntype DecodedCallbackTarget = { fnPtr: bigint; userData?: bigint | undefined };\n\nconst MARSHALLED_KINDS: Set<Descriptor[\"kind\"]> = new Set<MarshalledKind>([\n \"object\",\n \"struct\",\n \"boxed\",\n \"fundamental\",\n \"array\",\n \"hashtable\",\n]);\n\nconst NULL_POINTER = 0n;\n\nfunction isMarshalledDescriptor(descriptor: Descriptor): descriptor is MarshalledDescriptor {\n return MARSHALLED_KINDS.has(descriptor.kind);\n}\n\nfunction mapCollection(\n descriptor: ArrayDescriptor,\n value: unknown,\n convert: (itemDescriptor: Descriptor, item: unknown) => unknown,\n): unknown[] {\n return (value as unknown[]).map((item) => convert(descriptor.itemDescriptor, item));\n}\n\nfunction collectionFromNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value === null ? null : mapCollection(descriptor, value, fromNative);\n}\n\nfunction boxedFromNative(descriptor: Descriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n const type = resolveDescriptorType(descriptor);\n const registered = resolveWrapperClass(type);\n\n if (registered !== null) {\n return wrapHandle(handle, registered);\n }\n\n const fallback = (descriptor as BoxedDescriptor).fallbackClass?.();\n\n if (fallback !== undefined) {\n return wrapHandle(handle, fallback);\n }\n\n return wrapHandle(handle, getWrapperClass(type));\n}\n\nfunction fundamentalWrapperClass(descriptor: FundamentalDescriptor, handle: ExternalObject<Handle>): AnyClass {\n if (descriptor.wrapperClass !== undefined) {\n return descriptor.wrapperClass;\n }\n\n const declaredType = resolveDescriptorType(descriptor);\n const registered = resolveWrapperClass(getType(handle, declaredType));\n\n if (registered !== null) {\n return registered;\n }\n\n const fallback = descriptor.fallbackClass?.();\n\n if (fallback !== undefined) {\n return fallback;\n }\n\n return getWrapperClass(declaredType);\n}\n\nfunction fundamentalFromNative(descriptor: FundamentalDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n const handle = value as ExternalObject<Handle>;\n\n return wrapFundamentalHandle(handle, fundamentalWrapperClass(descriptor, handle));\n}\n\nconst errorRefDescriptor = (): Descriptor =>\n refT(boxedT(\"GError\", { ownership: \"full\", sharedLibrary: LIB, getTypeFnName: \"g_error_get_type\" }));\n\nfunction decodedCallbackValues(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n inputs: unknown[],\n): unknown[] {\n const values: unknown[] = [];\n let cursor = 0;\n\n for (const [index, argDescriptor] of descriptor.argDescriptors.entries()) {\n if (index === descriptor.userDataIndex) {\n values.push(target.userData ?? NULL_POINTER);\n } else {\n values.push(toNative(argDescriptor, inputs[cursor]));\n cursor += 1;\n }\n }\n\n return values;\n}\n\nfunction decodedCallbackCallable(\n descriptor: CallbackDescriptor,\n target: DecodedCallbackTarget,\n): (...inputs: unknown[]) => unknown {\n const canThrow = descriptor.canThrow === true;\n const isOneShot = descriptor.scope === \"async\";\n const argDescriptors = canThrow ? [...descriptor.argDescriptors, errorRefDescriptor()] : descriptor.argDescriptors;\n let bound: ExternalObject<CallDescriptor> | undefined;\n let isSpent = false;\n\n return (...inputs) => {\n if (isSpent) {\n throw new Error(\"An async-scoped callback was already invoked; its native caller has released it\");\n }\n\n bound ??= bindFunctionPointer(target.fnPtr, argDescriptors, descriptor.returnDescriptor, \"decoded callback\");\n const values = decodedCallbackValues(descriptor, target, inputs);\n isSpent = isOneShot;\n\n if (!canThrow) {\n return fromNative(descriptor.returnDescriptor, call(bound, values));\n }\n\n const errorRef: Ref = { value: null };\n values.push(errorRef);\n const result = call(bound, values);\n checkError(errorRef);\n\n return fromNative(descriptor.returnDescriptor, result);\n };\n}\n\nfunction callbackFromNative(descriptor: CallbackDescriptor, value: unknown): unknown {\n if (value == null) {\n return value;\n }\n\n const target = value as Partial<DecodedCallbackTarget>;\n\n if (typeof target.fnPtr !== \"bigint\") {\n return value;\n }\n\n return decodedCallbackCallable(descriptor, { fnPtr: target.fnPtr, userData: target.userData });\n}\n\nfunction hashTableFromNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value === null) {\n return null;\n }\n\n const entries = value as [unknown, unknown][];\n\n return new Map(\n entries.map(([key, val]): [unknown, unknown] => [\n fromNative(descriptor.keyDescriptor, key),\n fromNative(descriptor.valueDescriptor, val),\n ]),\n );\n}\n\n/**\n * Converts a raw value returned from native code into its JavaScript form,\n * wrapping object, struct, boxed, and fundamental handles and recursively\n * converting arrays and hash tables according to the descriptor. A callback\n * decoded from a native function pointer and its bound user data becomes a\n * callable function that invokes the native callback; it stays valid only as\n * long as the native caller keeps the pointer pair alive, which for an\n * async-scoped callback means until the first invocation — calling one a\n * second time throws instead of reaching the released native closure.\n *\n * @param descriptor Describes the native type of the value.\n * @param value The raw native value to convert.\n */\nfunction fromNative(descriptor: Descriptor, value: unknown): unknown {\n if (descriptor.kind === \"callback\") {\n return callbackFromNative(descriptor, value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\": {\n const fallbackClass = (descriptor as ObjectDescriptor).fallbackClass;\n\n return descriptor.isCallScoped === true\n ? wrapCallScopedObject(value, fallbackClass)\n : wrapObject(value, fallbackClass);\n }\n case \"struct\": {\n return wrapHandle(value as ExternalObject<Handle> | null, (descriptor as StructDescriptor).wrapperClass);\n }\n case \"boxed\": {\n return boxedFromNative(descriptor, value);\n }\n case \"fundamental\": {\n return fundamentalFromNative(descriptor, value);\n }\n case \"array\": {\n return collectionFromNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableFromNative(descriptor, value);\n }\n }\n}\n\nfunction collectionToNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value == null ? null : mapCollection(descriptor, value, toNative);\n}\n\nfunction hashTableToNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n return [...(value as Map<unknown, unknown>)].map(([key, val]): [unknown, unknown] => [\n toNative(descriptor.keyDescriptor, key),\n toNative(descriptor.valueDescriptor, val),\n ]);\n}\n\n/**\n * Converts a JavaScript value into the raw form native code expects, unwrapping\n * object, struct, boxed, and fundamental wrappers back to their handles,\n * resolving a class passed for a GType to the GType it was registered under, and\n * recursively converting arrays and maps according to the descriptor.\n *\n * @param descriptor Describes the native type to convert to.\n * @param value The JavaScript value to convert.\n */\nfunction toNative(descriptor: Descriptor, value: unknown): unknown {\n if (isGtypeDescriptor(descriptor)) {\n return coerceGType(value);\n }\n\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\":\n case \"struct\":\n case \"boxed\":\n case \"fundamental\": {\n const instance = value as object | null | undefined;\n\n return instance == null ? null : getHandle(instance);\n }\n case \"array\": {\n return collectionToNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableToNative(descriptor, value);\n }\n }\n}\n\nexport { fromNative, toNative };\n"]}
@@ -117,7 +117,7 @@ type SignalSpec = {
117
117
  /** GType of the value an emission returns, defaulting to none. */
118
118
  returnType?: SignalGType;
119
119
  /**
120
- * How the emission combines what its handlers return, limited to the two accumulators GObject
120
+ * How the emission combines what its handlers return, limited to the accumulators GObject
121
121
  * ships: `"first-wins"` stops the emission at the first handler and keeps its result, and
122
122
  * `"true-handled"` runs handlers until one returns `true`, which requires a boolean
123
123
  * `returnType`. Without one, every handler runs and the last result stands.
@@ -233,7 +233,7 @@ type RegisterClassOptions<TInstance extends object, TProperties extends Record<s
233
233
  * in lowercase letters, digits, `-` and `_`, and be new to the type: one an ancestor type or a
234
234
  * listed interface already carries throws, and so does one carrying an uppercase letter, which
235
235
  * GObject would carry under that exact spelling, out of reach of both its dashed spelling and
236
- * its `on<SignalName>` default handler. The two word separators spell the same signal, so a
236
+ * its `on<SignalName>` default handler. Either word separator spells the same signal, so a
237
237
  * signal declared as `data_changed` is connected to and emitted as `data-changed` too.
238
238
  *
239
239
  * Instances connect and emit by name through the same `connect`, `on`, `once`, `off` and
@@ -1 +1 @@
1
- {"version":3,"file":"register-class.d.ts","sourceRoot":"","sources":["../src/register-class.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register-class.d.ts","sourceRoot":"","sources":["../src/register-class.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { insertMixinLayer } from "./mixin.js";
5
5
  import { buildPropertyDispatch, GET_PROPERTY_VFUNC, makeGetProperty, makeSetProperty, SET_PROPERTY_VFUNC, toNativeProperties, } from "./properties.js";
6
6
  import { getClassStructClass, getClassType, getInterfaceMixin, getTypeClassHandle, markDerivedClass, registerClassType, wrapHandle, } from "./registry.js";
7
7
  import { connectClosureSignal, emitDeclaredSignal, getSignalBaseName, overrideSignalClassClosure, signalForHandlerName, signalIdFor, } from "./signal.js";
8
- import { TYPE_INTERFACE, TYPE_INVALID, TYPE_NONE, typeFundamental, typeInterfaces, typeIsA, typeName, } from "./type.js";
8
+ import { TYPE_INTERFACE, TYPE_INVALID, TYPE_NONE, typeFundamental, typeInterfacePrerequisites, typeInterfaces, typeIsA, typeName, } from "./type.js";
9
9
  import { findClassVfuncDescriptor, findInterfaceVfuncDescriptor } from "./vfunc.js";
10
10
  const INSTANCE_ARG_INDEX = 0;
11
11
  const VALUE_ARG_INDEX = 2;
@@ -17,6 +17,7 @@ const PROPERTY_VFUNC_SPECS = [
17
17
  { methodName: SET_PROPERTY_VFUNC, isValueOut: false, makeDispatch: makeSetProperty },
18
18
  ];
19
19
  const PROPERTY_VFUNC_NAMES = new Set(PROPERTY_VFUNC_SPECS.map((spec) => spec.methodName));
20
+ const VFUNC_METHOD_PATTERN = /^vfunc[A-Z0-9]/;
20
21
  const TYPE_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9\-_+]{2,}$/;
21
22
  const UPPER_CASE_PATTERN = /[A-Z]/;
22
23
  const SIGNAL_OVERRIDE_PATTERN = /^on[A-Z]/;
@@ -27,6 +28,7 @@ function registerClass(klass, options = {}) {
27
28
  }
28
29
  const name = resolveTypeName(klass, options);
29
30
  const declaredTypes = resolveInterfaceTypes(klass, options.implements ?? []);
31
+ assertInterfacePrerequisites(klass, parentType, declaredTypes);
30
32
  const adoptedTypes = declaredTypes.filter((gtype) => !typeIsA(parentType, gtype));
31
33
  const properties = options.properties ?? {};
32
34
  const signals = resolveDeclaredSignals(klass, options.signals ?? {});
@@ -40,6 +42,7 @@ function registerClass(klass, options = {}) {
40
42
  ];
41
43
  const claimedMethodNames = new Set(classVfuncs.map((vfunc) => vfunc.methodName));
42
44
  const interfaceBindings = discoverInterfaceBindings(methods, parentType, declaredTypes, claimedMethodNames);
45
+ assertClaimedVfuncs(klass, methods, claimedMethodNames, interfaceBindings);
43
46
  const nativeOptions = withNativeSignals(toNativeOptions(classVfuncs, interfaceBindings, properties, options), signals.native);
44
47
  const newType = nativeRegisterClass(name, parentType, nativeOptions);
45
48
  registerClassType(klass, newType);
@@ -169,6 +172,40 @@ function discoverClassVfuncs(klass, methods) {
169
172
  function wrapVfunc(fn, argDescriptors, descriptor) {
170
173
  return wrapCallback(fn, { argDescriptors, returnDescriptor: descriptor.returnDescriptor }, "vfunc");
171
174
  }
175
+ const claimedVfuncNames = (claimedMethodNames, interfaceBindings) => {
176
+ const claimed = new Set(claimedMethodNames);
177
+ for (const binding of interfaceBindings) {
178
+ for (const vfunc of binding.vfuncs) {
179
+ claimed.add(vfunc.methodName);
180
+ }
181
+ }
182
+ return claimed;
183
+ };
184
+ const isPrerequisiteMet = (parentType, declaredTypes, prerequisite) => typeIsA(parentType, prerequisite) || declaredTypes.includes(prerequisite);
185
+ function assertPrerequisitesFor(klass, parentType, declaredTypes, iface) {
186
+ for (const prerequisite of typeInterfacePrerequisites(iface)) {
187
+ if (!isPrerequisiteMet(parentType, declaredTypes, prerequisite)) {
188
+ throw new TypeError(`registerClass: ${klass.name} does not meet prerequisite ` +
189
+ `'${typeName(prerequisite) ?? String(prerequisite)}' of interface ` +
190
+ `'${typeName(iface) ?? String(iface)}'`);
191
+ }
192
+ }
193
+ }
194
+ function assertInterfacePrerequisites(klass, parentType, declaredTypes) {
195
+ for (const iface of declaredTypes) {
196
+ assertPrerequisitesFor(klass, parentType, declaredTypes, iface);
197
+ }
198
+ }
199
+ function assertClaimedVfuncs(klass, methods, claimedMethodNames, interfaceBindings) {
200
+ const claimed = claimedVfuncNames(claimedMethodNames, interfaceBindings);
201
+ for (const methodName of methods.keys()) {
202
+ if (VFUNC_METHOD_PATTERN.test(methodName) && !claimed.has(methodName)) {
203
+ throw new Error(`registerClass: ${klass.name}.${methodName} matches no vtable slot on any ancestor ` +
204
+ "or implemented interface, so the override would never be called; check the name against " +
205
+ "the parent class's virtual methods");
206
+ }
207
+ }
208
+ }
172
209
  function discoverInterfaceBindings(methods, parentGtype, declaredTypes, claimedMethodNames) {
173
210
  const declared = new Set(declaredTypes);
174
211
  const gtypes = new Set([...typeInterfaces(parentGtype), ...declaredTypes]);