diff --git a/java/src/edu/wpi/first/wpilibj/networktables/NetworkTable.java b/java/src/edu/wpi/first/wpilibj/networktables/NetworkTable.java index a2d1eb6c8f..5a58168baa 100644 --- a/java/src/edu/wpi/first/wpilibj/networktables/NetworkTable.java +++ b/java/src/edu/wpi/first/wpilibj/networktables/NetworkTable.java @@ -174,7 +174,7 @@ public class NetworkTable implements ITable, IRemote { public synchronized static NetworkTable getTable(String key) { if (!running) initialize(); - if (key.isEmpty()) + if (key.isEmpty() || key.charAt(0) == PATH_SEPARATOR) return new NetworkTable(key); return new NetworkTable(PATH_SEPARATOR + key); } diff --git a/src/networktables/NetworkTable.cpp b/src/networktables/NetworkTable.cpp index bfcf7057b3..267da1f085 100644 --- a/src/networktables/NetworkTable.cpp +++ b/src/networktables/NetworkTable.cpp @@ -82,12 +82,14 @@ const char* NetworkTable::LoadPersistent( std::shared_ptr NetworkTable::GetTable(StringRef key) { if (!s_running) Initialize(); - llvm::SmallString<128> path; - if (!key.empty()) { + if (key.empty() || key[0] == PATH_SEPARATOR_CHAR) { + return std::make_shared(key, private_init()); + } else { + llvm::SmallString<128> path; path += PATH_SEPARATOR_CHAR; path += key; + return std::make_shared(path, private_init()); } - return std::make_shared(path, private_init()); } NetworkTable::NetworkTable(StringRef path, const private_init&) diff --git a/test/unit/NetworkTableTest.cpp b/test/unit/NetworkTableTest.cpp index 084c658ca5..24ad29f7d2 100644 --- a/test/unit/NetworkTableTest.cpp +++ b/test/unit/NetworkTableTest.cpp @@ -18,3 +18,10 @@ TEST_F(NetworkTableTest, ContainsKey) { ASSERT_TRUE(nt->ContainsKey("testkey")); } +TEST_F(NetworkTableTest, LeadingSlash) { + auto nt = NetworkTable::GetTable("leadingslash"); + auto nt2 = NetworkTable::GetTable("/leadingslash"); + ASSERT_FALSE(nt->ContainsKey("testkey")); + nt2->PutNumber("testkey", 5); + ASSERT_TRUE(nt->ContainsKey("testkey")); +}