From c4dd32ca96bdffa2838960df9bbd98c04748f454 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sun, 5 Sep 2010 22:43:49 +0200 Subject: [PATCH] Third iteration at the problem with packages_to_be_created. Now this variable is associated to a flag that deactivates its use outside read_VV's reader. --- src/c/cinit.d | 6 ++++++ src/c/main.d | 3 ++- src/c/package.d | 4 ++-- src/c/read.d | 29 ++++++++++++++++------------- src/h/external.h | 1 + 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/c/cinit.d b/src/c/cinit.d index 112e47ab7..b141dcef1 100644 --- a/src/c/cinit.d +++ b/src/c/cinit.d @@ -66,6 +66,12 @@ si_signal_simple_error(cl_narg narg, cl_object condition, cl_object continuable, return cl_apply(6, @'si::signal-simple-error', condition, continuable, format, format_args, cl_grab_rest_args(args)); } +extern cl_object +cl_set_difference(cl_narg narg, cl_object l1, cl_object l2, ...) +{ + @(return l1) +} + extern cl_object cl_array_dimensions(cl_object array) { diff --git a/src/c/main.d b/src/c/main.d index debda2697..5b095e0f1 100644 --- a/src/c/main.d +++ b/src/c/main.d @@ -378,7 +378,8 @@ struct cl_core_struct cl_core = { # endif #endif Cnil, /* mp_package */ - OBJNULL, /* packages_to_be_created */ + Cnil, /* packages_to_be_created */ + Cnil, /* packages_to_be_created_p */ Cnil, /* pathname_translations */ Cnil, /* library_pathname */ diff --git a/src/c/package.d b/src/c/package.d index 1b0d710a1..4a6de2685 100644 --- a/src/c/package.d +++ b/src/c/package.d @@ -133,9 +133,9 @@ ecl_make_package(cl_object name, cl_object nicknames, cl_object use_list) * created and use it. */ PACKAGE_OP_LOCK(); - if (cl_core.packages_to_be_created != OBJNULL) { + { cl_object l = cl_core.packages_to_be_created; - while (CONSP(l)) { + while (!Null(l)) { cl_object pair = ECL_CONS_CAR(l); cl_object other_name = ECL_CONS_CAR(pair); if (ecl_equal(other_name, name) || diff --git a/src/c/read.d b/src/c/read.d index 51eb0c5bf..b488794ff 100644 --- a/src/c/read.d +++ b/src/c/read.d @@ -252,7 +252,7 @@ LOOP: all referenced packages have been properly built. */ cl_object name = cl_copy_seq(token); - unlikely_if (cl_core.packages_to_be_created == OBJNULL) { + unlikely_if (cl_core.packages_to_be_created_p == Cnil) { FEerror("There is no package with the name ~A.", 1, name); } else if (!Null(p = ecl_assoc(name, cl_core.packages_to_be_created))) { @@ -2428,8 +2428,7 @@ read_VV(cl_object block, void (*entry_point)(cl_object)) cl_object progv_list; ecl_bds_bind(env, @'si::*cblock*', block); - if (cl_core.packages_to_be_created == OBJNULL) - cl_core.packages_to_be_created = Cnil; + cl_core.packages_to_be_created_p = Ct; /* Communicate the library which Cblock we are using, and get * back the amount of data to be processed. @@ -2507,6 +2506,8 @@ read_VV(cl_object block, void (*entry_point)(cl_object)) "binary file", in, 0); #endif NO_DATA_LABEL: + cl_core.packages_to_be_created_p = Cnil; + for (i = 0; i < block->cblock.cfuns_size; i++) { const struct ecl_cfun *prototype = block->cblock.cfuns+i; cl_index fname_location = fix(prototype->block); @@ -2529,16 +2530,17 @@ read_VV(cl_object block, void (*entry_point)(cl_object)) } /* Execute top-level code */ (*entry_point)(MAKE_FIXNUM(0)); - x = cl_core.packages_to_be_created; - loop_for_on(x) { - if (ecl_member(x, cl_core.packages)) - continue; - if ((old_eptbc == OBJNULL) || !ecl_member(x, old_eptbc)) { - CEerror(Ct, "The package named ~A was referenced in " - "compiled file~& ~A~&but has not been created", - 2, CAR(x), block->cblock.name); - } - } end_loop_for_on(x); + x = cl_set_difference(2, cl_core.packages_to_be_created, old_eptbc); + old_eptbc = cl_core.packages_to_be_created; + unlikely_if (!Null(x)) { + CEerror(Ct, + Null(ECL_CONS_CDR(x))? + "Package ~A referenced in " + "compiled file~& ~A~&but has not been created": + "The packages~& ~A~&were referenced in " + "compiled file~& ~A~&but have not been created", + 2, x, block->cblock.name); + } if (VVtemp) { block->cblock.temp_data = NULL; block->cblock.temp_data_size = 0; @@ -2549,6 +2551,7 @@ read_VV(cl_object block, void (*entry_point)(cl_object)) if (in != OBJNULL) cl_close(1,in); cl_core.packages_to_be_created = old_eptbc; + cl_core.packages_to_be_created_p = Cnil; } CL_UNWIND_PROTECT_END; return block; diff --git a/src/h/external.h b/src/h/external.h index f0c6b5623..4c26fbc42 100755 --- a/src/h/external.h +++ b/src/h/external.h @@ -173,6 +173,7 @@ struct cl_core_struct { #endif cl_object mp_package; cl_object packages_to_be_created; + cl_object packages_to_be_created_p; cl_object pathname_translations; cl_object library_pathname;