Author: cwittich
Date: Fri Jan 18 14:17:50 2008
New Revision: 31854
URL:
http://svn.reactos.org/svn/reactos?rev=31854&view=rev
Log:
widl: Fix context handle "cannot be null" detection.
The "cannot be null" attibute is applied to a parameter if and only if
it is in-only.
widl: Fix the conditions under which array freeing code is output.
It doesn't matter whether or not the array is declared as a pointer or
is declared using array subscripts - the array is still allocated by the
unmarshalling function and so needs to be freed.
<rob at codeweavers.com>
Modified:
trunk/reactos/tools/widl/typegen.c
Modified: trunk/reactos/tools/widl/typegen.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/widl/typegen.c?rev=3…
==============================================================================
--- trunk/reactos/tools/widl/typegen.c (original)
+++ trunk/reactos/tools/widl/typegen.c Fri Jan 18 14:17:50 2008
@@ -2059,13 +2059,13 @@
unsigned char flags = 0x08 /* strict */;
if (is_ptr(type))
- {
flags |= 0x80;
- if (type->type != RPC_FC_RP)
+ if (is_attr(var->attrs, ATTR_IN))
+ {
+ flags |= 0x40;
+ if (!is_attr(var->attrs, ATTR_OUT))
flags |= 0x01;
}
- if (is_attr(var->attrs, ATTR_IN))
- flags |= 0x40;
if (is_attr(var->attrs, ATTR_OUT))
flags |= 0x20;
@@ -2807,15 +2807,13 @@
if (pointer_type != RPC_FC_RP) array_type = "Pointer";
print_phase_function(file, indent, array_type, phase, var, start_offset);
- if (phase == PHASE_FREE && type->declarray && pointer_type ==
RPC_FC_RP)
- {
- /* these are all unmarshalled by pointing into the buffer on the
- * server side */
+ if (phase == PHASE_FREE && pointer_type == RPC_FC_RP)
+ {
+ /* these are all unmarshalled by allocating memory */
if (type->type == RPC_FC_BOGUS_ARRAY ||
type->type == RPC_FC_CVARRAY ||
- (type->type == RPC_FC_SMVARRAY && type->type ==
RPC_FC_LGVARRAY && in_attr) ||
- (type->type == RPC_FC_CARRAY && type->type == RPC_FC_CARRAY
&& !in_attr))
- {
+ ((type->type == RPC_FC_SMVARRAY || type->type == RPC_FC_LGVARRAY)
&& in_attr) ||
+ (type->type == RPC_FC_CARRAY && !in_attr)) {
print_file(file, indent, "if (%s)\n", var->name);
indent++;
print_file(file, indent, "_StubMsg.pfnFree(%s);\n",
var->name);