diff options
author | Zackery Spytz <zspytz@gmail.com> | 2019-01-06 09:40:25 -0700 |
---|---|---|
committer | Zackery Spytz <zspytz@gmail.com> | 2019-01-06 09:40:25 -0700 |
commit | 4a912668fcc5c73c9725ee8d07c9af57f0256e3f (patch) | |
tree | a20ec97912e374160c41faea08c6a89bbd7e0acd /Source/Modules/ocaml.cxx | |
parent | 0c4491eaae3459c2826b62a869f35ef2ad407970 (diff) | |
download | swig-4a912668fcc5c73c9725ee8d07c9af57f0256e3f.tar.gz |
[OCaml] Fix member var getters and setters
Add `membervariableHandler()` to the `OCAML` class in ocaml.cxx (it is
partly based on the code in python.cxx and octave.cxx).
In Lib/ocaml/class.swg, wrapped classes/structs were not being added
to `class_master_list`. This is fixed by adding a call to
`register_class_byname`.
Add a unit test in the form of struct_value_runme.ml.
Diffstat (limited to 'Source/Modules/ocaml.cxx')
-rw-r--r-- | Source/Modules/ocaml.cxx | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/Source/Modules/ocaml.cxx b/Source/Modules/ocaml.cxx index cfdb31ebd..0c97cd1d3 100644 --- a/Source/Modules/ocaml.cxx +++ b/Source/Modules/ocaml.cxx @@ -417,6 +417,29 @@ public: return SwigType_isarray(SwigType_typedef_resolve_all(t)); } + virtual int membervariableHandler(Node *n) { + String *symname = Getattr(n, "sym:name"); + Language::membervariableHandler(n); + + String *mname = Swig_name_member(NSPACE_TODO, classname, symname); + String *getname = Swig_name_get(NSPACE_TODO, mname); + String *mangled_getname = mangleNameForCaml(getname); + Delete(getname); + + if (!GetFlag(n, "feature:immutable")) { + String *setname = Swig_name_set(NSPACE_TODO, mname); + String *mangled_setname = mangleNameForCaml(setname); + Delete(setname); + Printf(f_class_ctors, " \"[%s]\", (fun args -> " "if args = (C_list [ raw_ptr ]) then _%s args else _%s args) ;\n", symname, mangled_getname, mangled_setname); + Delete(mangled_setname); + } else { + Printf(f_class_ctors, " \"[%s]\", (fun args -> " "if args = (C_list [ raw_ptr ]) then _%s args else C_void) ;\n", symname, mangled_getname); + } + Delete(mangled_getname); + Delete(mname); + return SWIG_OK; + } + /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. @@ -477,26 +500,12 @@ public: Delete(mangled_name_nounder); } else if (classmode && in_destructor) { Printf(f_class_ctors, " \"~\", %s ;\n", mangled_name); - } else if (classmode && !in_constructor && !in_destructor && !static_member_function) { + } else if (classmode && !in_constructor && !in_destructor && !static_member_function && + !Getattr(n, "membervariableHandler:sym:name")) { String *opname = Copy(Getattr(n, "memberfunctionHandler:sym:name")); Replaceall(opname, "operator ", ""); - - if (strstr(Char(mangled_name), "__get__")) { - String *set_name = Copy(mangled_name); - if (!GetFlag(n, "feature:immutable")) { - Replaceall(set_name, "__get__", "__set__"); - Printf(f_class_ctors, " \"%s\", (fun args -> " "if args = (C_list [ raw_ptr ]) then %s args else %s args) ;\n", opname, mangled_name, set_name); - Delete(set_name); - } else { - Printf(f_class_ctors, " \"%s\", (fun args -> " "if args = (C_list [ raw_ptr ]) then %s args else C_void) ;\n", opname, mangled_name); - } - } else if (strstr(Char(mangled_name), "__set__")) { - ; /* Nothing ... handled by the case above */ - } else { - Printf(f_class_ctors, " \"%s\", %s ;\n", opname, mangled_name); - } - + Printf(f_class_ctors, " \"%s\", %s ;\n", opname, mangled_name); Delete(opname); } @@ -1103,7 +1112,7 @@ public: */ int classHandler(Node *n) { - String *name = Getattr(n, "name"); + String *name = Getattr(n, "sym:name"); if (!name) return SWIG_OK; |