authorgravatar for ryan.saunderson88@gmail.comdimenus <ryan.saunderson88@gmail.com> 2017-11-22 10:01:43-06:00
committergravatar for ryan.saunderson@kiriworks.comRyan Saunderson <ryan.saunderson@kiriworks.com> 2017-11-27 11:23:14-06:00
log04472f57be5e91e82adf9346e71c1421725716d5
tree7c9cddd7234a4c79fb6aa548ddf4984ccbb175da
parent1b0e90f70b4dc26c2ba96b7b5709a3ff269bb48a

Added support for exporting of C field expressions


5 files changed, 70 insertions(+), 9 deletions(-)

src/c_tokenizer.cpp+4-3
......@@ -216,9 +216,8 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) {
216216 buf_append_char(&ctok->buf, '0');
217217 break;
218218 case '.':
219 begin_token(ctok, CTokIdNumLitFloat);
220 ctok->state = CTokStateFloat;
221 buf_init_from_str(&ctok->buf, "0.");
219 begin_token(ctok, CTokIdDot);
220 end_token(ctok);
222221 break;
223222 case '(':
224223 begin_token(ctok, CTokIdLParen);
......@@ -238,6 +237,8 @@ void tokenize_c_macro(CTokenize *ctok, const uint8_t *c) {
238237 break;
239238 case CTokStateFloat:
240239 switch (*c) {
240 case '.':
241 break;
241242 case 'e':
242243 case 'E':
243244 buf_append_char(&ctok->buf, 'e');
src/c_tokenizer.hpp+1
......@@ -21,6 +21,7 @@ enum CTokId {
2121 CTokIdLParen,
2222 CTokIdRParen,
2323 CTokIdEOF,
24 CTokIdDot,
2425};
2526
2627enum CNumLitSuffix {
src/ir.cpp+2-1
......@@ -6302,8 +6302,9 @@ static Buf *get_anon_type_name(CodeGen *codegen, IrExecutable *exec, const char
63026302 buf_appendf(name, ")");
63036303 return name;
63046304 } else {
6305 //Note: C-imports do not have valid location information
63056306 return buf_sprintf("(anonymous %s at %s:%" ZIG_PRI_usize ":%" ZIG_PRI_usize ")", kind_name,
6306 buf_ptr(source_node->owner->path), source_node->line + 1, source_node->column + 1);
6307 (source_node->owner->path != nullptr) ? buf_ptr(source_node->owner->path) : "(null)", source_node->line + 1, source_node->column + 1);
63076308 }
63086309 }
63096310}
src/translate_c.cpp+27-3
......@@ -3442,7 +3442,6 @@ static AstNode *resolve_record_decl(Context *c, const RecordDecl *record_decl) {
34423442 }
34433443
34443444 const char *raw_name = decl_name(record_decl);
3445
34463445 const char *container_kind_name;
34473446 ContainerKind container_kind;
34483447 if (record_decl->isUnion()) {
......@@ -3794,9 +3793,33 @@ static AstNode *parse_ctok(Context *c, CTokenize *ctok, size_t *tok_i) {
37943793 return parse_ctok_num_lit(c, ctok, tok_i, false);
37953794 case CTokIdSymbol:
37963795 {
3797 *tok_i += 1;
3796 bool need_symbol = false;
3797 CTokId curr_id = CTokIdSymbol;
37983798 Buf *symbol_name = buf_create_from_buf(&tok->data.symbol);
3799 return trans_create_node_symbol(c, symbol_name);
3799 AstNode *curr_node = trans_create_node_symbol(c, symbol_name);
3800 AstNode *parent_node = curr_node;
3801 do {
3802 *tok_i += 1;
3803 CTok* curr_tok = &ctok->tokens.at(*tok_i);
3804 if (need_symbol) {
3805 if (curr_tok->id == CTokIdSymbol) {
3806 symbol_name = buf_create_from_buf(&curr_tok->data.symbol);
3807 curr_node = trans_create_node_field_access(c, parent_node, buf_create_from_buf(symbol_name));
3808 parent_node = curr_node;
3809 need_symbol = false;
3810 } else {
3811 return nullptr;
3812 }
3813 } else {
3814 if (curr_tok->id == CTokIdDot) {
3815 need_symbol = true;
3816 continue;
3817 } else {
3818 break;
3819 }
3820 }
3821 } while (curr_id != CTokIdEOF);
3822 return curr_node;
38003823 }
38013824 case CTokIdLParen:
38023825 {
......@@ -3810,6 +3833,7 @@ static AstNode *parse_ctok(Context *c, CTokenize *ctok, size_t *tok_i) {
38103833 *tok_i += 1;
38113834 return inner_node;
38123835 }
3836 case CTokIdDot:
38133837 case CTokIdEOF:
38143838 case CTokIdRParen:
38153839 // not able to make sense of this
test/translate_c.zig+36-2
......@@ -1041,9 +1041,43 @@ pub fn addCases(cases: &tests.TranslateCContext) {
10411041 \\ return x + 13;
10421042 \\}
10431043 );
1044}
1045
10461044
1045 cases.add("macros with field targets",
1046 \\typedef unsigned int GLbitfield;
1047 \\typedef void (*PFNGLCLEARPROC) (GLbitfield mask);
1048 \\typedef void(*OpenGLProc)(void);
1049 \\union OpenGLProcs {
1050 \\ OpenGLProc ptr[1];
1051 \\ struct {
1052 \\ PFNGLCLEARPROC Clear;
1053 \\ } gl;
1054 \\};
1055 \\extern union OpenGLProcs glProcs;
1056 \\#define glClearUnion glProcs.gl.Clear
1057 \\#define glClearPFN PFNGLCLEARPROC
1058 ,
1059 \\pub const GLbitfield = c_uint;
1060 ,
1061 \\pub const PFNGLCLEARPROC = ?extern fn(GLbitfield);
1062 ,
1063 \\pub const OpenGLProc = ?extern fn();
1064 ,
1065 \\pub const union_OpenGLProcs = extern union {
1066 \\ ptr: [1]OpenGLProc,
1067 \\ gl: extern struct {
1068 \\ Clear: PFNGLCLEARPROC,
1069 \\ },
1070 \\};
1071 ,
1072 \\pub extern var glProcs: union_OpenGLProcs;
1073 ,
1074 \\pub const glClearPFN = PFNGLCLEARPROC;
1075 ,
1076 \\pub const glClearUnion = glProcs.gl.Clear;
1077 ,
1078 \\pub const OpenGLProcs = union_OpenGLProcs;
1079 );
1080}
10471081
10481082// TODO
10491083//float *ptrcast(int *a) {