本文整理汇总了C++中UlamValue::getPtrNameId方法的典型用法代码示例。如果您正苦于以下问题:C++ UlamValue::getPtrNameId方法的具体用法?C++ UlamValue::getPtrNameId怎么用?C++ UlamValue::getPtrNameId使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类UlamValue
的用法示例。
在下文中一共展示了UlamValue::getPtrNameId方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: eval
EvalStatus NodeMemberSelect::eval()
{
assert(m_nodeLeft && m_nodeRight);
UTI nuti = getNodeType();
if(nuti == Nav)
return ERROR;
if(nuti == Hzy)
return NOTREADY;
evalNodeProlog(0); //new current frame pointer on node eval stack
UlamValue saveCurrentObjectPtr = m_state.m_currentObjPtr; //*************
UlamValue saveCurrentSelfPtr = m_state.m_currentSelfPtr; //*************
makeRoomForSlots(1); //always 1 slot for ptr
EvalStatus evs = m_nodeLeft->evalToStoreInto();
if(evs != NORMAL)
{
evalNodeEpilog();
return evs;
}
//UPDATE selected member (i.e. element or quark) before eval of rhs
//(i.e. data member or func call); e.g. Ptr to atom
UlamValue newCurrentObjectPtr = m_state.m_nodeEvalStack.loadUlamValuePtrFromSlot(1);
UTI newobjtype = newCurrentObjectPtr.getUlamValueTypeIdx();
if(!m_state.isPtr(newobjtype))
{
assert(m_nodeLeft->isFunctionCall()); //must be the result of a function call
// copy anonymous class to "uc" hidden slot in STACK, then replace with a pointer to it.
assert(m_state.isAClass(newobjtype));
newCurrentObjectPtr = assignAnonymousClassReturnValueToStack(newCurrentObjectPtr); //t3912
}
u32 superid = m_state.m_pool.getIndexForDataString("super");
if(newCurrentObjectPtr.getPtrNameId() == superid)
{
if(!m_nodeRight->isFunctionCall())
newCurrentObjectPtr = m_state.m_currentSelfPtr; //(t3749)
else
m_state.m_currentSelfPtr = newCurrentObjectPtr; //changes self ********* (t3743, t3745)
}
m_state.m_currentObjPtr = newCurrentObjectPtr;
//UTI ruti = m_nodeRight->getNodeType();
//u32 slot = makeRoomForNodeType(ruti);
u32 slot = makeRoomForNodeType(nuti);
evs = m_nodeRight->eval(); //a Node Function Call here, or data member eval
if(evs != NORMAL)
{
evalNodeEpilog();
return evs;
}
//assigns rhs to lhs UV pointer (handles arrays);
//also copy result UV to stack, -1 relative to current frame pointer
if(slot) //avoid Void's
if(!doBinaryOperation(1, 1+slot, slot))
evs = ERROR;
m_state.m_currentObjPtr = saveCurrentObjectPtr; //restore current object ptr
m_state.m_currentSelfPtr = saveCurrentSelfPtr; //restore current self ptr
evalNodeEpilog();
return evs;
} //eval
示例2: genCodeReadIntoATmpVar
//.........这里部分代码省略.........
if(vuti == Ptr)
{
tmpVarNum = uvpass.getPtrSlotIndex();
vuti = uvpass.getPtrTargetType(); //replace
}
else
{
// an immediate terminal value
isTerminal = true;
}
if(nuti == vuti)
return; //nothing to do!
UlamType * vut = m_state.getUlamTypeByIndex(vuti); //after vuti replacement
ULAMCLASSTYPE nclasstype = nut->getUlamClass();
ULAMCLASSTYPE vclasstype = vut->getUlamClass();
//handle element-atom and atom-element casting differently:
// handle element->quark, atom->quark, not quark->element or quark->atom
if(nuti == UAtom || vuti == UAtom || vclasstype == UC_ELEMENT || vclasstype == UC_QUARK)
{
//only to be nclasstype quark makes sense!!! check first, one might be element
if(nclasstype == UC_QUARK || vclasstype == UC_QUARK)
return genCodeCastAtomAndQuark(fp, uvpass);
if(nclasstype == UC_ELEMENT || vclasstype == UC_ELEMENT)
return genCodeCastAtomAndElement(fp, uvpass);
{
std::ostringstream msg;
msg << "Casting 'incomplete' types: ";
msg << m_state.getUlamTypeNameByIndex(nuti).c_str();
msg << "(UTI" << nuti << ") to be " << m_state.getUlamTypeNameByIndex(vuti).c_str();
msg << "(UTI" << vuti << ")";
MSG(getNodeLocationAsString().c_str(), msg.str().c_str(), DEBUG);
return;
}
}
s32 tmpVarCastNum = m_state.getNextTmpVarNumber();
m_state.indent(fp);
fp->write("const ");
fp->write(nut->getTmpStorageTypeAsString().c_str()); //e.g. u32, s32, u64, etc.
fp->write(" ");
fp->write(m_state.getTmpVarAsString(nuti, tmpVarCastNum).c_str());
fp->write(" = ");
// write the cast method (e.g. _Unsigned32ToInt32, _Int32ToUnary32, etc..)
fp->write(nut->castMethodForCodeGen(vuti).c_str());
fp->write("(");
if(isTerminal)
{
s32 len = m_state.getBitSize(vuti);
assert(len != UNKNOWNSIZE);
if(len <= MAXBITSPERINT)
{
u32 data = uvpass.getImmediateData(m_state);
char dstr[40];
vut->getDataAsString(data, dstr, 'z');
fp->write(dstr);
}
else if(len <= MAXBITSPERLONG)
{
u64 data = uvpass.getImmediateDataLong(m_state);
char dstr[70];
vut->getDataLongAsString(data, dstr, 'z');
fp->write(dstr);
}
else
assert(0);
}
else
{
fp->write(m_state.getTmpVarAsString(nuti, tmpVarNum).c_str());
}
fp->write(", ");
assert(!(nuti == UAtom || vuti == UAtom));
//LENGTH of node being casted (Uh_AP_mi::LENGTH ?)
//fp->write(m_state.getBitVectorLengthAsStringForCodeGen(nodetype).c_str());
fp->write_decimal(m_state.getTotalBitSize(vuti)); //src length
fp->write(", ");
fp->write_decimal(m_state.getTotalBitSize(nuti)); //tobe length
fp->write(")");
fp->write(";\n");
//PROBLEM is that funccall checks for 0 nameid to use the tmp var!
// but then if we don't pass it along Node::genMemberNameForMethod fails..
if(isTerminal)
uvpass = UlamValue::makePtr(tmpVarCastNum, TMPREGISTER, nuti, m_state.determinePackable(nuti), m_state, 0); //POS 0 rightjustified.
else
uvpass = UlamValue::makePtr(tmpVarCastNum, TMPREGISTER, nuti, m_state.determinePackable(nuti), m_state, 0, uvpass.getPtrNameId()); //POS 0 rightjustified; pass along name id
} //genCodeReadIntoTmp
示例3: genCodeCastAtomAndElement
void NodeCast::genCodeCastAtomAndElement(File * fp, UlamValue & uvpass)
{
UTI nuti = getNodeType();
UlamType * nut = m_state.getUlamTypeByIndex(nuti);
UTI vuti = uvpass.getUlamValueTypeIdx();
s32 tmpVarNum = 0;
if(vuti == Ptr)
{
tmpVarNum = uvpass.getPtrSlotIndex();
vuti = uvpass.getPtrTargetType(); //replace
}
// "downcast" might not be true; compare to be sure the atom is an element "Foo"
if(vuti == UAtom)
{
m_state.indent(fp);
fp->write("if(!");
fp->write(nut->getUlamTypeMangledName().c_str());
fp->write("<EC>::THE_INSTANCE.");
fp->write(m_state.getIsMangledFunctionName());
fp->write("(");
fp->write(m_state.getTmpVarAsString(vuti, tmpVarNum).c_str());
fp->write("))\n");
m_state.m_currentIndentLevel++;
m_state.indent(fp);
fp->write("FAIL(BAD_CAST);\n");
m_state.m_currentIndentLevel--;
}
//update the uvpass to have the casted type
uvpass = UlamValue::makePtr(tmpVarNum, uvpass.getPtrStorage(), nuti, m_state.determinePackable(nuti), m_state, 0, uvpass.getPtrNameId()); //POS 0 rightjustified; pass along name id
return;
} //genCodeCastAtomAndElement
示例4: genCode
void NodeBinaryOpEqualBitwise::genCode(File * fp, UlamValue& uvpass)
{
assert(m_nodeLeft && m_nodeRight);
assert(m_state.m_currentObjSymbolsForCodeGen.empty());
#ifdef TMPVARBRACES
m_state.indent(fp);
fp->write("{\n");
m_state.m_currentIndentLevel++;
#endif
// generate rhs first; may update current object globals (e.g. function call)
UlamValue ruvpass;
m_nodeRight->genCode(fp, ruvpass);
// restore current object globals
assert(m_state.m_currentObjSymbolsForCodeGen.empty());
// lhs should be the new current object: node member select updates them,
// but a plain NodeIdent does not!!! because genCodeToStoreInto has been repurposed
// to mean "don't read into a TmpVar" (e.g. by NodeCast).
UlamValue luvpass;
m_nodeLeft->genCodeToStoreInto(fp, luvpass); //may update m_currentObjSymbol
//wiped out by left read; need to write back into left
std::vector<Symbol *> saveCOSVector = m_state.m_currentObjSymbolsForCodeGen;
uvpass = luvpass; //keep luvpass slot untouched
Node::genCodeReadIntoATmpVar(fp, uvpass);
m_state.m_currentObjSymbolsForCodeGen = saveCOSVector; //restore vector after lhs read*************
UTI nuti = getNodeType();
UlamType * nut = m_state.getUlamTypeByIndex(nuti);
s32 tmpVarNum = m_state.getNextTmpVarNumber();
m_state.indent(fp);
fp->write("const ");
fp->write(nut->getTmpStorageTypeAsString().c_str()); //e.g. u32, s32, u64..
fp->write(" ");
fp->write(m_state.getTmpVarAsString(nuti,tmpVarNum).c_str());
fp->write(" = ");
fp->write(methodNameForCodeGen().c_str());
fp->write("(");
UTI uti = uvpass.getUlamValueTypeIdx();
assert(uti == Ptr);
fp->write(m_state.getTmpVarAsString(uvpass.getPtrTargetType(), uvpass.getPtrSlotIndex()).c_str());
fp->write(", ");
UTI ruti = ruvpass.getUlamValueTypeIdx();
assert(ruti == Ptr);
fp->write(m_state.getTmpVarAsString(ruvpass.getPtrTargetType(), ruvpass.getPtrSlotIndex()).c_str());
fp->write(", ");
fp->write_decimal(nut->getBitSize());
fp->write(");\n");
uvpass = UlamValue::makePtr(tmpVarNum, TMPREGISTER, nuti, m_state.determinePackable(nuti), m_state, uvpass.getPtrPos(), uvpass.getPtrNameId()); //P
// current object globals should pertain to lhs for the write
genCodeWriteFromATmpVar(fp, luvpass, uvpass); //uses rhs' tmpvar; orig lhs
#ifdef TMPVARBRACES
m_state.m_currentIndentLevel--;
m_state.indent(fp);
fp->write("}\n"); //close for tmpVar
#endif
assert(m_state.m_currentObjSymbolsForCodeGen.empty());
} //genCode