From 8b1139fa37377c0fd008f9f786b6fcb08cd60de4 Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Fri, 13 Sep 2019 18:35:56 +0100 Subject: [PATCH] Improve WebAssembly import/export types Sets more specific types to allowed imports/exports for WebAssembly. --- baselines/dom.generated.d.ts | 13 +++++--- baselines/webworker.generated.d.ts | 13 +++++--- inputfiles/addedTypes.json | 49 ++++++++++++++++++++++++++++++ inputfiles/overridingTypes.json | 34 ++++++++++++++++++++- src/emitter.ts | 8 +++-- src/legacy-namespace.ts | 8 ++++- src/types.d.ts | 2 ++ 7 files changed, 115 insertions(+), 12 deletions(-) diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index e4abe0612..12f051c69 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -19043,7 +19043,7 @@ declare namespace WebAssembly { }; interface Instance { - readonly exports: any; + readonly exports: Exports; } var Instance: { @@ -19134,10 +19134,16 @@ declare namespace WebAssembly { type ImportExportKind = "function" | "table" | "memory" | "global"; type TableKind = "anyfunc"; + type ValueType = "i32" | "i64" | "f32" | "f64"; + type ExportValue = Function | Global | Memory | Table; + type Exports = Record; + type ImportValue = ExportValue | number; + type ModuleImports = Record; + type Imports = Record; function compile(bytes: BufferSource): Promise; function compileStreaming(source: Response | Promise): Promise; - function instantiate(bytes: BufferSource, importObject?: any): Promise; - function instantiate(moduleObject: Module, importObject?: any): Promise; + function instantiate(bytes: BufferSource, importObject?: Imports): Promise; + function instantiate(moduleObject: Module, importObject?: Imports): Promise; function instantiateStreaming(source: Response | Promise, importObject?: any): Promise; function validate(bytes: BufferSource): boolean; } @@ -20097,7 +20103,6 @@ type TouchType = "direct" | "stylus"; type Transport = "usb" | "nfc" | "ble"; type UserVerificationRequirement = "required" | "preferred" | "discouraged"; type VRDisplayEventReason = "mounted" | "navigation" | "requested" | "unmounted"; -type ValueType = "i32" | "i64" | "f32" | "f64"; type VideoFacingModeEnum = "user" | "environment" | "left" | "right"; type VisibilityState = "hidden" | "visible" | "prerender"; type WebGLPowerPreference = "default" | "low-power" | "high-performance"; diff --git a/baselines/webworker.generated.d.ts b/baselines/webworker.generated.d.ts index 36602863e..79b62e505 100644 --- a/baselines/webworker.generated.d.ts +++ b/baselines/webworker.generated.d.ts @@ -5604,7 +5604,7 @@ declare namespace WebAssembly { }; interface Instance { - readonly exports: any; + readonly exports: Exports; } var Instance: { @@ -5679,10 +5679,16 @@ declare namespace WebAssembly { type ImportExportKind = "function" | "table" | "memory" | "global"; type TableKind = "anyfunc"; + type ValueType = "i32" | "i64" | "f32" | "f64"; + type ExportValue = Function | Global | Memory | Table; + type Exports = Record; + type ImportValue = ExportValue | number; + type ModuleImports = Record; + type Imports = Record; function compile(bytes: BufferSource): Promise; function compileStreaming(source: Response | Promise): Promise; - function instantiate(bytes: BufferSource, importObject?: any): Promise; - function instantiate(moduleObject: Module, importObject?: any): Promise; + function instantiate(bytes: BufferSource, importObject?: Imports): Promise; + function instantiate(moduleObject: Module, importObject?: Imports): Promise; function instantiateStreaming(source: Response | Promise, importObject?: any): Promise; function validate(bytes: BufferSource): boolean; } @@ -5857,7 +5863,6 @@ type RequestRedirect = "follow" | "error" | "manual"; type ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect"; type ServiceWorkerState = "installing" | "installed" | "activating" | "activated" | "redundant"; type ServiceWorkerUpdateViaCache = "imports" | "all" | "none"; -type ValueType = "i32" | "i64" | "f32" | "f64"; type VisibilityState = "hidden" | "visible" | "prerender"; type WebGLPowerPreference = "default" | "low-power" | "high-performance"; type WorkerType = "classic" | "module"; diff --git a/inputfiles/addedTypes.json b/inputfiles/addedTypes.json index 4e35780b2..a4b426926 100644 --- a/inputfiles/addedTypes.json +++ b/inputfiles/addedTypes.json @@ -2264,6 +2264,55 @@ { "new-type": "WindowProxy", "type": "Window" + }, + { + "new-type": "ExportValue", + "legacy-namespace": "WebAssembly", + "override-type": "Function | Global | Memory | Table" + }, + { + "new-type": "Exports", + "legacy-namespace": "WebAssembly", + "type": "record", + "subtype": [ + { + "type": "DOMString" + }, + { + "type": "ExportValue" + } + ] + }, + { + "new-type": "ImportValue", + "legacy-namespace": "WebAssembly", + "override-type": "ExportValue | number" + }, + { + "new-type": "ModuleImports", + "legacy-namespace": "WebAssembly", + "type": "record", + "subtype": [ + { + "type": "DOMString" + }, + { + "type": "ImportValue" + } + ] + }, + { + "new-type": "Imports", + "legacy-namespace": "WebAssembly", + "type": "record", + "subtype": [ + { + "type": "DOMString" + }, + { + "type": "ModuleImports" + } + ] } ] } diff --git a/inputfiles/overridingTypes.json b/inputfiles/overridingTypes.json index 5b424cd18..948ecd122 100644 --- a/inputfiles/overridingTypes.json +++ b/inputfiles/overridingTypes.json @@ -312,6 +312,9 @@ }, "TableKind": { "legacy-namespace": "WebAssembly" + }, + "ValueType": { + "legacy-namespace": "WebAssembly" } } }, @@ -2802,6 +2805,15 @@ } } } + }, + "Instance": { + "properties": { + "property": { + "exports": { + "type": "Exports" + } + } + } } } }, @@ -3190,5 +3202,25 @@ "new-type": "BodyInit" } ] - } + }, + "namespaces": [ + { + "name": "WebAssembly", + "methods": { + "method": { + "instantiate": { + "override-signatures": [ + "instantiate(bytes: BufferSource, importObject?: Imports): Promise", + "instantiate(moduleObject: Module, importObject?: Imports): Promise" + ], + "force-references": [ + { + "type": "Imports" + } + ] + } + } + } + } + ] } diff --git a/src/emitter.ts b/src/emitter.ts index 1e7ec61af..0539406a7 100644 --- a/src/emitter.ts +++ b/src/emitter.ts @@ -1049,6 +1049,8 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor) { namespace.nested.enums .sort(compareName) .forEach(emitEnum); + namespace.nested.typedefs + .forEach(emitTypeDef); } emitProperties("var ", EmitScope.InstanceOnly, namespace); @@ -1097,7 +1099,9 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor) { function emitTypeDefs() { if (webidl.typedefs) { - webidl.typedefs.typedef.forEach(emitTypeDef); + webidl.typedefs.typedef + .filter(i => !i["legacy-namespace"]) + .forEach(emitTypeDef); } } @@ -1272,7 +1276,7 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor) { mapToArray(i.methods ? i.methods.method : {}) .filter(m => m.signature && !m["override-signatures"]) .map(m => ({ - ...m, + ...m, signature: replaceTypedefsInSignatures(m.signature.filter(hasSequenceArgument)) })) .filter(m => m.signature.length) diff --git a/src/legacy-namespace.ts b/src/legacy-namespace.ts index e3bcc7524..f18cd8790 100644 --- a/src/legacy-namespace.ts +++ b/src/legacy-namespace.ts @@ -22,6 +22,11 @@ export function collectLegacyNamespaceTypes(webidl: Browser.WebIdl): Browser.Int getNamespace(i["legacy-namespace"]).nested!.enums.push(i); } } + for (const i of webidl.typedefs!.typedef) { + if (i["legacy-namespace"]) { + getNamespace(i["legacy-namespace"]).nested!.typedefs.push(i); + } + } return mapToArray(namespaceMap); @@ -44,7 +49,8 @@ function addEmptyNested(namespace: Browser.Interface): Browser.Interface { nested: { interfaces: [], enums: [], - dictionaries: [] + dictionaries: [], + typedefs: [], } }; } diff --git a/src/types.d.ts b/src/types.d.ts index f16c66444..5901f0598 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -200,6 +200,7 @@ export interface Interface { interfaces: Interface[]; enums: Enum[]; dictionaries: Dictionary[]; + typedefs: TypeDef[]; } } @@ -222,6 +223,7 @@ export interface Enum { export interface TypeDef extends Typed { "new-type": string; deprecated?: 1; + "legacy-namespace"?: string; } export interface Dictionary {