summaryrefslogtreecommitdiff
path: root/dev-scheme/c-wrapper/files/c-wrapper-extend-parser.patch
blob: 998938a2c428f5df207d04f978a1b80ce7ebb0db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
https://aur.archlinux.org/cgit/aur.git/tree/14_extend_parser.patch?h=gauche-c-wrapper

Description: Include __int128, make statements before delcarations in functions possible and add some workaround to load x86intrin.h successfully.
Author: Fabian Brosda <fabi3141@gmx.de>
Last-Update: 2020-07-10

--- a/lib/c-wrapper/c-parser.scm
+++ b/lib/c-wrapper/c-parser.scm
@@ -181,6 +181,26 @@
        ,@(reverse init-list)
        ,@statements)))
 
+(define-maybe (%COMPOUND-STATEMENT-WITH-DECLARATION-EXT statements-before declaration-list statements)
+  (let ((var-list '())
+        (init-list '()))
+    (for-each (lambda (declaration)
+                (let* ((type (type-of declaration))
+                       (identifier (name-of declaration))
+                       (init-val (value-of declaration)))
+                  ;; TODO: typedef in compound_statement is not supported
+                  (push! var-list `(,identifier (make ,type)))
+                  (when init-val
+                    (push! init-list
+                           `(set! ((with-module c-wrapper.c-ffi ref) ,identifier)
+                                  ,init-val)))))
+              declaration-list)
+    `(begin
+       ,@statements-before
+       (let* ,(reverse var-list)
+       ,@(reverse init-list)
+       ,@statements))))
+
 (define-maybe (%REF-ARRAY v index)
   `((with-module c-wrapper.c-ffi ref) ,v ,(%INT index)))
 
--- a/src/c-grammar.scm
+++ b/src/c-grammar.scm
@@ -122,6 +122,7 @@
   (LPAREN expr RPAREN) : (%EXPR-IN-PARENS $2)
   (LPAREN compound_statement RPAREN) : (%COMPOUND-STATEMENT $2)
   (LPAREN type_name RPAREN LCBRA initializer_list RCBRA) : #f
+  (LPAREN type_name RPAREN LCBRA initializer_list COMMA RCBRA) : #f
   (objc_message_expr) : $1
   (objc_selector_expr) : $1
   (objc_protocol_expr) : #f
@@ -474,8 +475,8 @@
   (LCBRA RCBRA) : (%COMPOUND-STATEMENT '(0))
   (LCBRA statement_list RCBRA) : (%COMPOUND-STATEMENT $2)
   (LCBRA declaration_list RCBRA) : (%COMPOUND-STATEMENT '(0))
-  (LCBRA declaration_list statement_list RCBRA)
-  : (%COMPOUND-STATEMENT-WITH-DECLARATION $2 $3)
+  (LCBRA declaration_list statement_list RCBRA) : (%COMPOUND-STATEMENT-WITH-DECLARATION $2 $3)
+  (LCBRA statement_list declaration_list statement_list RCBRA) : (%COMPOUND-STATEMENT-WITH-DECLARATION-EXT $2 $3 $4)
   (error RCBRA) : #f
   )
 
--- a/src/c-lex.c
+++ b/src/c-lex.c
@@ -361,6 +361,7 @@
         "void",
         "_Bool",
         "_Float128",
+        "__int128",
         NULL,
     };
     int i;
--- a/src/c-parser.c
+++ b/src/c-parser.c
@@ -104,6 +104,7 @@
 DEFINE_SYM(void);
 DEFINE_SYM(_Bool);
 DEFINE_SYM(_Float128);
+DEFINE_SYM(__int128);
 DEFINE_SYM(__builtin_va_list);
 DEFINE_SYM(U_struct);
 DEFINE_SYM(U_union);
@@ -472,7 +473,9 @@
     } else if (SCM_EQ(car, SYM(_Bool))) {
         SCM_RETURN(SYM(c_int));
     } else if (SCM_EQ(car, SYM(_Float128))) {
         SCM_RETURN(SYM(c_double));
+    } else if (SCM_EQ(car, SYM(__int128))) {
+        SCM_RETURN(SYM(c_longlong));
     } else if (SCM_EQ(car, SYM(__builtin_va_list))) {
         SCM_RETURN(SCM_LIST2(SCM_LIST3(SYM(with_module), SYM(c_wrapper_c_ffi), SYM(ptr)), SYM(c_void)));
     } else if (SCM_PAIRP(car) && SCM_EQ(SCM_CAR(car), SYM(U_struct))) {
@@ -1024,7 +1027,11 @@
     Scm_ParserAttributeClear();
     td_list = Scm_MakeTypeDeclList(type_spec_list, declarator_list);
     SCM_FOR_EACH(pair, td_list) {
-        Scm_ArgPoolAdd(SCM_TYPE_DECL_NAME(SCM_CAR(pair)));
+        // hack to avoid segfault when loading x86intrin.h
+        // TODO: why is this necessary?
+        if (!SCM_EQ(SCM_CAR(pair), SCM_FALSE)) {
+            Scm_ArgPoolAdd(SCM_TYPE_DECL_NAME(SCM_CAR(pair)));
+        }
     }
 
     SCM_RETURN(td_list);
@@ -1865,6 +1872,7 @@
     INIT_SYM(void, "void");
     INIT_SYM(_Bool, "_Bool");
     INIT_SYM(_Float128, "_Float128");
+    INIT_SYM(__int128, "__int128");
     INIT_SYM(__builtin_va_list, "__builtin_va_list");
     INIT_SYM(U_struct, "STRUCT");
     INIT_SYM(U_union, "UNION");
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -78,6 +78,7 @@
 	$(GOSH) -I../src -I../lib stdio-test.scm >> test.log
 	$(GOSH) -I../src -I../lib math-test.scm >> test.log
 	$(GOSH) -I../src -I../lib local-typedef.scm >> test.log
+	$(GOSH) -I../src -I../lib stmt-decl.scm >> test.log
 	$(GOSH) -I../src -I../lib inline-test.scm >> test.log
 	$(GOSH) -I../src -I../lib fptr_array-test.scm >> test.log
 	$(GOSH) -I../src -I../lib array_qualifier-test.scm >> test.log
--- a/testsuite/stmt_decl.h
+++ b/testsuite/stmt_decl.h
@@ -0,0 +1,6 @@
+void f(int arg1)
+{
+  arg1 = 3;
+  double tmp = arg1;
+  return tmp;
+}
--- a/testsuite/stmt-decl.scm
+++ b/testsuite/stmt-decl.scm
@@ -0,0 +1,13 @@
+;;;
+;;; Test include math.h
+;;;
+
+(use gauche.test)
+
+(test-start "test for statement before and after declaration in c function")
+(use c-wrapper)
+
+(c-include "stmt_decl.h")
+
+;; epilogue
+(test-end)