1.1 --- a/declaration.c Sat Nov 30 22:39:18 2019 +0100
1.2 +++ b/declaration.c Tue Dec 03 00:25:00 2019 +0100
1.3 @@ -39,7 +39,7 @@
1.4 int member = (role & MEMBER_ROLE);
1.5 int server = (component == SERVER_ROLE);
1.6 int completion = have_attribute(sig->attributes, "completion");
1.7 - enum specifier specifier = (server && completion) ? IN_PARAMETER : ANY_PARAMETER;
1.8 + enum specifier direction = (server && completion) ? IN_PARAMETER : ANY_PARAMETER;
1.9 enum function_role function = (server && completion) ? COMPLETION_ROLE : GENERAL_FUNCTION_ROLE;
1.10
1.11 /* Indent and provide a qualifier for C++ class declarations. */
1.12 @@ -63,23 +63,41 @@
1.13
1.14 /* Emit the parameters. */
1.15
1.16 - write_parameters(sig->parameters, fp, SIGNATURE_ROLE, function, specifier,
1.17 + write_parameters(sig->parameters, fp, SIGNATURE_ROLE, function, direction,
1.18 have_init_param);
1.19
1.20 fputs(")", fp);
1.21
1.22 - /* Add a "value" for the function, this being used to declare pure virtual
1.23 + /* Add a body for the function, this being used to define unimplemented
1.24 methods in C++. The client has method definitions and therefore normal
1.25 virtual methods. */
1.26
1.27 if (cpp && declaration && server)
1.28 - fputs(" = 0", fp);
1.29 -
1.30 - fputs(get_signature_terminator(role), fp);
1.31 + write_interface_unimplemented_method(sig, direction, fp);
1.32 + else
1.33 + fputs(get_signature_terminator(role), fp);
1.34
1.35 free(opname);
1.36 }
1.37
1.38 +/* Write an unimplemented member function body for a C++ interface. */
1.39 +
1.40 +void write_interface_unimplemented_method(struct signature *sig,
1.41 + enum specifier direction, FILE *fp)
1.42 +{
1.43 + struct parameter *param;
1.44 +
1.45 + fputs(interface_unimplemented_method_prologue_cpp, fp);
1.46 +
1.47 + for (param = sig->parameters; param != NULL; param = param->tail)
1.48 + {
1.49 + if (param->specifier & direction)
1.50 + fprintf(fp, interface_unused_parameter, get_parameter_name(param->identifiers));
1.51 + }
1.52 +
1.53 + fputs(interface_unimplemented_method_epilogue_cpp, fp);
1.54 +}
1.55 +
1.56 /* Write the initial parameter in an interface signature. */
1.57
1.58 void write_initial_parameter(const char *name, FILE *fp)
1.59 @@ -110,12 +128,12 @@
1.60 /* Generate parameters in each function signature. */
1.61
1.62 void write_parameters(struct parameter *param, FILE *fp, enum parameter_role role,
1.63 - enum function_role function, enum specifier specifier,
1.64 + enum function_role function, enum specifier direction,
1.65 int continuing)
1.66 {
1.67 for (; param != NULL; param = param->tail)
1.68 {
1.69 - if (param->specifier & specifier)
1.70 + if (param->specifier & direction)
1.71 {
1.72 if (continuing)
1.73 fputs(", ", fp);
2.1 --- a/declaration.h Sat Nov 30 22:39:18 2019 +0100
2.2 +++ b/declaration.h Tue Dec 03 00:25:00 2019 +0100
2.3 @@ -30,6 +30,9 @@
2.4 enum component_role component, FILE *fp,
2.5 struct interface *iface);
2.6
2.7 +void write_interface_unimplemented_method(struct signature *sig,
2.8 + enum specifier direction, FILE *fp);
2.9 +
2.10 void write_initial_parameter(const char *name, FILE *fp);
2.11
2.12 void write_signatures(struct signature *sig, enum signature_role role, FILE *fp,
2.13 @@ -40,7 +43,7 @@
2.14 /* Parameter lists. */
2.15
2.16 void write_parameters(struct parameter *param, FILE *fp, enum parameter_role role,
2.17 - enum function_role function, enum specifier specifier,
2.18 + enum function_role function, enum specifier direction,
2.19 int continuing);
2.20
2.21 void write_parameter(struct parameter *param, FILE *fp, enum parameter_role role,
3.1 --- a/templates.h Sat Nov 30 22:39:18 2019 +0100
3.2 +++ b/templates.h Tue Dec 03 00:25:00 2019 +0100
3.3 @@ -131,6 +131,7 @@
3.4
3.5 #define header_prologue \
3.6 "#pragma once\n\n" \
3.7 +"#include <l4/sys/err.h>\n" \
3.8 "#include <l4/sys/types.h>\n"
3.9
3.10 /* Server templates. */
3.11 @@ -208,6 +209,15 @@
3.12 #define interface_struct_member_function_signature_prologue \
3.13 "\n long (*%s)("
3.14
3.15 +#define interface_unimplemented_method_prologue_cpp \
3.16 +"\n {"
3.17 +
3.18 +#define interface_unimplemented_method_epilogue_cpp \
3.19 +" return -L4_EBADPROTO; }\n"
3.20 +
3.21 +#define interface_unused_parameter \
3.22 +" (void) %s;"
3.23 +
3.24 /* Reference and object type definitions for interfaces. */
3.25
3.26 #define ref_type_definition_c \