Ejemplo n.º 1
0
static bool
RenderBlock(WasmRenderContext& c, AstBlock& block)
{
    if (!RenderIndent(c))
        return false;

    MAP_AST_EXPR(c, block);
    if (block.expr() == Expr::Block) {
        if (!c.buffer.append("block"))
            return false;
    } else if (block.expr() == Expr::Loop) {
        if (!c.buffer.append("loop"))
            return false;
    } else {
        return Fail(c, "unexpected block kind");
    }

    if (!RenderBlockNameAndSignature(c, block.name(), block.type()))
        return false;

    if (!c.buffer.append('\n'))
        return false;

    c.indent++;
    if (!RenderExprList(c, block.exprs()))
        return false;
    c.indent--;

    if (!RenderIndent(c))
        return false;

    return c.buffer.append("end");
}
Ejemplo n.º 2
0
static bool
RenderBlock(WasmRenderContext& c, AstBlock& block)
{
    if (block.expr() == Expr::Block) {
        if (!c.buffer.append("(block "))
            return false;
        if (!RenderName(c, block.breakName()))
            return false;
    } else if (block.expr() == Expr::Loop) {
        if (!c.buffer.append("(loop "))
            return false;
        if (block.breakName().empty() && !block.continueName().empty()) {
            // Giving auto label if continue label is present.
            if (!c.buffer.append("$exit$"))
                return false;
        } else {
            if (!RenderName(c, block.breakName()))
                return false;
        }
        if (!block.continueName().empty()) {
          if (!c.buffer.append(" "))
              return false;
          if (!RenderName(c, block.continueName()))
              return false;
        }
    } else
        return false;

    c.indent++;
    if (!RenderExprList(c, block.exprs()))
        return false;
    c.indent--;

    return c.buffer.append(")");
}
Ejemplo n.º 3
0
static bool
RenderBlock(WasmRenderContext& c, AstBlock& block, bool isInline = false)
{
    if (!isInline && !RenderIndent(c))
        return false;

    MAP_AST_EXPR(c, block);
    if (block.op() == Op::Block) {
        if (!c.buffer.append("block"))
            return false;
    } else if (block.op() == Op::Loop) {
        if (!c.buffer.append("loop"))
            return false;
    } else {
        return Fail(c, "unexpected block kind");
    }

    if (!RenderBlockNameAndSignature(c, block.name(), block.type()))
        return false;

    uint32_t startAtSubExpr = 0;

    // If there is a stack of blocks, print them all inline.
    if (block.op() == Op::Block &&
        block.exprs().length() &&
        block.exprs()[0]->kind() == AstExprKind::Block &&
        block.exprs()[0]->as<AstBlock>().op() == Op::Block)
    {
        if (!c.buffer.append(' '))
            return false;

        // Render the first inner expr (block) at the same indent level, but
        // next instructions one level further.
        if (!RenderBlock(c, block.exprs()[0]->as<AstBlock>(), /* isInline */ true))
            return false;

        startAtSubExpr = 1;
    }

    if (!c.buffer.append('\n'))
        return false;

    c.indent++;
    if (!RenderExprList(c, block.exprs(), startAtSubExpr))
        return false;
    c.indent--;

    return RenderIndent(c) &&
           c.buffer.append("end ") &&
           RenderName(c, block.name());
}
Ejemplo n.º 4
0
void IrGen::visit(AstBlock& block) {
  allocateAndInitLocalIrObjectFor(
    block, callAcceptOn(block.body()), block.name());
}