componentCanonicalAdapterPlans function

List<WASIComponentCanonicalAdapterPlan> componentCanonicalAdapterPlans(
  1. WasmComponent component, {
  2. 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);
}