Skip to content

Commit b58df7d

Browse files
committed
Use string output parameter in list to string functions
1 parent 6d44f64 commit b58df7d

File tree

8 files changed

+51
-38
lines changed

8 files changed

+51
-38
lines changed

include/scratchcpp/list.h

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class LIBSCRATCHCPP_EXPORT List : public Entity
153153
}
154154

155155
/*! Joins the list items with spaces or without any separator if there are only digits and returns the result as StringPtr. */
156-
inline StringPtr *toStringPtr() const
156+
inline void toStringPtr(StringPtr *dst) const
157157
{
158158
veque::veque<StringPtr *> strings;
159159
size_t size = 0;
@@ -187,56 +187,54 @@ class LIBSCRATCHCPP_EXPORT List : public Entity
187187
}
188188
}
189189

190-
StringPtr *ret = string_pool_new();
191-
ret->size = 0;
190+
dst->size = 0;
192191

193192
if (digits) {
194-
string_alloc(ret, size);
193+
string_alloc(dst, size);
195194

196195
for (i = 0; i < strings.size(); i++) {
197-
memcpy(ret->data + ret->size, strings[i]->data, strings[i]->size * sizeof(char16_t));
198-
ret->size += strings[i]->size;
196+
memcpy(dst->data + dst->size, strings[i]->data, strings[i]->size * sizeof(char16_t));
197+
dst->size += strings[i]->size;
199198
string_pool_free(strings[i]);
200199
}
201200

202201
for (; i < m_size; i++) {
203202
StringPtr *item = string_pool_new();
204203
value_toStringPtr(&m_dataPtr->operator[](i), item);
205204
size += item->size + 1;
206-
string_alloc(ret, size);
207-
memcpy(ret->data + ret->size, item->data, item->size * sizeof(char16_t));
208-
ret->size += item->size;
205+
string_alloc(dst, size);
206+
memcpy(dst->data + dst->size, item->data, item->size * sizeof(char16_t));
207+
dst->size += item->size;
209208
string_pool_free(item);
210209
}
211210
} else {
212211
size += strings.size() - 1;
213-
string_alloc(ret, size);
212+
string_alloc(dst, size);
214213

215214
for (i = 0; i < strings.size(); i++) {
216-
memcpy(ret->data + ret->size, strings[i]->data, strings[i]->size * sizeof(char16_t));
217-
ret->size += strings[i]->size;
215+
memcpy(dst->data + dst->size, strings[i]->data, strings[i]->size * sizeof(char16_t));
216+
dst->size += strings[i]->size;
218217
string_pool_free(strings[i]);
219218

220219
if (i + 1 < m_size)
221-
ret->data[ret->size++] = u' ';
220+
dst->data[dst->size++] = u' ';
222221
}
223222

224223
for (; i < m_size; i++) {
225224
StringPtr *item = string_pool_new();
226225
value_toStringPtr(&m_dataPtr->operator[](i), item);
227226
size += item->size + 1;
228-
string_alloc(ret, size);
229-
memcpy(ret->data + ret->size, item->data, item->size * sizeof(char16_t));
230-
ret->size += item->size;
227+
string_alloc(dst, size);
228+
memcpy(dst->data + dst->size, item->data, item->size * sizeof(char16_t));
229+
dst->size += item->size;
231230
string_pool_free(item);
232231

233232
if (i + 1 < m_size)
234-
ret->data[ret->size++] = u' ';
233+
dst->data[dst->size++] = u' ';
235234
}
236235
}
237236

238-
ret->data[ret->size] = u'\0';
239-
return ret;
237+
dst->data[dst->size] = u'\0';
240238
}
241239

242240
std::string toString() const;

src/engine/internal/llvm/instructions/lists.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,8 @@ LLVMInstruction *Lists::buildGetListContents(LLVMInstruction *ins)
270270
{
271271
assert(ins->args.size() == 0);
272272
const LLVMListPtr &listPtr = m_utils.listPtr(ins->targetList);
273-
llvm::Value *ptr = m_builder.CreateCall(m_utils.functions().resolve_list_to_string(), listPtr.ptr);
273+
llvm::Value *ptr = m_builder.CreateCall(m_utils.functions().resolve_string_pool_new(), { m_builder.getInt1(true) });
274+
m_builder.CreateCall(m_utils.functions().resolve_list_to_string(), { listPtr.ptr, ptr });
274275
m_utils.freeStringLater(ptr);
275276
ins->functionReturnReg->value = ptr;
276277

src/engine/internal/llvm/llvmfunctions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ llvm::FunctionCallee LLVMFunctions::resolve_list_alloc_size_ptr()
234234
llvm::FunctionCallee LLVMFunctions::resolve_list_to_string()
235235
{
236236
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(*m_ctx->llvmCtx()), 0);
237-
llvm::FunctionCallee callee = resolveFunction("list_to_string", llvm::FunctionType::get(m_stringPtrType->getPointerTo(), { pointerType }, false));
237+
llvm::FunctionCallee callee = resolveFunction("list_to_string", llvm::FunctionType::get(m_builder->getVoidTy(), { pointerType, m_stringPtrType->getPointerTo() }, false));
238238
llvm::Function *func = llvm::cast<llvm::Function>(callee.getCallee());
239239
func->addFnAttr(llvm::Attribute::ReadOnly);
240240
return callee;

src/scratch/list.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ void List::setMonitor(Monitor *monitor)
6161
/*! Same as the other method, but returns the result as std::string. */
6262
std::string List::toString() const
6363
{
64-
StringPtr *str = toStringPtr();
64+
StringPtr *str = string_pool_new();
65+
toStringPtr(str);
6566
std::string ret = utf8::utf16to8(std::u16string(str->data));
6667
string_pool_free(str);
6768
return ret;

src/scratch/list_functions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ extern "C"
5858
return list->size();
5959
}
6060

61-
StringPtr *list_to_string(List *list)
61+
void list_to_string(List *list, StringPtr *dst)
6262
{
63-
return list->toStringPtr();
63+
list->toStringPtr(dst);
6464
}
6565
}

