Example #1
0
    private void AddUnaryExprToTree(string name, string op, ESIR_UnaryExpression expr, TreeViewItem parentItem, bool postfix = false)
    {
        var niceInner  = GetNiceExpr(expr.ExprInner);
        var concatItem = AddNodeToTree($"{name}: {(!postfix ? op : niceInner)}{(!postfix ? niceInner : op)}", parentItem);

        AddIRNodeToTree(expr.ExprInner, concatItem);
    }
    private static ExpressionData CompileExpression_Unary(
        ref PassData passData,
        ref FunctionData funcData,
        ESIR_UnaryExpression expr
        )
    {
        var innerExpr = CompileExpression(ref passData, ref funcData, expr.ExprInner);

        StripFirstConst(ref innerExpr);

        return(innerExpr.Type->TypeTag switch {
            ES_TypeTag.Bool => CompileExpression_UnaryBool(ref passData, expr, ref innerExpr),
            ES_TypeTag.Int => CompileExpression_UnaryInt(ref passData, expr, ref innerExpr),
            ES_TypeTag.Float => CompileExpression_UnaryFloat(ref passData, expr, ref innerExpr),

            ES_TypeTag.Reference => CompileExpression_UnaryRef(ref passData, expr, ref innerExpr),

            _ => throw new CompilationException("Binary expression not supported."),
        });
Example #3
0
    public static ESIR_UnaryExpression UnaryExpression(ESIR_NodeKind kind, ESIR_Expression inner)
    {
        if (kind < ESIR_NodeKind.UnaryNegative || kind > ESIR_NodeKind.UnaryPostDecrement)
        {
            throw new ArgumentOutOfRangeException(nameof(kind), "Kind is not an unary expression.");
        }

        var node = ESIR_NodeCache.Shared.TryGetNode(kind, inner, out var hash);

        if (node is not null)
        {
            return((ESIR_UnaryExpression)node);
        }

        var ret = new ESIR_UnaryExpression(kind, inner);

        if (hash >= 0)
        {
            ESIR_NodeCache.Shared.AddNode(ret, hash);
        }

        return(ret);
    }