[m-rev.] uncommitted diff: pragma attribute syntax
Tyson Dowd
trd at miscrit.be
Mon Aug 27 19:07:22 AEST 2001
For the record here is the patch which adds the pragma attribute syntax
from the dotnet-foreign branch. It was merged up with the latest
Mercury compiler, but I didn't commit as the syntax is not yet final.
Index: make_hlds.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/make_hlds.m,v
retrieving revision 1.381
diff -u -r1.381 make_hlds.m
--- make_hlds.m 2001/08/20 15:15:21 1.381
+++ make_hlds.m 2001/08/24 12:51:18
@@ -522,6 +522,10 @@
ImportStatus, Context, check_termination,
[terminates, does_not_terminate],
Module)
+ ;
+ { Pragma = attribute(Pred, Arity, AttributeType) },
+ module_add_pragma_attribute(Pred, Arity, AttributeType,
+ ImportStatus, Context, Module0, Module)
).
add_item_decl_pass_2(
@@ -8311,3 +8315,47 @@
).
%-----------------------------------------------------------------------------%
+% Add a `pragma attribute' declaration to the HLDS.
+
+:- pred module_add_pragma_attribute(sym_name, arity, type,
+ import_status, prog_context, module_info, module_info,
+ io__state, io__state).
+:- mode module_add_pragma_attribute(in, in, in, in, in, in, out,
+ di, uo) is det.
+
+module_add_pragma_attribute(Pred, Arity, AttributeType, _Status, Context,
+ Module0, Module) -->
+ { module_info_get_predicate_table(Module0, PredicateTable) },
+ (
+ { predicate_table_search_sym_arity(PredicateTable, Pred,
+ Arity, PredIDs) },
+ { PredIDs = [_ | _] }
+ ->
+ (
+ { PredIDs = [PredID] }
+ ->
+ { module_info_pred_info(Module0, PredID, PredInfo0) },
+ { pred_info_get_attributes(PredInfo0, Attributes) },
+ { add_attribute(Attributes, custom(AttributeType),
+ NewAttributes) },
+ { pred_info_set_attributes(PredInfo0, NewAttributes,
+ PredInfo) },
+ { module_info_set_pred_info(Module0, PredID, PredInfo,
+ Module) }
+ ;
+ io__set_exit_status(1),
+ prog_out__write_context(Context),
+ io__write_string("In pragma attribute for `"),
+ prog_out__write_sym_name_and_arity(Pred/Arity),
+ io__write_string("':\n"),
+ prog_out__write_context(Context),
+ io__write_string(
+ " error: ambiguous predicate/function name.\n"),
+ { Module = Module0 }
+ )
+ ;
+ undefined_pred_or_func_error(Pred, Arity, Context,
+ "`:- pragma fact_table' declaration"),
+ { Module = Module0 }
+ ).
+
Index: mercury_to_mercury.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/mercury_to_mercury.m,v
retrieving revision 1.191
diff -u -r1.191 mercury_to_mercury.m
--- mercury_to_mercury.m 2001/08/10 08:29:27 1.191
+++ mercury_to_mercury.m 2001/08/24 12:51:19
@@ -557,6 +557,9 @@
{ Pragma = check_termination(Pred, Arity) },
mercury_output_pragma_decl(Pred, Arity, predicate,
"check_termination")
+ ;
+ { Pragma = attribute(Pred, Arity, AttributeTerm) },
+ mercury_output_pragma_attribute(Pred, Arity, AttributeTerm)
).
mercury_output_item(assertion(Goal, VarSet), _) -->
@@ -2874,6 +2877,23 @@
add_string(", ["),
mercury_format_int_list(Attrs),
add_string("]").
+
+%-----------------------------------------------------------------------------%
+%
+
+ % Output the given pragma attribute declaration
+:- pred mercury_output_pragma_attribute(sym_name, arity, type,
+ io__state, io__state).
+:- mode mercury_output_pragma_attribute(in, in, in, di, uo) is det.
+
+mercury_output_pragma_attribute(Pred, Arity, AttributeType) -->
+ io__write_string(":- pragma attribute("),
+ mercury_output_sym_name(Pred),
+ io__write_string("/"),
+ io__write_int(Arity),
+ io__write_string(", "),
+ format_type(varset__init, no, AttributeType),
+ io__write_string(").\n").
%-----------------------------------------------------------------------------%
Index: module_qual.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/module_qual.m,v
retrieving revision 1.68
diff -u -r1.68 module_qual.m
--- module_qual.m 2001/06/27 05:04:15 1.68
+++ module_qual.m 2001/08/24 12:51:30
@@ -955,6 +955,8 @@
Info, Info) --> [].
qualify_pragma(check_termination(A, B), check_termination(A, B), Info,
Info) --> [].
+qualify_pragma(attribute(A, B, Type0), attribute(A, B, Type), Info0, Info) -->
+ qualify_type(Type0, Type, Info0, Info).
:- pred qualify_pragma_vars(list(pragma_var)::in, list(pragma_var)::out,
mq_info::in, mq_info::out, io__state::di, io__state::uo) is det.
Index: modules.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/modules.m,v
retrieving revision 1.196
diff -u -r1.196 modules.m
--- modules.m 2001/08/20 14:07:20 1.196
+++ modules.m 2001/08/24 12:51:33
@@ -1158,6 +1158,7 @@
pragma_allowed_in_interface(terminates(_, _), yes).
pragma_allowed_in_interface(does_not_terminate(_, _), yes).
pragma_allowed_in_interface(check_termination(_, _), yes).
+pragma_allowed_in_interface(attribute(_, _, _), no).
% `aditi', `base_relation', `index' and `owner' pragmas must be in the
% interface for exported preds. This is checked in make_hlds.m.
pragma_allowed_in_interface(aditi(_, _), yes).
Index: prog_data.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/prog_data.m,v
retrieving revision 1.69
diff -u -r1.69 prog_data.m
--- prog_data.m 2001/07/18 10:20:57 1.69
+++ prog_data.m 2001/08/24 12:51:33
@@ -270,8 +270,11 @@
; does_not_terminate(sym_name, arity)
% Predname, Arity
- ; check_termination(sym_name, arity).
+ ; check_termination(sym_name, arity)
% Predname, Arity
+
+ ; attribute(sym_name, arity, type).
+ % Predname, Arity, TypeName
%
% Stuff for tabling pragmas
Index: prog_io_pragma.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/prog_io_pragma.m,v
retrieving revision 1.33
diff -u -r1.33 prog_io_pragma.m
--- prog_io_pragma.m 2001/07/18 10:20:58 1.33
+++ prog_io_pragma.m 2001/08/24 12:51:34
@@ -1069,6 +1069,40 @@
Pragma = check_termination(Name, Arity)),
PragmaTerms, ErrorTerm, Result).
+parse_pragma_type(ModuleName, "attribute", PragmaTerms,
+ ErrorTerm, _VarSet, Result) :-
+ PragmaType = "attribute",
+ ( PragmaTerms = [PredAndArityTerm, TypeTerm] ->
+ parse_pred_name_and_arity(ModuleName, PragmaType,
+ PredAndArityTerm, ErrorTerm, NameArityResult),
+ (
+ NameArityResult = ok(PredName, Arity),
+ parse_implicitly_qualified_term(ModuleName, TypeTerm,
+ ErrorTerm, "`:- pragma attribute' declaration",
+ MaybeMercuryType),
+ (
+ MaybeMercuryType = ok(_MercuryTypeSymName, MercuryArgs),
+ ( MercuryArgs = [] ->
+ term__coerce(TypeTerm, MercuryType),
+ Pragma = attribute(PredName, Arity, MercuryType),
+ Result = ok(pragma(Pragma))
+ ;
+ Result = error("attribute type arity not 0", ErrorTerm)
+ )
+ ;
+ MaybeMercuryType = error(String, Term),
+ Result = error(String, Term)
+ )
+ ;
+ NameArityResult = error(ErrorMsg, _),
+ Result = error(ErrorMsg, PredAndArityTerm)
+ )
+ ;
+ string__append_list(["wrong number of arguments in `:- pragma ",
+ PragmaType, "' declaration"], ErrorMsg),
+ Result = error(ErrorMsg, ErrorTerm)
+ ).
+
:- pred parse_simple_pragma(module_name, string,
pred(sym_name, int, pragma_type),
list(term), term, maybe1(item)).
Index: recompilation_version.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/recompilation_version.m,v
retrieving revision 1.4
diff -u -r1.4 recompilation_version.m
--- recompilation_version.m 2001/07/24 17:16:43 1.4
+++ recompilation_version.m 2001/08/24 12:51:34
@@ -487,6 +487,7 @@
is_pred_pragma(terminates(Name, Arity), yes(no - Name / Arity)).
is_pred_pragma(does_not_terminate(Name, Arity), yes(no - Name / Arity)).
is_pred_pragma(check_termination(Name, Arity), yes(no - Name / Arity)).
+is_pred_pragma(attribute(Name, Arity, _), yes(no - Name / Arity)).
% XXX This is a bit brittle (need to be careful with term__contexts).
% For example, it won't work for clauses.
--------------------------------------------------------------------------
mercury-reviews mailing list
post: mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the reviews
mailing list