Next: Implementation of Compiled Closures, Previous: The compiler translates to C, Up: The compiler
The format of the intermediate C code generated by the ECL compiler is the same as the hand-coded C code of the ECL source programs. For example, supposing that the Lisp source file contains the following function definition:
(defvar *delta* 2) (defun add1 (x) (+ *delta* x))
The compiler generates the following intermediate C code.
/* function definition for ADD1 */ static cl_object L1(cl_object V1) { VT2 VLEX2 CLSR2 cl_object value0; value0=number_plus(symbol_value(VV[0]),V1); NVALUES=1; return value0; } /* initialization of this module */ void init_CODE(cl_object flag) { VT1 CLSR1 cl_object value0; if (!FIXNUMP(flag)){ Cblock=flag; #ifndef ECL_DYNAMIC_VV flag->cblock.data = VV; #endif flag->cblock.self_destruct=0; flag->cblock.data_size = VM; flag->cblock.data_text = compiler_data_text; flag->cblock.data_text_size = compiler_data_text_size; return;} #ifdef ECL_DYNAMIC_VV VV = Cblock->cblock.data; #endif T0= MAKE_FIXNUM(2); si_Xmake_special(VV[0]) if(SYM_VAL(T0)!=OBJNULL) cl_setq(VV[0],T0); cl_def_c_function(VV[1],(void*)L1,1); }
The C function L1
implements the Lisp function add1
.
This relation is established by cl_def_c_function
in the
initialization function init_CODE
, which is invoked at load
time. There, the vector VV
consists of Lisp objects;
VV[0]
and VV[1]
in this example hold the Lisp symbols
*delta*
and add1
. VM
in the definition of
L1
is a C macro declared in the corresponding H-file. The
actual value of VM
is the number of value stack locations used
by this module, i.e., 2 in this example. Thus the following macro
definition is found in the H-file.
#define VM 2