bool SymbolWithValue::getArrayValueAsString(std::string& vstr) { BV8K dval; bool oktoprint = getValueReadyToPrint(dval); if(!oktoprint) return false; UTI tuti = getUlamTypeIdx(); UlamType * tut = m_state.getUlamTypeByIndex(tuti); if(tut->getTotalBitSize() == 0) { vstr = "10"; //empty array return true; } //get the number of bits for this type into u64 // convert to a lex-number as a string, applying type specifics // return the completed string of all the array values in arg vstr. std::ostringstream tovstr; s32 bs = tut->getBitSize(); s32 arraysize = tut->getArraySize(); for(s32 i=0; i < arraysize; i++) { u64 thisval = dval.ReadLong(i * bs, bs); //pos and len std::string str; convertValueToALexString(thisval, tuti, str, m_state); tovstr << str; } vstr = tovstr.str(); return true; } //getArrayValueAsString
UlamValue NodeInstanceof::makeUlamValuePtr() { // (from NodeVarDecl's makeUlamValuePtr) UlamValue ptr; UlamValue atomuv; UTI auti = getOfType(); UlamType * aut = m_state.getUlamTypeByIndex(auti); ULAMCLASSTYPE aclasstype = aut->getUlamClassType(); u32 atop = 1; atop = m_state.m_funcCallStack.getAbsoluteStackIndexOfSlot(atop); if(m_state.isAtom(auti)) atomuv = UlamValue::makeAtom(auti); else if(aclasstype == UC_ELEMENT) atomuv = UlamValue::makeDefaultAtom(auti, m_state); else if(aclasstype == UC_QUARK) { u32 dq = 0; AssertBool isDefinedQuark = m_state.getDefaultQuark(auti, dq); //returns scalar dq assert(isDefinedQuark); atomuv = UlamValue::makeImmediateClass(auti, dq, aut->getTotalBitSize()); } else if(aclasstype == UC_TRANSIENT) atomuv = UlamValue::makeDefaultAtom(auti, m_state); //size limited to atom for eval else m_state.abortUndefinedUlamClassType(); m_state.m_funcCallStack.storeUlamValueAtStackIndex(atomuv, atop); //stackframeslotindex ? ptr = UlamValue::makePtr(atop, STACK, auti, m_state.determinePackable(auti), m_state, 0); ptr.setUlamValueTypeIdx(PtrAbs); return ptr; } //makeUlamValuePtr
void SymbolWithValue::printPostfixValueArray(File * fp) { BV8K dval; bool oktoprint = getValueReadyToPrint(dval); if(!oktoprint) { fp->write("NONREADYCONSTARRAY"); return; } UTI tuti = getUlamTypeIdx(); UlamType * tut = m_state.getUlamTypeByIndex(tuti); s32 tbs = tut->getTotalBitSize(); if(tbs == 0) { fp->write("{ }"); return; //nothing to do } //required as hex for String arrays too (needed for initialization) (t3974) //like the code generated in CS::genCodeClassDefaultConstantArray std::string dhex; bool nonZero = SymbolWithValue::getHexValueAsString(tbs, dval, dhex); //short-circuit if all zeros if(!nonZero) { if(tut->getUlamTypeEnum() == String) //t3953 m_state.abortShouldntGetHere(); fp->write("{ 0 }"); return; //nothing else to do } fp->write("{ "); fp->write(dhex.c_str()); fp->write(" }"); } //printPostfixValueArray
bool SymbolWithValue::getValueAsHexString(std::string& vstr) { BV8K dval; bool oktoprint = getValueReadyToPrint(dval); if(!oktoprint) return false; UTI tuti = getUlamTypeIdx(); UlamType * tut = m_state.getUlamTypeByIndex(tuti); s32 tbs = tut->getTotalBitSize(); if(tbs == 0) { vstr = "0"; //no "0x" hex indicates empty array return true; } s32 tnybbles = int(tbs/4); //4 bits per nybble (one Hex digit) std::ostringstream ostream; //ostream << "0x"; //no "0x" for(s32 i = 0; i < tnybbles; i++) { ostream << std::hex << dval.Read(i, 4); //per bit? } s32 remainder = tbs - tnybbles*4; if(remainder > 0) { //shift left for continguous bits ostream << std::hex << ((dval.Read(tnybbles*4, remainder)) << (4 - remainder)); } vstr = ostream.str(); return true; } //getValueAsHexString