idlc/CustomTarget_parser_test.mk | 44 +++++----- solenv/bin/exectest.pl | 97 +++++++++-------------- unoidl/source/sourceprovider-parser-requires.hxx | 2 unoidl/source/sourceprovider-parser.y | 95 ++++++++++++++++++---- unoidl/source/sourceprovider-scanner.hxx | 33 +++++++ 5 files changed, 177 insertions(+), 94 deletions(-)
New commits: commit 60f8d808c2451fd37f02c1f86ed7fe60f4f58fa6 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Sep 20 13:11:59 2013 +0200 Reject "too similar" service constructors Change-Id: Ie81e9994084b5a2f44a436c764318ea6e5049faf diff --git a/unoidl/source/sourceprovider-parser-requires.hxx b/unoidl/source/sourceprovider-parser-requires.hxx index fc84c5d..9865720 100644 --- a/unoidl/source/sourceprovider-parser-requires.hxx +++ b/unoidl/source/sourceprovider-parser-requires.hxx @@ -118,6 +118,8 @@ struct SourceProviderType { OUString getName() const; + bool equals(SourceProviderType const & other) const; + Type type; OUString name; // TYPE_ENUM ... TYPE_PARAMETER SourceProviderEntity const * entity; diff --git a/unoidl/source/sourceprovider-parser.y b/unoidl/source/sourceprovider-parser.y index e410f35..6512e4a 100644 --- a/unoidl/source/sourceprovider-parser.y +++ b/unoidl/source/sourceprovider-parser.y @@ -2205,13 +2205,32 @@ singleInterfaceBasedServiceDefn: dynamic_cast<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad *>( ent->pad.get()); assert(pad != 0); - if (!$7) { + std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor> ctors; + if ($7) { + for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor>::iterator + i(pad->constructors.begin()); + i != pad->constructors.end(); ++i) + { + std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter> parms; + for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter>::iterator + j(i->parameters.begin()); + j != i->parameters.end(); ++j) + { + parms.push_back( + unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter( + j->name, j->type.getName(), j->rest)); + } + ctors.push_back( + unoidl::SingleInterfaceBasedServiceEntity::Constructor( + i->name, parms, i->exceptions, i->annotations)); + } + } else { assert(pad->constructors.empty()); - pad->constructors.push_back( + ctors.push_back( unoidl::SingleInterfaceBasedServiceEntity::Constructor()); } ent->entity = new unoidl::SingleInterfaceBasedServiceEntity( - pad->isPublished(), pad->base, pad->constructors, annotations($1)); + pad->isPublished(), pad->base, ctors, annotations($1)); ent->pad.clear(); clearCurrentName(data); } @@ -2235,7 +2254,7 @@ ctor: rtl::Reference<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad> pad(getCurrentPad<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>( data)); - for (std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor>::iterator + for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor>::iterator i(pad->constructors.begin()); i != pad->constructors.end(); ++i) { @@ -2249,22 +2268,49 @@ ctor: } } pad->constructors.push_back( - unoidl::SingleInterfaceBasedServiceEntity::Constructor( - id, std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter>(), - std::vector<OUString>(), annotations($1))); + unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor( + id, annotations($1))); } '(' ctorParams_opt ')' exceptionSpec_opt ';' { + unoidl::detail::SourceProviderScannerData * data = yyget_extra(yyscanner); + rtl::Reference<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad> + pad(getCurrentPad<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>( + data)); + assert(!pad->constructors.empty()); if ($7 != 0) { - unoidl::detail::SourceProviderScannerData * data - = yyget_extra(yyscanner); - rtl::Reference<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad> - pad(getCurrentPad<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad>( - data)); - assert(!pad->constructors.empty()); pad->constructors.back().exceptions = *$7; delete $7; } + for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor>::iterator + i(pad->constructors.begin()); + i != pad->constructors.end() - 1; ++i) + { + if (i->parameters.size() + == pad->constructors.back().parameters.size()) + { + bool same = true; + for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter>::iterator + j(i->parameters.begin()), + k(pad->constructors.back().parameters.begin()); + j != i->parameters.end(); ++j, ++k) + { + if (!j->type.equals(k->type) || j->rest != k->rest) { + same = false; + break; + } + } + if (same) { + error( + @2, yyscanner, + ("single-interface--based service " + data->currentName + + " constructor " + pad->constructors.back().name + + " has similar paramete list to constructor " + + i->name)); + YYERROR; + } + } + } } ; @@ -2338,7 +2384,7 @@ ctorParam: + " rest parameter must be last parameter")); YYERROR; } - for (std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter>::iterator + for (std::vector<unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter>::iterator i(pad->constructors.back().parameters.begin()); i != pad->constructors.back().parameters.end(); ++i) { @@ -2353,8 +2399,8 @@ ctorParam: } } pad->constructors.back().parameters.push_back( - unoidl::SingleInterfaceBasedServiceEntity::Constructor::Parameter( - id, t.getName(), $5)); + unoidl::detail::SourceProviderSingleInterfaceBasedServiceEntityPad::Constructor::Parameter( + id, t, $5)); } ; @@ -3682,6 +3728,23 @@ OUString SourceProviderType::getName() const { } } +bool SourceProviderType::equals(SourceProviderType const & other) const { + if (type != other.type || name != other.name + || subtypes.size() != other.subtypes.size()) + { + return false; + } + for (std::vector<SourceProviderType>::const_iterator + i(subtypes.begin()), j(other.subtypes.begin()); + i != subtypes.end(); ++i, ++j) + { + if (!i->equals(*j)) { + return false; + } + } + return true; +} + bool parse(OUString const & uri, SourceProviderScannerData * data) { assert(data != 0); oslFileHandle handle; diff --git a/unoidl/source/sourceprovider-scanner.hxx b/unoidl/source/sourceprovider-scanner.hxx index 8a79d31..0c08a13 100644 --- a/unoidl/source/sourceprovider-scanner.hxx +++ b/unoidl/source/sourceprovider-scanner.hxx @@ -156,14 +156,43 @@ class SourceProviderSingleInterfaceBasedServiceEntityPad: public SourceProviderEntityPad { public: + struct Constructor { + struct Parameter { + Parameter( + rtl::OUString const & theName, + SourceProviderType const & theType, bool theRest): + name(theName), type(theType), rest(theRest) + {} + + rtl::OUString name; + + SourceProviderType type; + + bool rest; + }; + + Constructor( + rtl::OUString const & theName, + std::vector< rtl::OUString > const & theAnnotations): + name(theName), annotations(theAnnotations) + {} + + rtl::OUString const name; + + std::vector< Parameter > parameters; + + std::vector< rtl::OUString > exceptions; + + std::vector< rtl::OUString > const annotations; + }; + explicit SourceProviderSingleInterfaceBasedServiceEntityPad( bool published, OUString const & theBase): SourceProviderEntityPad(published), base(theBase) {} OUString const base; - std::vector<unoidl::SingleInterfaceBasedServiceEntity::Constructor> - constructors; + std::vector<Constructor> constructors; private: virtual ~SourceProviderSingleInterfaceBasedServiceEntityPad() throw () {} commit aeee571501df4d3b1d91e10d61b434f0ecac4d6a Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Sep 20 11:01:44 2013 +0200 Use tempfile instead of stdin in exectest.pl ...so it can easily be reused to test unoidl-write, too. Change-Id: I4992850b44faaa152bcf1d281f2787824d6ad036 diff --git a/idlc/CustomTarget_parser_test.mk b/idlc/CustomTarget_parser_test.mk index 6be490a..d8defd6 100644 --- a/idlc/CustomTarget_parser_test.mk +++ b/idlc/CustomTarget_parser_test.mk @@ -23,57 +23,59 @@ $(call gb_CustomTarget_get_target,idlc/parser_test) : \ $(SRCDIR)/idlc/test/parser/polystruct.tests \ $(SRCDIR)/idlc/test/parser/published.tests \ $(SRCDIR)/idlc/test/parser/struct.tests \ - $(SRCDIR)/idlc/test/parser/typedef.tests + $(SRCDIR)/idlc/test/parser/typedef.tests \ + | $(call gb_CustomTarget_get_workdir,idlc/parser_test)/.dir $(call gb_Helper_abbreviate_dirs,( \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/attribute.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/constant.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/constructor.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/interfaceinheritance.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/methodoverload.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/oldstyle.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/polystruct.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/published.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/struct.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin && \ + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {} && \ $(PERL) $(SRCDIR)/solenv/bin/exectest.pl \ $(SRCDIR)/idlc/test/parser/typedef.tests \ + $(call gb_CustomTarget_get_workdir,idlc/parser_test)/in.idl \ $(call gb_Executable_get_command,idlc) \ - -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) \ - -stdin) > $@.log 2>&1 || (cat $@.log && false)) + -O $(call gb_CustomTarget_get_workdir,idlc/parser_test) {}) \ + > ${}.log 2>&1 || (cat ${}.log && false)) # vim: set noet sw=4 ts=4: diff --git a/solenv/bin/exectest.pl b/solenv/bin/exectest.pl index 2cd9fb6..bd9b5f3 100644 --- a/solenv/bin/exectest.pl +++ b/solenv/bin/exectest.pl @@ -23,8 +23,11 @@ sub encode($) return $arg } -$#ARGV >= 1 or die "Usage: $0 <input file> <command> <arguments...>"; -open INPUT, $ARGV[0] or die "cannot open $ARGV[0]: $!"; +$#ARGV >= 2 + or die "Usage: $0 <input file> <temp file> <command> <arguments...>"; +open INPUT, '<', $ARGV[0] or die "cannot open $ARGV[0]: $!"; +shift @ARGV; +$temp = $ARGV[0]; shift @ARGV; $failed = 0; $open = 0; @@ -35,7 +38,31 @@ while (1) { { if ($open) { - close PIPE; + close OUTPUT; + my $prog = ''; + my $assigns = 1; + for ($i = 0; $i != scalar(@ARGV); ++$i) + { + $prog .= ' ' unless $i == 0; + if ($assigns && $ARGV[$i] =~ /^([A-Za-z_][A-Za-z0-9_]+)=(.*)$/) + { + $prog .= $1 . "='" . encode($2) . "'"; + } + else + { + if ($ARGV[$i] =~ /^{}$/) + { + $prog .= "'" . encode($temp) . "'"; + } + else + { + $prog .= "'" . encode($ARGV[$i]) . "'"; + } + $assigns = 0; + } + } + system("$prog"); + unlink $temp; if ($? % 256 == 0) { $exit = $? / 256; @@ -60,27 +87,12 @@ while (1) { last if $eof; $expect = $1; $title = $2; - my $prog = ''; - my $assigns = 1; - for ($i = 0; $i != scalar(@ARGV); ++$i) - { - $prog .= ' ' unless $i == 0; - if ($assigns && $ARGV[$i] =~ /^([A-Za-z_][A-Za-z0-9_]+)=(.*)$/) - { - $prog .= $1 . "='" . encode($2) . "'"; - } - else - { - $prog .= "'" . encode($ARGV[$i]) . "'"; - $assigns = 0; - } - } - open PIPE, "| $prog" or die "cannot start process: $!"; + open OUTPUT, '>', $temp or die "cannot open $temp: $!"; $open = 1; } elsif ($open) { - print PIPE $in or die "cannot write to pipe: $!"; + print OUTPUT $in or die "cannot write to $temp: $!"; } } exit(0); commit 89d911a2775118dbf5e4cd337e4ede4284b6f717 Author: Stephan Bergmann <sberg...@redhat.com> Date: Fri Sep 20 10:35:57 2013 +0200 Strip exectest.pl down to what is needed by its only client Change-Id: I9355f8618757f657fb8f8408a10b02f113fc0966 diff --git a/solenv/bin/exectest.pl b/solenv/bin/exectest.pl index 06c9072..2cd9fb6 100644 --- a/solenv/bin/exectest.pl +++ b/solenv/bin/exectest.pl @@ -23,31 +23,15 @@ sub encode($) return $arg } -$#ARGV >= 1 - or die "Usage: $0 <input file>|-SUCCESS|-FAILURE <command> <arguments...>"; -if ($ARGV[0] eq "-SUCCESS") -{ - $expect = "SUCCESS"; - $input = 0; -} -elsif ($ARGV[0] eq "-FAILURE") -{ - $expect = "FAILURE"; - $input = 0; -} -else -{ - open INPUT, $ARGV[0] or die "cannot open $ARGV[0]: $!"; - $input = 1; -} +$#ARGV >= 1 or die "Usage: $0 <input file> <command> <arguments...>"; +open INPUT, $ARGV[0] or die "cannot open $ARGV[0]: $!"; shift @ARGV; $failed = 0; $open = 0; while (1) { - $eof = $input ? eof INPUT : $open; - $in = <INPUT> if $input && !$eof; - if (!$input || $eof - || $in =~ /^EXPECT (SUCCESS|FAILURE|\d+)( "([^"]*)")?:\n$/) + $eof = eof INPUT; + $in = <INPUT> unless $eof; + if ($eof || $in =~ /^EXPECT (SUCCESS|FAILURE) "([^"]*)"?:\n$/) { if ($open) { @@ -55,16 +39,14 @@ while (1) { if ($? % 256 == 0) { $exit = $? / 256; - $ok = $expect eq "SUCCESS" ? $exit == 0 - : $expect eq "FAILURE" ? $exit != 0 : $exit == $expect; + $ok = ($? == 0) == ($expect eq "SUCCESS"); } else { $exit = "signal"; $ok = 0; } - print "\"$title\", " if defined $title; - print "expected $expect, got $exit ($?): "; + print "\"$title\" expected $expect, got $exit ($?): "; if ($ok) { print "ok\n"; @@ -72,19 +54,12 @@ while (1) { else { print "FAILED!\n"; - $failed = 1; + exit(1); } } last if $eof; - $expect = $1 if $input; - if (defined $3) - { - $title = $3; - } - else - { - undef $title; - } + $expect = $1; + $title = $2; my $prog = ''; my $assigns = 1; for ($i = 0; $i != scalar(@ARGV); ++$i) @@ -103,9 +78,9 @@ while (1) { open PIPE, "| $prog" or die "cannot start process: $!"; $open = 1; } - elsif ($open && $input) + elsif ($open) { print PIPE $in or die "cannot write to pipe: $!"; } } -exit $failed; +exit(0); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits