mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Included store.m in Mercury/samples, now 100% coverage in Mercury library/ and compiler/
This commit is contained in:
		| @@ -563,8 +563,8 @@ | |||||||
|       "zshrc" |       "zshrc" | ||||||
|     ] |     ] | ||||||
|   }, |   }, | ||||||
|   "tokens_total": 481534, |   "tokens_total": 484777, | ||||||
|   "languages_total": 560, |   "languages_total": 561, | ||||||
|   "tokens": { |   "tokens": { | ||||||
|     "Groovy": { |     "Groovy": { | ||||||
|       "SHEBANG#!groovy": 1, |       "SHEBANG#!groovy": 1, | ||||||
| @@ -36958,66 +36958,66 @@ | |||||||
|       "time": 1 |       "time": 1 | ||||||
|     }, |     }, | ||||||
|     "Mercury": { |     "Mercury": { | ||||||
|       "%": 363, |       "%": 416, | ||||||
|       "-": 6240, |       "-": 6914, | ||||||
|       "module": 44, |       "module": 45, | ||||||
|       "rot13_verbose.": 1, |       "rot13_verbose.": 1, | ||||||
|       "interface.": 11, |       "interface.": 12, | ||||||
|       "import_module": 121, |       "import_module": 124, | ||||||
|       "io.": 7, |       "io.": 8, | ||||||
|       "pred": 232, |       "pred": 253, | ||||||
|       "main": 15, |       "main": 15, | ||||||
|       "(": 3101, |       "(": 3284, | ||||||
|       "io__state": 4, |       "io__state": 4, | ||||||
|       ")": 3099, |       ")": 3284, | ||||||
|       ".": 544, |       ".": 592, | ||||||
|       "mode": 6, |       "mode": 6, | ||||||
|       "di": 5, |       "di": 54, | ||||||
|       "uo": 5, |       "uo": 58, | ||||||
|       "is": 199, |       "is": 244, | ||||||
|       "det.": 180, |       "det.": 182, | ||||||
|       "implementation.": 11, |       "implementation.": 11, | ||||||
|       "char": 7, |       "char": 7, | ||||||
|       "int": 113, |       "int": 124, | ||||||
|       "require.": 5, |       "require.": 5, | ||||||
|       "rot13a/2": 1, |       "rot13a/2": 1, | ||||||
|       "A": 6, |       "A": 6, | ||||||
|       "table": 1, |       "table": 1, | ||||||
|       "to": 4, |       "to": 16, | ||||||
|       "map": 7, |       "map": 7, | ||||||
|       "the": 4, |       "the": 27, | ||||||
|       "alphabetic": 2, |       "alphabetic": 2, | ||||||
|       "characters": 1, |       "characters": 1, | ||||||
|       "their": 1, |       "their": 1, | ||||||
|       "rot13": 11, |       "rot13": 11, | ||||||
|       "equivalents": 1, |       "equivalents": 1, | ||||||
|       "fails": 1, |       "fails": 1, | ||||||
|       "if": 4, |       "if": 15, | ||||||
|       "input": 1, |       "input": 1, | ||||||
|       "not": 1, |       "not": 7, | ||||||
|       "rot13a": 55, |       "rot13a": 55, | ||||||
|       "in": 457, |       "in": 506, | ||||||
|       "out": 303, |       "out": 334, | ||||||
|       "semidet.": 10, |       "semidet.": 10, | ||||||
|       "rot13/2": 1, |       "rot13/2": 1, | ||||||
|       "Applies": 1, |       "Applies": 1, | ||||||
|       "algorithm": 1, |       "algorithm": 1, | ||||||
|       "a": 1, |       "a": 10, | ||||||
|       "character.": 1, |       "character.": 1, | ||||||
|       "Char": 12, |       "Char": 12, | ||||||
|       "RotChar": 8, |       "RotChar": 8, | ||||||
|       "TmpChar": 2, |       "TmpChar": 2, | ||||||
|       "then": 3, |       "then": 3, | ||||||
|       "else": 3, |       "else": 8, | ||||||
|       "io__read_char": 1, |       "io__read_char": 1, | ||||||
|       "Res": 8, |       "Res": 8, | ||||||
|       "{": 13, |       "{": 23, | ||||||
|       "ok": 3, |       "ok": 3, | ||||||
|       "}": 13, |       "}": 24, | ||||||
|       "io__write_char": 1, |       "io__write_char": 1, | ||||||
|       ";": 848, |       ";": 898, | ||||||
|       "eof": 3, |       "eof": 3, | ||||||
|       "error": 4, |       "error": 6, | ||||||
|       "ErrorCode": 4, |       "ErrorCode": 4, | ||||||
|       "io__error_message": 2, |       "io__error_message": 2, | ||||||
|       "ErrorMessage": 4, |       "ErrorMessage": 4, | ||||||
| @@ -37026,11 +37026,11 @@ | |||||||
|       "io__write_string": 2, |       "io__write_string": 2, | ||||||
|       "io__nl": 1, |       "io__nl": 1, | ||||||
|       "hello.": 1, |       "hello.": 1, | ||||||
|       "io": 5, |       "io": 6, | ||||||
|       "IO": 4, |       "IO": 4, | ||||||
|       "io.write_string": 1, |       "io.write_string": 1, | ||||||
|       "rot13_concise.": 1, |       "rot13_concise.": 1, | ||||||
|       "state": 2, |       "state": 3, | ||||||
|       "string.": 7, |       "string.": 7, | ||||||
|       "alphabet": 3, |       "alphabet": 3, | ||||||
|       "cycle": 4, |       "cycle": 4, | ||||||
| @@ -37041,9 +37041,9 @@ | |||||||
|       "sub_string_search": 1, |       "sub_string_search": 1, | ||||||
|       "Index": 3, |       "Index": 3, | ||||||
|       "NewIndex": 2, |       "NewIndex": 2, | ||||||
|       "+": 122, |       "+": 125, | ||||||
|       "mod": 1, |       "mod": 1, | ||||||
|       "*": 1, |       "*": 18, | ||||||
|       "//": 1, |       "//": 1, | ||||||
|       "index_det": 1, |       "index_det": 1, | ||||||
|       "read_char": 1, |       "read_char": 1, | ||||||
| @@ -37051,18 +37051,353 @@ | |||||||
|       "error_message": 1, |       "error_message": 1, | ||||||
|       "stderr_stream": 1, |       "stderr_stream": 1, | ||||||
|       "nl": 1, |       "nl": 1, | ||||||
|  |       "store.": 1, | ||||||
|  |       "typeclass": 1, | ||||||
|  |       "store": 52, | ||||||
|  |       "T": 52, | ||||||
|  |       "where": 8, | ||||||
|  |       "[": 184, | ||||||
|  |       "]": 184, | ||||||
|  |       "type": 56, | ||||||
|  |       "S": 133, | ||||||
|  |       "instance": 4, | ||||||
|  |       "io.state": 3, | ||||||
|  |       "some": 4, | ||||||
|  |       "store.init": 2, | ||||||
|  |       "generic_mutvar": 15, | ||||||
|  |       "io_mutvar": 1, | ||||||
|  |       "store_mutvar": 1, | ||||||
|  |       "store.new_mutvar": 1, | ||||||
|  |       "det": 21, | ||||||
|  |       "<": 14, | ||||||
|  |       "store.copy_mutvar": 1, | ||||||
|  |       "store.get_mutvar": 1, | ||||||
|  |       "store.set_mutvar": 1, | ||||||
|  |       "<=>": 5, | ||||||
|  |       "new_cyclic_mutvar": 2, | ||||||
|  |       "Func": 4, | ||||||
|  |       "Mutvar": 23, | ||||||
|  |       "Create": 1, | ||||||
|  |       "new": 25, | ||||||
|  |       "mutable": 3, | ||||||
|  |       "variable": 1, | ||||||
|  |       "whose": 2, | ||||||
|  |       "value": 16, | ||||||
|  |       "initialized": 2, | ||||||
|  |       "with": 5, | ||||||
|  |       "returned": 1, | ||||||
|  |       "from": 1, | ||||||
|  |       "specified": 1, | ||||||
|  |       "function": 3, | ||||||
|  |       "The": 2, | ||||||
|  |       "argument": 6, | ||||||
|  |       "passed": 2, | ||||||
|  |       "mutvar": 6, | ||||||
|  |       "itself": 4, | ||||||
|  |       "has": 4, | ||||||
|  |       "yet": 1, | ||||||
|  |       "been": 1, | ||||||
|  |       "this": 4, | ||||||
|  |       "safe": 2, | ||||||
|  |       "because": 1, | ||||||
|  |       "does": 3, | ||||||
|  |       "get": 2, | ||||||
|  |       "so": 3, | ||||||
|  |       "it": 1, | ||||||
|  |       "can": 1, | ||||||
|  |       "t": 5, | ||||||
|  |       "examine": 1, | ||||||
|  |       "uninitialized": 1, | ||||||
|  |       "This": 2, | ||||||
|  |       "predicate": 1, | ||||||
|  |       "useful": 1, | ||||||
|  |       "for": 8, | ||||||
|  |       "creating": 1, | ||||||
|  |       "self": 1, | ||||||
|  |       "referential": 1, | ||||||
|  |       "values": 1, | ||||||
|  |       "such": 2, | ||||||
|  |       "as": 5, | ||||||
|  |       "circular": 1, | ||||||
|  |       "linked": 1, | ||||||
|  |       "lists": 1, | ||||||
|  |       "For": 1, | ||||||
|  |       "example": 1, | ||||||
|  |       "clist": 2, | ||||||
|  |       "node": 1, | ||||||
|  |       "store.new_cyclic_mutvar": 1, | ||||||
|  |       "func": 24, | ||||||
|  |       "generic_ref": 20, | ||||||
|  |       "io_ref": 1, | ||||||
|  |       "store_ref": 1, | ||||||
|  |       "store.new_ref": 1, | ||||||
|  |       "store.ref_functor": 1, | ||||||
|  |       "string": 114, | ||||||
|  |       "store.arg_ref": 1, | ||||||
|  |       "ArgT": 4, | ||||||
|  |       "store.new_arg_ref": 3, | ||||||
|  |       "store.set_ref": 1, | ||||||
|  |       "store.set_ref_value": 1, | ||||||
|  |       "store.copy_ref_value": 1, | ||||||
|  |       "store.extract_ref_value": 1, | ||||||
|  |       "Nasty": 1, | ||||||
|  |       "performance": 2, | ||||||
|  |       "hacks": 1, | ||||||
|  |       "WARNING": 1, | ||||||
|  |       "use": 1, | ||||||
|  |       "of": 10, | ||||||
|  |       "these": 1, | ||||||
|  |       "procedures": 2, | ||||||
|  |       "dangerous": 1, | ||||||
|  |       "Use": 1, | ||||||
|  |       "them": 1, | ||||||
|  |       "only": 4, | ||||||
|  |       "last": 1, | ||||||
|  |       "resort": 1, | ||||||
|  |       "critical": 1, | ||||||
|  |       "and": 6, | ||||||
|  |       "profiling": 5, | ||||||
|  |       "shows": 1, | ||||||
|  |       "that": 2, | ||||||
|  |       "using": 1, | ||||||
|  |       "versions": 1, | ||||||
|  |       "bottleneck": 1, | ||||||
|  |       "These": 1, | ||||||
|  |       "may": 1, | ||||||
|  |       "vanish": 1, | ||||||
|  |       "future": 1, | ||||||
|  |       "version": 3, | ||||||
|  |       "Mercury": 1, | ||||||
|  |       "unsafe_arg_ref": 1, | ||||||
|  |       "same": 2, | ||||||
|  |       "arg_ref": 12, | ||||||
|  |       "unsafe_new_arg_ref": 1, | ||||||
|  |       "new_arg_ref": 1, | ||||||
|  |       "except": 1, | ||||||
|  |       "they": 4, | ||||||
|  |       "doesn": 1, | ||||||
|  |       "check": 1, | ||||||
|  |       "errors": 1, | ||||||
|  |       "don": 3, | ||||||
|  |       "work": 3, | ||||||
|  |       "no_tag": 1, | ||||||
|  |       "types": 3, | ||||||
|  |       "exactly": 2, | ||||||
|  |       "one": 2, | ||||||
|  |       "functor": 2, | ||||||
|  |       "which": 2, | ||||||
|  |       "arguments": 2, | ||||||
|  |       "occupy": 1, | ||||||
|  |       "word": 2, | ||||||
|  |       "other": 1, | ||||||
|  |       "functors.": 1, | ||||||
|  |       "store.unsafe_arg_ref": 1, | ||||||
|  |       "store.unsafe_new_arg_ref": 1, | ||||||
|  |       "implementation": 1, | ||||||
|  |       "deconstruct": 2, | ||||||
|  |       "require": 1, | ||||||
|  |       "just": 1, | ||||||
|  |       "dummy": 2, | ||||||
|  |       "no": 365, | ||||||
|  |       "real": 1, | ||||||
|  |       "representation": 1, | ||||||
|  |       "pragma": 41, | ||||||
|  |       "foreign_type": 10, | ||||||
|  |       "C": 24, | ||||||
|  |       "MR_Word": 24, | ||||||
|  |       "can_pass_as_mercury_type": 5, | ||||||
|  |       "equality": 5, | ||||||
|  |       "store_equal": 7, | ||||||
|  |       "comparison": 5, | ||||||
|  |       "store_compare": 7, | ||||||
|  |       "IL": 2, | ||||||
|  |       "int32": 1, | ||||||
|  |       "Java": 12, | ||||||
|  |       "Erlang": 3, | ||||||
|  |       "semidet": 2, | ||||||
|  |       "_": 149, | ||||||
|  |       "attempt": 2, | ||||||
|  |       "unify": 21, | ||||||
|  |       "two": 2, | ||||||
|  |       "stores": 2, | ||||||
|  |       "comparison_result": 1, | ||||||
|  |       "compare": 1, | ||||||
|  |       "Mutvars": 1, | ||||||
|  |       "references": 1, | ||||||
|  |       "are": 1, | ||||||
|  |       "each": 1, | ||||||
|  |       "represented": 1, | ||||||
|  |       "pointer": 1, | ||||||
|  |       "single": 1, | ||||||
|  |       "on": 1, | ||||||
|  |       "heap": 1, | ||||||
|  |       "private_builtin.ref": 2, | ||||||
|  |       "ref": 2, | ||||||
|  |       "store.do_init": 6, | ||||||
|  |       "foreign_proc": 28, | ||||||
|  |       "_S0": 16, | ||||||
|  |       "will_not_call_mercury": 28, | ||||||
|  |       "promise_pure": 30, | ||||||
|  |       "will_not_modify_trail": 7, | ||||||
|  |       "new_mutvar": 5, | ||||||
|  |       "Val": 45, | ||||||
|  |       "S0": 23, | ||||||
|  |       "get_mutvar": 5, | ||||||
|  |       "set_mutvar": 5, | ||||||
|  |       "_S": 12, | ||||||
|  |       "copy_mutvar": 1, | ||||||
|  |       "Copy": 2, | ||||||
|  |       "Value": 4, | ||||||
|  |       "store.unsafe_new_uninitialized_mutvar": 1, | ||||||
|  |       "unsafe_new_uninitialized_mutvar": 4, | ||||||
|  |       "MR_offset_incr_hp_msg": 5, | ||||||
|  |       "MR_SIZE_SLOT_SIZE": 10, | ||||||
|  |       "1": 5, | ||||||
|  |       "MR_ALLOC_ID": 5, | ||||||
|  |       "2": 2, | ||||||
|  |       "MR_define_size_slot": 5, | ||||||
|  |       "0": 2, | ||||||
|  |       "object": 21, | ||||||
|  |       "MutVar": 4, | ||||||
|  |       "Store": 5, | ||||||
|  |       "apply": 1, | ||||||
|  |       "Ref": 41, | ||||||
|  |       "foreign_code": 2, | ||||||
|  |       "public": 17, | ||||||
|  |       "class": 4, | ||||||
|  |       "Object": 9, | ||||||
|  |       "referenced": 4, | ||||||
|  |       "obj": 7, | ||||||
|  |       "Specific": 2, | ||||||
|  |       "field": 20, | ||||||
|  |       "or": 2, | ||||||
|  |       "null": 8, | ||||||
|  |       "specify": 2, | ||||||
|  |       "XXX": 3, | ||||||
|  |       "GetFields": 2, | ||||||
|  |       "return": 6, | ||||||
|  |       "fields": 3, | ||||||
|  |       "any": 2, | ||||||
|  |       "particular": 2, | ||||||
|  |       "order": 2, | ||||||
|  |       "really": 2, | ||||||
|  |       "usable": 2, | ||||||
|  |       "System": 1, | ||||||
|  |       "Reflection": 1, | ||||||
|  |       "FieldInfo": 1, | ||||||
|  |       "Constructors": 2, | ||||||
|  |       "init": 8, | ||||||
|  |       "num": 8, | ||||||
|  |       "setField": 4, | ||||||
|  |       "Set": 2, | ||||||
|  |       "according": 2, | ||||||
|  |       "given": 2, | ||||||
|  |       "index": 2, | ||||||
|  |       "void": 4, | ||||||
|  |       "GetType": 1, | ||||||
|  |       "Return": 6, | ||||||
|  |       "reference": 4, | ||||||
|  |       "getValue": 4, | ||||||
|  |       "GetValue": 1, | ||||||
|  |       "Update": 2, | ||||||
|  |       "setValue": 2, | ||||||
|  |       "SetValue": 1, | ||||||
|  |       "java": 35, | ||||||
|  |       "static": 1, | ||||||
|  |       "lang": 28, | ||||||
|  |       "getDeclaredFields": 2, | ||||||
|  |       "reflect": 1, | ||||||
|  |       "Field": 5, | ||||||
|  |       "try": 3, | ||||||
|  |       "getClass": 1, | ||||||
|  |       "catch": 11, | ||||||
|  |       "SecurityException": 1, | ||||||
|  |       "se": 1, | ||||||
|  |       "throw": 11, | ||||||
|  |       "RuntimeException": 11, | ||||||
|  |       "Security": 1, | ||||||
|  |       "manager": 1, | ||||||
|  |       "denied": 1, | ||||||
|  |       "access": 3, | ||||||
|  |       "ArrayIndexOutOfBoundsException": 1, | ||||||
|  |       "e": 13, | ||||||
|  |       "No": 1, | ||||||
|  |       "Exception": 3, | ||||||
|  |       "Unable": 3, | ||||||
|  |       "set": 16, | ||||||
|  |       "getMessage": 3, | ||||||
|  |       "IllegalAccessException": 2, | ||||||
|  |       "inaccessible": 2, | ||||||
|  |       "IllegalArgumentException": 2, | ||||||
|  |       "mismatch": 2, | ||||||
|  |       "NullPointerException": 2, | ||||||
|  |       "new_ref": 4, | ||||||
|  |       "ets": 3, | ||||||
|  |       "insert": 1, | ||||||
|  |       "copy_ref_value": 1, | ||||||
|  |       "unsafe_ref_value": 6, | ||||||
|  |       "store.unsafe_ref_value": 1, | ||||||
|  |       "lookup": 1, | ||||||
|  |       "ref_functor": 1, | ||||||
|  |       "Functor": 6, | ||||||
|  |       "Arity": 5, | ||||||
|  |       "canonicalize": 1, | ||||||
|  |       "foreign_decl": 1, | ||||||
|  |       "include": 4, | ||||||
|  |       "mercury_type_info": 1, | ||||||
|  |       "h": 4, | ||||||
|  |       "mercury_heap": 1, | ||||||
|  |       "mercury_misc": 1, | ||||||
|  |       "MR_fatal_error": 5, | ||||||
|  |       "mercury_deconstruct": 1, | ||||||
|  |       "MR_arg": 3, | ||||||
|  |       "ArgNum": 7, | ||||||
|  |       "ArgRef": 22, | ||||||
|  |       "may_not_duplicate": 1, | ||||||
|  |       "MR_TypeInfo": 10, | ||||||
|  |       "type_info": 8, | ||||||
|  |       "arg_type_info": 6, | ||||||
|  |       "exp_arg_type_info": 6, | ||||||
|  |       "const": 10, | ||||||
|  |       "MR_DuArgLocn": 2, | ||||||
|  |       "arg_locn": 9, | ||||||
|  |       "TypeInfo_for_T": 2, | ||||||
|  |       "TypeInfo_for_ArgT": 2, | ||||||
|  |       "MR_save_transient_registers": 2, | ||||||
|  |       "MR_NONCANON_ABORT": 2, | ||||||
|  |       "number": 2, | ||||||
|  |       "range": 2, | ||||||
|  |       "MR_compare_type_info": 2, | ||||||
|  |       "MR_COMPARE_EQUAL": 2, | ||||||
|  |       "wrong": 2, | ||||||
|  |       "MR_restore_transient_registers": 2, | ||||||
|  |       "NULL": 2, | ||||||
|  |       "MR_arg_bits": 2, | ||||||
|  |       "store.ref/2": 3, | ||||||
|  |       "MR_arg_value": 2, | ||||||
|  |       "C#": 6, | ||||||
|  |       "store.Ref": 8, | ||||||
|  |       "Ref.getValue": 6, | ||||||
|  |       "*arg_ref": 1, | ||||||
|  |       "*arg_locn": 1, | ||||||
|  |       "&": 7, | ||||||
|  |       "&&": 1, | ||||||
|  |       "ValRef": 1, | ||||||
|  |       "Ref.setValue": 3, | ||||||
|  |       "ValRef.getValue": 2, | ||||||
|  |       "*Ptr": 2, | ||||||
|  |       "Ptr": 4, | ||||||
|  |       "MR_strip_tag": 2, | ||||||
|  |       "Arg": 6, | ||||||
|       "rot13_ralph.": 1, |       "rot13_ralph.": 1, | ||||||
|       "io__read_byte": 1, |       "io__read_byte": 1, | ||||||
|       "Result": 4, |       "Result": 4, | ||||||
|       "X": 9, |       "X": 9, | ||||||
|       "io__write_byte": 1, |       "io__write_byte": 1, | ||||||
|       "ErrNo": 2, |       "ErrNo": 2, | ||||||
|       "func": 23, |  | ||||||
|       "int.": 4, |       "int.": 4, | ||||||
|       "z": 1, |       "z": 1, | ||||||
|       "Rot13": 2, |       "Rot13": 2, | ||||||
|       "<": 2, |  | ||||||
|       "C": 6, |  | ||||||
|       "rem": 1, |       "rem": 1, | ||||||
|       "check_hlds.polymorphism.": 1, |       "check_hlds.polymorphism.": 1, | ||||||
|       "hlds.": 1, |       "hlds.": 1, | ||||||
| @@ -37101,7 +37436,6 @@ | |||||||
|       "polymorphism_make_type_info_vars": 1, |       "polymorphism_make_type_info_vars": 1, | ||||||
|       "term.context": 3, |       "term.context": 3, | ||||||
|       "polymorphism_make_type_info_var": 1, |       "polymorphism_make_type_info_var": 1, | ||||||
|       "type": 41, |  | ||||||
|       "int_or_var": 2, |       "int_or_var": 2, | ||||||
|       "iov_int": 1, |       "iov_int": 1, | ||||||
|       "iov_var": 1, |       "iov_var": 1, | ||||||
| @@ -37134,7 +37468,6 @@ | |||||||
|       "type_ctor": 1, |       "type_ctor": 1, | ||||||
|       "cons_id": 2, |       "cons_id": 2, | ||||||
|       "type_info_kind": 2, |       "type_info_kind": 2, | ||||||
|       "type_info": 2, |  | ||||||
|       "type_ctor_info.": 1, |       "type_ctor_info.": 1, | ||||||
|       "new_type_info_var_raw": 1, |       "new_type_info_var_raw": 1, | ||||||
|       "check_hlds.clause_to_proc.": 1, |       "check_hlds.clause_to_proc.": 1, | ||||||
| @@ -37192,8 +37525,6 @@ | |||||||
|       "pred_info_orig_arity": 3, |       "pred_info_orig_arity": 3, | ||||||
|       "no_type_info_builtin": 3, |       "no_type_info_builtin": 3, | ||||||
|       "copy_module_clauses_to_procs": 1, |       "copy_module_clauses_to_procs": 1, | ||||||
|       "[": 163, |  | ||||||
|       "]": 163, |  | ||||||
|       "polymorphism_process_pred_msg": 3, |       "polymorphism_process_pred_msg": 3, | ||||||
|       "PredTable0": 3, |       "PredTable0": 3, | ||||||
|       "map.lookup": 2, |       "map.lookup": 2, | ||||||
| @@ -37216,7 +37547,6 @@ | |||||||
|       "ArgTypes": 6, |       "ArgTypes": 6, | ||||||
|       "pred_info_set_arg_types": 1, |       "pred_info_set_arg_types": 1, | ||||||
|       "PredInfo1": 5, |       "PredInfo1": 5, | ||||||
|       "_": 144, |  | ||||||
|       "|": 28, |       "|": 28, | ||||||
|       "OldHeadVarTypes": 2, |       "OldHeadVarTypes": 2, | ||||||
|       "type_list_subsumes": 2, |       "type_list_subsumes": 2, | ||||||
| @@ -37234,7 +37564,6 @@ | |||||||
|       "map.map_values_only": 1, |       "map.map_values_only": 1, | ||||||
|       ".ProcInfo": 2, |       ".ProcInfo": 2, | ||||||
|       "ProcInfo": 43, |       "ProcInfo": 43, | ||||||
|       "det": 3, |  | ||||||
|       "introduce_exists_casts_proc": 1, |       "introduce_exists_casts_proc": 1, | ||||||
|       "Procs": 4, |       "Procs": 4, | ||||||
|       "pred_info_set_procedures": 2, |       "pred_info_set_procedures": 2, | ||||||
| @@ -37243,14 +37572,11 @@ | |||||||
|       "flag": 4, |       "flag": 4, | ||||||
|       "write_pred_progress_message": 1, |       "write_pred_progress_message": 1, | ||||||
|       "polymorphism_process_pred": 4, |       "polymorphism_process_pred": 4, | ||||||
|       "mutable": 2, |  | ||||||
|       "selected_pred": 1, |       "selected_pred": 1, | ||||||
|       "bool": 406, |       "bool": 406, | ||||||
|       "no": 364, |  | ||||||
|       "ground": 9, |       "ground": 9, | ||||||
|       "untrailed": 2, |       "untrailed": 2, | ||||||
|       "level": 1, |       "level": 1, | ||||||
|       "promise_pure": 2, |  | ||||||
|       "pred_id_to_int": 1, |       "pred_id_to_int": 1, | ||||||
|       "impure": 2, |       "impure": 2, | ||||||
|       "set_selected_pred": 2, |       "set_selected_pred": 2, | ||||||
| @@ -37306,8 +37632,6 @@ | |||||||
|       "ClausesRep": 2, |       "ClausesRep": 2, | ||||||
|       "map.init": 7, |       "map.init": 7, | ||||||
|       "TVarNameMap": 2, |       "TVarNameMap": 2, | ||||||
|       "This": 1, |  | ||||||
|       "only": 1, |  | ||||||
|       "used": 2, |       "used": 2, | ||||||
|       "while": 1, |       "while": 1, | ||||||
|       "adding": 1, |       "adding": 1, | ||||||
| @@ -37452,7 +37776,6 @@ | |||||||
|       "poly_arg_vector_set_exist_type_infos": 1, |       "poly_arg_vector_set_exist_type_infos": 1, | ||||||
|       "poly_arg_vector_set_univ_typeclass_infos": 1, |       "poly_arg_vector_set_univ_typeclass_infos": 1, | ||||||
|       "poly_arg_vector_set_exist_typeclass_infos": 1, |       "poly_arg_vector_set_exist_typeclass_infos": 1, | ||||||
|       "some": 1, |  | ||||||
|       "ToLocn": 4, |       "ToLocn": 4, | ||||||
|       "TheVar": 2, |       "TheVar": 2, | ||||||
|       "TheLocn": 2, |       "TheLocn": 2, | ||||||
| @@ -37525,7 +37848,6 @@ | |||||||
|       "Call": 4, |       "Call": 4, | ||||||
|       "call_foreign_proc": 4, |       "call_foreign_proc": 4, | ||||||
|       "polymorphism_process_foreign_proc": 3, |       "polymorphism_process_foreign_proc": 3, | ||||||
|       "unify": 20, |  | ||||||
|       "XVar": 11, |       "XVar": 11, | ||||||
|       "Y": 9, |       "Y": 9, | ||||||
|       "Mode": 12, |       "Mode": 12, | ||||||
| @@ -37688,14 +38010,12 @@ | |||||||
|       ".Unification": 5, |       ".Unification": 5, | ||||||
|       "complicated_unify": 2, |       "complicated_unify": 2, | ||||||
|       "construct": 1, |       "construct": 1, | ||||||
|       "deconstruct": 1, |  | ||||||
|       "assign": 46, |       "assign": 46, | ||||||
|       "simple_test": 1, |       "simple_test": 1, | ||||||
|       "X0": 8, |       "X0": 8, | ||||||
|       "ConsId0": 5, |       "ConsId0": 5, | ||||||
|       "Mode0": 4, |       "Mode0": 4, | ||||||
|       "TypeOfX": 6, |       "TypeOfX": 6, | ||||||
|       "Arity": 3, |  | ||||||
|       "closure_cons": 1, |       "closure_cons": 1, | ||||||
|       "ShroudedPredProcId": 2, |       "ShroudedPredProcId": 2, | ||||||
|       "proc": 2, |       "proc": 2, | ||||||
| @@ -37722,7 +38042,6 @@ | |||||||
|       "UnifyExpr": 2, |       "UnifyExpr": 2, | ||||||
|       "Unify": 2, |       "Unify": 2, | ||||||
|       "PredArgTypes": 10, |       "PredArgTypes": 10, | ||||||
|       "Functor": 4, |  | ||||||
|       "create_fresh_vars": 5, |       "create_fresh_vars": 5, | ||||||
|       "module_info_pred_proc_info": 4, |       "module_info_pred_proc_info": 4, | ||||||
|       "QualifiedPName": 5, |       "QualifiedPName": 5, | ||||||
| @@ -37852,7 +38171,6 @@ | |||||||
|       "UnivTypeClassArgInfos": 2, |       "UnivTypeClassArgInfos": 2, | ||||||
|       "TypeClassArgInfos": 2, |       "TypeClassArgInfos": 2, | ||||||
|       "list.filter": 1, |       "list.filter": 1, | ||||||
|       "semidet": 1, |  | ||||||
|       "list.member": 2, |       "list.member": 2, | ||||||
|       "ExistUnconstrainedVars": 2, |       "ExistUnconstrainedVars": 2, | ||||||
|       "UnivUnconstrainedVars": 2, |       "UnivUnconstrainedVars": 2, | ||||||
| @@ -37869,7 +38187,6 @@ | |||||||
|       "make_foreign_args": 1, |       "make_foreign_args": 1, | ||||||
|       "tvarset": 3, |       "tvarset": 3, | ||||||
|       "pair": 7, |       "pair": 7, | ||||||
|       "string": 113, |  | ||||||
|       "box_policy": 2, |       "box_policy": 2, | ||||||
|       "Constraint": 2, |       "Constraint": 2, | ||||||
|       "MaybeArgName": 7, |       "MaybeArgName": 7, | ||||||
| @@ -37988,7 +38305,6 @@ | |||||||
|       "option_table": 5, |       "option_table": 5, | ||||||
|       "maybe_option_table": 3, |       "maybe_option_table": 3, | ||||||
|       "inconsequential_options": 1, |       "inconsequential_options": 1, | ||||||
|       "set": 13, |  | ||||||
|       "options_help": 1, |       "options_help": 1, | ||||||
|       "option_table_add_mercury_library_directory": 1, |       "option_table_add_mercury_library_directory": 1, | ||||||
|       "option_table.": 2, |       "option_table.": 2, | ||||||
| @@ -38073,7 +38389,6 @@ | |||||||
|       "deduction/deforestation": 1, |       "deduction/deforestation": 1, | ||||||
|       "debug_il_asm": 3, |       "debug_il_asm": 3, | ||||||
|       "il_asm": 1, |       "il_asm": 1, | ||||||
|       "IL": 1, |  | ||||||
|       "generation": 1, |       "generation": 1, | ||||||
|       "via": 1, |       "via": 1, | ||||||
|       "asm": 1, |       "asm": 1, | ||||||
| @@ -38180,7 +38495,6 @@ | |||||||
|       "il_only": 4, |       "il_only": 4, | ||||||
|       "compile_to_c": 4, |       "compile_to_c": 4, | ||||||
|       "c": 1, |       "c": 1, | ||||||
|       "java": 6, |  | ||||||
|       "java_only": 4, |       "java_only": 4, | ||||||
|       "csharp": 6, |       "csharp": 6, | ||||||
|       "csharp_only": 4, |       "csharp_only": 4, | ||||||
| @@ -38190,7 +38504,6 @@ | |||||||
|       "erlang_only": 4, |       "erlang_only": 4, | ||||||
|       "exec_trace": 3, |       "exec_trace": 3, | ||||||
|       "decl_debug": 3, |       "decl_debug": 3, | ||||||
|       "profiling": 4, |  | ||||||
|       "profile_time": 5, |       "profile_time": 5, | ||||||
|       "profile_calls": 6, |       "profile_calls": 6, | ||||||
|       "time_profiling": 3, |       "time_profiling": 3, | ||||||
| @@ -38465,7 +38778,6 @@ | |||||||
|       "common_data": 2, |       "common_data": 2, | ||||||
|       "common_layout_data": 2, |       "common_layout_data": 2, | ||||||
|       "Also": 1, |       "Also": 1, | ||||||
|       "for": 1, |  | ||||||
|       "MLDS": 2, |       "MLDS": 2, | ||||||
|       "optimizations.": 1, |       "optimizations.": 1, | ||||||
|       "optimize_peep": 2, |       "optimize_peep": 2, | ||||||
| @@ -38659,7 +38971,6 @@ | |||||||
|       "typecheck_ambiguity_warn_limit": 2, |       "typecheck_ambiguity_warn_limit": 2, | ||||||
|       "typecheck_ambiguity_error_limit": 2, |       "typecheck_ambiguity_error_limit": 2, | ||||||
|       "help": 4, |       "help": 4, | ||||||
|       "version": 2, |  | ||||||
|       "fullarch": 2, |       "fullarch": 2, | ||||||
|       "cross_compiling": 2, |       "cross_compiling": 2, | ||||||
|       "local_module_id": 2, |       "local_module_id": 2, | ||||||
| @@ -38696,7 +39007,6 @@ | |||||||
|       "OptionsList": 2, |       "OptionsList": 2, | ||||||
|       "multi.": 1, |       "multi.": 1, | ||||||
|       "bool_special": 7, |       "bool_special": 7, | ||||||
|       "XXX": 1, |  | ||||||
|       "should": 1, |       "should": 1, | ||||||
|       "be": 1, |       "be": 1, | ||||||
|       "accumulating": 49, |       "accumulating": 49, | ||||||
| @@ -38951,9 +39261,6 @@ | |||||||
|       "init_fail_info": 2, |       "init_fail_info": 2, | ||||||
|       "will": 1, |       "will": 1, | ||||||
|       "override": 1, |       "override": 1, | ||||||
|       "this": 1, |  | ||||||
|       "dummy": 1, |  | ||||||
|       "value": 1, |  | ||||||
|       "nested": 1, |       "nested": 1, | ||||||
|       "conjunction": 1, |       "conjunction": 1, | ||||||
|       "depth": 1, |       "depth": 1, | ||||||
| @@ -39176,7 +39483,6 @@ | |||||||
|       "internal_layout_info": 6, |       "internal_layout_info": 6, | ||||||
|       "Exec0": 3, |       "Exec0": 3, | ||||||
|       "Resume": 5, |       "Resume": 5, | ||||||
|       "Return": 4, |  | ||||||
|       "Internal": 8, |       "Internal": 8, | ||||||
|       "Internals": 6, |       "Internals": 6, | ||||||
|       "map.det_insert": 3, |       "map.det_insert": 3, | ||||||
| @@ -39395,7 +39701,6 @@ | |||||||
|       "pick_stack_resume_point": 3, |       "pick_stack_resume_point": 3, | ||||||
|       "StackLabel": 9, |       "StackLabel": 9, | ||||||
|       "LabelConst": 4, |       "LabelConst": 4, | ||||||
|       "const": 8, |  | ||||||
|       "llconst_code_addr": 6, |       "llconst_code_addr": 6, | ||||||
|       "ite_region_info": 5, |       "ite_region_info": 5, | ||||||
|       "ite_info": 3, |       "ite_info": 3, | ||||||
| @@ -51655,7 +51960,7 @@ | |||||||
|     "RMarkdown": 19, |     "RMarkdown": 19, | ||||||
|     "Stylus": 76, |     "Stylus": 76, | ||||||
|     "Bluespec": 1298, |     "Bluespec": 1298, | ||||||
|     "Mercury": 27385, |     "Mercury": 30628, | ||||||
|     "Erlang": 2928, |     "Erlang": 2928, | ||||||
|     "NSIS": 725, |     "NSIS": 725, | ||||||
|     "Arduino": 20, |     "Arduino": 20, | ||||||
| @@ -51803,7 +52108,7 @@ | |||||||
|     "RMarkdown": 1, |     "RMarkdown": 1, | ||||||
|     "Stylus": 1, |     "Stylus": 1, | ||||||
|     "Bluespec": 2, |     "Bluespec": 2, | ||||||
|     "Mercury": 7, |     "Mercury": 8, | ||||||
|     "Erlang": 5, |     "Erlang": 5, | ||||||
|     "NSIS": 2, |     "NSIS": 2, | ||||||
|     "Arduino": 1, |     "Arduino": 1, | ||||||
| @@ -51850,5 +52155,5 @@ | |||||||
|     "Protocol Buffer": 1, |     "Protocol Buffer": 1, | ||||||
|     "Scheme": 2 |     "Scheme": 2 | ||||||
|   }, |   }, | ||||||
|   "md5": "5277eee29d26cba1c645879dc518c0b9" |   "md5": "1c540f92a03ec13cf822b38473b5a4ff" | ||||||
| } | } | ||||||
							
								
								
									
										930
									
								
								samples/Mercury/store.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										930
									
								
								samples/Mercury/store.m
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,930 @@ | |||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | % vim: ft=mercury ts=4 sw=4 et wm=0 tw=0 | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | % Copyright (C) 1994-1997, 2000-2008, 2010-2011 The University of Melbourne. | ||||||
|  | % This file may only be copied under the terms of the GNU Library General | ||||||
|  | % Public License - see the file COPYING.LIB in the Mercury distribution. | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | %  | ||||||
|  | % File: store.m. | ||||||
|  | % Main author: fjh. | ||||||
|  | % Stability: low. | ||||||
|  | %  | ||||||
|  | % This file provides facilities for manipulating mutable stores. | ||||||
|  | % A store can be considered a mapping from abstract keys to their values. | ||||||
|  | % A store holds a set of nodes, each of which may contain a value of any | ||||||
|  | % type. | ||||||
|  | % | ||||||
|  | % Stores may be used to implement cyclic data structures such as circular | ||||||
|  | % linked lists, etc. | ||||||
|  | % | ||||||
|  | % Stores can have two different sorts of keys: | ||||||
|  | % mutable variables (mutvars) and references (refs). | ||||||
|  | % The difference between mutvars and refs is that mutvars can only be updated | ||||||
|  | % atomically, whereas it is possible to update individual fields of a | ||||||
|  | % reference one at a time (presuming the reference refers to a structured | ||||||
|  | % term). | ||||||
|  | %  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  |  | ||||||
|  | :- module store. | ||||||
|  | :- interface. | ||||||
|  |  | ||||||
|  | :- import_module io. | ||||||
|  |  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  |  | ||||||
|  |     % Stores and keys are indexed by a type S of typeclass store(S) that | ||||||
|  |     % is used to distinguish between different stores.  By using an | ||||||
|  |     % existential type declaration for store.new (see below), we use the | ||||||
|  |     % type system to ensure at compile time that you never attempt to use | ||||||
|  |     % a key from one store to access a different store. | ||||||
|  |     % | ||||||
|  | :- typeclass store(T) where []. | ||||||
|  | :- type store(S). | ||||||
|  |  | ||||||
|  | :- instance store(io.state). | ||||||
|  | :- instance store(store(S)). | ||||||
|  |  | ||||||
|  |     % Initialize a new store. | ||||||
|  |     % | ||||||
|  | :- some [S] pred store.init(store(S)::uo) is det. | ||||||
|  |  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | % | ||||||
|  | % Mutvars | ||||||
|  | % | ||||||
|  |  | ||||||
|  |     % generic_mutvar(T, S): | ||||||
|  |     % A mutable variable holding a value of type T in store S. | ||||||
|  |     % | ||||||
|  | :- type generic_mutvar(T, S). | ||||||
|  | :- type io_mutvar(T) == generic_mutvar(T, io.state). | ||||||
|  | :- type store_mutvar(T, S) == generic_mutvar(T, store(S)). | ||||||
|  |  | ||||||
|  |     % Create a new mutable variable, initialized with the specified value. | ||||||
|  |     % | ||||||
|  | :- pred store.new_mutvar(T::in, generic_mutvar(T, S)::out, S::di, S::uo) | ||||||
|  |     is det <= store(S). | ||||||
|  |  | ||||||
|  |     % copy_mutvar(OldMutvar, NewMutvar, S0, S) is equivalent to the sequence | ||||||
|  |     %   get_mutvar(OldMutvar, Value, S0, S1), | ||||||
|  |     %   new_mutvar(NewMutvar, Value, S1, S ) | ||||||
|  |     % | ||||||
|  | :- pred store.copy_mutvar(generic_mutvar(T, S)::in, generic_mutvar(T, S)::out, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % Lookup the value stored in a given mutable variable. | ||||||
|  |     % | ||||||
|  | :- pred store.get_mutvar(generic_mutvar(T, S)::in, T::out, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % Replace the value stored in a given mutable variable. | ||||||
|  |     % | ||||||
|  | :- pred store.set_mutvar(generic_mutvar(T, S)::in, T::in, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % new_cyclic_mutvar(Func, Mutvar): | ||||||
|  |     % | ||||||
|  |     % Create a new mutable variable, whose value is initialized | ||||||
|  |     % with the value returned from the specified function `Func'. | ||||||
|  |     % The argument passed to the function is the mutvar itself, | ||||||
|  |     % whose value has not yet been initialized (this is safe | ||||||
|  |     % because the function does not get passed the store, so | ||||||
|  |     % it can't examine the uninitialized value). | ||||||
|  |     % | ||||||
|  |     % This predicate is useful for creating self-referential values | ||||||
|  |     % such as circular linked lists. | ||||||
|  |     % For example: | ||||||
|  |     % | ||||||
|  |     %   :- type clist(T, S) ---> node(T, mutvar(clist(T, S))). | ||||||
|  |     % | ||||||
|  |     %   :- pred init_cl(T::in, clist(T, S)::out, | ||||||
|  |     %       store(S)::di, store(S)::uo) is det. | ||||||
|  |     % | ||||||
|  |     %   init_cl(X, CList, !Store) :- | ||||||
|  |     %       store.new_cyclic_mutvar(func(CL) = node(X, CL), CList, | ||||||
|  |     %       !Store). | ||||||
|  |     % | ||||||
|  | :- pred store.new_cyclic_mutvar((func(generic_mutvar(T, S)) = T)::in, | ||||||
|  |     generic_mutvar(T, S)::out, S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | % | ||||||
|  | % References | ||||||
|  | % | ||||||
|  |  | ||||||
|  |     % generic_ref(T, S): | ||||||
|  |     % | ||||||
|  |     % A reference to value of type T in store S. | ||||||
|  |     % | ||||||
|  | :- type generic_ref(T, S). | ||||||
|  | :- type io_ref(T, S) == generic_ref(T, io.state). | ||||||
|  | :- type store_ref(T, S) == generic_ref(T, store(S)). | ||||||
|  |  | ||||||
|  |     % new_ref(Val, Ref): | ||||||
|  |     %   /* In C: Ref = malloc(...); *Ref = Val; */ | ||||||
|  |     % | ||||||
|  |     % Given a value of any type `T', insert a copy of the term | ||||||
|  |     % into the store and return a new reference to that term. | ||||||
|  |     % (This does not actually perform a copy, it just returns a view | ||||||
|  |     % of the representation of that value. | ||||||
|  |     % It does however allocate one cell to hold the reference; | ||||||
|  |     % you can use new_arg_ref to avoid that.) | ||||||
|  |     % | ||||||
|  | :- pred store.new_ref(T::di, generic_ref(T, S)::out, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % ref_functor(Ref, Functor, Arity): | ||||||
|  |     % | ||||||
|  |     % Given a reference to a term, return the functor and arity | ||||||
|  |     % of that term. | ||||||
|  |     % | ||||||
|  | :- pred store.ref_functor(generic_ref(T, S)::in, string::out, int::out, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % arg_ref(Ref, ArgNum, ArgRef): | ||||||
|  |     %   /* Pseudo-C code: ArgRef = &Ref[ArgNum]; */ | ||||||
|  |     % | ||||||
|  |     % Given a reference to a term, return a reference to | ||||||
|  |     % the specified argument (field) of that term | ||||||
|  |     % (argument numbers start from zero). | ||||||
|  |     % It is an error if the argument number is out of range, | ||||||
|  |     % or if the argument reference has the wrong type. | ||||||
|  |     % | ||||||
|  | :- pred store.arg_ref(generic_ref(T, S)::in, int::in, | ||||||
|  |     generic_ref(ArgT, S)::out, S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % new_arg_ref(Val, ArgNum, ArgRef): | ||||||
|  |     %   /* Pseudo-C code: ArgRef = &Val[ArgNum]; */ | ||||||
|  |     % | ||||||
|  |     % Equivalent to `new_ref(Val, Ref), arg_ref(Ref, ArgNum, ArgRef)', | ||||||
|  |     % except that it is more efficient. | ||||||
|  |     % It is an error if the argument number is out of range, | ||||||
|  |     % or if the argument reference has the wrong type. | ||||||
|  |     % | ||||||
|  | :- pred store.new_arg_ref(T::di, int::in, generic_ref(ArgT, S)::out, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % set_ref(Ref, ValueRef): | ||||||
|  |     %   /* Pseudo-C code: *Ref = *ValueRef; */ | ||||||
|  |     % | ||||||
|  |     % Given a reference to a term (Ref), | ||||||
|  |     % a reference to another term (ValueRef), | ||||||
|  |     % update the store so that the term referred to by Ref | ||||||
|  |     % is replaced with the term referenced by ValueRef. | ||||||
|  |     % | ||||||
|  | :- pred store.set_ref(generic_ref(T, S)::in, generic_ref(T, S)::in, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % set_ref_value(Ref, Value): | ||||||
|  |     %   /* Pseudo-C code: *Ref = Value; */ | ||||||
|  |     % | ||||||
|  |     % Given a reference to a term (Ref), and a value (Value), | ||||||
|  |     % update the store so that the term referred to by Ref | ||||||
|  |     % is replaced with Value. | ||||||
|  |     % | ||||||
|  | :- pred store.set_ref_value(generic_ref(T, S)::in, T::di, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % Given a reference to a term, return that term. | ||||||
|  |     % Note that this requires making a copy, so this pred may | ||||||
|  |     % be inefficient if used to return large terms; it | ||||||
|  |     % is most efficient with atomic terms. | ||||||
|  |     % XXX current implementation buggy (does shallow copy) | ||||||
|  |     % | ||||||
|  | :- pred store.copy_ref_value(generic_ref(T, S)::in, T::uo, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  |     % Same as above, but without making a copy. Destroys the store. | ||||||
|  |     % | ||||||
|  | :- pred store.extract_ref_value(S::di, generic_ref(T, S)::in, T::out) | ||||||
|  |     is det <= store(S). | ||||||
|  |  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | % | ||||||
|  | % Nasty performance hacks | ||||||
|  | % | ||||||
|  | % WARNING: use of these procedures is dangerous! | ||||||
|  | % Use them only as a last resort, only if performance is critical, and only if | ||||||
|  | % profiling shows that using the safe versions is a bottleneck. | ||||||
|  | % | ||||||
|  | % These procedures may vanish in some future version of Mercury. | ||||||
|  |  | ||||||
|  |     % `unsafe_arg_ref' is the same as `arg_ref', | ||||||
|  |     % and `unsafe_new_arg_ref' is the same as `new_arg_ref' | ||||||
|  |     % except that they doesn't check for errors, | ||||||
|  |     % and they don't work for `no_tag' types (types with | ||||||
|  |     % exactly one functor which has exactly one argument), | ||||||
|  |     % and they don't work for arguments which occupy a word with other | ||||||
|  |     % arguments, | ||||||
|  |     % and they don't work for types with >4 functors. | ||||||
|  |     % If the argument number is out of range, | ||||||
|  |     % or if the argument reference has the wrong type, | ||||||
|  |     % or if the argument is a `no_tag' type, | ||||||
|  |     % or if the argument uses a packed representation, | ||||||
|  |     % then the behaviour is undefined, and probably harmful. | ||||||
|  |  | ||||||
|  | :- pred store.unsafe_arg_ref(generic_ref(T, S)::in, int::in, | ||||||
|  |     generic_ref(ArgT, S)::out, S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  | :- pred store.unsafe_new_arg_ref(T::di, int::in, generic_ref(ArgT, S)::out, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  |  | ||||||
|  | :- implementation. | ||||||
|  |  | ||||||
|  | :- import_module deconstruct. | ||||||
|  | :- import_module require. | ||||||
|  |  | ||||||
|  | :- instance store(store(S)) where []. | ||||||
|  | :- instance store(io.state) where []. | ||||||
|  |  | ||||||
|  | % The store type itself is just a dummy type, | ||||||
|  | % with no real representation. | ||||||
|  |  | ||||||
|  | :- type store(S). | ||||||
|  | :- pragma foreign_type("C", store(S), "MR_Word", [can_pass_as_mercury_type]) | ||||||
|  |     where equality is store_equal, comparison is store_compare. | ||||||
|  | :- pragma foreign_type("IL", store(S), "int32", [can_pass_as_mercury_type]) | ||||||
|  |     where equality is store_equal, comparison is store_compare. | ||||||
|  | :- pragma foreign_type("C#", store(S), "int", [can_pass_as_mercury_type]) | ||||||
|  |     where equality is store_equal, comparison is store_compare. | ||||||
|  | :- pragma foreign_type("Java", store(S), "int", [can_pass_as_mercury_type]) | ||||||
|  |     where equality is store_equal, comparison is store_compare. | ||||||
|  | :- pragma foreign_type("Erlang", store(S), "", [can_pass_as_mercury_type]) | ||||||
|  |     where equality is store_equal, comparison is store_compare. | ||||||
|  |  | ||||||
|  | :- pred store_equal(store(S)::in, store(S)::in) is semidet. | ||||||
|  |  | ||||||
|  | store_equal(_, _) :- | ||||||
|  |     error("attempt to unify two stores"). | ||||||
|  |  | ||||||
|  | :- pred store_compare(comparison_result::uo, store(S)::in, store(S)::in) | ||||||
|  |     is det. | ||||||
|  |  | ||||||
|  | store_compare(_, _, _) :- | ||||||
|  |     error("attempt to compare two stores"). | ||||||
|  |  | ||||||
|  |     % Mutvars and references are each represented as a pointer to a single word | ||||||
|  |     % on the heap. | ||||||
|  | :- type generic_mutvar(T, S) ---> mutvar(private_builtin.ref(T)). | ||||||
|  | :- type generic_ref(T, S) ---> ref(private_builtin.ref(T)). | ||||||
|  |  | ||||||
|  | store.init(S) :- | ||||||
|  |     store.do_init(S). | ||||||
|  |  | ||||||
|  | :- some [S] pred store.do_init(store(S)::uo) is det. | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     store.do_init(_S0::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, will_not_modify_trail], | ||||||
|  | " | ||||||
|  |     TypeInfo_for_S = 0; | ||||||
|  | "). | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     store.do_init(_S0::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     TypeInfo_for_S = null; | ||||||
|  | "). | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     store.do_init(_S0::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     TypeInfo_for_S = null; | ||||||
|  | "). | ||||||
|  | :- pragma foreign_proc("Erlang", | ||||||
|  |     store.do_init(_S0::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     TypeInfo_for_S = 'XXX' | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | % Note -- the syntax for the operations on stores | ||||||
|  | % might be nicer if we used some new operators, e.g. | ||||||
|  | % | ||||||
|  | %   :- op(.., xfx, ('<-')). | ||||||
|  | %   :- op(.., fy, ('!')). | ||||||
|  | %   :- op(.., xfx, (':=')). | ||||||
|  | % | ||||||
|  | % Then we could do something like this: | ||||||
|  | % | ||||||
|  | %   Ptr <- new(Val)   -->   new_mutvar(Val, Ptr). | ||||||
|  | %   Val <- !Ptr       -->   get_mutvar(Ptr, Val). | ||||||
|  | %   !Ptr := Val   -->   set_mutvar(Ptr, Val). | ||||||
|  | % | ||||||
|  | % I wonder whether it is worth it?  Hmm, probably not. | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     new_mutvar(Val::in, Mutvar::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, will_not_modify_trail], | ||||||
|  | " | ||||||
|  |     MR_offset_incr_hp_msg(Mutvar, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1, | ||||||
|  |         MR_ALLOC_ID, ""store.mutvar/2""); | ||||||
|  |     MR_define_size_slot(0, Mutvar, 1); | ||||||
|  |     * (MR_Word *) Mutvar = Val; | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     get_mutvar(Mutvar::in, Val::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, will_not_modify_trail], | ||||||
|  | " | ||||||
|  |     Val = * (MR_Word *) Mutvar; | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     set_mutvar(Mutvar::in, Val::in, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, will_not_modify_trail], | ||||||
|  | " | ||||||
|  |     * (MR_Word *) Mutvar = Val; | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_type("C#", generic_mutvar(T, S), "object[]"). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     new_mutvar(Val::in, Mutvar::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Mutvar = new object[] { Val }; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     get_mutvar(Mutvar::in, Val::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Val = Mutvar[0]; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     set_mutvar(Mutvar::in, Val::in, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Mutvar[0] = Val; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_type("Java", generic_mutvar(T, S), "mutvar.Mutvar"). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     new_mutvar(Val::in, Mutvar::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Mutvar = new mutvar.Mutvar(Val); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     get_mutvar(Mutvar::in, Val::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Val = Mutvar.object; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     set_mutvar(Mutvar::in, Val::in, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Mutvar.object = Val; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | % XXX ets are not garbage collected | ||||||
|  | % but shareable between processes | ||||||
|  |  | ||||||
|  | :- pragma foreign_type("Erlang", generic_mutvar(T, S), ""). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Erlang", | ||||||
|  |     new_mutvar(Val::in, Mutvar::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Mutvar = ets:new(mutvar, [set, public]), | ||||||
|  |     ets:insert(Mutvar, {value, Val}), | ||||||
|  |     S = S0 | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Erlang", | ||||||
|  |     get_mutvar(Mutvar::in, Val::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     [{value, Val}] = ets:lookup(Mutvar, value), | ||||||
|  |     S = S0 | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Erlang", | ||||||
|  |     set_mutvar(Mutvar::in, Val::in, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     ets:insert(Mutvar, {value, Val}), | ||||||
|  |     S = S0 | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | copy_mutvar(Mutvar, Copy, !S) :- | ||||||
|  |     get_mutvar(Mutvar, Value, !S), | ||||||
|  |     new_mutvar(Value, Copy, !S). | ||||||
|  |  | ||||||
|  | :- pred store.unsafe_new_uninitialized_mutvar(generic_mutvar(T, S)::out, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     unsafe_new_uninitialized_mutvar(Mutvar::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, will_not_modify_trail], | ||||||
|  | " | ||||||
|  |     MR_offset_incr_hp_msg(Mutvar, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1, | ||||||
|  |         MR_ALLOC_ID, ""store.mutvar/2""); | ||||||
|  |     MR_define_size_slot(0, Mutvar, 1); | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     unsafe_new_uninitialized_mutvar(Mutvar::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Mutvar = new object[1]; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     unsafe_new_uninitialized_mutvar(Mutvar::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Mutvar = new mutvar.Mutvar(); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | store.new_cyclic_mutvar(Func, MutVar, !Store) :- | ||||||
|  |     store.unsafe_new_uninitialized_mutvar(MutVar, !Store), | ||||||
|  |     Value = apply(Func, MutVar), | ||||||
|  |     store.set_mutvar(MutVar, Value, !Store). | ||||||
|  |  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  |  | ||||||
|  | :- pragma foreign_type("C#", generic_ref(T, S), "store.Ref"). | ||||||
|  | :- pragma foreign_code("C#", | ||||||
|  | " | ||||||
|  |     public class Ref { | ||||||
|  |         // Object referenced. | ||||||
|  |         public object   obj; | ||||||
|  |  | ||||||
|  |         // Specific field of object referenced, or null to | ||||||
|  |         // specify the object itself. | ||||||
|  |         // XXX GetFields does not return fields in any particular order so | ||||||
|  |         // this is not really usable. | ||||||
|  |         public System.Reflection.FieldInfo  field; | ||||||
|  |  | ||||||
|  |         // Constructors | ||||||
|  |         public Ref(object init) { | ||||||
|  |             obj     = init; | ||||||
|  |             field   = null; | ||||||
|  |         } | ||||||
|  |         public Ref(object init, int num) { | ||||||
|  |             obj = init; | ||||||
|  |             setField(num); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Set the field according to a given index. | ||||||
|  |         public void setField(int num) { | ||||||
|  |             field = obj.GetType().GetFields()[num]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Return the value of the reference. | ||||||
|  |         public object getValue() { | ||||||
|  |             if (field == null) { | ||||||
|  |                 return obj; | ||||||
|  |             } else { | ||||||
|  |                 return field.GetValue(obj); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Update the value of the reference. | ||||||
|  |         public void setValue(object value) { | ||||||
|  |             field.SetValue(obj, value); | ||||||
|  |         } | ||||||
|  |     } // class Ref | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_type(java, generic_ref(T, S), "store.Ref"). | ||||||
|  | :- pragma foreign_code("Java", | ||||||
|  | " | ||||||
|  |     public static class Ref { | ||||||
|  |         // Object referenced. | ||||||
|  |         public java.lang.Object         object; | ||||||
|  |  | ||||||
|  |         // Specific field of object referenced, or null to | ||||||
|  |         // specify the object itself. | ||||||
|  |         // XXX getDeclaredFields does not return fields in any particular | ||||||
|  |         // order so this is not really usable. | ||||||
|  |         public java.lang.reflect.Field  field; | ||||||
|  |  | ||||||
|  |         // Constructors | ||||||
|  |         public Ref(java.lang.Object init) { | ||||||
|  |             object  = init; | ||||||
|  |             field   = null; | ||||||
|  |         } | ||||||
|  |         public Ref(java.lang.Object init, int num) { | ||||||
|  |             object  = init; | ||||||
|  |             setField(num); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Set the field according to a given index. | ||||||
|  |         public void setField(int num) { | ||||||
|  |             try { | ||||||
|  |                 field = object.getClass().getDeclaredFields()[num]; | ||||||
|  |             } catch (java.lang.SecurityException se) { | ||||||
|  |                 throw new java.lang.RuntimeException( | ||||||
|  |                     ""Security manager denied access to object fields""); | ||||||
|  |             } catch (java.lang.ArrayIndexOutOfBoundsException e) { | ||||||
|  |                 throw new java.lang.RuntimeException( | ||||||
|  |                     ""No such field in object""); | ||||||
|  |             } catch (java.lang.Exception e) { | ||||||
|  |                 throw new java.lang.RuntimeException( | ||||||
|  |                     ""Unable to set field: "" + e.getMessage()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Return the value of the reference. | ||||||
|  |         public java.lang.Object getValue() { | ||||||
|  |             if (field == null) { | ||||||
|  |                 return object; | ||||||
|  |             } else { | ||||||
|  |                 try { | ||||||
|  |                     return field.get(object); | ||||||
|  |                 } catch (java.lang.IllegalAccessException e) { | ||||||
|  |                     throw new java.lang.RuntimeException( | ||||||
|  |                         ""Field inaccessible""); | ||||||
|  |                 } catch (java.lang.IllegalArgumentException e) | ||||||
|  |                 { | ||||||
|  |                     throw new java.lang.RuntimeException( | ||||||
|  |                         ""Field-object mismatch""); | ||||||
|  |                 } catch (java.lang.NullPointerException e) { | ||||||
|  |                     throw new java.lang.RuntimeException( | ||||||
|  |                         ""Object is null""); | ||||||
|  |                 } catch (java.lang.Exception e) { | ||||||
|  |                     throw new java.lang.RuntimeException( | ||||||
|  |                         ""Unable to access field: "" + e.getMessage()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Update the value of the reference. | ||||||
|  |         public void setValue(java.lang.Object value) { | ||||||
|  |             try { | ||||||
|  |                 field.set(object, value); | ||||||
|  |             } catch (java.lang.IllegalAccessException e) { | ||||||
|  |                 throw new java.lang.RuntimeException(""Field inaccessible""); | ||||||
|  |             } catch (java.lang.IllegalArgumentException e) { | ||||||
|  |                 throw new java.lang.RuntimeException( | ||||||
|  |                     ""Field-object mismatch""); | ||||||
|  |             } catch (java.lang.NullPointerException e) { | ||||||
|  |                 throw new java.lang.RuntimeException(""Object is null""); | ||||||
|  |             } catch (java.lang.Exception e) { | ||||||
|  |                 throw new java.lang.RuntimeException( | ||||||
|  |                         ""Unable to access field: "" + e.getMessage()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } // class Ref | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     new_ref(Val::di, Ref::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, will_not_modify_trail], | ||||||
|  | " | ||||||
|  |     MR_offset_incr_hp_msg(Ref, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1, | ||||||
|  |         MR_ALLOC_ID, ""store.ref/2""); | ||||||
|  |     MR_define_size_slot(0, Ref, 1); | ||||||
|  |     * (MR_Word *) Ref = Val; | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     new_ref(Val::di, Ref::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Ref = new store.Ref(Val); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     new_ref(Val::di, Ref::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Ref = new store.Ref(Val); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Erlang", | ||||||
|  |     new_ref(Val::di, Ref::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Ref = ets:new(mutvar, [set, public]), | ||||||
|  |     ets:insert(Ref, {value, Val}), | ||||||
|  |     S = S0 | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | copy_ref_value(Ref, Val) --> | ||||||
|  |     % XXX Need to deep-copy non-atomic types. | ||||||
|  |     unsafe_ref_value(Ref, Val). | ||||||
|  |  | ||||||
|  |     % Unsafe_ref_value extracts the value that a reference refers to, without | ||||||
|  |     % making a copy; it is unsafe because the store could later be modified, | ||||||
|  |     % changing the returned value. | ||||||
|  |     % | ||||||
|  | :- pred store.unsafe_ref_value(generic_ref(T, S)::in, T::uo, | ||||||
|  |     S::di, S::uo) is det <= store(S). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     unsafe_ref_value(Ref::in, Val::uo, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, will_not_modify_trail], | ||||||
|  | " | ||||||
|  |     Val = * (MR_Word *) Ref; | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     unsafe_ref_value(Ref::in, Val::uo, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Val = Ref.getValue(); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     unsafe_ref_value(Ref::in, Val::uo, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Val = Ref.getValue(); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Erlang", | ||||||
|  |     unsafe_ref_value(Ref::in, Val::uo, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     [{value, Val}] = ets:lookup(Ref, value), | ||||||
|  |     S = S0 | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | ref_functor(Ref, Functor, Arity, !Store) :- | ||||||
|  |     unsafe_ref_value(Ref, Val, !Store), | ||||||
|  |     functor(Val, canonicalize, Functor, Arity). | ||||||
|  |  | ||||||
|  | :- pragma foreign_decl("C", | ||||||
|  | " | ||||||
|  |     #include ""mercury_type_info.h"" | ||||||
|  |     #include ""mercury_heap.h"" | ||||||
|  |     #include ""mercury_misc.h""         /* for MR_fatal_error() */ | ||||||
|  |     #include ""mercury_deconstruct.h""  /* for MR_arg() */ | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     arg_ref(Ref::in, ArgNum::in, ArgRef::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, may_not_duplicate], | ||||||
|  | "{ | ||||||
|  |     MR_TypeInfo         type_info; | ||||||
|  |     MR_TypeInfo         arg_type_info; | ||||||
|  |     MR_TypeInfo         exp_arg_type_info; | ||||||
|  |     MR_Word             *arg_ref; | ||||||
|  |     const MR_DuArgLocn  *arg_locn; | ||||||
|  |  | ||||||
|  |     type_info = (MR_TypeInfo) TypeInfo_for_T; | ||||||
|  |     exp_arg_type_info = (MR_TypeInfo) TypeInfo_for_ArgT; | ||||||
|  |  | ||||||
|  |     MR_save_transient_registers(); | ||||||
|  |  | ||||||
|  |     if (!MR_arg(type_info, (MR_Word *) Ref, ArgNum, &arg_type_info, | ||||||
|  |         &arg_ref, &arg_locn, MR_NONCANON_ABORT)) | ||||||
|  |     { | ||||||
|  |         MR_fatal_error(""store.arg_ref: argument number out of range""); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (MR_compare_type_info(arg_type_info, exp_arg_type_info) != | ||||||
|  |         MR_COMPARE_EQUAL) | ||||||
|  |     { | ||||||
|  |         MR_fatal_error(""store.arg_ref: argument has wrong type""); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     MR_restore_transient_registers(); | ||||||
|  |  | ||||||
|  |     if (arg_locn != NULL && arg_locn->MR_arg_bits != 0) { | ||||||
|  |         MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE, | ||||||
|  |             MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, ""store.ref/2""); | ||||||
|  |         MR_define_size_slot(0, ArgRef, 1); | ||||||
|  |         * (MR_Word *) ArgRef = MR_arg_value(arg_ref, arg_locn); | ||||||
|  |     } else { | ||||||
|  |         ArgRef = (MR_Word) arg_ref; | ||||||
|  |     } | ||||||
|  |     S = S0; | ||||||
|  | }"). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     arg_ref(Ref::in, ArgNum::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     /* | ||||||
|  |     ** XXX Some dynamic type-checking should be done here to check that | ||||||
|  |     ** the type of the specified Arg matches the type supplied by the caller. | ||||||
|  |     ** This will require RTTI. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |     ArgRef = new store.Ref(Ref.getValue(), ArgNum); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     arg_ref(Ref::in, ArgNum::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     /* | ||||||
|  |     ** XXX Some dynamic type-checking should be done here to check that | ||||||
|  |     ** the type of the specified Arg matches the type supplied by the caller. | ||||||
|  |     ** This will require RTTI. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |     ArgRef = new store.Ref(Ref.getValue(), ArgNum); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     new_arg_ref(Val::di, ArgNum::in, ArgRef::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure, may_not_duplicate], | ||||||
|  | "{ | ||||||
|  |     MR_TypeInfo         type_info; | ||||||
|  |     MR_TypeInfo         arg_type_info; | ||||||
|  |     MR_TypeInfo         exp_arg_type_info; | ||||||
|  |     MR_Word             *arg_ref; | ||||||
|  |     const MR_DuArgLocn  *arg_locn; | ||||||
|  |  | ||||||
|  |     type_info = (MR_TypeInfo) TypeInfo_for_T; | ||||||
|  |     exp_arg_type_info = (MR_TypeInfo) TypeInfo_for_ArgT; | ||||||
|  |  | ||||||
|  |     MR_save_transient_registers(); | ||||||
|  |  | ||||||
|  |     if (!MR_arg(type_info, (MR_Word *) &Val, ArgNum, &arg_type_info, | ||||||
|  |         &arg_ref, &arg_locn, MR_NONCANON_ABORT)) | ||||||
|  |     { | ||||||
|  |         MR_fatal_error(""store.new_arg_ref: argument number out of range""); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (MR_compare_type_info(arg_type_info, exp_arg_type_info) != | ||||||
|  |         MR_COMPARE_EQUAL) | ||||||
|  |     { | ||||||
|  |         MR_fatal_error(""store.new_arg_ref: argument has wrong type""); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     MR_restore_transient_registers(); | ||||||
|  |  | ||||||
|  |     if (arg_locn != NULL && arg_locn->MR_arg_bits != 0) { | ||||||
|  |         MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE, | ||||||
|  |             MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, ""store.ref/2""); | ||||||
|  |         MR_define_size_slot(0, ArgRef, 1); | ||||||
|  |         * (MR_Word *) ArgRef = MR_arg_value(arg_ref, arg_locn); | ||||||
|  |     } else if (arg_ref == &Val) { | ||||||
|  |         /* | ||||||
|  |         ** For no_tag types, the argument may have the same address as the | ||||||
|  |         ** term.  Since the term (Val) is currently on the C stack, we can't | ||||||
|  |         ** return a pointer to it; so if that is the case, then we need | ||||||
|  |         ** to copy it to the heap before returning. | ||||||
|  |         */ | ||||||
|  |  | ||||||
|  |         MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE, | ||||||
|  |             MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, ""store.ref/2""); | ||||||
|  |         MR_define_size_slot(0, ArgRef, 1); | ||||||
|  |         * (MR_Word *) ArgRef = Val; | ||||||
|  |     } else { | ||||||
|  |         ArgRef = (MR_Word) arg_ref; | ||||||
|  |     } | ||||||
|  |     S = S0; | ||||||
|  | }"). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     new_arg_ref(Val::di, ArgNum::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     /* | ||||||
|  |     ** XXX Some dynamic type-checking should be done here to check that | ||||||
|  |     ** the type of the specified Arg matches the type supplied by the caller. | ||||||
|  |     ** This will require RTTI. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |     ArgRef = new store.Ref(Val, ArgNum); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     new_arg_ref(Val::di, ArgNum::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     /* | ||||||
|  |     ** XXX Some dynamic type-checking should be done here to check that | ||||||
|  |     ** the type of the specified Arg matches the type supplied by the caller. | ||||||
|  |     ** This will require RTTI. | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |     ArgRef = new store.Ref(Val, ArgNum); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     set_ref(Ref::in, ValRef::in, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     * (MR_Word *) Ref = * (MR_Word *) ValRef; | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     set_ref(Ref::in, ValRef::in, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Ref.setValue(ValRef.getValue()); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     set_ref(Ref::in, ValRef::in, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Ref.setValue(ValRef.getValue()); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     set_ref_value(Ref::in, Val::di, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     * (MR_Word *) Ref = Val; | ||||||
|  |     S = S0; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     set_ref_value(Ref::in, Val::di, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Ref.setValue(Val); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     extract_ref_value(_S::di, Ref::in, Val::out), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Val = * (MR_Word *) Ref; | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     extract_ref_value(_S::di, Ref::in, Val::out), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Val = Ref.getValue(); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     extract_ref_value(_S::di, Ref::in, Val::out), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     Val = Ref.getValue(); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | %-----------------------------------------------------------------------------% | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | "{ | ||||||
|  |     /* unsafe - does not check type & arity, won't handle no_tag types */ | ||||||
|  |     MR_Word *Ptr; | ||||||
|  |  | ||||||
|  |     Ptr = (MR_Word *) MR_strip_tag((MR_Word) Ref); | ||||||
|  |     ArgRef = (MR_Word) &Ptr[Arg]; | ||||||
|  |     S = S0; | ||||||
|  | }"). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     ArgRef = new store.Ref(Ref.getValue(), Arg); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     ArgRef = new store.Ref(Ref.getValue(), Arg); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C", | ||||||
|  |     unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, S0::di, S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | "{ | ||||||
|  |     /* unsafe - does not check type & arity, won't handle no_tag types */ | ||||||
|  |     MR_Word *Ptr; | ||||||
|  |  | ||||||
|  |     Ptr = (MR_Word *) MR_strip_tag((MR_Word) Val); | ||||||
|  |     ArgRef = (MR_Word) &Ptr[Arg]; | ||||||
|  |     S = S0; | ||||||
|  | }"). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("C#", | ||||||
|  |     unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     ArgRef = new store.Ref(Val, Arg); | ||||||
|  | "). | ||||||
|  |  | ||||||
|  | :- pragma foreign_proc("Java", | ||||||
|  |     unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, _S0::di, _S::uo), | ||||||
|  |     [will_not_call_mercury, promise_pure], | ||||||
|  | " | ||||||
|  |     ArgRef = new store.Ref(Val, Arg); | ||||||
|  | "). | ||||||
		Reference in New Issue
	
	Block a user