Improved converting return values (avoiding using assignment and default constructors).

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2008-maciekd@10746 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Maciej Drwal 2008-08-08 21:22:07 +00:00
commit 83d60a1d36
2 changed files with 40 additions and 19 deletions

View file

@ -34,7 +34,6 @@ class C:public Language {
bool proxy_flag;
bool runtime_flag;
bool typecheck_flag;
public:
@ -49,8 +48,7 @@ public:
create_object(0),
destroy_object(0),
proxy_flag(true),
runtime_flag(true),
typecheck_flag(false) {
runtime_flag(true) {
}
/* ------------------------------------------------------------
@ -325,8 +323,6 @@ public:
Delete(result);
result = NewString("");
/*Printf(stderr, "MANGLING TYPE: %s\n", type_arg);*/
SwigType *type = Copy(type_arg);
if (SwigType_ismemberpointer(type)) {
@ -364,8 +360,6 @@ public:
Printf(result, "%s", Char(SwigType_base(type)));
ready:
/*Printf(stderr, " RESULT: %s\n", result);*/
if (prefix)
Delete(prefix);
if (type)
@ -459,6 +453,7 @@ ready:
else {
// C++ function wrapper
// mark the first parameter as object-struct
if ((Cmp(Getattr(n, "storage"), "static") != 0) &&
(Cmp(Getattr(n, "ismember"), "1") == 0) &&
(Cmp(nodeType(n), "constructor") != 0)) {
@ -506,22 +501,39 @@ ready:
}
// add variable for holding result of original function
bool return_object = false;
if (!is_void_return && (Cmp(Getattr(n, "c:objstruct"), "1") != 0)) {
if (SwigType_isconst(type))
SwigType_del_qualifier(type);
SwigType *return_var_type;
if (SwigType_isenum(type))
SwigType *tdtype = SwigType_typedef_resolve(type);
if (tdtype)
type = tdtype;
if (SwigType_isenum(type)) {
Wrapper_add_localv(wrapper, "cppresult", "int", "cppresult", NIL);
else {
if (SwigType_isreference(type))
return_var_type = SwigType_base(type);
else if (SwigType_isarray(type))
}
else if (SwigType_isbuiltin(SwigType_base(type))) {
// type is built-in (int, char, double, etc.)
if (SwigType_isreference(type) || SwigType_isarray(type))
return_var_type = SwigType_add_pointer(SwigType_base(type));
else
return_var_type = type;
Wrapper_add_localv(wrapper, "cppresult", SwigType_str(return_var_type, 0), "cppresult", NIL);
}
else {
// type is class
if (SwigType_ispointer(type))
return_var_type = type;
else if (SwigType_isreference(type) || SwigType_isarray(type))
return_var_type = SwigType_add_pointer(SwigType_base(type));
else
return_var_type = SwigType_add_pointer(type);
Wrapper_add_localv(wrapper, "cppresult", SwigType_str(return_var_type, 0), "cppresult", NIL);
return_object = true;
}
}
@ -624,8 +636,10 @@ ready:
// emit action code
String *action = emit_action(n);
if (Getattr(n, "throws") || (Cmp(Getattr(n, "feature:except"), "0") != 0)) {
Printf(action, "if (SWIG_exc.handled) {\nSWIG_rt_stack_pop();\nlongjmp(SWIG_rt_env, 1);\n}\n");
String *except = Getattr(n, "feature:except");
if (Getattr(n, "throws") || except) {
if (!except || (Cmp(except, "0") != 0))
Printf(action, "if (SWIG_exc.handled) {\nSWIG_rt_stack_pop();\nlongjmp(SWIG_rt_env, 1);\n}\n");
}
if (Cmp(nodeType(n), "constructor") != 0)
Replace(action, "result =", "cppresult = $mod", DOH_REPLACE_FIRST);
@ -637,13 +651,14 @@ ready:
//Printf(ref_cast, "(%s*)", SwigType_str(SwigType_base(type), 0));
Printf(ref_cast, "*");
}
else
Printf(ref_cast, "&");
Replaceall(action, "$mod", ref_cast);
Delete(ref_cast);
}
else if (SwigType_isenum(type))
Replaceall(action, "$mod", "(int)");
else if (return_object && Getattr(n, "c:retval")) {
Replaceall(action, "$mod", "&");
}
else
Replaceall(action, "$mod", "");
@ -847,6 +862,9 @@ ready:
* --------------------------------------------------------------------- */
virtual int memberfunctionHandler(Node *n) {
SwigType *type = Getattr(n, "type");
if (!SwigType_ispointer(type) && !SwigType_ispointer(SwigType_typedef_resolve(type)))
Setattr(n, "c:retval", "1");
return Language::memberfunctionHandler(n);
}
@ -1151,13 +1169,15 @@ ready:
virtual int enumDeclaration(Node *n) {
if (!proxy_flag)
return SWIG_OK;
if (Cmp(Getattr(n, "access"), "public") != 0)
return SWIG_OK;
String *newclassname = Getattr(Swig_methodclass(n), "sym:name");
String *name = Getattr(n, "sym:name");
String *code = NewString("");
String *tdname = Getattr(n, "tdname");
String *newname = newclassname ? NewStringf("%s_", newclassname) : Copy(name);
Symtab *symtab = Getattr(n, "sym:symtab");
if (tdname)
Printf(code, "typedef ");
@ -1175,7 +1195,6 @@ ready:
Setattr(entry, "sym:symtab", symtab);
Swig_symbol_add(name, entry);
}
if (newclassname) {
if (symtab) {
Node *node = Swig_symbol_clookup(name, symtab);
@ -1207,6 +1226,8 @@ ready:
virtual int enumvalueDeclaration(Node *n) {
String *name = Getattr(n, "sym:name");
if (Cmp(Getattr(n, "access"), "public") != 0)
return SWIG_OK;
String *enumvalue = Getattr(n, "enumvalue");
String *init = 0;
if (enumvalue) {

View file

@ -271,7 +271,7 @@ int SwigType_issimple(SwigType *t) {
}
int SwigType_isbuiltin(SwigType *t) {
const char* builtins[] = { "void", "short", "int", "long", "char", "float", "double", 0 };
const char* builtins[] = { "void", "short", "int", "long", "char", "float", "double", "bool", 0 };
int i = 0;
char *c = Char(t);
if (!t)