1 |
/* |
/* |
2 |
* Copyright (c) 2014-2016 Christian Schoenebeck |
* Copyright (c) 2014-2017 Christian Schoenebeck |
3 |
* |
* |
4 |
* http://www.linuxsampler.org |
* http://www.linuxsampler.org |
5 |
* |
* |
157 |
* expressions to an array expression for you, instead this method will |
* expressions to an array expression for you, instead this method will |
158 |
* simply return NULL! |
* simply return NULL! |
159 |
* |
* |
160 |
|
* @b Note: this method is currently, and in contrast to its other |
161 |
|
* counter parts, declared as virtual method. Some deriving classes are |
162 |
|
* currently using this to override this default implementation in order |
163 |
|
* to implement an "evaluate now as integer array" behavior. This has |
164 |
|
* efficiency reasons, however this also currently makes this part of |
165 |
|
* the API less clean and should thus be addressed in future with |
166 |
|
* appropriate changes to the API. |
167 |
|
* |
168 |
* @see exprType() |
* @see exprType() |
169 |
*/ |
*/ |
170 |
VMIntArrayExpr* asIntArray() const; |
virtual VMIntArrayExpr* asIntArray() const; |
171 |
|
|
172 |
/** |
/** |
173 |
* Returns true in case this expression can be considered to be a |
* Returns true in case this expression can be considered to be a |
547 |
} |
} |
548 |
}; |
}; |
549 |
|
|
550 |
|
#if HAVE_CXX_EMBEDDED_PRAGMA_DIAGNOSTICS |
551 |
|
# define COMPILER_DISABLE_OFFSETOF_WARNING \ |
552 |
|
_Pragma("GCC diagnostic push") \ |
553 |
|
_Pragma("GCC diagnostic ignored \"-Winvalid-offsetof\"") |
554 |
|
# define COMPILER_RESTORE_OFFSETOF_WARNING \ |
555 |
|
_Pragma("GCC diagnostic pop") |
556 |
|
#else |
557 |
|
# define COMPILER_DISABLE_OFFSETOF_WARNING |
558 |
|
# define COMPILER_RESTORE_OFFSETOF_WARNING |
559 |
|
#endif |
560 |
|
|
561 |
/** |
/** |
562 |
* Convenience macro for initializing VMIntRelPtr and VMInt8RelPtr |
* Convenience macro for initializing VMIntRelPtr and VMInt8RelPtr |
563 |
* structures. Usage example: |
* structures. Usage example: |
602 |
*/ |
*/ |
603 |
#define DECLARE_VMINT(basePtr, T_struct, T_member) ( \ |
#define DECLARE_VMINT(basePtr, T_struct, T_member) ( \ |
604 |
/* Disable offsetof warning, trust us, we are cautios. */ \ |
/* Disable offsetof warning, trust us, we are cautios. */ \ |
605 |
_Pragma("GCC diagnostic push") \ |
COMPILER_DISABLE_OFFSETOF_WARNING \ |
|
_Pragma("GCC diagnostic ignored \"-Winvalid-offsetof\"") \ |
|
606 |
(VMRelPtr) { \ |
(VMRelPtr) { \ |
607 |
(void**) &basePtr, \ |
(void**) &basePtr, \ |
608 |
offsetof(T_struct, T_member), \ |
offsetof(T_struct, T_member), \ |
609 |
false \ |
false \ |
610 |
} \ |
} \ |
611 |
_Pragma("GCC diagnostic pop") \ |
COMPILER_RESTORE_OFFSETOF_WARNING \ |
612 |
) \ |
) \ |
613 |
|
|
614 |
/** |
/** |
626 |
*/ |
*/ |
627 |
#define DECLARE_VMINT_READONLY(basePtr, T_struct, T_member) ( \ |
#define DECLARE_VMINT_READONLY(basePtr, T_struct, T_member) ( \ |
628 |
/* Disable offsetof warning, trust us, we are cautios. */ \ |
/* Disable offsetof warning, trust us, we are cautios. */ \ |
629 |
_Pragma("GCC diagnostic push") \ |
COMPILER_DISABLE_OFFSETOF_WARNING \ |
|
_Pragma("GCC diagnostic ignored \"-Winvalid-offsetof\"") \ |
|
630 |
(VMRelPtr) { \ |
(VMRelPtr) { \ |
631 |
(void**) &basePtr, \ |
(void**) &basePtr, \ |
632 |
offsetof(T_struct, T_member), \ |
offsetof(T_struct, T_member), \ |
633 |
true \ |
true \ |
634 |
} \ |
} \ |
635 |
_Pragma("GCC diagnostic pop") \ |
COMPILER_RESTORE_OFFSETOF_WARNING \ |
636 |
) \ |
) \ |
637 |
|
|
638 |
/** @brief Built-in VM 8 bit integer array variable. |
/** @brief Built-in VM 8 bit integer array variable. |
644 |
struct VMInt8Array { |
struct VMInt8Array { |
645 |
int8_t* data; |
int8_t* data; |
646 |
int size; |
int size; |
647 |
|
bool readonly; ///< Whether the array data may be modified or just be read. |
648 |
|
|
649 |
VMInt8Array() : data(NULL), size(0) {} |
VMInt8Array() : data(NULL), size(0), readonly(false) {} |
650 |
}; |
}; |
651 |
|
|
652 |
/** @brief Virtual machine script variable. |
/** @brief Virtual machine script variable. |
758 |
public: |
public: |
759 |
}; |
}; |
760 |
|
|
761 |
|
/** @brief Dynamically executed variable (of integer array data type). |
762 |
|
* |
763 |
|
* This is the base class for all built-in integer array script variables |
764 |
|
* whose variable content needs to be provided dynamically by executable |
765 |
|
* native code on each script variable access. |
766 |
|
*/ |
767 |
|
class VMDynIntArrayVar : virtual public VMDynVar, virtual public VMIntArrayExpr { |
768 |
|
public: |
769 |
|
}; |
770 |
|
|
771 |
/** @brief Provider for built-in script functions and variables. |
/** @brief Provider for built-in script functions and variables. |
772 |
* |
* |
773 |
* Abstract base class defining the high-level interface for all classes |
* Abstract base class defining the high-level interface for all classes |
851 |
* @see ScriptVM::exec() |
* @see ScriptVM::exec() |
852 |
*/ |
*/ |
853 |
virtual int suspensionTimeMicroseconds() const = 0; |
virtual int suspensionTimeMicroseconds() const = 0; |
854 |
|
|
855 |
|
/** |
856 |
|
* Causes all polyphonic variables to be reset to zero values. A |
857 |
|
* polyphonic variable is expected to be zero when entering a new event |
858 |
|
* handler instance. As an exception the values of polyphonic variables |
859 |
|
* shall only be preserved from an note event handler instance to its |
860 |
|
* correspending specific release handler instance. So in the latter |
861 |
|
* case the script author may pass custom data from the note handler to |
862 |
|
* the release handler, but only for the same specific note! |
863 |
|
*/ |
864 |
|
virtual void resetPolyphonicData() = 0; |
865 |
|
|
866 |
|
/** |
867 |
|
* Returns amount of virtual machine instructions which have been |
868 |
|
* performed the last time when this execution context was executing a |
869 |
|
* script. So in case you need the overall amount of instructions |
870 |
|
* instead, then you need to add them by yourself after each |
871 |
|
* ScriptVM::exec() call. |
872 |
|
*/ |
873 |
|
virtual size_t instructionsPerformed() const = 0; |
874 |
|
|
875 |
|
/** |
876 |
|
* Sends a signal to this script execution instance to abort its script |
877 |
|
* execution as soon as possible. This method is called i.e. when one |
878 |
|
* script execution instance intends to stop another script execution |
879 |
|
* instance. |
880 |
|
*/ |
881 |
|
virtual void signalAbort() = 0; |
882 |
}; |
}; |
883 |
|
|
884 |
/** @brief Script callback for a certain event. |
/** @brief Script callback for a certain event. |