void Evaluator::evaluatePrimitiveBody()

in impl/src/tooling/icpp/interpreter/op_eval.cpp [2156:2253]


void Evaluator::evaluatePrimitiveBody(const BSQInvokePrimitiveDecl* invk, StorageLocationPtr resultsl, const BSQType* restype)
{
    switch (invk->implkey)
    {
    case BSQPrimitiveImplTag::validator_accepts: {
        //BSQString str = SLPTR_LOAD_CONTENTS_AS(BSQString, this->cframe->argsbase[0]);
        assert(false);
        break;
    }
    case BSQPrimitiveImplTag::string_empty:
        assert(false);
        break;
    case BSQPrimitiveImplTag::string_append:
        assert(false);
        break;
    case BSQPrimitiveImplTag::stringof_string:
        SLPTR_STORE_CONTENTS_AS(BSQString, resultsl, SLPTR_LOAD_CONTENTS_AS(BSQString, this->cframe->argsbase[0]));
        break;
    case BSQPrimitiveImplTag::stringof_from:
        SLPTR_STORE_CONTENTS_AS(BSQString, resultsl, SLPTR_LOAD_CONTENTS_AS(BSQString, this->cframe->argsbase[0]));
        break;
    case BSQPrimitiveImplTag::list_size: {
        BSQNat length = dynamic_cast<const BSQListType*>(invk->enclosingtype)->getLength(SLPTR_LOAD_CONTENTS_AS(BSQList, this->cframe->argsbase[0]));
        SLPTR_STORE_CONTENTS_AS(BSQNat, resultsl, length);
        break;
    }
    case BSQPrimitiveImplTag::list_empty: {
        BSQBool empty = dynamic_cast<const BSQListType*>(invk->enclosingtype)->getLength(SLPTR_LOAD_CONTENTS_AS(BSQList, this->cframe->argsbase[0])) == 0;
        SLPTR_STORE_CONTENTS_AS(BSQBool, resultsl, empty);
        break;
    }
    case BSQPrimitiveImplTag::list_unsafe_get: {
        auto idx = SLPTR_LOAD_CONTENTS_AS(BSQNat, this->cframe->argsbase[1]);
        dynamic_cast<const BSQListType*>(invk->enclosingtype)->getValueAtPosition(this->cframe->argsbase[0], idx);
        break;
    }
    case BSQPrimitiveImplTag::list_fill:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_concat2:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_haspredcheck: {
        StorageLocationPtr scratcharg = (this->cframe->mixedbase + invk->mixedoffsetMap.find("vv")->second.first);
        const BSQPCode* pc = invk->pcodes.find("p")->second;
        BSQPCodeOperator lambda(Environment::g_invokes[pc->code]);
        loadPCodeCapturedArgs(lambda, pc);

        dynamic_cast<const BSQListType*>(invk->enclosingtype)->hasPredCheck(this->cframe->argsbase[0], scratcharg, resultsl, [this, &lambda](const std::vector<StorageLocationPtr>& args, StorageLocationPtr res) {
            this->invokePCode(lambda, args, res);
        });
        break;
    }
    case BSQPrimitiveImplTag::list_haspredcheck_idx:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_findindexof:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_findindexoflast:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_findindexof_idx:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_findindexoflast_idx:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_minidx:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_maxidx:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_sum:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_filter:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_filter_idx:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_slice:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_map:
        assert(false);
        break;
    case BSQPrimitiveImplTag::list_map_idx:
        assert(false);
        break;

    default:
        assert(false);
        break;
    }
}