You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/dev-scheme/c-wrapper/files/c-wrapper-local-typedef.patch

150 lines
4.5 KiB

https://aur.archlinux.org/cgit/aur.git/plain/13_local_typedef.patch?h=gauche-c-wrapper
Description: Basic support for typedefs inside functions
Author: Fabian Brosda <fabi3141@gmx.de>
Last-Update: 2020-07-10
--- a/src/c-parser.c
+++ b/src/c-parser.c
@@ -594,6 +594,26 @@
}
}
+static void emit_typedef(ScmObj type_decl_list)
+{
+ ScmObj p;
+
+ SCM_FOR_EACH(p, type_decl_list) {
+ ScmObj v = SCM_CAR(p);
+ ScmObj ctype = SCM_TYPE_DECL_CTYPE(v);
+ ScmObj new_ctype = SCM_TYPE_DECL_NAME(v);
+ ScmObj sym = CParser_ctype2class_symbol(new_ctype);
+
+ Scm_DefChunkDictSetTypename(new_ctype,
+ Scm_MakeDefChunk(SYM(S_typedef),
+ new_ctype,
+ SCM_LIST1(sym),
+ SCM_LIST3(SYM(S_define), sym, ctype)));
+ Scm_InstallType(new_ctype);
+ }
+}
+
+
ScmObj Scm_MakeTypeDecl(ScmObj type_spec_list, ScmObj declarator)
{
ScmObj lst = SCM_NIL;
@@ -612,6 +632,7 @@
SCM_FOR_EACH(pair, type_spec_list) {
if (SCM_EQ(SCM_CAR(pair), SYM(U_typedef))) {
+ emit_typedef(Scm_Cons(Scm_MakeTypeDecl(SCM_CDR(pair), declarator), lst));
continue;
}
lst = Scm_Cons(SCM_CAR(pair), lst);
@@ -1542,25 +1563,6 @@
SCM_RETURN(SCM_UNDEFINED);
}
-static void emit_typedef(ScmObj type_decl_list)
-{
- ScmObj p;
-
- SCM_FOR_EACH(p, type_decl_list) {
- ScmObj v = SCM_CAR(p);
- ScmObj ctype = SCM_TYPE_DECL_CTYPE(v);
- ScmObj new_ctype = SCM_TYPE_DECL_NAME(v);
- ScmObj sym = CParser_ctype2class_symbol(new_ctype);
-
- Scm_DefChunkDictSetTypename(new_ctype,
- Scm_MakeDefChunk(SYM(S_typedef),
- new_ctype,
- SCM_LIST1(sym),
- SCM_LIST3(SYM(S_define), sym, ctype)));
- Scm_InstallType(new_ctype);
- }
-}
-
static void emit_define_extern(ScmObj declaration)
{
ScmObj ctype = SCM_TYPE_DECL_CTYPE(declaration);
--- a/testsuite/local_typedef.c
+++ b/testsuite/local_typedef.c
@@ -0,0 +1,6 @@
+#include "local_typedef.h"
+
+int local_typedef(void)
+{
+ return helper();
+}
--- a/testsuite/local_typedef.h
+++ b/testsuite/local_typedef.h
@@ -0,0 +1,8 @@
+extern int local_typedef(void);
+
+int helper(void)
+{
+ typedef int _my_type;
+ _my_type ret = 1;
+ return ret;
+}
--- a/testsuite/local-typedef.scm
+++ b/testsuite/local-typedef.scm
@@ -0,0 +1,19 @@
+;;;
+;;; Test local typedefs
+;;;
+
+(use gauche.test)
+
+(test-start "c-wrapper (local typedefs)")
+(use c-wrapper)
+
+(c-load-library "./local_typedef")
+(c-include "./local_typedef.h")
+
+(test "local_typedef"
+ 1
+ (lambda ()
+ (local_typedef)))
+
+;; epilogue
+(test-end)
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -57,6 +57,9 @@
fptr_array.$(DYLIBEXT): fptr_array.o
$(CC) $(LDFLAGS) $@ $<
+local_typedef.$(DYLIBEXT): local_typedef.o
+ $(CC) $(LDFLAGS) $@ $<
+
gcc_extension.$(DYLIBEXT): gcc_extension.o
$(CC) $(LDFLAGS) $@ $<
@@ -65,7 +68,7 @@
check: $(CHECK_TARGET)
-check-c: ffitest.$(DYLIBEXT) fptr_array.$(DYLIBEXT) gcc_extension.$(DYLIBEXT)
+check-c: ffitest.$(DYLIBEXT) fptr_array.$(DYLIBEXT) gcc_extension.$(DYLIBEXT) local_typedef.$(DYLIBEXT)
@rm -f test.log
$(GOSH) -I../src -I../lib attr-test.scm >> test.log
$(GOSH) -I../src -I../lib ffitest.scm >> test.log
@@ -74,6 +77,7 @@
$(GOSH) -I../src -I../lib struct_in_union-test.scm >> test.log
$(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 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
@@ -83,7 +87,7 @@
$(GOSH) -I../src -I../lib -I../objc objc-test.scm >> test.log
clean :
- rm -rf core ffitest.$(DYLIBEXT) objc-test.$(DYLIBEXT) fptr_array.$(DYLIBEXT) gcc_extension.$(DYLIBEXT) *.o $(GENERATED) *~ test.log so_locations
+ rm -rf core ffitest.$(DYLIBEXT) objc-test.$(DYLIBEXT) fptr_array.$(DYLIBEXT) gcc_extension.$(DYLIBEXT) local_typedef.$(DYLIBEXT) *.o $(GENERATED) *~ test.log so_locations
distclean : clean
rm -rf $(CONFIG_GENERATED)