typemap m3wrapargconst allow definition of local constants

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@6617 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
amigalemming 2004-11-02 15:35:07 +00:00
commit 70ff24a677
2 changed files with 41 additions and 8 deletions

View file

@ -146,7 +146,7 @@ On the one hand Modula-3 can be safe
while providing much static and dynamic safety.
On the other hand you can write efficient
but less safe code in the style of C
within UNSAFE modules.
within <tt>UNSAFE</tt> modules.
<p>
Unfortunately Modula's safety and strength
@ -187,7 +187,7 @@ and the low level of the C libraries.
SWIG converts C headers to Modula-3 interfaces for you.
You could call the C functions without loss
of efficiency but it won't be joy
because you could not pass TEXTs
because you could not pass <tt>TEXT</tt>s
or open arrays and
you would have to process error return codes
rather then exceptions.
@ -650,11 +650,18 @@ consist of the following parts:
</tr>
<tr>
<td>m3wrapargvar</td>
<td><tt>$1: Ptr := $1_name;</tt></td>
<td><tt>$1: INTEGER := $1_name;</tt></td>
<td>
Declaration of some variables needed for temporary results.
</td>
</tr>
<tr>
<td>m3wrapargconst</td>
<td><tt>$1 = "$1_name";</tt></td>
<td>
Declaration of some constant, maybe for debug purposes.
</td>
</tr>
<tr>
<td>m3wrapargraw</td>
<td><tt>ORD($1_name)</tt></td>
@ -909,6 +916,8 @@ where almost everything is generated by a typemap:
PROCEDURE Name (READONLY str : TEXT := "" )
<I> (* m3wrapoutcheck:throws *)</I>
: NameResult RAISES {E} =
CONST
arg1name = "str"; <I>(* m3wrapargconst *)</I>
VAR
arg0 : C.char_star; <I>(* m3wrapretvar *)</I>
arg1 : C.char_star; <I>(* m3wrapargvar *)</I>

View file

@ -23,12 +23,12 @@ char cvsroot_modula3_cxx[] =
It's not a good concept to use functions of superclasses for specific services.
E.g. For SWIG this means: Generating accessor functions for member variables
is the most common but no general task to be processed in membervariableHandler.
Better provide a service functions which generates accessor function code
Better provide a service function which generates accessor function code
and equip this service function with all parameters needed for input (parse node)
and output (generated code).
- How can I make globalvariableHandler not to generate
interface functions to two accessor functions
(that don't exist)
(that don't exist) ?
- How can I generate a typemap that turns every C reference argument into
its Modula 3 counterpart, that is
void test(Complex &z);
@ -3292,6 +3292,7 @@ MODULA3 ():
String *rawcall = NewString ("");
String *reccall = NewString ("");
String *local_variables = NewString ("");
String *local_constants = NewString ("");
String *incheck = NewString ("");
String *outcheck = NewString ("");
String *setup = NewString ("");
@ -3316,6 +3317,7 @@ MODULA3 ():
/* Attach the non-standard typemaps to the parameter list */
Swig_typemap_attach_parms ("m3wrapargvar", l, NULL);
Swig_typemap_attach_parms ("m3wrapargconst", l, NULL);
Swig_typemap_attach_parms ("m3wrapargraw", l, NULL);
Swig_typemap_attach_parms ("m3wrapargdir", l, NULL);
Swig_typemap_attach_parms ("m3wrapinmode", l, NULL);
@ -3429,6 +3431,26 @@ MODULA3 ():
}
}
/* Declare local constants e.g. for storing argument names. */
{
Parm *p = l;
while (p != NIL) {
String *arg = Getattr (p, "autoname");
String *tm = Getattr (p, "tmap:m3wrapargconst");
if (tm != NIL) {
addImports (m3wrap_impl.import, "m3wrapargconst", p);
Replaceall (tm, "$input", arg);
Printv (local_constants, tm, "\n", NIL);
p = Getattr (p, "tmap:m3wrapargconst:next");
} else {
p = nextSibling (p);
}
}
}
/* Declare local variables e.g. for converted input values. */
{
String *tm = getMappedTypeNew (n, "m3wrapretvar", "", false);
@ -3722,9 +3744,10 @@ MODULA3 ():
exc_handler = NewStringf ("%s%s", body, cleanup);
}
Printf (function_code, " =\n%s%sBEGIN\n%s%sEND %s;\n\n",
hasContent (local_variables) ? "VAR\n" : "",
local_variables, exc_handler, outarg, func_name);
Printf (function_code, " =\n%s%s%s%sBEGIN\n%s%sEND %s;\n\n",
hasContent (local_constants) ? "CONST\n" : "", local_constants,
hasContent (local_variables) ? "VAR\n" : "", local_variables,
exc_handler, outarg, func_name);
Delete (exc_handler);
Delete (body);
@ -3771,6 +3794,7 @@ MODULA3 ():
Delete (arguments);
Delete (return_variables);
Delete (local_variables);
Delete (local_constants);
Delete (outarg);
Delete (incheck);
Delete (outcheck);