Skip to content

Commit cdcd5f5

Browse files
committed
[C2HEXA] Pointer math
1 parent a965b16 commit cdcd5f5

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

source/toHexa/clang/clangGenerator.hexa

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,11 @@ class ClangGenerator {
593593
}
594594
}
595595

596+
if node.type.qualType.endsWith('*') and op == Token.Add {
597+
// Pointer math
598+
return Node.Call(Node.Dot(left, 'offsetItems'), [right], [])
599+
}
600+
596601
if op == Token.LogicalAnd or op == Token.LogicalOr {
597602
left = nodeToBoolean(node.inner[0])
598603
right = nodeToBoolean(node.inner[1])
@@ -601,6 +606,13 @@ class ClangGenerator {
601606
return Node.Binop(left, op, right)
602607
case CompoundAssignOperator:
603608
var op = Lexer.tokenize(Buffer.from(node.opcode), "CLANG").token[0] as! Token
609+
if node.type.qualType.endsWith('*') and op == Token.Add {
610+
// Pointer math
611+
let left = nodeToNode(node.inner[0])
612+
let right = nodeToNode(node.inner[1])
613+
return Node.Binop(left, Token.Assign, Node.Call(Node.Dot(left, 'offsetItems'), [right], []))
614+
}
615+
604616
return Node.AssignOp(nodeToNode(node.inner[0]), op, nodeToNode(node.inner[1]))
605617
case IntegerLiteral:
606618
// TODO type
@@ -716,9 +728,19 @@ class ClangGenerator {
716728
case '-': return Node.Unop(Token.Subtract, postfix: false, expr)
717729
case '++':
718730
// TODO mutatedNode(expr)
731+
if node.type.qualType.endsWith('*') {
732+
// Pointer math
733+
return Node.Binop(expr, Token.Assign, Node.Call(Node.Dot(expr, 'offsetItems'), [Node.Int(1)], []))
734+
}
735+
719736
return Node.Unop(Token.Increment, postfix: true, expr)
720737
case '--':
721738
// TODO mutatedNode(expr)
739+
if node.type.qualType.endsWith('*') {
740+
// Pointer math
741+
return Node.Binop(expr, Token.Assign, Node.Call(Node.Dot(expr, 'offsetItemsBack'), [Node.Int(-1)], []))
742+
}
743+
722744
return Node.Unop(Token.Decrement, postfix: true, expr)
723745
case '*': return Node.Index(expr, Node.Int(0))
724746
case '&': return expr
@@ -850,6 +872,11 @@ class ClangGenerator {
850872
return nodeToNode(node.inner[0])
851873
}
852874

875+
// Literally
876+
if node.castKind == "NoOp" {
877+
return nodeToNode(node.inner[0])
878+
}
879+
853880
let e = nodeToNode(node.inner[0])
854881
let to = typeToType(node.type)
855882

@@ -1019,6 +1046,8 @@ class ClangGenerator {
10191046
case Parenthesis(value):
10201047
switch value {
10211048
case Ident(_): value
1049+
case Call(_): value
1050+
case Dot(_): value
10221051
case _: expr
10231052
}
10241053
case _: expr

0 commit comments

Comments
 (0)