On Fri, 1 Oct 2004, Stas Bekman wrote:

> Randy Kobes wrote:
> > Hi,
> >   On Win32, there's a problem in compiling modperl_cmd.c
> > under src/modules/perl/ with the current cvs about trying to
> > use a function with the wrong number of arguments (lines 311
> > and 317). I think this is due to how modperl_var_modify_t is
> > defined within mod_perl.h, specifically with the presence of
> > _stdcall within the definition of MP_FUNC_T in
> > modperl_common_util.h for Win32. This patch:
> > ================================================================
> > Index: src/modules/perl/mod_perl.h
> > ===================================================================
> > RCS file: /home/cvs/modperl-2.0/src/modules/perl/mod_perl.h,v
> > retrieving revision 1.70
> > diff -u -r1.70 mod_perl.h
> > --- src/modules/perl/mod_perl.h     20 Sep 2004 18:14:47 -0000      1.70
> > +++ src/modules/perl/mod_perl.h     1 Oct 2004 03:14:50 -0000
> > @@ -130,10 +130,10 @@
> >
> >  #define MgTypeExt(mg) (mg->mg_type == '~')
> >
> > -typedef void MP_FUNC_T(modperl_var_modify_t) (apr_table_t *,
> > -                                              apr_table_t *,
> > -                                              const char *,
> > -                                              const char *);
> > +typedef void (*modperl_var_modify_t) (apr_table_t *,
> > +                                      apr_table_t *,
> > +                                      const char *,
> > +                                      const char *);
>
>
>
> >  /* we need to hook a few internal things before APR_HOOK_REALLY_FIRST */
> >  #define MODPERL_HOOK_REALLY_REALLY_FIRST (-20)
> > ====================================================================
> > allows things to build and the tests run (I'm getting a
> > couple of failures, but I'll look at those separately).
> >
>
> Is it possible that the right place to fix that is in modperl_common_util.h:
>
> #ifdef WIN32
> #   define MP_FUNC_T(name) (_stdcall *name)
> /* XXX: not all functions get inlined
>   * so its unclear what to and not to include in the .def files
>   */
> #   undef MP_INLINE
> #   define MP_INLINE
> #else
> #   define MP_FUNC_T(name)          (*name)
> #endif
>
> as you can see there already a special case for WIN32. And it was added
> there for some reason. Do you know why? May be it's because of this nature
> of that specific function that you've a problem with? Should it stay
> intact for other uses?

You're right that the
  #ifdef WIN32
  #   define MP_FUNC_T(name) (_stdcall *name)
  /* XXX: not all functions get inlined
    * so its unclear what to and not to include in the .def files
  */
 #   undef MP_INLINE
 #   define MP_INLINE

is needed elsewhere, specifically in modperl_filter.h:
   typedef ap_filter_t * MP_FUNC_T(modperl_filter_add_t) ...
where the _stcall is necessary. I think the situation
is analagous to what's described in ap_config.h:
===================================================================
#if !defined(WIN32)
/**
 * Apache Core dso functions are declared with AP_DECLARE(), so they may
 * use the most appropriate calling convention.  Hook functions and other
 * Core functions with variable arguments must use AP_DECLARE_NONSTD().
 * @code
 * AP_DECLARE(rettype) ap_func(args)
 * @endcode
 */
#define AP_DECLARE(type)            type

/**
 * Apache Core dso variable argument and hook functions are declared with
 * AP_DECLARE_NONSTD(), as they must use the C language calling convention.
 * @see AP_DECLARE
 * @code
 * AP_DECLARE_NONSTD(rettype) ap_func(args [...])
 * @endcode
 */
#define AP_DECLARE_NONSTD(type)     type

/**
 * Apache Core dso variables are declared with AP_MODULE_DECLARE_DATA.
 * This assures the appropriate indirection is invoked at compile time.
 *
 * @note AP_DECLARE_DATA extern type apr_variable; syntax is required for
 * declarations within headers to properly import the variable.
 * @code
 * AP_DECLARE_DATA type apr_variable
 * @endcode
 */
#define AP_DECLARE_DATA

#elif defined(AP_DECLARE_STATIC)
#define AP_DECLARE(type)            type __stdcall
#define AP_DECLARE_NONSTD(type)     type
#define AP_DECLARE_DATA
#elif defined(AP_DECLARE_EXPORT)
#define AP_DECLARE(type)            __declspec(dllexport) type __stdcall
#define AP_DECLARE_NONSTD(type)     __declspec(dllexport) type
#define AP_DECLARE_DATA             __declspec(dllexport)
#else
#define AP_DECLARE(type)            __declspec(dllimport) type __stdcall
#define AP_DECLARE_NONSTD(type)     __declspec(dllimport) type
#define AP_DECLARE_DATA             __declspec(dllimport)
#endif

====================================================================

So perhaps, in analogy, we could have a

  #ifdef WIN32
  #   define MP_DECLARE(name)         *name __stdcall
  #   define MP_DECLARE_NONSTD(name)  *name
  /* XXX: not all functions get inlined
  * so its unclear what to and not to include in the .def files
  */
 #   undef MP_INLINE
 #   define MP_INLINE
 #else
 #   define MP_DECLARE(name)         *name
 #   define MP_DECLARE_NONSTD        *name
 #endif

and then use MP_DECLARE/MP_DECLARE_NONSTD?

-- 
best regards,
randy

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to