componentCanonicalAdapterPlans function
List<WASIComponentCanonicalAdapterPlan>
componentCanonicalAdapterPlans(
- WasmComponent component, {
- Iterable<
WASIComponentResourceUse> ? resourceUses,
Builds canonical lift/lower adapter plans for component.
Implementation
List<WASIComponentCanonicalAdapterPlan> componentCanonicalAdapterPlans(
WasmComponent component, {
Iterable<WASIComponentResourceUse>? resourceUses,
}) {
final definitions = component.componentTypeIndexDefinitions;
final flatLayouts = _FlatLayoutResolver(definitions);
final resourceUseList = resourceUses is List<WASIComponentResourceUse>
? resourceUses
: resourceUses?.toList(growable: false) ??
WASIComponentResourceHost().componentCanonicalResourceUses(
component,
);
final plans = <WASIComponentCanonicalAdapterPlan>[];
for (
var canonicalIndex = 0;
canonicalIndex < component.canonicalDefinitions.length;
canonicalIndex++
) {
final definition = component.canonicalDefinitions[canonicalIndex];
final functionType = _canonicalAdapterFunctionType(component, definition);
if (functionType == null) {
continue;
}
final uses = List<WASIComponentResourceUse>.unmodifiable(
resourceUseList.where((use) => use.canonicalIndex == canonicalIndex),
);
final params = <WASIComponentCanonicalAdapterValuePlan>[];
for (
var paramIndex = 0;
paramIndex < functionType.params.length;
paramIndex++
) {
final param = functionType.params[paramIndex];
final path = _canonicalParamPath(canonicalIndex, paramIndex, param.label);
params.add(
_valuePlan(
path: path,
label: param.label.isEmpty ? null : param.label,
type: param.type,
definitions: definitions,
flatLayouts: flatLayouts,
resourceUses: uses,
),
);
}
final resultType = functionType.result;
plans.add(
WASIComponentCanonicalAdapterPlan(
canonicalIndex: canonicalIndex,
definition: definition,
functionType: functionType,
params: List<WASIComponentCanonicalAdapterValuePlan>.unmodifiable(
params,
),
result: resultType == null
? null
: _valuePlan(
path: 'canonical[$canonicalIndex].result',
label: null,
type: resultType,
definitions: definitions,
flatLayouts: flatLayouts,
resourceUses: uses,
),
resourceUses: uses,
stringEncoding:
WASIComponentCanonicalStringEncoding.fromCanonicalOptions(
definition.options,
),
memoryIndex: _canonicalOptionIndex(
definition,
WasmComponentCanonicalOptionKind.memory,
),
reallocIndex: _canonicalOptionIndex(
definition,
WasmComponentCanonicalOptionKind.realloc,
),
postReturnIndex: _canonicalOptionIndex(
definition,
WasmComponentCanonicalOptionKind.postReturn,
),
callbackIndex: _canonicalOptionIndex(
definition,
WasmComponentCanonicalOptionKind.callback,
),
isAsync: _hasCanonicalOption(
definition,
WasmComponentCanonicalOptionKind.async,
),
),
);
}
return List<WASIComponentCanonicalAdapterPlan>.unmodifiable(plans);
}