L4Re/idl4re

Changeset

139:3fc951c797f3
2019-12-03 Paul Boddie raw files shortlog changelog graph Replaced pure virtual method usage with error-returning default implementations. This more easily permits the partial implementation of interfaces.
declaration.c (file) declaration.h (file) templates.h (file)
     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 \