Commit b4bd52cc51

hryx <codroid@gmail.com>
2019-06-28 06:02:48
Create and render big.Int from IntegerLiteral; group BinaryOperator
1 parent 8435351
Changed files (1)
src-self-hosted
src-self-hosted/translate_c.zig
@@ -372,22 +372,22 @@ fn transBinaryOperator(
         },
         .Add => {
             const node = if (cIsUnsignedInteger(qt))
-                try transCreateNodeInfixOp(rp, scope, stmt, .AddWrap, .PlusPercent, "+%")
+                try transCreateNodeInfixOp(rp, scope, stmt, .AddWrap, .PlusPercent, "+%", true)
             else
-                try transCreateNodeInfixOp(rp, scope, stmt, .Add, .Plus, "+");
+                try transCreateNodeInfixOp(rp, scope, stmt, .Add, .Plus, "+", true);
             return maybeSuppressResult(rp, scope, result_used, TransResult{
-                .node = &node.base,
+                .node = node,
                 .child_scope = scope,
                 .node_scope = scope,
             });
         },
         .Sub => {
             const node = if (cIsUnsignedInteger(qt))
-                try transCreateNodeInfixOp(rp, scope, stmt, .SubWrap, .MinusPercent, "-%")
+                try transCreateNodeInfixOp(rp, scope, stmt, .SubWrap, .MinusPercent, "-%", true)
             else
-                try transCreateNodeInfixOp(rp, scope, stmt, .Sub, .Minus, "-");
+                try transCreateNodeInfixOp(rp, scope, stmt, .Sub, .Minus, "-", true);
             return maybeSuppressResult(rp, scope, result_used, TransResult{
-                .node = &node.base,
+                .node = node,
                 .child_scope = scope,
                 .node_scope = scope,
             });
@@ -1056,7 +1056,9 @@ fn transCreateNodeInfixOp(
     op: ast.Node.InfixOp.Op,
     op_tok_id: std.zig.Token.Id,
     bytes: []const u8,
-) !*ast.Node.InfixOp {
+    grouped: bool,
+) !*ast.Node {
+    const lparen = if (grouped) try appendToken(rp.c, .LParen, "(") else undefined;
     const lhs = try transExpr(rp, scope, ZigClangBinaryOperator_getLHS(stmt), .used, .l_value);
     const op_token = try appendToken(rp.c, op_tok_id, bytes);
     const rhs = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
@@ -1068,7 +1070,16 @@ fn transCreateNodeInfixOp(
         .op = op,
         .rhs = rhs.node,
     };
-    return node;
+    if (!grouped) return &node.base;
+    const rparen = try appendToken(rp.c, .RParen, ")");
+    const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);
+    grouped_expr.* = ast.Node.GroupedExpression{
+        .base = ast.Node{ .id = .GroupedExpression },
+        .lparen = lparen,
+        .expr = &node.base,
+        .rparen = rparen,
+    };
+    return &grouped_expr.base;
 }
 
 fn transCreateNodePtrType(
@@ -1096,10 +1107,21 @@ fn transCreateNodePtrType(
 }
 
 fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {
+    const num_limbs = ZigClangAPSInt_getNumWords(int.?);
+    var big = try std.math.big.Int.initCapacity(c.a(), num_limbs);
+    defer big.deinit();
+    const data = ZigClangAPSInt_getRawData(int.?);
+    var i: usize = 0;
+    while (i < num_limbs) : (i += 1) big.limbs[i] = data[i];
+    const str = big.toString(c.a(), 10) catch |err| switch (err) {
+        error.OutOfMemory => return error.OutOfMemory,
+        else => unreachable,
+    };
+    const token = try appendToken(c, .IntegerLiteral, str);
     const node = try c.a().create(ast.Node.IntegerLiteral);
     node.* = ast.Node.IntegerLiteral{
         .base = ast.Node{ .id = .IntegerLiteral },
-        .token = try appendToken(c, .IntegerLiteral, "3333333"), // TODO
+        .token = token,
     };
     return &node.base;
 }