示例#1
0
static bool
RenderExport(WasmRenderContext& c, AstExport& export_, const AstModule::FuncVector& funcs)
{
    if (!RenderIndent(c))
        return false;
    if (!c.buffer.append("(export \""))
        return false;
    if (!RenderEscapedString(c, export_.name()))
        return false;
    if (!c.buffer.append("\" "))
        return false;
    if (export_.kind() == DefinitionKind::Memory) {
        if (!c.buffer.append("memory"))
          return false;
    } else {
        const AstFunc* func = funcs[export_.ref().index()];
        if (func->name().empty()) {
            if (!RenderInt32(c, export_.ref().index()))
                return false;
        } else {
            if (!RenderName(c, func->name()))
                return false;
        }
    }
    if (!c.buffer.append(")\n"))
        return false;

    return true;
}
static bool
RenderExport(WasmRenderContext& c, AstExport& export_,
             const AstModule::NameVector& funcImportNames,
             const AstModule::FuncVector& funcs)
{
    if (!RenderIndent(c))
        return false;
    if (!c.buffer.append("(export \""))
        return false;
    if (!RenderEscapedString(c, export_.name()))
        return false;
    if (!c.buffer.append("\" "))
        return false;

    switch (export_.kind()) {
      case DefinitionKind::Function: {
        uint32_t index = export_.ref().index();
        AstName name = index < funcImportNames.length()
                       ? funcImportNames[index]
                       : funcs[index - funcImportNames.length()]->name();
        if (name.empty()) {
            if (!RenderInt32(c, index))
                return false;
        } else {
            if (!RenderName(c, name))
                return false;
        }
        break;
      }
      case DefinitionKind::Table: {
        if (!c.buffer.append("table"))
            return false;
        break;
      }
      case DefinitionKind::Memory: {
        if (!c.buffer.append("memory"))
            return false;
        break;
      }
      case DefinitionKind::Global: {
        if (!c.buffer.append("global"))
            return false;
        if (!RenderRef(c, export_.ref()))
            return false;
        break;
      }
    }

    return c.buffer.append(")\n");
}