Alien-LibJIT

 view release on metacpan or  search on metacpan

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

		case JIT_TYPE_INT:
		case JIT_TYPE_UINT:
		case JIT_TYPE_NINT:
		case JIT_TYPE_NUINT:
		case JIT_TYPE_LONG:
		case JIT_TYPE_ULONG:
		{
			/* Will only happen if the primitive numeric type
			   does not correspond to one of the system types */
			jit_nuint size = jit_type_get_size(type);
			add_ch(mangler, 'I');
			add_ch(mangler, hexchars[(size >> 4) & 0x0F]);
			add_ch(mangler, hexchars[size & 0x0F]);
		}
		break;

		case JIT_TYPE_FLOAT32:		add_ch(mangler, 'f'); break;
		case JIT_TYPE_FLOAT64:		add_ch(mangler, 'd'); break;
	#ifdef JIT_NFLOAT_IS_DOUBLE
		case JIT_TYPE_NFLOAT:		add_ch(mangler, 'd'); break;
	#else
		case JIT_TYPE_NFLOAT:		add_ch(mangler, 'r'); break;
	#endif

		case JIT_TYPE_STRUCT:
		case JIT_TYPE_UNION:
		{
			/* These should have been tagged with a name */
			add_ch(mangler, '?');
		}
		break;

		case JIT_TYPE_SIGNATURE:
		{
			add_ch(mangler, 'F');
			mangle_signature_gcc2(mangler, type);
			add_ch(mangler, '_');
			mangle_type_gcc2(mangler, jit_type_get_return(type));
		}
		break;

		case JIT_TYPE_PTR:
		{
			add_ch(mangler, 'P');
			mangle_type_gcc2(mangler, jit_type_get_ref(type));
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_NAME:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_STRUCT_NAME:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_UNION_NAME:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_ENUM_NAME:
		{
			/* Output the qualified name of the type */
			mangle_name_gcc2
				(mangler, (const char *)jit_type_get_tagged_data(type));
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_REFERENCE:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_OUTPUT:
		{
			add_ch(mangler, 'R');
			mangle_type_gcc2
				(mangler, jit_type_get_ref(jit_type_remove_tags(type)));
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_BOOL:
			add_ch(mangler, 'b'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_CHAR:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_UCHAR:
			add_ch(mangler, 'c'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_SCHAR:
			add_ch(mangler, 'S');
			add_ch(mangler, 'c'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_SHORT:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_USHORT:
			add_ch(mangler, 's'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_INT:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_UINT:
			add_ch(mangler, 'i'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONG:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_ULONG:
			add_ch(mangler, 'l'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONGLONG:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_ULONGLONG:
			add_ch(mangler, 'x'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_FLOAT:
			add_ch(mangler, 'f'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_DOUBLE:
			add_ch(mangler, 'd'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONGDOUBLE:
			add_ch(mangler, 'r'); break;

		default: break;
	}
}

/*
 * Mangle a function signature, using gcc 3.x rules.
 */
static void mangle_signature_gcc3(jit_mangler_t mangler, jit_type_t type)
{
	unsigned int num_params;
	unsigned int param;
	num_params = jit_type_num_params(type);
	if(num_params == 0 && jit_type_get_abi(type) != jit_abi_vararg)
	{
		add_ch(mangler, 'v');
	}
	for(param = 0; param < num_params; ++param)
	{
		mangle_type_gcc3(mangler, jit_type_get_param(type, param));
	}
	if(jit_type_get_abi(type) == jit_abi_vararg)
	{
		add_ch(mangler, 'z');
	}
}

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

		case JIT_TYPE_NUINT:
		case JIT_TYPE_LONG:
		case JIT_TYPE_ULONG:
		{
			/* Will only happen if the primitive numeric type
			   does not correspond to one of the system types */
			jit_nuint size = jit_type_get_size(type);
			if(is_unsigned(type))
				add_string(mangler, "uU");
			else
				add_string(mangler, "uI");
			add_ch(mangler, hexchars[(size >> 4) & 0x0F]);
			add_ch(mangler, hexchars[size & 0x0F]);
		}
		break;

		case JIT_TYPE_FLOAT32:		add_ch(mangler, 'f'); break;
		case JIT_TYPE_FLOAT64:		add_ch(mangler, 'd'); break;
	#ifdef JIT_NFLOAT_IS_DOUBLE
		case JIT_TYPE_NFLOAT:		add_ch(mangler, 'd'); break;
	#else
		case JIT_TYPE_NFLOAT:		add_ch(mangler, 'e'); break;
	#endif

		case JIT_TYPE_STRUCT:
		case JIT_TYPE_UNION:
		{
			/* These should have been tagged with a name */
			add_ch(mangler, '?');
		}
		break;

		case JIT_TYPE_SIGNATURE:
		{
			add_ch(mangler, 'F');
			mangle_type_gcc3(mangler, jit_type_get_return(type));
			mangle_signature_gcc3(mangler, type);
			add_ch(mangler, 'E');
		}
		break;

		case JIT_TYPE_PTR:
		{
			add_ch(mangler, 'P');
			mangle_type_gcc3(mangler, jit_type_get_ref(type));
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_NAME:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_STRUCT_NAME:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_UNION_NAME:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_ENUM_NAME:
		{
			/* Output the qualified name of the type */
			mangle_name_gcc3
				(mangler, (const char *)jit_type_get_tagged_data(type), 0);
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_REFERENCE:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_OUTPUT:
		{
			add_ch(mangler, 'R');
			mangle_type_gcc3
				(mangler, jit_type_get_ref(jit_type_remove_tags(type)));
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_BOOL:
			add_ch(mangler, 'b'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_CHAR:
			add_ch(mangler, 'c'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_SCHAR:
			add_ch(mangler, 'a'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_UCHAR:
			add_ch(mangler, 'h'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_SHORT:
			add_ch(mangler, 's'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_USHORT:
			add_ch(mangler, 't'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_INT:
			add_ch(mangler, 'i'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_UINT:
			add_ch(mangler, 'j'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONG:
			add_ch(mangler, 'l'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_ULONG:
			add_ch(mangler, 'm'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONGLONG:
			add_ch(mangler, 'x'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_ULONGLONG:
			add_ch(mangler, 'y'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_FLOAT:
			add_ch(mangler, 'f'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_DOUBLE:
			add_ch(mangler, 'd'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONGDOUBLE:
			add_ch(mangler, 'e'); break;

		default: break;
	}
}

#if defined(JIT_WIN32_PLATFORM)

/*
 * Forward declaration.
 */
static void mangle_type_msvc6(jit_mangler_t mangler, jit_type_t type);

/*
 * Mangle a function signature, using MSVC 6.0 rules.
 */
static void mangle_signature_msvc6(jit_mangler_t mangler, jit_type_t type,
								   int output_return, int is_this_call,
								   int has_explicit_this)
{
	unsigned int num_params;
	unsigned int param;
	jit_abi_t abi = jit_type_get_abi(type);
	if(is_this_call)

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

			{
				if(jit_type_has_tag(sub_type, JIT_TYPETAG_VOLATILE))
				{
					add_ch(mangler, 'D');
				}
				else
				{
					add_ch(mangler, 'B');
				}
			}
			else if(jit_type_has_tag(sub_type, JIT_TYPETAG_VOLATILE))
			{
				add_ch(mangler, 'C');
			}
			else
			{
				add_ch(mangler, 'A');
			}
			mangle_type_msvc6(mangler, sub_type);
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_NAME:
		{
			add_ch(mangler, 'V');
			mangle_name_msvc6
				(mangler, (const char *)jit_type_get_tagged_data(type));
			add_string(mangler, "@@");
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_STRUCT_NAME:
		{
			add_ch(mangler, 'U');
			mangle_name_msvc6
				(mangler, (const char *)jit_type_get_tagged_data(type));
			add_string(mangler, "@@");
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_UNION_NAME:
		{
			add_ch(mangler, 'T');
			mangle_name_msvc6
				(mangler, (const char *)jit_type_get_tagged_data(type));
			add_string(mangler, "@@");
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_ENUM_NAME:
		{
			add_ch(mangler, 'W');
			add_ch(mangler, (int)('0' + jit_type_get_size(type)));
			mangle_name_msvc6
				(mangler, (const char *)jit_type_get_tagged_data(type));
			add_string(mangler, "@@");
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_REFERENCE:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_OUTPUT:
		{
			add_ch(mangler, 'A');
			sub_type = jit_type_get_ref(jit_type_remove_tags(type));
			if(jit_type_has_tag(sub_type, JIT_TYPETAG_CONST))
			{
				if(jit_type_has_tag(sub_type, JIT_TYPETAG_VOLATILE))
				{
					add_ch(mangler, 'D');
				}
				else
				{
					add_ch(mangler, 'B');
				}
			}
			else if(jit_type_has_tag(sub_type, JIT_TYPETAG_VOLATILE))
			{
				add_ch(mangler, 'C');
			}
			else
			{
				add_ch(mangler, 'A');
			}
			mangle_type_msvc6(mangler, sub_type);
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_CONST:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_VOLATILE:
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_RESTRICT:
		{
			/* These are handled in the pointer and reference cases */
			mangle_type_msvc6(mangler, jit_type_get_tagged_type(type));
		}
		break;

		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_BOOL:
			add_ch(mangler, 'D'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_CHAR:
			add_ch(mangler, 'D'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_SCHAR:
			add_ch(mangler, 'C'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_UCHAR:
			add_ch(mangler, 'E'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_SHORT:
			add_ch(mangler, 'F'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_USHORT:
			add_ch(mangler, 'G'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_INT:
			add_ch(mangler, 'H'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_UINT:
			add_ch(mangler, 'I'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONG:
			add_ch(mangler, 'J'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_ULONG:
			add_ch(mangler, 'K'); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_LONGLONG:
			add_string(mangler, "_J"); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_ULONGLONG:
			add_string(mangler, "_K"); break;
		case JIT_TYPE_FIRST_TAGGED + JIT_TYPETAG_SYS_FLOAT:



( run in 0.446 second using v1.01-cache-2.11-cpan-8644d7adfcd )