Example #1
0
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;
}