diff --git a/ProxyStubGenerator/StubGenerator.py b/ProxyStubGenerator/StubGenerator.py index 86fb397f..cdf71ffc 100755 --- a/ProxyStubGenerator/StubGenerator.py +++ b/ProxyStubGenerator/StubGenerator.py @@ -1557,24 +1557,22 @@ def _EmitAssignment(p): elif p.is_dynamic_array: obj_name = p.name - if not p.suppress_type: - if p.optional: - obj_name = Normalize(obj_name + "Object__") - emit.Line("%s %s{};" % (p.optional.type_name, obj_name)) - else: - emit.Line("%s %s{};" % (p.type_name, obj_name)) + if p.optional: + obj_name = Normalize(p.name + "Object__") + emit.Line("%s %s{};" % (p.optional.type_name, obj_name)) + elif not p.suppress_type: + emit.Line("%s %s{};" % (p.type_name, obj_name)) length = EmitParam(interface, p.length, Normalize("%sSize" % obj_name)) ReadParameter(length) CheckRange(p, ("%s" % length.as_rvalue)) - emit.Line("%s.reserve(%s);" % (p.as_rvalue, length.as_rvalue)) - + emit.Line("%s.reserve(%s);" % (obj_name, length.as_rvalue)) index = chr(ord('i') + p.name.count('Item')) element = EmitParam(interface, p.element, Normalize(obj_name + "Item"), parent=p) emit.Line("for (%s %s = 0; %s < %s; %s++) {" % (p.length.type_name, index, index, length.as_rvalue, index)) emit.IndentInc() ReadParameter(element) - emit.Line("%s.push_back(std::move(%s));" % (p.as_rvalue, element.as_rvalue)) + emit.Line("%s.push_back(std::move(%s));" % (obj_name, element.as_rvalue)) emit.IndentDec() emit.Line("}") @@ -2132,18 +2130,33 @@ def ReadParameter(p, no_array=False, suppress_type=True): elif p.is_dynamic_array: length = EmitLength(interface, p.length, Normalize(p.name + "Size")) element = EmitParam(interface, p.element, Normalize(p.name + "Item"), parent=p) + + obj_name = p.as_rvalue + + if p.optional: + obj_name = Normalize(p.name + "Object__") + emit.Line("%s %s{};" % (p.optional.type_name, obj_name)) + emit.Line("%s{};" % (length.temporary_no_cv)) ReadParameter(length) - emit.Line("%s.reserve(%s);" % (p.as_rvalue, length.as_rvalue)) + + if not p.optional: + emit.Line("%s.clear();" % (p.as_rvalue)) + + emit.Line("%s.reserve(%s);" % (obj_name, length.as_rvalue)) + index = chr(ord('i') + p.name.count('Item')) emit.Line("for (%s %s = 0; %s < %s; %s++) {" % (p.length.type_name, index, index, length.as_rvalue, index)) emit.IndentInc() emit.Line("%s{};" % (element.temporary_no_cv)) ReadParameter(element) - emit.Line("%s.push_back(std::move(%s));" % (p.as_rvalue, element.as_rvalue)) + emit.Line("%s.push_back(std::move(%s));" % (obj_name, element.as_rvalue)) emit.IndentDec() emit.Line("}") + if p.optional: + emit.Line("%s = std::move(%s);" % (p.name, obj_name)) + elif p.is_buffer: CheckFrame(p) CheckSize(p) @@ -2194,6 +2207,11 @@ def _EmitAssignment(p): if p.optional and (not p.is_array or no_array): emit.IndentDec() emit.Line("}") + emit.Line("else {") + emit.IndentInc() + emit.Line("%s = %s();" % (p.name, p.type_name)) + emit.IndentDec() + emit.Line("}") if EMIT_TRACES: emit.Line('fprintf(stderr, "*** [%s proxy] ENTER: %s()\\n");' % (interface_name, method.name))