1234567891011121314151617181920212223242526272829303132333435363738394041424344454647(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * Copyright INRIA, CNRS and contributors *)(* <O___,, * (see version control and CREDITS file for authors & dates) *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)openPptypeerror=|TooLargeInductiveofNames.Id.t|TooLargeCodeexceptionCompileErroroferrorlettoo_large_code()=raise(CompileErrorTooLargeCode)(* Limit needed to make SWITCH work. The specific limit is
arbitrary but nobody needs more than 0x1000000 constructors. *)letmax_nb_const=0x1000000letmax_nb_block=0x1000000+Obj.last_non_constant_constructor_tag-1letstr_max_constructors=Format.sprintf" which has more than %i constant constructors or more than %i non-constant constructors"max_nb_constmax_nb_block(* NB: Declarations depends on Vmemitcodes which depends on
too_large_code so we can't use Declarations.one_inductive_body
here. Instead we pass the needed fields. *)letcheck_compilable_ind~name~mind_nb_args~mind_nb_constant=ifnot(mind_nb_args<=max_nb_block&&mind_nb_constant<=max_nb_const)thenraise(CompileError(TooLargeInductivename))letpr_error=function|TooLargeCode->str"Cannot compile code for virtual machine as it exceeds string size limits."|TooLargeInductivename->str"Cannot compile code for virtual machine as it uses inductive "++Names.Id.printname++strstr_max_constructorslet()=CErrors.register_handler(function|CompileErrore->Some(pr_errore)|_->None)