C-TinyCompiler

 view release on metacpan or  search on metacpan

lib/C/TinyCompiler.xs  view on Meta::CPAN

			path = SvPVbyte_nolen(ST(i));
			tcc_add_library_path(state, path);
		}

############ Compiler ############
void
_compile(state, code)
	TCCStateObj * state
	const char * code
	CODE:
		/* Compile and croak if error */
		int ret = tcc_compile_string(state, code);
		if (ret != 0) croak("Something fishy happened\n");

void
_add_symbols(state, ...)
	TCCStateObj * state
	PREINIT:
		char * symbol_name;
		void * symbol_ptr;
	CODE:
		/* Make sure we've got an even number of arguments (aside from self) */
		if (items % 2 == 0) {
			croak("INTERNAL ERROR: _add_symbols should only get key => value pairs\n");
		}
		int i;
		for (i = 1; i < items; i += 2) {
			symbol_name = SvPVbyte_nolen(ST(i));
			symbol_ptr = INT2PTR(void*, SvIV(ST(i+1)));
			tcc_add_symbol(state, symbol_name, symbol_ptr);
		}

void
_relocate(state)
	TCCStateObj * state
	CODE:
		/* Relocate and croak if error */
		int ret = tcc_relocate(state, TCC_RELOCATE_AUTO);
		if (ret < 0) croak("Relocation error\n");

############ Post-Compiler ############
void
_call_void_function(state, func_name)
	TCCStateObj * state
	const char * func_name
	CODE:
		/* Get a pointer to the function */
		my_void_func p_func = (my_void_func)tcc_get_symbol(state, func_name);
		/* Croak if we encountered errors */
		if (p_func == 0) croak("Unable to locate %s", func_name);
		/* Call it with no inputs and no outputs */
		p_func();

void
_get_symbols(state, ...)
	TCCStateObj * state
	PREINIT:
		char * symbol_name;
		void * symbol_pointer;
		int i;
	PPCODE:
		EXTEND(SP, 2*items);
		for (i = 1; i < items; i++) {
			/* Get the tentative name */
			symbol_name = SvPVbyte_nolen(ST(i));
			
			/* Get a pointer to the symbol */
			symbol_pointer = tcc_get_symbol(state, symbol_name);
			
			/* croak if the symbol retrieval was not successful, as this is
			 * likely to be the result of a typo on the programmer's part */
			if (symbol_pointer == 0) croak("Unable to locate %s", symbol_name);
			
			/* Push the resulting key => value onto the return list */
			PUSHs(sv_2mortal(newSVpv(symbol_name, strlen(symbol_name))));
			PUSHs(sv_2mortal(newSViv(PTR2IV(symbol_pointer))));
		}



( run in 1.165 second using v1.01-cache-2.11-cpan-71847e10f99 )