am d6ff1cc8: Merge "emugen: porperly handle nullAllowed API calls"

* commit 'd6ff1cc8e5805058152020661082f5f1bd9d58a8':
  emugen: porperly handle nullAllowed API calls
This commit is contained in:
David Turner
2011-05-03 12:54:51 -07:00
committed by Android Git Automerger

View File

@@ -384,8 +384,12 @@ int ApiGen::genEncoderImpl(const std::string &filename)
evars[j].lenExpression().c_str());
}
if (evars[j].nullAllowed()) {
fprintf(fp, "ptr += %s == NULL ? 0 : %s; \n", evars[j].name().c_str(), evars[j].lenExpression().c_str());
} else {
fprintf(fp, "ptr += %s;\n", evars[j].lenExpression().c_str());
}
}
} else {
// encode a non pointer variable
if (!evars[j].isVoid()) {
@@ -621,8 +625,13 @@ int ApiGen::genDecoderImpl(const std::string &filename)
(uint) j, varoffset.c_str());
}
if (pass == PASS_FunctionCall) {
if (v->nullAllowed()) {
fprintf(fp, "*((unsigned int *)(ptr + %s)) == 0 ? NULL : (%s)(ptr + %s + 4)",
varoffset.c_str(), v->type()->name().c_str(), varoffset.c_str());
} else {
fprintf(fp, "(%s)(ptr + %s + 4)",
v->type()->name().c_str(), varoffset.c_str());
}
} else if (pass == PASS_DebugPrint) {
fprintf(fp, "(%s)(ptr + %s + 4), *(unsigned int *)(ptr + %s)",
v->type()->name().c_str(), varoffset.c_str(),
@@ -633,10 +642,11 @@ int ApiGen::genDecoderImpl(const std::string &filename)
if (pass == PASS_TmpBuffAlloc) {
fprintf(fp, "\t\t\tsize_t tmpPtr%uSize = (size_t)*(unsigned int *)(ptr + %s);\n",
(uint) j, varoffset.c_str());
if (!totalTmpBuffExist)
if (!totalTmpBuffExist) {
fprintf(fp, "\t\t\tsize_t totalTmpSize = tmpPtr%uSize;\n", (uint)j);
else
} else {
fprintf(fp, "\t\t\ttotalTmpSize += tmpPtr%uSize;\n", (uint)j);
}
tmpBufOffset[j] = totalTmpBuffOffset;
char tmpPtrName[16];
sprintf(tmpPtrName," + tmpPtr%uSize", (uint)j);
@@ -646,7 +656,12 @@ int ApiGen::genDecoderImpl(const std::string &filename)
fprintf(fp, "\t\t\tunsigned char *tmpPtr%u = &tmpBuf[%s];\n",
(uint)j, tmpBufOffset[j].c_str());
} else if (pass == PASS_FunctionCall) {
if (v->nullAllowed()) {
fprintf(fp, "tmpPtr%uSize == 0 ? NULL : (%s)(tmpPtr%u)",
(uint) j, v->type()->name().c_str(), (uint) j);
} else {
fprintf(fp, "(%s)(tmpPtr%u)", v->type()->name().c_str(), (uint) j);
}
} else if (pass == PASS_DebugPrint) {
fprintf(fp, "(%s)(tmpPtr%u), *(unsigned int *)(ptr + %s)",
v->type()->name().c_str(), (uint) j,