Use std::string instead of a huge array for storing literal strings.
diff --git a/source/text.cpp b/source/text.cpp
index bd74769..b440552 100644
--- a/source/text.cpp
+++ b/source/text.cpp
@@ -112,22 +112,19 @@
if (len < 2 || textValue[0] != '"' || textValue[len - 1] != '"')
return SPV_FAILED_MATCH;
bool escaping = false;
- size_t write_index = 0;
for (const char* val = textValue + 1; val != textValue + len - 1; ++val) {
if ((*val == '\\') && (!escaping)) {
escaping = true;
} else {
// Have to save space for the null-terminator
- if (write_index >= sizeof(pLiteral->value.str) - 1)
+ if (pLiteral->str.size() >= SPV_LIMIT_LITERAL_STRING_BYTES_MAX)
return SPV_ERROR_OUT_OF_MEMORY;
- pLiteral->value.str[write_index] = *val;
+ pLiteral->str.push_back(*val);
escaping = false;
- ++write_index;
}
}
pLiteral->type = SPV_LITERAL_TYPE_STRING;
- pLiteral->value.str[write_index] = '\0';
} else if (numPeriods == 1) {
double d = std::strtod(textValue, nullptr);
float f = (float)d;
@@ -364,10 +361,10 @@
// NOTE: Special case for extended instruction library import
if (SpvOpExtInstImport == pInst->opcode) {
const spv_ext_inst_type_t ext_inst_type =
- spvExtInstImportTypeGet(literal.value.str);
+ spvExtInstImportTypeGet(literal.str.c_str());
if (SPV_EXT_INST_TYPE_NONE == ext_inst_type) {
return context->diagnostic()
- << "Invalid extended instruction import '" << literal.value.str
+ << "Invalid extended instruction import '" << literal.str
<< "'";
}
if (auto error = context->recordIdAsExtInstImport(pInst->words[1],
@@ -375,7 +372,7 @@
return error;
}
- if (context->binaryEncodeString(literal.value.str, pInst))
+ if (context->binaryEncodeString(literal.str.c_str(), pInst))
return SPV_ERROR_INVALID_TEXT;
} break;
case SPV_OPERAND_TYPE_FP_FAST_MATH_MODE:
diff --git a/source/text.h b/source/text.h
index f8b9551..5c5dc56 100644
--- a/source/text.h
+++ b/source/text.h
@@ -54,11 +54,8 @@
uint64_t u64;
float f;
double d;
- // Allow room for the null terminator
- // TODO(dneto): This is a very large array. We should use a
- // different kind of container.
- char str[SPV_LIMIT_LITERAL_STRING_BYTES_MAX + 1];
} value;
+ std::string str; // Special field for literal string.
} spv_literal_t;
// Functions
diff --git a/test/TextLiteral.cpp b/test/TextLiteral.cpp
index 62a2dbe..301ad6c 100644
--- a/test/TextLiteral.cpp
+++ b/test/TextLiteral.cpp
@@ -112,7 +112,7 @@
ASSERT_EQ(SPV_SUCCESS, spvTextToLiteral(std::get<0>(GetParam()), &l));
EXPECT_EQ(SPV_LITERAL_TYPE_STRING, l.type);
- EXPECT_STREQ(std::get<1>(GetParam()), l.value.str);
+ EXPECT_EQ(std::get<1>(GetParam()), l.str);
}
INSTANTIATE_TEST_CASE_P(
@@ -151,7 +151,7 @@
std::string good_long = std::string("\"") + unquoted + "\"";
EXPECT_EQ(SPV_SUCCESS, spvTextToLiteral(good_long.data(), &l));
EXPECT_EQ(SPV_LITERAL_TYPE_STRING, l.type);
- EXPECT_STREQ(unquoted.data(), l.value.str);
+ EXPECT_EQ(unquoted.data(), l.str);
}
TEST(TextLiteral, GoodUTF8String) {
@@ -161,7 +161,7 @@
spv_literal_t l;
EXPECT_EQ(SPV_SUCCESS, spvTextToLiteral(good_long.data(), &l));
EXPECT_EQ(SPV_LITERAL_TYPE_STRING, l.type);
- EXPECT_STREQ(unquoted.data(), l.value.str);
+ EXPECT_EQ(unquoted.data(), l.str);
}
// A test case for parsing literal numbers.