| ... | ... | @@ -173,6 +173,14 @@ static AstNode * trans_create_node(Context *c, NodeType id) { |
| 173 | 173 | return node; |
| 174 | 174 | } |
| 175 | 175 | |
| 176 | static AstNode *trans_create_node_if(Context *c, AstNode *cond_node, AstNode *then_node, AstNode *else_node) { |
| 177 | AstNode *node = trans_create_node(c, NodeTypeIfBoolExpr); |
| 178 | node->data.if_bool_expr.condition = cond_node; |
| 179 | node->data.if_bool_expr.then_block = then_node; |
| 180 | node->data.if_bool_expr.else_node = else_node; |
| 181 | return node; |
| 182 | } |
| 183 | |
| 176 | 184 | static AstNode *trans_create_node_float_lit(Context *c, double value) { |
| 177 | 185 | AstNode *node = trans_create_node(c, NodeTypeFloatLiteral); |
| 178 | 186 | node->data.float_literal.bigfloat = allocate<BigFloat>(1); |
| ... | ... | @@ -4077,14 +4085,35 @@ static AstNode *parse_ctok_primary_expr(Context *c, CTokenize *ctok, size_t *tok |
| 4077 | 4085 | } |
| 4078 | 4086 | *tok_i += 1; |
| 4079 | 4087 | |
| 4080 | | if (inner_node->type == NodeTypeAddrOfExpr) { |
| 4081 | | AstNode *call_node = trans_create_node_builtin_fn_call_str(c, "ptrCast"); |
| 4082 | | call_node->data.fn_call_expr.params.append(inner_node); |
| 4083 | | call_node->data.fn_call_expr.params.append(node_to_cast); |
| 4084 | | return call_node; |
| 4085 | | } else { |
| 4086 | | return trans_create_node_cast(c, inner_node, node_to_cast); |
| 4087 | | } |
| 4088 | |
| 4089 | //if (@typeId(@typeOf(x)) == @import("builtin").TypeId.Pointer) |
| 4090 | // @ptrCast(dest, x) |
| 4091 | //else if (@typeId(@typeOf(x)) == @import("builtin").TypeId.Integer) |
| 4092 | // @intToPtr(dest, x) |
| 4093 | //else |
| 4094 | // (dest)(x) |
| 4095 | |
| 4096 | AstNode *import_builtin = trans_create_node_builtin_fn_call_str(c, "import"); |
| 4097 | import_builtin->data.fn_call_expr.params.append(trans_create_node_str_lit_non_c(c, buf_create_from_str("builtin"))); |
| 4098 | AstNode *typeid_type = trans_create_node_field_access_str(c, import_builtin, "TypeId"); |
| 4099 | AstNode *typeid_pointer = trans_create_node_field_access_str(c, typeid_type, "Pointer"); |
| 4100 | AstNode *typeid_integer = trans_create_node_field_access_str(c, typeid_type, "Int"); |
| 4101 | AstNode *typeof_x = trans_create_node_builtin_fn_call_str(c, "typeOf"); |
| 4102 | typeof_x->data.fn_call_expr.params.append(node_to_cast); |
| 4103 | AstNode *typeid_value = trans_create_node_builtin_fn_call_str(c, "typeId"); |
| 4104 | typeid_value->data.fn_call_expr.params.append(typeof_x); |
| 4105 | |
| 4106 | AstNode *outer_if_cond = trans_create_node_bin_op(c, typeid_value, BinOpTypeCmpEq, typeid_pointer); |
| 4107 | AstNode *inner_if_cond = trans_create_node_bin_op(c, typeid_value, BinOpTypeCmpEq, typeid_integer); |
| 4108 | AstNode *inner_if_then = trans_create_node_builtin_fn_call_str(c, "intToPtr"); |
| 4109 | inner_if_then->data.fn_call_expr.params.append(inner_node); |
| 4110 | inner_if_then->data.fn_call_expr.params.append(node_to_cast); |
| 4111 | AstNode *inner_if_else = trans_create_node_cast(c, inner_node, node_to_cast); |
| 4112 | AstNode *inner_if = trans_create_node_if(c, inner_if_cond, inner_if_then, inner_if_else); |
| 4113 | AstNode *outer_if_then = trans_create_node_builtin_fn_call_str(c, "ptrCast"); |
| 4114 | outer_if_then->data.fn_call_expr.params.append(inner_node); |
| 4115 | outer_if_then->data.fn_call_expr.params.append(node_to_cast); |
| 4116 | return trans_create_node_if(c, outer_if_cond, outer_if_then, inner_if); |
| 4088 | 4117 | } |
| 4089 | 4118 | case CTokIdDot: |
| 4090 | 4119 | case CTokIdEOF: |