[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.
This commit is contained in:
parent
0c4491eaae
commit
4a912668fc
4 changed files with 40 additions and 19 deletions
11
Examples/test-suite/ocaml/struct_value_runme.ml
Normal file
11
Examples/test-suite/ocaml/struct_value_runme.ml
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
open Swig
|
||||||
|
open Struct_value
|
||||||
|
|
||||||
|
let b = new_Bar (C_void)
|
||||||
|
let a = (invoke b) "[a]" (C_void)
|
||||||
|
let _ = (invoke a) "[x]" (C_int 3)
|
||||||
|
let _ = assert((invoke a) "[x]" (C_void) = C_int 3)
|
||||||
|
|
||||||
|
let bb = (invoke b) "[b]" (C_void)
|
||||||
|
let _ = (invoke bb) "[x]" (C_int 3)
|
||||||
|
let _ = assert((invoke bb) "[x]" (C_void) = C_int 3)
|
||||||
|
|
@ -56,6 +56,7 @@ begin
|
||||||
(fun mth arg -> invoke_inner raw_ptr mth arg)
|
(fun mth arg -> invoke_inner raw_ptr mth arg)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
let _ = register_class_byname "$realname" create_$classname_from_ptr
|
||||||
let _ = Callback.register
|
let _ = Callback.register
|
||||||
"create_$normalized_from_ptr"
|
"create_$normalized_from_ptr"
|
||||||
create_$classname_from_ptr
|
create_$classname_from_ptr
|
||||||
|
|
|
||||||
|
|
@ -155,5 +155,5 @@ let _ = Callback.register "swig_set_type_info" set_type_info
|
||||||
let class_master_list = Hashtbl.create 20
|
let class_master_list = Hashtbl.create 20
|
||||||
let register_class_byname nm co =
|
let register_class_byname nm co =
|
||||||
Hashtbl.replace class_master_list nm (Obj.magic co)
|
Hashtbl.replace class_master_list nm (Obj.magic co)
|
||||||
let create_class nm arg =
|
let create_class nm =
|
||||||
try (Obj.magic (Hashtbl.find class_master_list nm)) with _ -> raise (NoSuchClass nm)
|
try (Obj.magic (Hashtbl.find class_master_list nm)) with _ -> raise (NoSuchClass nm)
|
||||||
|
|
|
||||||
|
|
@ -417,6 +417,29 @@ public:
|
||||||
return SwigType_isarray(SwigType_typedef_resolve_all(t));
|
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()
|
* functionWrapper()
|
||||||
* Create a function declaration and register it with the interpreter.
|
* Create a function declaration and register it with the interpreter.
|
||||||
|
|
@ -477,26 +500,12 @@ public:
|
||||||
Delete(mangled_name_nounder);
|
Delete(mangled_name_nounder);
|
||||||
} else if (classmode && in_destructor) {
|
} else if (classmode && in_destructor) {
|
||||||
Printf(f_class_ctors, " \"~\", %s ;\n", mangled_name);
|
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"));
|
String *opname = Copy(Getattr(n, "memberfunctionHandler:sym:name"));
|
||||||
|
|
||||||
Replaceall(opname, "operator ", "");
|
Replaceall(opname, "operator ", "");
|
||||||
|
Printf(f_class_ctors, " \"%s\", %s ;\n", opname, mangled_name);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
Delete(opname);
|
Delete(opname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1103,7 +1112,7 @@ public:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int classHandler(Node *n) {
|
int classHandler(Node *n) {
|
||||||
String *name = Getattr(n, "name");
|
String *name = Getattr(n, "sym:name");
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
return SWIG_OK;
|
return SWIG_OK;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue