aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbuild2/context.hxx6
-rw-r--r--libbuild2/file.cxx38
-rw-r--r--libbuild2/target.txx5
-rw-r--r--libbuild2/variable.cxx5
-rw-r--r--libbuild2/variable.hxx5
5 files changed, 20 insertions, 39 deletions
diff --git a/libbuild2/context.hxx b/libbuild2/context.hxx
index e4d4d4c..a8b6b01 100644
--- a/libbuild2/context.hxx
+++ b/libbuild2/context.hxx
@@ -363,10 +363,8 @@ namespace build2
// if not requested (but only in version 1). The exporter should also set
// the returned version as the target-specific export.metadata variable.
//
- // The export.metadata value should start with the version optionally
- // followed by the metadata variable prefix (for example, cli in
- // cli.version). If the variable prefix is missing, it is assumed to be
- // the target name as imported.
+ // The export.metadata value should start with the version followed by the
+ // metadata variable prefix (for example, cli in cli.version).
//
// The following metadata variable names have pre-defined meaning:
//
diff --git a/libbuild2/file.cxx b/libbuild2/file.cxx
index 4c7e6d9..e376ab9 100644
--- a/libbuild2/file.cxx
+++ b/libbuild2/file.cxx
@@ -2522,15 +2522,13 @@ namespace build2
if (meta)
{
- // The export.metadata value should start with the version optionally
- // followed by the metadata variable prefix. If the variable prefix is
- // missing, set it to the metadata key (i.e., target name as imported)
- // by default.
+ // The export.metadata value should start with the version followed by
+ // the metadata variable prefix.
//
- value& v (t.assign (*ctx.var_export_metadata));
- if (v && !v.empty ())
+ lookup l (t.vars[ctx.var_export_metadata]);
+ if (l && !l->empty ())
{
- names& ns (cast<names> (v));
+ const names& ns (cast<names> (l));
// First verify the version.
//
@@ -2540,7 +2538,7 @@ namespace build2
// Note: does not change the passed name.
//
ver = value_traits<uint64_t>::convert (
- move (ns[0]), ns[0].pair ? &ns[1] : nullptr);
+ ns[0], ns[0].pair ? &ns[1] : nullptr);
}
catch (const invalid_argument& e)
{
@@ -2552,27 +2550,11 @@ namespace build2
fail (loc) << "unexpected metadata version " << ver
<< " in imported target " << t;
- // Next see if we have the metadata variable prefix.
+ // Next verify the metadata variable prefix.
//
- switch (ns.size ())
- {
- case 1:
- {
- ns.push_back (name (*meta));
- break;
- }
- case 2:
- {
- if (ns[1].simple ())
- break;
- }
- // Fall through.
- default:
- {
- fail (loc) << "invalid metadata variable prefix in imported "
- << "target " << t;
- }
- }
+ if (ns.size () != 2 || !ns[1].simple ())
+ fail (loc) << "invalid metadata variable prefix in imported "
+ << "target " << t;
// See if we have the stable program name in the <var-prefix>.name
// variable. If its missing, set it to the metadata key (i.e., target
diff --git a/libbuild2/target.txx b/libbuild2/target.txx
index ef14cf5..777653a 100644
--- a/libbuild2/target.txx
+++ b/libbuild2/target.txx
@@ -188,9 +188,10 @@ namespace build2
{
if (auto* ns = cast_null<names> (vars[ctx.var_export_metadata]))
{
- // Metadata variable prefix is in the second name.
+ // Metadata variable prefix must be in the second name.
//
- assert (ns->size () == 2 && (*ns)[1].simple ());
+ if (ns->size () < 2 || !(*ns)[1].simple ())
+ fail << "invalid metadata variable prefix in target " << *this;
return cast_null<T> (vars[(*ns)[1].value + '.' + var]);
}
diff --git a/libbuild2/variable.cxx b/libbuild2/variable.cxx
index 9009fdc..79d0018 100644
--- a/libbuild2/variable.cxx
+++ b/libbuild2/variable.cxx
@@ -483,11 +483,8 @@ namespace build2
// uint64_t value
//
uint64_t value_traits<uint64_t>::
- convert (name&& n, name* r)
+ convert (const name& n, const name* r)
{
- // Note: in some places we reply on this function not
- // changing the passed name.
- //
if (r == nullptr && n.simple ())
{
try
diff --git a/libbuild2/variable.hxx b/libbuild2/variable.hxx
index c1cfa84..08d4612 100644
--- a/libbuild2/variable.hxx
+++ b/libbuild2/variable.hxx
@@ -715,7 +715,10 @@ namespace build2
{
static_assert (sizeof (uint64_t) <= value::size_, "insufficient space");
- static uint64_t convert (name&&, name*);
+ // Note: in some places we rely on the convert() function not changing
+ // the passed names thus we make them const.
+ //
+ static uint64_t convert (const name&, const name*);
static void assign (value&, uint64_t);
static void append (value&, uint64_t); // ADD.
static name reverse (uint64_t x) {return name (to_string (x));}