src/scratch/list_functions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ extern "C"
2626
const size_t *list_alloc_size_ptr(List *list);
2727
size_t list_size(List *list);
2828

29-
StringPtr *list_to_string(List *list);
29+
void list_to_string(List *list, StringPtr *dst);
3030
}
3131

3232
} // namespace libscratchcpp

test/scratch_classes/list_functions_test.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ TEST(ListFunctionsTest, ToString)
171171
list.append("sit");
172172
list.append("amet");
173173

174-
StringPtr *str = list_to_string(&list);
174+
StringPtr *str = string_pool_new();
175+
list_to_string(&list, str);
175176
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "Lorem ipsum dolor sit amet");
176177
}
177178

@@ -181,7 +182,8 @@ TEST(ListFunctionsTest, ToString)
181182
list.append(2);
182183
list.append(3);
183184

184-
StringPtr *str = list_to_string(&list);
185+
StringPtr *str = string_pool_new();
186+
list_to_string(&list, str);
185187
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "123");
186188
}
187189
}

test/scratch_classes/list_test.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -296,20 +296,23 @@ TEST(ListTest, ArrayIndexOperator)
296296
TEST(ListTest, ToString)
297297
{
298298
List list("", "test list");
299-
StringPtr *str = list.toStringPtr();
299+
StringPtr *str = string_pool_new();
300+
list.toStringPtr(str);
300301
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "");
301302
ASSERT_EQ(str->size, 0);
302303
ASSERT_EQ(list.toString(), "");
303304

304305
list.append("");
305-
str = list.toStringPtr();
306+
str = string_pool_new();
307+
list.toStringPtr(str);
306308
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "");
307309
ASSERT_EQ(str->size, 0);
308310
ASSERT_EQ(list.toString(), "");
309311

310312
list.append("");
311313
list.append("");
312-
str = list.toStringPtr();
314+
str = string_pool_new();
315+
list.toStringPtr(str);
313316
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), " ");
314317
ASSERT_EQ(str->size, 2);
315318
ASSERT_EQ(list.toString(), " ");
@@ -318,7 +321,8 @@ TEST(ListTest, ToString)
318321
list.append("item1");
319322
list.append("i t e m 2");
320323
list.append("item 3");
321-
str = list.toStringPtr();
324+
str = string_pool_new();
325+
list.toStringPtr(str);
322326
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "item1 i t e m 2 item 3");
323327
ASSERT_EQ(str->size, 22);
324328
ASSERT_EQ(list.toString(), "item1 i t e m 2 item 3");
@@ -328,15 +332,17 @@ TEST(ListTest, ToString)
328332
list.append("a ");
329333
list.append(" b");
330334
list.append(" c ");
331-
str = list.toStringPtr();
335+
str = string_pool_new();
336+
list.toStringPtr(str);
332337
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), " a b c ");
333338
ASSERT_EQ(str->size, 11);
334339
ASSERT_EQ(list.toString(), " a b c ");
335340

336341
list.clear();
337342
list.append("áä");
338343
list.append("ľ š");
339-
str = list.toStringPtr();
344+
str = string_pool_new();
345+
list.toStringPtr(str);
340346
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "áä ľ š");
341347
ASSERT_EQ(str->size, 6);
342348
ASSERT_EQ(list.toString(), "áä ľ š");
@@ -345,7 +351,8 @@ TEST(ListTest, ToString)
345351
list.append(-2);
346352
list.append(5);
347353
list.append(8);
348-
str = list.toStringPtr();
354+
str = string_pool_new();
355+
list.toStringPtr(str);
349356
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "-2 5 8");
350357
ASSERT_EQ(str->size, 6);
351358
ASSERT_EQ(list.toString(), "-2 5 8");
@@ -354,7 +361,8 @@ TEST(ListTest, ToString)
354361
list.append(2);
355362
list.append(10);
356363
list.append(8);
357-
str = list.toStringPtr();
364+
str = string_pool_new();
365+
list.toStringPtr(str);
358366
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "2 10 8");
359367
ASSERT_EQ(str->size, 6);
360368
ASSERT_EQ(list.toString(), "2 10 8");
@@ -363,23 +371,26 @@ TEST(ListTest, ToString)
363371
list.append(0);
364372
list.append(9);
365373
list.append(8);
366-
str = list.toStringPtr();
374+
str = string_pool_new();
375+
list.toStringPtr(str);
367376
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "098");
368377
ASSERT_EQ(str->size, 3);
369378
ASSERT_EQ(list.toString(), "098");
370379

371380
list.clear();
372381
list.append("true");
373382
list.append("false");
374-
str = list.toStringPtr();
383+
str = string_pool_new();
384+
list.toStringPtr(str);
375385
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "true false");
376386
ASSERT_EQ(str->size, 10);
377387
ASSERT_EQ(list.toString(), "true false");
378388

379389
list.clear();
380390
list.append(true);
381391
list.append(false);
382-
str = list.toStringPtr();
392+
str = string_pool_new();
393+
list.toStringPtr(str);
383394
ASSERT_EQ(utf8::utf16to8(std::u16string(str->data)), "true false");
384395
ASSERT_EQ(str->size, 10);
385396
ASSERT_EQ(list.toString(), "true false");

0 commit comments

Comments
 (0)