authorgravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-27 21:02:48-07:00
committergravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-27 21:02:48-07:00
logb4bd52cc515e698a0bcf64653d829efeb2e0b4cb
tree18ac905ac01e3d88a4e417b7d4ea3cc4e4d885bd
parent84353515817929d694efd22e528e00e8de3d41a1
signaturelock-open Commit is signed but in an unrecognized format.

Create and render big.Int from IntegerLiteral; group BinaryOperator


1 files changed, 31 insertions(+), 9 deletions(-)

src-self-hosted/translate_c.zig+31-9
......@@ -372,22 +372,22 @@ fn transBinaryOperator(
372372 },
373373 .Add => {
374374 const node = if (cIsUnsignedInteger(qt))
375 try transCreateNodeInfixOp(rp, scope, stmt, .AddWrap, .PlusPercent, "+%")
375 try transCreateNodeInfixOp(rp, scope, stmt, .AddWrap, .PlusPercent, "+%", true)
376376 else
377 try transCreateNodeInfixOp(rp, scope, stmt, .Add, .Plus, "+");
377 try transCreateNodeInfixOp(rp, scope, stmt, .Add, .Plus, "+", true);
378378 return maybeSuppressResult(rp, scope, result_used, TransResult{
379 .node = &node.base,
379 .node = node,
380380 .child_scope = scope,
381381 .node_scope = scope,
382382 });
383383 },
384384 .Sub => {
385385 const node = if (cIsUnsignedInteger(qt))
386 try transCreateNodeInfixOp(rp, scope, stmt, .SubWrap, .MinusPercent, "-%")
386 try transCreateNodeInfixOp(rp, scope, stmt, .SubWrap, .MinusPercent, "-%", true)
387387 else
388 try transCreateNodeInfixOp(rp, scope, stmt, .Sub, .Minus, "-");
388 try transCreateNodeInfixOp(rp, scope, stmt, .Sub, .Minus, "-", true);
389389 return maybeSuppressResult(rp, scope, result_used, TransResult{
390 .node = &node.base,
390 .node = node,
391391 .child_scope = scope,
392392 .node_scope = scope,
393393 });
......@@ -1056,7 +1056,9 @@ fn transCreateNodeInfixOp(
10561056 op: ast.Node.InfixOp.Op,
10571057 op_tok_id: std.zig.Token.Id,
10581058 bytes: []const u8,
1059) !*ast.Node.InfixOp {
1059 grouped: bool,
1060) !*ast.Node {
1061 const lparen = if (grouped) try appendToken(rp.c, .LParen, "(") else undefined;
10601062 const lhs = try transExpr(rp, scope, ZigClangBinaryOperator_getLHS(stmt), .used, .l_value);
10611063 const op_token = try appendToken(rp.c, op_tok_id, bytes);
10621064 const rhs = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
......@@ -1068,7 +1070,16 @@ fn transCreateNodeInfixOp(
10681070 .op = op,
10691071 .rhs = rhs.node,
10701072 };
1071 return node;
1073 if (!grouped) return &node.base;
1074 const rparen = try appendToken(rp.c, .RParen, ")");
1075 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);
1076 grouped_expr.* = ast.Node.GroupedExpression{
1077 .base = ast.Node{ .id = .GroupedExpression },
1078 .lparen = lparen,
1079 .expr = &node.base,
1080 .rparen = rparen,
1081 };
1082 return &grouped_expr.base;
10721083}
10731084
10741085fn transCreateNodePtrType(
......@@ -1096,10 +1107,21 @@ fn transCreateNodePtrType(
10961107}
10971108
10981109fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {
1110 const num_limbs = ZigClangAPSInt_getNumWords(int.?);
1111 var big = try std.math.big.Int.initCapacity(c.a(), num_limbs);
1112 defer big.deinit();
1113 const data = ZigClangAPSInt_getRawData(int.?);
1114 var i: usize = 0;
1115 while (i < num_limbs) : (i += 1) big.limbs[i] = data[i];
1116 const str = big.toString(c.a(), 10) catch |err| switch (err) {
1117 error.OutOfMemory => return error.OutOfMemory,
1118 else => unreachable,
1119 };
1120 const token = try appendToken(c, .IntegerLiteral, str);
10991121 const node = try c.a().create(ast.Node.IntegerLiteral);
11001122 node.* = ast.Node.IntegerLiteral{
11011123 .base = ast.Node{ .id = .IntegerLiteral },
1102 .token = try appendToken(c, .IntegerLiteral, "3333333"), // TODO
1124 .token = token,
11031125 };
11041126 return &node.base;
11051127}