Merge branch 'ZackerySpytz-OCaml-fix-member-var-access'
* ZackerySpytz-OCaml-fix-member-var-access: OCaml's classHandler() requires name, not sym:name. [OCaml] Fix member var getters and setters
This commit is contained in:
commit
b64d685d5f
6 changed files with 71 additions and 26 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
@ -1102,11 +1111,12 @@ public:
|
|||
|
||||
int classHandler(Node *n) {
|
||||
String *name = Getattr(n, "name");
|
||||
classname = Getattr(n, "sym:name");
|
||||
|
||||
if (!name)
|
||||
return SWIG_OK;
|
||||
|
||||
String *mangled_sym_name = mangleNameForCaml(name);
|
||||
String *mangled_name = mangleNameForCaml(name);
|
||||
String *this_class_def = NewString(f_classtemplate);
|
||||
String *name_normalized = normalizeTemplatedClassName(name);
|
||||
String *old_class_ctors = f_class_ctors;
|
||||
|
|
@ -1115,7 +1125,6 @@ public:
|
|||
bool sizeof_feature = generate_sizeof && isSimpleType(name);
|
||||
|
||||
|
||||
classname = mangled_sym_name;
|
||||
classmode = true;
|
||||
int rv = Language::classHandler(n);
|
||||
classmode = false;
|
||||
|
|
@ -1123,15 +1132,15 @@ public:
|
|||
if (sizeof_feature) {
|
||||
Printf(f_wrappers,
|
||||
"SWIGEXT CAML_VALUE _wrap_%s_sizeof( CAML_VALUE args ) {\n"
|
||||
" CAMLparam1(args);\n" " CAMLreturn(Val_int(sizeof(%s)));\n" "}\n", mangled_sym_name, name_normalized);
|
||||
" CAMLparam1(args);\n" " CAMLreturn(Val_int(sizeof(%s)));\n" "}\n", mangled_name, name_normalized);
|
||||
|
||||
Printf(f_mlbody, "external __%s_sizeof : unit -> int = " "\"_wrap_%s_sizeof\"\n", classname, mangled_sym_name);
|
||||
Printf(f_mlbody, "external __%s_sizeof : unit -> int = " "\"_wrap_%s_sizeof\"\n", mangled_name, mangled_name);
|
||||
}
|
||||
|
||||
|
||||
/* Insert sizeof operator for concrete classes */
|
||||
if (sizeof_feature) {
|
||||
Printv(f_class_ctors, "\"sizeof\" , (fun args -> C_int (__", classname, "_sizeof ())) ;\n", NIL);
|
||||
Printv(f_class_ctors, "\"sizeof\" , (fun args -> C_int (__", mangled_name, "_sizeof ())) ;\n", NIL);
|
||||
}
|
||||
/* Handle up-casts in a nice way */
|
||||
List *baselist = Getattr(n, "bases");
|
||||
|
|
@ -1150,7 +1159,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
Replaceall(this_class_def, "$classname", classname);
|
||||
Replaceall(this_class_def, "$classname", mangled_name);
|
||||
Replaceall(this_class_def, "$normalized", name_normalized);
|
||||
Replaceall(this_class_def, "$realname", name);
|
||||
Replaceall(this_class_def, "$baselist", base_classes);
|
||||
|
|
@ -1163,7 +1172,7 @@ public:
|
|||
|
||||
Multiwrite(this_class_def);
|
||||
|
||||
Setattr(n, "ocaml:ctor", classname);
|
||||
Setattr(n, "ocaml:ctor", mangled_name);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue