Example #1
0
//------------------------------------------------------------
VIREO_FUNCTION_SIGNATURE3(ArrayIndexElt, TypedArrayCoreRef, Int32, void)
{
    TypedArrayCoreRef array = _Param(0);
    Int32       length = array->Length();
    TypeRef     elementType = array->ElementType();
    Int32       index = _Param(1);
    
    if (_ParamPointer(2)) {
        if (index < 0 || index >= length) {
            elementType->InitData(_ParamPointer(2));
        } else {
            elementType->CopyData(array->BeginAt(index), _ParamPointer(2));
        }
    }
    return _NextInstruction();
}
Example #2
0
VIREO_FUNCTION_SIGNATURE4(AnalogWaveformBuild, AnalogWaveform, Timestamp, Double, TypedArrayCoreRef)
{
    _Param(0)._t0 = _ParamPointer(1) ? _Param(1) : Timestamp(0, 0);
    _Param(0)._dt = _ParamPointer(2) ? _Param(2) : 1.0;

    TypedArrayCoreRef* argY_source = _ParamPointer(3);
    TypedArrayCoreRef* waveY_dest = &_Param(0)._Y;
    if (argY_source) {
        if (!(*argY_source)->ElementType()->IsA((*waveY_dest)->ElementType())) {
            THREAD_EXEC()->LogEvent(EventLog::kHardDataError, "AnalogWaveformBuild() Type of argument-3 does not match type of output waveform");
            return THREAD_EXEC()->Stop();
        }
        TypeRef type = (*argY_source)->Type();
        type->CopyData(argY_source, waveY_dest);
    }

    return _NextInstruction();
}
Example #3
0
//------------------------------------------------------------
VIREO_FUNCTION_SIGNATURE4(ArrayReplaceElt, TypedArrayCoreRef, TypedArrayCoreRef, Int32, void)
{
    TypedArrayCoreRef arrayOut = _Param(0);
    TypedArrayCoreRef arrayIn = _Param(1);

    TypeRef     elementType = arrayOut->ElementType();
    Int32       index = _Param(2);
    Int32       length = arrayIn->Length();
    if(arrayOut != arrayIn){
        arrayOut->Type()->CopyData(_ParamPointer(1), _ParamPointer(0));
    } 
    
    if (index >= 0 && index < length) {
        void* pDest = arrayOut->BeginAt(index);
        elementType->CopyData(_ParamPointer(3), pDest);
    }

    return _NextInstruction();
}
Example #4
0
// Convert variant to data of given type. Error if the data types don't match
VIREO_FUNCTION_SIGNATURET(VariantToData, VariantToDataParamBlock)
{
    ErrorCluster *errPtr = _ParamPointer(ErrorClust);
    if (!errPtr || !errPtr->status) {
        TypeRef inputType = _ParamImmediate(InputData._paramType);
        void* inputData = _ParamImmediate(InputData)._pData;

        TypeRef targetType = _ParamPointer(TargetType);
        TypeRef outputType = _ParamImmediate(OutputData._paramType);
        void* outputData = _ParamImmediate(OutputData)._pData;

        if (targetType->IsStaticTypeWildcard() || (!outputType->IsStaticTypeAndDataWildcard() && !outputType->IsA(targetType, true))) {
            // In VIA, TargetType is a required argument. Generated VIA from G must guarantee this.
            // If TargetType is optional, just throw internal error and exit.
            // OutputData is optional. However, if supplied, outputType MUST be same as targetType. Generated VIA from G must guarantee this.
            // If violated, just throw internal error and exit.
            // We should not throw valid LV errors.
            if (errPtr)
                errPtr->SetErrorAndAppendCallChain(true, kUnspecifiedError, "Variant To Data");
            return _NextInstruction();
        }

        if (inputType->IsVariant()) {
            VariantTypeRef variant = *reinterpret_cast<VariantTypeRef *>_ParamImmediate(InputData._pData);
            if (VariantType::IsNullVariant(variant)) {
                if (errPtr)
                    errPtr->SetErrorAndAppendCallChain(true, kVariantIncompatibleType, "Variant To Data");
            } else {
                TypeRef underlyingType = variant->_underlyingTypeRef;
                if (targetType->IsVariant()) {
                    if (outputData)
                        *static_cast<VariantTypeRef *>(outputData) = VariantType::CreateNewVariantFromType(underlyingType);
                } else if (underlyingType->IsA(targetType, true)) {
                    if (outputData)
                        targetType->CopyData(underlyingType->Begin(kPARead), outputData);
                } else if (errPtr) {
                    VariantType::SetVariantToDataTypeError(underlyingType, targetType, outputType, outputData, errPtr);
                }
            }
        } else {