Alien-LibJIT

 view release on metacpan or  search on metacpan

libjit/jitdynamic/jit-cpp-mangle.c  view on Meta::CPAN

	#define	MANGLING_FORM_GCC_2			0
	#define	MANGLING_FORM_GCC_3			1
#endif

/*@
 * @deftypefun {char *} jit_mangle_global_function (const char *@var{name}, jit_type_t @var{signature}, int @var{form})
 * Mangle the name of a global C++ function using the specified @var{form}.
 * Returns NULL if out of memory, or if the form is not supported.
 * @end deftypefun
@*/
char *jit_mangle_global_function
	(const char *name, jit_type_t signature, int form)
{
	struct jit_mangler mangler;
	init_mangler(&mangler);
	switch(form)
	{
	#ifdef MANGLING_FORM_GCC_2
		case MANGLING_FORM_GCC_2:
		{
			add_string(&mangler, name);
			add_string(&mangler, "__F");
			mangle_signature_gcc2(&mangler, signature);
		}
		break;
	#endif

	#ifdef MANGLING_FORM_GCC_3
		case MANGLING_FORM_GCC_3:
		{
			add_string(&mangler, "_Z");
			add_len_string(&mangler, name);
			mangle_signature_gcc3(&mangler, signature);
		}
		break;
	#endif

	#ifdef MANGLING_FORM_MSVC_6
		case MANGLING_FORM_MSVC_6:
		{
			add_ch(&mangler, '?');
			add_string(&mangler, name);
			add_string(&mangler, "@@Y");
			mangle_signature_msvc6(&mangler, signature, 1, 0, 0);
		}
		break;
	#endif
	}
	return end_mangler(&mangler);
}

/*@
 * @deftypefun {char *} jit_mangle_member_function (const char *@var{class_name}, const char *@var{name}, jit_type_t @var{signature}, int @var{form}, int @var{flags})
 * Mangle the name of a C++ member function using the specified @var{form}.
 * Returns NULL if out of memory, or if the form is not supported.
 * The following flags may be specified to modify the mangling rules:
 *
 * @table @code
 * @vindex JIT_MANGLE_PUBLIC
 * @item JIT_MANGLE_PUBLIC
 * The method has @code{public} access within its containing class.
 *
 * @vindex JIT_MANGLE_PROTECTED
 * @item JIT_MANGLE_PROTECTED
 * The method has @code{protected} access within its containing class.
 *
 * @vindex JIT_MANGLE_PRIVATE
 * @item JIT_MANGLE_PRIVATE
 * The method has @code{private} access within its containing class.
 *
 * @vindex JIT_MANGLE_STATIC
 * @item JIT_MANGLE_STATIC
 * The method is @code{static}.
 *
 * @vindex JIT_MANGLE_VIRTUAL
 * @item JIT_MANGLE_VIRTUAL
 * The method is a virtual instance method.  If neither
 * @code{JIT_MANGLE_STATIC} nor @code{JIT_MANGLE_VIRTUAL} are supplied,
 * then the method is assumed to be a non-virtual instance method.
 *
 * @vindex JIT_MANGLE_CONST
 * @item JIT_MANGLE_CONST
 * The method is an instance method with the @code{const} qualifier.
 *
 * @vindex JIT_MANGLE_EXPLICIT_THIS
 * @item JIT_MANGLE_EXPLICIT_THIS
 * The @var{signature} includes an extra pointer parameter at the start
 * that indicates the type of the @code{this} pointer.  This parameter won't
 * be included in the final mangled name.
 *
 * @vindex JIT_MANGLE_IS_CTOR
 * @item JIT_MANGLE_IS_CTOR
 * The method is a constructor.  The @var{name} parameter will be ignored.
 *
 * @vindex JIT_MANGLE_IS_DTOR
 * @item JIT_MANGLE_IS_DTOR
 * The method is a destructor.  The @var{name} parameter will be ignored.
 *
 * @vindex JIT_MANGLE_BASE
 * @item JIT_MANGLE_BASE
 * Fetch the "base" constructor or destructor entry point, rather than
 * the "complete" entry point.
 * @end table
 *
 * The @var{class_name} may include namespace and nested parent qualifiers
 * by separating them with @code{::} or @code{.}.  Class names that involve
 * template parameters are not supported yet.
 * @end deftypefun
@*/
char *jit_mangle_member_function
	(const char *class_name, const char *name,
	 jit_type_t signature, int form, int flags)
{
	struct jit_mangler mangler;
	init_mangler(&mangler);
	switch(form)
	{
	#ifdef MANGLING_FORM_GCC_2
		case MANGLING_FORM_GCC_2:
		{
			if((flags & JIT_MANGLE_IS_CTOR) != 0)

libjit/jitdynamic/jit-cpp-mangle.c  view on Meta::CPAN

		case MANGLING_FORM_MSVC_6:
		{
			if((flags & JIT_MANGLE_IS_CTOR) != 0)
			{
				add_string(&mangler, "??0");
				mangle_name_msvc6(&mangler, class_name);
			}
			else if((flags & JIT_MANGLE_IS_DTOR) != 0)
			{
				add_string(&mangler, "??1");
				mangle_name_msvc6(&mangler, class_name);
			}
			else
			{
				add_ch(&mangler, '?');
				add_string(&mangler, name);
				add_ch(&mangler, '@');
				mangle_name_msvc6(&mangler, class_name);
			}
			add_string(&mangler, "@@");
			if((flags & 0x07) == JIT_MANGLE_PROTECTED)
			{
				if((flags & JIT_MANGLE_STATIC) != 0)
				{
					/* static protected */
					add_ch(&mangler, 'K');
				}
				else if((flags & JIT_MANGLE_VIRTUAL) != 0)
				{
					/* virtual protected */
					add_ch(&mangler, 'M');
				}
				else
				{
					/* instance protected */
					add_ch(&mangler, 'I');
				}
			}
			else if((flags & 0x07) == JIT_MANGLE_PRIVATE)
			{
				if((flags & JIT_MANGLE_STATIC) != 0)
				{
					/* static private */
					add_ch(&mangler, 'C');
				}
				else if((flags & JIT_MANGLE_VIRTUAL) != 0)
				{
					/* virtual private */
					add_ch(&mangler, 'E');
				}
				else
				{
					/* instance private */
					add_ch(&mangler, 'A');
				}
			}
			else
			{
				if((flags & JIT_MANGLE_STATIC) != 0)
				{
					/* static public */
					add_ch(&mangler, 'S');
				}
				else if((flags & JIT_MANGLE_VIRTUAL) != 0)
				{
					/* virtual public */
					add_ch(&mangler, 'U');
				}
				else
				{
					/* instance public */
					add_ch(&mangler, 'Q');
				}
			}
			if((flags & JIT_MANGLE_STATIC) == 0)
			{
				if((flags & JIT_MANGLE_CONST) != 0)
				{
					add_ch(&mangler, 'B');
				}
				else
				{
					add_ch(&mangler, 'A');
				}
			}
			mangle_signature_msvc6
				(&mangler, signature,
			     (flags & (JIT_MANGLE_IS_CTOR | JIT_MANGLE_IS_DTOR)) == 0,
				 (flags & JIT_MANGLE_STATIC) == 0,
				 (flags & JIT_MANGLE_EXPLICIT_THIS) != 0);
		}
		break;
	#endif
	}
	return end_mangler(&mangler);
}



( run in 0.400 second using v1.01-cache-2.11-cpan-5623c5533a1 )