#include "util/alloc.h"
#include "util/multibit_internal.h"
#include "util/order_check.h"
+#include "util/report_manager.h"
#include "util/verify_types.h"
#include <algorithm>
} // namespace
static
-void writePuffette(mpv_puffette *out, const raw_puff &rp) {
+void writePuffette(mpv_puffette *out, const raw_puff &rp,
+ const ReportManager &rm) {
DEBUG_PRINTF("outputting %u %d %u to %p\n", rp.repeats, (int)rp.unbounded,
rp.report, out);
out->repeats = rp.repeats;
out->unbounded = rp.unbounded;
out->simple_exhaust = rp.simple_exhaust;
- out->report = rp.report;
+ out->report = rm.getProgramOffset(rp.report);
+}
+
+static
+void writeSentinel(mpv_puffette *out) {
+ DEBUG_PRINTF("outputting sentinel to %p\n", out);
+ memset(out, 0, sizeof(*out));
+ out->report = INVALID_REPORT;
}
static
static
void writeKiloPuff(const map<ClusterKey, vector<raw_puff>>::const_iterator &it,
- u32 counter_offset, mpv *m, mpv_kilopuff *kp,
- mpv_puffette **pa) {
+ const ReportManager &rm, u32 counter_offset, mpv *m,
+ mpv_kilopuff *kp, mpv_puffette **pa) {
const CharReach &reach = it->first.reach;
const vector<raw_puff> &puffs = it->second;
kp->puffette_offset = verify_u32((char *)*pa - (char *)m);
for (size_t i = 0; i < puffs.size(); i++) {
assert(!it->first.auto_restart || puffs[i].unbounded);
- writePuffette(*pa + i, puffs[i]);
+ writePuffette(*pa + i, puffs[i], rm);
}
*pa += puffs.size();
- writePuffette(*pa, raw_puff(0U, false, INVALID_REPORT, CharReach()));
+ writeSentinel(*pa);
++*pa;
writeDeadPoint(kp, puffs);
}
aligned_unique_ptr<NFA> mpvCompile(const vector<raw_puff> &puffs_in,
- const vector<raw_puff> &triggered_puffs) {
+ const vector<raw_puff> &triggered_puffs,
+ const ReportManager &rm) {
assert(!puffs_in.empty() || !triggered_puffs.empty());
u32 puffette_count = puffs_in.size() + triggered_puffs.size();
+ sizeof(mpv_counter_info) * counters.size());
mpv_puffette *pa = pa_base;
- writePuffette(pa, raw_puff(0U, false, INVALID_REPORT, CharReach()));
+ writeSentinel(pa);
++pa; /* skip init sentinel */
mpv_kilopuff *kp_begin = (mpv_kilopuff *)(m + 1);
mpv_kilopuff *kp = kp_begin;
for (auto it = puff_clusters.begin(); it != puff_clusters.end(); ++it) {
- writeKiloPuff(it, findCounter(counters, kp - kp_begin).counter_offset,
- m, kp, &pa);
+ writeKiloPuff(it, rm,
+ findCounter(counters, kp - kp_begin).counter_offset, m,
+ kp, &pa);
++kp;
}
assert((char *)pa == (char *)nfa.get() + len);
namespace ue2 {
+class ReportManager;
+
struct raw_puff {
raw_puff(u32 repeats_in, bool unbounded_in, ReportID report_in,
const CharReach &reach_in, bool auto_restart_in = false,
* puffs in the triggered_puffs vector are enabled when an TOP_N event is
* delivered corresponding to their index in the vector
*/
-aligned_unique_ptr<NFA>
-mpvCompile(const std::vector<raw_puff> &puffs,
- const std::vector<raw_puff> &triggered_puffs);
+aligned_unique_ptr<NFA> mpvCompile(const std::vector<raw_puff> &puffs,
+ const std::vector<raw_puff> &triggered_puffs,
+ const ReportManager &rm);
} // namespace ue2
return n;
}
-static
-void remapReportsToPrograms(MpvProto &mpv, const ReportManager &rm) {
- for (auto &puff : mpv.puffettes) {
- puff.report = rm.getProgramOffset(puff.report);
- }
- for (auto &puff : mpv.triggered_puffettes) {
- puff.report = rm.getProgramOffset(puff.report);
- }
-}
-
static
void prepMpv(RoseBuildImpl &tbi, build_context &bc, size_t *historyRequired,
bool *mpv_as_outfix) {
}
auto *mpv = mpv_outfix->mpv();
- auto tmp = *mpv; // copy
- remapReportsToPrograms(tmp, tbi.rm);
- auto nfa = mpvCompile(tmp.puffettes, tmp.triggered_puffettes);
+ auto nfa = mpvCompile(mpv->puffettes, mpv->triggered_puffettes, tbi.rm);
assert(nfa);
if (!nfa) {
throw CompileError("Unable to generate bytecode.");