/* -----------------------------------------------------------------------------
 * Swig_cargs()
 *
 * Emit all of the local variables for a list of parameters.  Returns the
 * number of parameters.
 * Default values for the local variables are only emitted if the compact default
 * argument behaviour is required.
 * ----------------------------------------------------------------------------- */
int Swig_cargs(Wrapper *w, ParmList *p) {
  int i = 0;
  int compactdefargs = ParmList_is_compactdefargs(p);

  while (p != 0) {
    String *lname = Swig_cparm_name(p, i);
    SwigType *pt = Getattr(p, k_type);
    if ((SwigType_type(pt) != T_VOID)) {
      String *local = 0;
      String *type = Getattr(p, k_type);
      /* default values only emitted if in compact default args mode */
      String *pvalue = (compactdefargs) ? Getattr(p, k_value) : 0;
      SwigType *altty = SwigType_alttype(type, 0);
      int tycode = SwigType_type(type);
      if (tycode == T_REFERENCE) {
	if (pvalue) {
	  SwigType *tvalue;
	  String *defname, *defvalue, *rvalue, *qvalue;
	  rvalue = SwigType_typedef_resolve_all(pvalue);
	  qvalue = SwigType_typedef_qualified(rvalue);
	  defname = NewStringf("%s_defvalue", lname);
	  tvalue = Copy(type);
	  SwigType_del_reference(tvalue);
	  tycode = SwigType_type(tvalue);
	  if (tycode != T_USER) {
	    /* plain primitive type, we copy the the def value */
	    String *lstr = SwigType_lstr(tvalue, defname);
	    defvalue = NewStringf("%s = %s", lstr, qvalue);
	    Delete(lstr);
	  } else {
	    /* user type, we copy the reference value */
	    String *str = SwigType_str(type, defname);
	    defvalue = NewStringf("%s = %s", str, qvalue);
	    Delete(str);
	  }
	  Wrapper_add_localv(w, defname, defvalue, NIL);
	  Delete(tvalue);
	  Delete(rvalue);
	  Delete(qvalue);
	  Delete(defname);
	  Delete(defvalue);
	}
      } else if (!pvalue && ((tycode == T_POINTER) || (tycode == T_STRING))) {
	pvalue = (String *) "0";
      }
      if (!altty) {
	local = Swig_clocal(pt, lname, pvalue);
      } else {
	local = Swig_clocal(altty, lname, pvalue);
	Delete(altty);
      }
      Wrapper_add_localv(w, lname, local, NIL);
      Delete(local);
      i++;
    }
    Delete(lname);
    p = nextSibling(p);
  }
  return (i);
}
Ejemplo n.º 2
0
/* -----------------------------------------------------------------------------
 * Swig_cargs()
 *
 * Emit all of the local variables for a list of parameters.  Returns the
 * number of parameters.
 * Default values for the local variables are only emitted if the compact default
 * argument behaviour is required.
 * ----------------------------------------------------------------------------- */
int Swig_cargs(Wrapper *w, ParmList *p) {
    int i = 0;
    int compactdefargs = ParmList_is_compactdefargs(p);

    while (p != 0) {
        String *lname = Swig_cparm_name(p, i);
        SwigType *pt = Getattr(p, "type");
        if ((SwigType_type(pt) != T_VOID)) {
            String *local = 0;
            String *type = Getattr(p, "type");
            /* default values only emitted if in compact default args mode */
            String *pvalue = (compactdefargs) ? Getattr(p, "value") : 0;

            /* When using compactdefaultargs, the code generated initialises a variable via a constructor call that accepts the
             * default value as a parameter. The default constructor is not called and therefore SwigValueWrapper is not needed. */
            SwigType *altty = pvalue ? 0 : SwigType_alttype(type, 0);

            int tycode = SwigType_type(type);
            if (tycode == T_REFERENCE) {
                if (pvalue) {
                    SwigType *tvalue;
                    String *defname, *defvalue, *rvalue, *qvalue;
                    rvalue = SwigType_typedef_resolve_all(pvalue);
                    qvalue = SwigType_typedef_qualified(rvalue);
                    defname = NewStringf("%s_defvalue", lname);
                    tvalue = Copy(type);
                    SwigType_del_reference(tvalue);
                    tycode = SwigType_type(tvalue);
                    if (tycode != T_USER) {
                        /* plain primitive type, we copy the the def value */
                        String *lstr = SwigType_lstr(tvalue, defname);
                        defvalue = NewStringf("%s = %s", lstr, qvalue);
                        Delete(lstr);
                    } else {
                        /* user type, we copy the reference value */
                        String *str = SwigType_str(type, defname);
                        defvalue = NewStringf("%s = %s", str, qvalue);
                        Delete(str);
                    }
                    Wrapper_add_localv(w, defname, defvalue, NIL);
                    Delete(tvalue);
                    Delete(rvalue);
                    Delete(qvalue);
                    Delete(defname);
                    Delete(defvalue);
                }
            } else if (!pvalue && ((tycode == T_POINTER) || (tycode == T_STRING))) {
                pvalue = (String *) "0";
            }
            if (!altty) {
                local = Swig_clocal(pt, lname, pvalue);
            } else {
                local = Swig_clocal(altty, lname, pvalue);
                Delete(altty);
            }
            Wrapper_add_localv(w, lname, local, NIL);
            Delete(local);
            i++;
        }
        Delete(lname);
        p = nextSibling(p);
    }
    return (i);
}