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 )