fix(webgpu): add webidl records and simple unions (#9698)

The only functional user facing difference is that this commit allows the
use SPIRV shaders, not just WGSL. This matches FF and Chrome Canary.
This commit is contained in:
Luca Casonato 2021-03-08 14:22:05 +01:00 committed by GitHub
parent 0bc488c85c
commit c009dad982
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 249 additions and 110 deletions

View file

@ -596,6 +596,13 @@
converters.VoidFunction = convertCallbackFunction;
converters["UVString?"] = createNullableConverter(
converters.USVString,
);
converters["sequence<double>"] = createSequenceConverter(
converters["double"],
);
function requiredArguments(length, required, opts = {}) {
if (length < required) {
const errMsg = `${
@ -737,6 +744,26 @@
};
}
function createRecordConverter(keyConverter, valueConverter) {
return (V, opts) => {
if (typeof V !== "object") {
throw makeException(
TypeError,
"can not be converted to dictionary.",
opts,
);
}
const result = {};
for (const key of V) {
const typedKey = keyConverter(key, opts);
const value = V[key];
const typedValue = valueConverter(value, opts);
result[typedKey] = typedValue;
}
return result;
};
}
const brand = Symbol("[[webidl.brand]]");
function createInterfaceConverter(name, prototype) {
@ -766,12 +793,14 @@
window.__bootstrap ??= {};
window.__bootstrap.webidl = {
makeException,
converters,
requiredArguments,
createDictionaryConverter,
createEnumConverter,
createNullableConverter,
createSequenceConverter,
createRecordConverter,
createInterfaceConverter,
brand,
createBranded,

View file

@ -25,6 +25,11 @@ declare namespace globalThis {
*/
context: string;
}
declare function makeException(
ErrorType: any,
message: string,
opts: ValueConverterOpts,
): any;
declare interface IntConverterOpts extends ValueConverterOpts {
/**
* Wether to throw if the number is outside of the acceptable values for
@ -191,6 +196,8 @@ declare namespace globalThis {
* Convert a value into a `VoidFunction` (() => void).
*/
VoidFunction(v: any, opts?: ValueConverterOpts): () => void;
["UVString?"](v: any, opts?: ValueConverterOpts): string | null;
["sequence<double>"](v: any, opts?: ValueConverterOpts): number[];
[type: string]: (v: any, opts: ValueConverterOpts) => any;
};
@ -268,6 +275,17 @@ declare namespace globalThis {
name: string,
prototype: any,
): (v: any, opts: ValueConverterOpts) => any;
declare function createRecordConverter<
K extends string | number | symbol,
V,
>(
keyConverter: (v: any, opts: ValueConverterOpts) => K,
valueConverter: (v: any, opts: ValueConverterOpts) => V,
): (
v: Record<K, V>,
opts: ValueConverterOpts,
) => any;
}
declare var eventTarget: {