From fe34270379f1e68b584540e25a41ee280cbb6891 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sun, 27 Feb 2011 00:05:28 +0100 Subject: [PATCH] Remove the load-time constants from the array, as they are replaced later on any way. --- src/c/compiler.d | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/c/compiler.d b/src/c/compiler.d index c6614b5bf..f3c3a511c 100644 --- a/src/c/compiler.d +++ b/src/c/compiler.d @@ -180,11 +180,26 @@ asm_end(cl_env_ptr env, cl_index beginning, cl_object definition) { for (i = 0, code = (cl_opcode *)bytecodes->bytecodes.code; i < code_size; i++) { code[i] = (cl_opcode)(cl_fixnum)(env->stack[beginning+i]); } - while (data_size--) { - bytecodes->bytecodes.data[data_size] = ECL_CONS_CAR(c_env->constants); + for (i = data_size; i--; ) { + bytecodes->bytecodes.data[i] = ECL_CONS_CAR(c_env->constants); c_env->constants = ECL_CONS_CDR(c_env->constants); c_env->constants_size--; } + if (c_env->load_time_forms != Cnil) { + /* Objects with load-time constants are not saved, as + * they will be rebuilt later on. */ + cl_object p = c_env->load_time_forms; + do { + cl_object o = ECL_CONS_CAR(p); + for (i = 0; i < data_size; i++) { + if (bytecodes->bytecodes.data[i] == o) { + bytecodes->bytecodes.data[i] = MAKE_FIXNUM(i); + break; + } + } + p = ECL_CONS_CDR(p); + } while (p != Cnil); + } bytecodes->bytecodes.entry = _ecl_bytecodes_dispatch_vararg; ecl_set_function_source_file_info(bytecodes, (file == OBJNULL)? Cnil : file, (file == OBJNULL)? Cnil : position); @@ -543,6 +558,7 @@ c_new_env(cl_env_ptr the_env, cl_compiler_env_ptr new, cl_object env, new->lexical_level = 0; new->constants = Cnil; new->constants_size = 0; + new->load_time_forms = Cnil; new->env_depth = 0; new->env_size = 0; if (old) {