bool UlamTypeInt::castTo64(UlamValue & val, UTI typidx) { bool brtn = true; UTI valtypidx = val.getUlamValueTypeIdx(); u32 valwordsize = m_state.getTotalWordSize(valtypidx); u64 data; if(valwordsize == MAXBITSPERINT) data = (u64) val.getImmediateData(m_state); else if(valwordsize == MAXBITSPERLONG) data = val.getImmediateDataLong(m_state); else assert(0); u64 sdata = 0; s32 bitsize = getBitSize(); s32 valbitsize = m_state.getBitSize(valtypidx); ULAMTYPE valtypEnum = m_state.getUlamTypeByIndex(valtypidx)->getUlamTypeEnum(); switch(valtypEnum) { case Int: // casting Int to Int to change bits size sdata = _Int64ToInt64(data, valbitsize, bitsize); break; case Unsigned: // casting Unsigned to Int to change type sdata = _Unsigned64ToInt64(data, valbitsize, bitsize); break; case Bits: // casting Bits to Int to change type sdata = _Bits64ToInt64(data, valbitsize, bitsize); break; case Unary: sdata = _Unary64ToInt64(data, valbitsize, bitsize); break; case Bool: sdata = _Bool64ToInt64(data, valbitsize, bitsize); break; case Void: default: //std::cerr << "UlamTypeInt (cast) error! Value Type was: " << valtypidx << std::endl; brtn = false; }; if(brtn) { u32 wordsize = getTotalWordSize(); //tobe if(wordsize == MAXBITSPERINT) //downcast val = UlamValue::makeImmediate(typidx, (u32) sdata, m_state); //overwrite val else if(wordsize == MAXBITSPERLONG) val = UlamValue::makeImmediateLong(typidx, sdata, m_state); //overwrite val else assert(0); } return brtn; } //castTo64
bool SymbolWithValue::convertValueToALexString(u64 varg, UTI tuti, std::string& vstr, CompilerState & state) { //UTI tuti = getUlamTypeIdx(); UlamType * tut = state.getUlamTypeByIndex(tuti); s32 bs = tut->getBitSize(); ULAMTYPE etyp = tut->getUlamTypeEnum(); switch(etyp) { case Int: { if(bs <= MAXBITSPERINT) { s32 sval = _Int32ToInt32((u32) varg, bs, MAXBITSPERINT); vstr = ToLeximitedNumber(sval); } else if(bs <= MAXBITSPERLONG) { s64 sval = _Int64ToInt64(varg, bs, MAXBITSPERLONG); vstr = ToLeximitedNumber64(sval); } else state.abortGreaterThanMaxBitsPerLong(); } break; case Bool: { bool bval = _Bool64ToCbool(varg, bs); if(bval) vstr = ToLeximitedNumber(1); //true else vstr = ToLeximitedNumber(0); //false } break; case Unary: { s32 pval = _Unary64ToInt64(varg, bs, MAXBITSPERINT); vstr = ToLeximitedNumber(pval); } break; case Unsigned: case Bits: { if( bs <= MAXBITSPERINT) vstr = ToLeximitedNumber((u32) varg); else if( bs <= MAXBITSPERLONG) vstr = ToLeximitedNumber64(varg); else state.abortGreaterThanMaxBitsPerLong(); } break; case String: { std::ostringstream fhex; std::string fstr = state.getDataAsUnFormattedUserString((u32) varg); u32 flen = fstr.length() - 1; //exclude null terminator for(u32 i = 0; i < flen; i++) fhex << std::hex << std::setfill('0') << std::setw(2) << (u32) fstr[i]; vstr = fhex.str(); } break; default: state.abortUndefinedUlamPrimitiveType(); }; return true; } //convertValueToLexString (static helper)