MCPcopy Create free account
hub / github.com/bloomberg/pystack / loadFromPython2

Method loadFromPython2

src/pystack/_pystack/pytypes.cpp:407–447  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

405}
406
407void
408DictObject::loadFromPython2(remote_addr_t addr)
409{
410 Python2::PyDictObject dict;
411 d_manager->copyObjectFromProcess(addr, &dict);
412
413 ssize_t num_items = dict.ma_mask + 1;
414 std::vector<Python2::PyDictEntry> raw_entries;
415 raw_entries.resize(num_items);
416
417 auto entries_addr = (remote_addr_t)dict.ma_table;
418 d_manager->copyMemoryFromProcess(
419 entries_addr,
420 num_items * sizeof(Python2::PyDictEntry),
421 raw_entries.data());
422
423 std::vector<Python2::PyDictEntry> valid_entries;
424 // Filter out the entries that are empty
425 std::copy_if(
426 std::make_move_iterator(raw_entries.cbegin()),
427 std::make_move_iterator(raw_entries.cend()),
428 std::back_inserter(valid_entries),
429 [](auto& entry) { return entry.me_value != 0; });
430
431 // Copy the keys
432 std::vector<remote_addr_t> keys;
433 keys.reserve(valid_entries.size());
434 std::transform(
435 valid_entries.cbegin(),
436 valid_entries.cend(),
437 std::back_inserter(d_keys),
438 [](auto& entry) { return (remote_addr_t)entry.me_key; });
439
440 // Copy the values
441 d_values.reserve(valid_entries.size());
442 std::transform(
443 valid_entries.cbegin(),
444 valid_entries.cend(),
445 std::back_inserter(d_values),
446 [](auto& entry) { return (remote_addr_t)entry.me_value; });
447}
448
449std::string
450DictObject::toString(ssize_t max_size) const

Callers

nothing calls this directly

Calls 3

copyObjectFromProcessMethod · 0.80
sizeMethod · 0.80
copyMemoryFromProcessMethod · 0.45

Tested by

no test coverage detected