void ObjTrace::dump(const char *fileName) const { typedef std::map<CallStack, int> CallStack2ObjCntMap; CallStack2ObjCntMap callCntMap; for (ObjTraceMap::const_iterator iter = m_objMap.begin(); iter != m_objMap.end(); ++iter) { ++callCntMap[iter->second]; } typedef std::multimap<int, CallStack> ObjCnt2CallStackMap; ObjCnt2CallStackMap cntCallMap; for (CallStack2ObjCntMap::iterator iter = callCntMap.begin(); iter != callCntMap.end(); ++iter) { cntCallMap.insert(ObjCnt2CallStackMap::value_type(iter->second, iter->first)); } char buf[128] = ""; std::string s; s += "**********************************************\n"; s += std::string("对象个数 :") + itoa((int)m_objMap.size(), buf, 10) + "\n"; int allocPos = 0; for (ObjCnt2CallStackMap::reverse_iterator iter = cntCallMap.rbegin(); iter != cntCallMap.rend(); ++iter) { s += std::string("分配点 ") + itoa(allocPos++, buf, 10) + " , 对象 " + itoa(iter->first, buf, 10) + " 个\n"; std::string ts; dumpStacks(ts, iter->second.stackFrame); s += ts; s += "\n"; } s += "**********************************************\n"; s += "\n"; if (fileName == NULL || fileName == std::string()) { OutputDebugString(s.c_str()); } else { std::ofstream(fileName) << s; } }
static short valueSymbolCallback(void *userDatavp, int symboli, int argi, int resulti) /****************************************************************************/ { static const char funcs[] = "valueSymbolCallback"; valueContext_t *valueContextp = (valueContext_t *) userDatavp; marpaWrapperRecognizer_t *marpaWrapperRecognizerp = valueContextp->marpaWrapperRecognizerp; marpaWrapperValue_t *marpaWrapperValuep = valueContextp->marpaWrapperValuep; marpaWrapperAsfValue_t *marpaWrapperAsfValuep = valueContextp->marpaWrapperAsfValuep; genericStack_t *inputStackp = valueContextp->inputStackp; genericStack_t *outputStackp = valueContextp->outputStackp; genericLogger_t *genericLoggerp = valueContextp->genericLoggerp; int *symbolip = valueContextp->symbolip; stackValueAndDescription_t *resultp = NULL; char *modes = marpaWrapperValuep ? "Value mode" : "Asf value mode"; short rcb; int starti; int lengthi; if (marpaWrapperValuep != NULL) { if (! marpaWrapperValue_value_startb(marpaWrapperValuep, &starti)) { goto err; } if (! marpaWrapperValue_value_lengthb(marpaWrapperValuep, &lengthi)) { goto err; } } else { if (! marpaWrapperAsfValue_value_startb(marpaWrapperAsfValuep, &starti)) { goto err; } if (! marpaWrapperAsfValue_value_lengthb(marpaWrapperAsfValuep, &lengthi)) { goto err; } } GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] Earleme Set Id start/end: %d/%d", modes, funcs, starti, lengthi); GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] Stacks before:", modes, funcs); dumpStacks(modes, valueContextp); if (symboli >= MAX_SYMBOL) { goto err; } switch (symboli) { case op: { char varc = GENERICSTACK_GET_CHAR(inputStackp, argi); GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] op: operator '0x%x' at input stack No %d -> output stack No %d", modes, funcs, varc, argi, resulti); if (GENERICSTACK_IS_PTR(outputStackp, resulti)) { free(GENERICSTACK_GET_PTR(outputStackp, resulti)); GENERICSTACK_SET_NA(outputStackp, resulti); } GENERICSTACK_SET_CHAR(outputStackp, varc, resulti); if (GENERICSTACK_ERROR(outputStackp)) { GENERICLOGGER_ERRORF(genericLoggerp, "generic stack error, %s", strerror(errno)); } } break; case number: { int vari = GENERICSTACK_GET_INT(inputStackp, argi); resultp = malloc(sizeof(stackValueAndDescription_t)); if (resultp == NULL) { GENERICLOGGER_ERRORF(genericLoggerp, "malloc error, %s", strerror(errno)); goto err; } resultp->i = vari; sprintf(resultp->s, "%d", vari); GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] number: value %d at input stack No %d -> {s=%s,i=%d} at output stack No %d", modes, funcs, vari, argi, resultp->s, resultp->i, resulti); if (GENERICSTACK_IS_PTR(outputStackp, resulti)) { free(GENERICSTACK_GET_PTR(outputStackp, resulti)); GENERICSTACK_SET_NA(outputStackp, resulti); } GENERICSTACK_SET_PTR(outputStackp, resultp, resulti); if (GENERICSTACK_ERROR(outputStackp)) { GENERICLOGGER_ERRORF(genericLoggerp, "generic stack error, %s", strerror(errno)); } } break; default: GENERICLOGGER_ERRORF(genericLoggerp, "Symbol %d !?", symboli); return 0; } rcb = 1; goto done; err: if (resultp != NULL) { free(resultp); } rcb = 0; done: GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] Stacks after:", modes, funcs); dumpStacks(modes, valueContextp); return rcb; }
static short valueRuleCallback(void *userDatavp, int rulei, int arg0i, int argni, int resulti) /****************************************************************************/ { static const char funcs[] = "valueRuleCallback"; valueContext_t *valueContextp = (valueContext_t *) userDatavp; marpaWrapperRecognizer_t *marpaWrapperRecognizerp = valueContextp->marpaWrapperRecognizerp; marpaWrapperValue_t *marpaWrapperValuep = valueContextp->marpaWrapperValuep; marpaWrapperAsfValue_t *marpaWrapperAsfValuep = valueContextp->marpaWrapperAsfValuep; genericStack_t *outputStackp = valueContextp->outputStackp; genericLogger_t *genericLoggerp = valueContextp->genericLoggerp; int *ruleip = valueContextp->ruleip; stackValueAndDescription_t *resultp = NULL; char *modes = marpaWrapperValuep ? "Value mode" : "Asf value mode"; short rcb; int starti; int lengthi; if (marpaWrapperValuep != NULL) { if (! marpaWrapperValue_value_startb(marpaWrapperValuep, &starti)) { goto err; } if (! marpaWrapperValue_value_lengthb(marpaWrapperValuep, &lengthi)) { goto err; } } else { if (! marpaWrapperAsfValue_value_startb(marpaWrapperAsfValuep, &starti)) { goto err; } if (! marpaWrapperAsfValue_value_lengthb(marpaWrapperAsfValuep, &lengthi)) { goto err; } } GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] Earleme Set Id start/end: %d/%d", modes, funcs, starti, lengthi); GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] Stacks before:", modes, funcs); dumpStacks(modes, valueContextp); if (rulei >= MAX_RULE) { goto err; } resultp = malloc(sizeof(stackValueAndDescription_t)); if (resultp == NULL) { GENERICLOGGER_ERRORF(genericLoggerp, "malloc error, %s", strerror(errno)); goto err; } switch (rulei) { case START_RULE: { stackValueAndDescription_t *varp = GENERICSTACK_GET_PTR(outputStackp, arg0i); *resultp = *varp; GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] START_RULE: {s=%s,i=%d} at output stack No %d -> {s=%s,i=%d} at output stack No %d", modes, funcs, varp->s, varp->i, arg0i, resultp->s, resultp->i, resulti); } break; case OP_RULE: { stackValueAndDescription_t *var1p = GENERICSTACK_GET_PTR(outputStackp, arg0i ); char var2c = GENERICSTACK_GET_CHAR(outputStackp, arg0i+1); stackValueAndDescription_t *var3p = GENERICSTACK_GET_PTR(outputStackp, arg0i+2); sprintf(resultp->s, "(%s %c %s)", var1p->s, var2c, var3p->s); switch (var2c) { case '+': resultp->i = var1p->i + var3p->i; break; case '-': resultp->i = var1p->i - var3p->i; break; case '*': resultp->i = var1p->i * var3p->i; break; case '/': resultp->i = var1p->i / var3p->i; break; case '%': resultp->i = var1p->i % var3p->i; break; default: GENERICLOGGER_ERRORF(genericLoggerp, "op %c !?", var2c); goto err; } GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] OP_RULE: {s=%s,i=%d} %c {s=%s,i=%i} at output stack [%d-%d] -> {s=%s,i=%d} at output stack No %d", modes, funcs, var1p->s, var1p->i, var2c, var3p->s, var3p->i, arg0i, argni, resultp->s, resultp->i, resulti); } break; case NUMBER_RULE: { stackValueAndDescription_t *varp = GENERICSTACK_GET_PTR(outputStackp, arg0i); *resultp = *varp; GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] START_RULE: {s=%s,i=%d} at output stack No %d -> {s=%s,i=%d} at output stack No %d", modes, funcs, varp->s, varp->i, arg0i, resultp->s, resultp->i, resulti); } break; default: GENERICLOGGER_ERRORF(genericLoggerp, "Rule %d !?", rulei); goto err; } if (GENERICSTACK_IS_PTR(outputStackp, resulti)) { free(GENERICSTACK_GET_PTR(outputStackp, resulti)); GENERICSTACK_SET_NA(outputStackp, resulti); } GENERICSTACK_SET_PTR(outputStackp, resultp, resulti); if (GENERICSTACK_ERROR(outputStackp)) { GENERICLOGGER_ERRORF(genericLoggerp, "generic stack error, %s", strerror(errno)); goto err; } rcb = 1; goto done; err: if (resultp != NULL) { free(resultp); } rcb = 0; done: GENERICLOGGER_TRACEF(genericLoggerp, "[%s][%s] Stacks after:", modes, funcs); dumpStacks(modes, valueContextp); return rcb; }