| | 4095 | % '$lgt_check_redefined_entities' |
| | 4096 | % |
| | 4097 | % check and print a warning for all entities that are about to be redefined; |
| | 4098 | % also retract old runtime clauses for the entity being redefined for safety |
| | 4099 | |
| | 4100 | '$lgt_check_redefined_entities' :- |
| | 4101 | ( '$lgt_pp_file_rclause_'('$lgt_current_protocol_'(Entity, _, _)) |
| | 4102 | ; '$lgt_pp_file_rclause_'('$lgt_current_category_'(Entity, _, _, _, _, _)) |
| | 4103 | ; '$lgt_pp_file_rclause_'('$lgt_current_object_'(Entity, _, _, _, _, _, _, _)) |
| | 4104 | ), |
| | 4105 | '$lgt_redefined_entity'(Entity, Type), |
| | 4106 | '$lgt_report_redefined_entity'(Type, Entity), |
| | 4107 | '$lgt_retract_old_runtime_clauses'(Entity), |
| | 4108 | fail. |
| | 4109 | |
| | 4110 | '$lgt_check_redefined_entities'. |
| | 4111 | |
| | 4112 | |
| | 4113 | |
| 4097 | | '$lgt_redefined_entity'(Entity, object) :- |
| 4098 | | '$lgt_current_object_'(Entity, _, _, _, _, _, _, _), |
| 4099 | | !. |
| 4100 | | |
| 4101 | | '$lgt_redefined_entity'(Entity, protocol) :- |
| 4102 | | '$lgt_current_protocol_'(Entity, _, _), |
| 4103 | | !. |
| 4104 | | |
| 4105 | | '$lgt_redefined_entity'(Entity, category) :- |
| 4106 | | '$lgt_current_category_'(Entity, _, _, _, _, _). |
| | 4118 | '$lgt_redefined_entity'(Entity, Type) :- |
| | 4119 | ( '$lgt_current_object_'(Entity, _, _, _, _, _, _, _) -> |
| | 4120 | Type = object |
| | 4121 | ; '$lgt_current_protocol_'(Entity, _, _) -> |
| | 4122 | Type = protocol |
| | 4123 | ; '$lgt_current_category_'(Entity, _, _, _, _, _) -> |
| | 4124 | Type = category |
| | 4125 | ). |
| | 4140 | |
| | 4141 | |
| | 4142 | |
| | 4143 | % '$lgt_retract_old_runtime_clauses'(@entity_identifier) |
| | 4144 | % |
| | 4145 | % clean all references to an entity that is about to be redefined from the |
| | 4146 | % runtime tables |
| | 4147 | |
| | 4148 | '$lgt_retract_old_runtime_clauses'(Entity) :- |
| | 4149 | retractall('$lgt_before_'(_, _, _, Entity, _)), |
| | 4150 | retractall('$lgt_after_'(_, _, _, Entity, _)), |
| | 4151 | retractall('$lgt_current_object_'(Entity, _, _, _, _, _, _, _)), |
| | 4152 | retractall('$lgt_current_protocol_'(Entity, _, _)), |
| | 4153 | retractall('$lgt_current_category_'(Entity, _, _, _, _, _)), |
| | 4154 | retractall('$lgt_implements_protocol_'(Entity, _, _)), |
| | 4155 | retractall('$lgt_imports_category_'(Entity, _, _)), |
| | 4156 | retractall('$lgt_instantiates_class_'(Entity, _, _)), |
| | 4157 | retractall('$lgt_specializes_class_'(Entity, _, _)), |
| | 4158 | retractall('$lgt_extends_protocol_'(Entity, _, _)), |
| | 4159 | retractall('$lgt_extends_object_'(Entity, _, _)), |
| | 4160 | retractall('$lgt_extends_category_'(Entity, _, _)), |
| | 4161 | retractall('$lgt_complemented_object_'(_, Entity, _, _)), |
| | 4162 | retractall('$lgt_debugging_'(Entity)). |
| 10694 | | % Logtalk internal runtime tables |
| 10695 | | % |
| 10696 | | % we may be reloading the entity so we must first retract any old |
| 10697 | | % runtime clauses before asserting the new ones |
| 10698 | | % |
| 10699 | | % this is mostly a workaround for the lack of support of multifile |
| 10700 | | % predicates in some Prolog compilers |
| 10701 | | |
| 10702 | | '$lgt_assert_runtime_clauses'(Entity, Clauses) :- |
| 10703 | | ( '$lgt_redefined_entity'(Entity, Type) -> |
| 10704 | | '$lgt_clean_lookup_caches', |
| 10705 | | '$lgt_report_redefined_entity'(Type, Entity) |
| 10706 | | ; true |
| 10707 | | ), |
| 10708 | | '$lgt_retract_old_runtime_clauses'(Entity), |
| 10709 | | '$lgt_assert_new_runtime_clauses'(Clauses). |
| 10710 | | |
| 10711 | | |
| 10712 | | '$lgt_retract_old_runtime_clauses'(Entity) :- |
| 10713 | | retractall('$lgt_current_object_'(Entity, _, _, _, _, _, _, _)), |
| 10714 | | retractall('$lgt_current_protocol_'(Entity, _, _)), |
| 10715 | | retractall('$lgt_current_category_'(Entity, _, _, _, _, _)), |
| 10716 | | retractall('$lgt_implements_protocol_'(Entity, _, _)), |
| 10717 | | retractall('$lgt_imports_category_'(Entity, _, _)), |
| 10718 | | retractall('$lgt_instantiates_class_'(Entity, _, _)), |
| 10719 | | retractall('$lgt_specializes_class_'(Entity, _, _)), |
| 10720 | | retractall('$lgt_extends_protocol_'(Entity, _, _)), |
| 10721 | | retractall('$lgt_extends_object_'(Entity, _, _)), |
| 10722 | | retractall('$lgt_extends_category_'(Entity, _, _)), |
| 10723 | | retractall('$lgt_complemented_object_'(_, Entity, _, _)), |
| 10724 | | retractall('$lgt_debugging_'(Entity)). |
| 10725 | | |
| 10726 | | |
| 10727 | | '$lgt_assert_new_runtime_clauses'([]). |
| 10728 | | |
| 10729 | | '$lgt_assert_new_runtime_clauses'([Clause| Clauses]) :- |
| | 10734 | % Logtalk internal runtime tables; this is mostly a workaround for |
| | 10735 | % the lack of support of multifile predicates in some Prolog compilers |
| | 10736 | |
| | 10737 | '$lgt_assert_runtime_clauses'([]). |
| | 10738 | |
| | 10739 | '$lgt_assert_runtime_clauses'([Clause| Clauses]) :- |