/[svn]/linuxsampler/trunk/src/scriptvm/tree.h
ViewVC logotype

Annotation of /linuxsampler/trunk/src/scriptvm/tree.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3846 - (hide annotations) (download) (as text)
Wed Jan 6 14:01:11 2021 UTC (3 years, 3 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 40973 byte(s)
* ScriptVM: Fixed crash when handling array results of built-in
  functions (e.g. "num_elements(by_marks($MARK_1)").

* Bumped version (2.1.1.svn69).

1 schoenebeck 2581 /* -*- c++ -*-
2     *
3 persson 3455 * Copyright (c) 2014 - 2019 Christian Schoenebeck and Andreas Persson
4 schoenebeck 2581 *
5     * http://www.linuxsampler.org
6     *
7     * This file is part of LinuxSampler and released under the same terms.
8     * See README file for details.
9     */
10    
11     // This header defines VM core implementation internal data types only used
12     // inside the parser and core VM implementation of this source directory. Not
13     // intended to be used in other source code parts (other source code
14     // directories) of the sampler.
15    
16     #ifndef LS_INSTRPARSERTREE_H
17     #define LS_INSTRPARSERTREE_H
18    
19     #include <vector>
20     #include <iostream>
21     #include <map>
22     #include <set>
23 schoenebeck 3208 #include <string.h> // for memset()
24 schoenebeck 3586 #include <assert.h>
25 schoenebeck 2581 #include "../common/global.h"
26     #include "../common/Ref.h"
27     #include "../common/ArrayList.h"
28 schoenebeck 3733 #include "../common/optional.h"
29 schoenebeck 2581 #include "common.h"
30    
31     namespace LinuxSampler {
32    
33     class ParserContext;
34     class ExecContext;
35    
36     enum StmtType_t {
37     STMT_LEAF,
38     STMT_LIST,
39     STMT_BRANCH,
40     STMT_LOOP,
41 schoenebeck 3260 STMT_SYNC,
42 schoenebeck 3311 STMT_NOOP,
43 schoenebeck 2581 };
44    
45 schoenebeck 3728 enum Qualifier_t {
46     QUALIFIER_NONE = 0,
47     QUALIFIER_CONST = 1,
48     QUALIFIER_POLYPHONIC = (1<<1),
49 schoenebeck 3733 QUALIFIER_PATCH = (1<<2),
50 schoenebeck 3728 };
51    
52 schoenebeck 3733 struct PatchVarBlock {
53     CodeBlock nameBlock;
54     optional<CodeBlock> exprBlock;
55     };
56    
57 schoenebeck 3583 /**
58     * Convenience function used for retrieving the (assumed) data type of a given
59     * script variable name.
60     *
61     * @param name - some script variable name (e.g. "$foo")
62     * @return variable's assumed data type (e.g. INT_EXPR for example above)
63     */
64     inline ExprType_t exprTypeOfVarName(const String& name) {
65     if (name.empty()) return (ExprType_t) -1;
66     const char prefix = name[0];
67     switch (prefix) {
68     case '$': return INT_EXPR;
69     case '%': return INT_ARR_EXPR;
70     case '~': return REAL_EXPR;
71     case '?': return REAL_ARR_EXPR;
72     case '@': return STRING_EXPR;
73     case '!': return STRING_ARR_EXPR;
74     }
75     return (ExprType_t) -1;
76     }
77    
78 schoenebeck 3586 inline ExprType_t scalarTypeOfArray(ExprType_t arrayType) {
79     if (arrayType == INT_ARR_EXPR) return INT_EXPR;
80     if (arrayType == REAL_ARR_EXPR) return REAL_EXPR;
81     if (arrayType == STRING_ARR_EXPR) return STRING_EXPR;
82     assert(false);
83     return EMPTY_EXPR; // just to shut up the compiler
84     }
85    
86 schoenebeck 3728 inline String qualifierStr(Qualifier_t qualifier) {
87     switch (qualifier) {
88     case QUALIFIER_NONE: return "none";
89     case QUALIFIER_CONST: return "const";
90     case QUALIFIER_POLYPHONIC: return "polyphonic";
91 schoenebeck 3733 case QUALIFIER_PATCH: return "patch";
92 schoenebeck 3728 }
93     return "unknown";
94     }
95    
96 schoenebeck 3585 /**
97     * Used by parser for parser error messages to provide a text with all data
98     * types accepted by the given built-in function @a fn for the respective
99     * function argument @a iArg.
100     */
101     String acceptedArgTypesStr(VMFunction* fn, vmint iArg);
102    
103 schoenebeck 2581 class Node {
104     public:
105     Node();
106     virtual ~Node();
107     virtual void dump(int level = 0) = 0;
108 schoenebeck 2645 virtual bool isPolyphonic() const = 0;
109 schoenebeck 2581 void printIndents(int n);
110     };
111     typedef Ref<Node> NodeRef;
112    
113     class Expression : virtual public VMExpr, virtual public Node {
114     public:
115     virtual ExprType_t exprType() const = 0;
116     virtual bool isConstExpr() const = 0;
117     virtual String evalCastToStr() = 0;
118     };
119     typedef Ref<Expression,Node> ExpressionRef;
120    
121 schoenebeck 3573 class Unit : virtual public VMUnit, virtual public Node {
122     StdUnit_t unit;
123 schoenebeck 2581 public:
124 schoenebeck 3581 Unit(StdUnit_t type) : unit(type) {}
125 schoenebeck 3573 StdUnit_t unitType() const OVERRIDE { return unit; }
126 schoenebeck 3581 static vmint convIntToUnitFactor(vmint iValue, VMUnit* srcUnit, VMUnit* dstUnit);
127     static vmint convIntToUnitFactor(vmint iValue, vmfloat srcFactor, vmfloat dstFactor);
128     static vmfloat convRealToUnitFactor(vmfloat fValue, VMUnit* srcUnit, VMUnit* dstUnit);
129     static vmfloat convRealToUnitFactor(vmfloat fValue, vmfloat srcFactor, vmfloat dstFactor);
130 schoenebeck 3573 };
131     typedef Ref<Unit,Node> UnitRef;
132    
133 schoenebeck 3582 class NumberExpr : virtual public Unit, virtual public VMNumberExpr, virtual public Expression {
134 schoenebeck 3573 public:
135     };
136 schoenebeck 3582 typedef Ref<NumberExpr,Node> NumberExprRef;
137 schoenebeck 3573
138 schoenebeck 3582 class IntExpr : virtual public NumberExpr, virtual public VMIntExpr {
139 schoenebeck 3573 public:
140 schoenebeck 3557 ExprType_t exprType() const OVERRIDE { return INT_EXPR; }
141 schoenebeck 3581 vmint evalIntToUnitFactor(vmfloat unitFactor);
142 schoenebeck 3557 String evalCastToStr() OVERRIDE;
143 schoenebeck 2581 };
144     typedef Ref<IntExpr,Node> IntExprRef;
145    
146 schoenebeck 3582 class RealExpr : virtual public NumberExpr, virtual public VMRealExpr {
147 schoenebeck 3056 public:
148 schoenebeck 3573 ExprType_t exprType() const OVERRIDE { return REAL_EXPR; }
149 schoenebeck 3581 vmfloat evalRealToUnitFactor(vmfloat unitFactor);
150 schoenebeck 3573 String evalCastToStr() OVERRIDE;
151     };
152     typedef Ref<RealExpr,Node> RealExprRef;
153    
154     class ArrayExpr : virtual public VMArrayExpr, virtual public Expression {
155     public:
156     };
157     typedef Ref<ArrayExpr,Node> ArrayExprRef;
158    
159     class IntArrayExpr : virtual public VMIntArrayExpr, virtual public ArrayExpr {
160     public:
161 schoenebeck 3557 ExprType_t exprType() const OVERRIDE { return INT_ARR_EXPR; }
162     String evalCastToStr() OVERRIDE;
163 schoenebeck 3056 };
164 schoenebeck 3293 typedef Ref<IntArrayExpr,Node> IntArrayExprRef;
165 schoenebeck 3056
166 schoenebeck 3573 class RealArrayExpr : virtual public VMRealArrayExpr, virtual public ArrayExpr {
167     public:
168     ExprType_t exprType() const OVERRIDE { return REAL_ARR_EXPR; }
169     String evalCastToStr() OVERRIDE;
170     };
171     typedef Ref<RealArrayExpr,Node> RealArrayExprRef;
172    
173 schoenebeck 2581 class StringExpr : virtual public VMStringExpr, virtual public Expression {
174     public:
175 schoenebeck 3557 ExprType_t exprType() const OVERRIDE { return STRING_EXPR; }
176     String evalCastToStr() OVERRIDE { return evalStr(); }
177 schoenebeck 2581 };
178     typedef Ref<StringExpr,Node> StringExprRef;
179    
180 schoenebeck 3581 struct IntLitDef {
181     vmint value; //NOTE: sequence matters! Since this is usually initialized with VMIntExpr::evalInt() it should be before member unitFactor, since the latter is usually initialized with VMIntExpr::unitFactor() which does not evaluate the expression.
182     vmfloat unitFactor = VM_NO_FACTOR;
183     StdUnit_t unitType = VM_NO_UNIT;
184     bool isFinal;
185     };
186    
187 schoenebeck 3574 class IntLiteral FINAL : public IntExpr {
188 schoenebeck 3561 bool finalVal;
189 schoenebeck 3581 vmfloat unitPrefixFactor;
190     vmint value;
191 schoenebeck 3561 public:
192 schoenebeck 3581 IntLiteral(const IntLitDef& def);
193 schoenebeck 3557 vmint evalInt() OVERRIDE;
194 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return unitPrefixFactor; }
195 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
196     bool isConstExpr() const OVERRIDE { return true; }
197     bool isPolyphonic() const OVERRIDE { return false; }
198 schoenebeck 3561 bool isFinal() const OVERRIDE { return finalVal; }
199 schoenebeck 2581 };
200     typedef Ref<IntLiteral,Node> IntLiteralRef;
201    
202 schoenebeck 3581 struct RealLitDef {
203     vmfloat value; //NOTE: sequence matters! Since this is usually initialized with VMRealExpr::evalReal() it should be before member unitFactor, since the latter is usually initialized with VMRealExpr::unitFactor() which does not evaluate the expression.
204     vmfloat unitFactor = VM_NO_FACTOR;
205     StdUnit_t unitType = VM_NO_UNIT;
206     bool isFinal;
207     };
208    
209 schoenebeck 3574 class RealLiteral FINAL : public RealExpr {
210 schoenebeck 3573 bool finalVal;
211 schoenebeck 3581 vmfloat unitPrefixFactor;
212     vmfloat value;
213 schoenebeck 3573 public:
214 schoenebeck 3581 RealLiteral(const RealLitDef& def);
215 schoenebeck 3573 vmfloat evalReal() OVERRIDE;
216 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return unitPrefixFactor; }
217 schoenebeck 3573 void dump(int level = 0) OVERRIDE;
218     bool isConstExpr() const OVERRIDE { return true; }
219     bool isPolyphonic() const OVERRIDE { return false; }
220     bool isFinal() const OVERRIDE { return finalVal; }
221     };
222     typedef Ref<RealLiteral,Node> RealLiteralRef;
223    
224 schoenebeck 3574 class StringLiteral FINAL : public StringExpr {
225 schoenebeck 3581 String value;
226 schoenebeck 2581 public:
227     StringLiteral(const String& value) : value(value) { }
228 schoenebeck 3557 bool isConstExpr() const OVERRIDE { return true; }
229     void dump(int level = 0) OVERRIDE;
230     String evalStr() OVERRIDE { return value; }
231     bool isPolyphonic() const OVERRIDE { return false; }
232 schoenebeck 2581 };
233     typedef Ref<StringLiteral,Node> StringLiteralRef;
234    
235 schoenebeck 3574 class Args FINAL : virtual public VMFnArgs, virtual public Node {
236 schoenebeck 2581 public:
237     std::vector<ExpressionRef> args;
238     void add(ExpressionRef arg) { args.push_back(arg); }
239 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
240     vmint argsCount() const OVERRIDE { return (vmint) args.size(); }
241     VMExpr* arg(vmint i) OVERRIDE { return (i >= 0 && i < argsCount()) ? &*args.at(i) : NULL; }
242     bool isPolyphonic() const OVERRIDE;
243 schoenebeck 2581 };
244     typedef Ref<Args,Node> ArgsRef;
245    
246 schoenebeck 3581 struct VariableDecl {
247     ParserContext* ctx;
248     bool isPolyphonic;
249     bool isConst;
250     vmint elements = 1;
251     vmint memPos;
252     vmint unitFactorMemPos;
253     StdUnit_t unitType = VM_NO_UNIT;
254 schoenebeck 3595 bool isFinal;
255 schoenebeck 3581 };
256    
257 schoenebeck 2945 class Variable : virtual public VMVariable, virtual public Expression {
258 schoenebeck 2581 public:
259 schoenebeck 2945 bool isConstExpr() const OVERRIDE { return bConst; }
260     bool isAssignable() const OVERRIDE { return !bConst; }
261 schoenebeck 2581 virtual void assign(Expression* expr) = 0;
262 schoenebeck 2945 void assignExpr(VMExpr* expr) OVERRIDE { Expression* e = dynamic_cast<Expression*>(expr); if (e) assign(e); }
263 schoenebeck 2581 protected:
264 schoenebeck 3581 Variable(const VariableDecl& decl);
265 schoenebeck 2581
266     ParserContext* context;
267 schoenebeck 3557 vmint memPos;
268 schoenebeck 2581 bool bConst;
269     };
270     typedef Ref<Variable,Node> VariableRef;
271    
272 schoenebeck 3582 class NumberVariable : public Variable, virtual public NumberExpr {
273 schoenebeck 2581 bool polyphonic;
274 schoenebeck 3561 bool finalVal;
275 schoenebeck 3581 protected:
276     vmint unitFactorMemPos;
277 schoenebeck 2581 public:
278 schoenebeck 3573 bool isPolyphonic() const OVERRIDE { return polyphonic; }
279     bool isFinal() const OVERRIDE { return finalVal; }
280 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
281 schoenebeck 3573 protected:
282 schoenebeck 3582 NumberVariable(const VariableDecl& decl);
283 schoenebeck 3573 };
284 schoenebeck 3582 typedef Ref<NumberVariable,Node> NumberVariableRef;
285 schoenebeck 3573
286 schoenebeck 3582 class IntVariable : public NumberVariable, virtual public IntExpr {
287 schoenebeck 3573 public:
288 schoenebeck 3581 IntVariable(const VariableDecl& decl);
289 schoenebeck 3557 void assign(Expression* expr) OVERRIDE;
290     vmint evalInt() OVERRIDE;
291     void dump(int level = 0) OVERRIDE;
292 schoenebeck 2581 };
293     typedef Ref<IntVariable,Node> IntVariableRef;
294    
295 schoenebeck 3582 class RealVariable : public NumberVariable, virtual public RealExpr {
296 schoenebeck 3573 public:
297 schoenebeck 3581 RealVariable(const VariableDecl& decl);
298 schoenebeck 3573 void assign(Expression* expr) OVERRIDE;
299     vmfloat evalReal() OVERRIDE;
300     void dump(int level = 0) OVERRIDE;
301     };
302     typedef Ref<RealVariable,Node> RealVariableRef;
303    
304 schoenebeck 3581 struct IntVarDef /* : VariableDecl*/ { //NOTE: derived, aggregate initializer-lists requires C++17
305 schoenebeck 3595 // additions for RealVarDef
306     vmint value = 0; //NOTE: sequence matters! Since this is usually initialized with VMIntExpr::evalInt() it should be before member unitFactor, since the latter is usually initialized with VMIntExpr::unitFactor() which does not evaluate the expression.
307     vmfloat unitFactor = VM_NO_FACTOR;
308 schoenebeck 3581 // copied from VariableDecl
309     ParserContext* ctx;
310     bool isPolyphonic;
311     bool isConst;
312     vmint elements = 1;
313     vmint memPos;
314     vmint unitFactorMemPos;
315     StdUnit_t unitType = VM_NO_UNIT;
316 schoenebeck 3595 bool isFinal;
317 schoenebeck 3581 };
318    
319 schoenebeck 3574 class ConstIntVariable FINAL : public IntVariable {
320 schoenebeck 3581 vmfloat unitPrefixFactor;
321     vmint value;
322 schoenebeck 2581 public:
323 schoenebeck 3581 ConstIntVariable(const IntVarDef& def);
324 schoenebeck 3557 void assign(Expression* expr) OVERRIDE;
325     vmint evalInt() OVERRIDE;
326 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return unitPrefixFactor; }
327 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
328 schoenebeck 2581 };
329     typedef Ref<ConstIntVariable,Node> ConstIntVariableRef;
330    
331 schoenebeck 3581 struct RealVarDef /* : VariableDecl*/ { //NOTE: derived, aggregate initializer-lists requires C++17
332 schoenebeck 3595 // additions for RealVarDef
333     vmfloat value = vmfloat(0); //NOTE: sequence matters! Since this is usually initialized with VMRealExpr::evalReal() it should be before member unitFactor, since the latter is usually initialized with VMRealExpr::unitFactor() which does not evaluate the expression.
334     vmfloat unitFactor = VM_NO_FACTOR;
335 schoenebeck 3581 // copied from VariableDecl
336     ParserContext* ctx;
337     bool isPolyphonic;
338     bool isConst;
339     vmint elements = 1;
340     vmint memPos;
341     vmint unitFactorMemPos;
342     StdUnit_t unitType = VM_NO_UNIT;
343 schoenebeck 3595 bool isFinal;
344 schoenebeck 3581 };
345    
346 schoenebeck 3574 class ConstRealVariable FINAL : public RealVariable {
347 schoenebeck 3581 vmfloat unitPrefixFactor;
348     vmfloat value;
349 schoenebeck 3573 public:
350 schoenebeck 3581 ConstRealVariable(const RealVarDef& def);
351 schoenebeck 3573 void assign(Expression* expr) OVERRIDE;
352     vmfloat evalReal() OVERRIDE;
353 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return unitPrefixFactor; }
354 schoenebeck 3573 void dump(int level = 0) OVERRIDE;
355     };
356     typedef Ref<ConstRealVariable,Node> ConstRealVariableRef;
357    
358 schoenebeck 3574 class BuiltInIntVariable FINAL : public IntVariable {
359 schoenebeck 2594 String name;
360 schoenebeck 3557 VMIntPtr* ptr;
361 schoenebeck 2594 public:
362 schoenebeck 3557 BuiltInIntVariable(const String& name, VMIntPtr* ptr);
363     bool isAssignable() const OVERRIDE { return ptr->isAssignable(); }
364 schoenebeck 3054 void assign(Expression* expr) OVERRIDE;
365 schoenebeck 3557 vmint evalInt() OVERRIDE;
366 schoenebeck 3695 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
367 schoenebeck 3054 void dump(int level = 0) OVERRIDE;
368 schoenebeck 2594 };
369     typedef Ref<BuiltInIntVariable,Node> BuiltInIntVariableRef;
370    
371 schoenebeck 3574 class PolyphonicIntVariable FINAL : public IntVariable {
372 schoenebeck 2581 public:
373 schoenebeck 3581 PolyphonicIntVariable(const VariableDecl& decl);
374 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
375 schoenebeck 2581 };
376     typedef Ref<PolyphonicIntVariable,Node> PolyphonicIntVariableRef;
377    
378 schoenebeck 3574 class PolyphonicRealVariable FINAL : public RealVariable {
379 schoenebeck 3573 public:
380 schoenebeck 3581 PolyphonicRealVariable(const VariableDecl& decl);
381 schoenebeck 3573 void dump(int level = 0) OVERRIDE;
382     };
383     typedef Ref<PolyphonicRealVariable,Node> PolyphonicRealVariableRef;
384    
385 schoenebeck 3293 class IntArrayVariable : public Variable, virtual public IntArrayExpr {
386 schoenebeck 3557 ArrayList<vmint> values;
387 schoenebeck 3581 ArrayList<vmfloat> unitFactors;
388 schoenebeck 2581 public:
389 schoenebeck 3557 IntArrayVariable(ParserContext* ctx, vmint size);
390     IntArrayVariable(ParserContext* ctx, vmint size, ArgsRef values, bool _bConst = false);
391     void assign(Expression* expr) OVERRIDE {} // ignore scalar assignment
392     ExprType_t exprType() const OVERRIDE { return INT_ARR_EXPR; }
393     virtual vmint arraySize() const OVERRIDE { return values.size(); }
394     virtual vmint evalIntElement(vmuint i) OVERRIDE;
395     virtual void assignIntElement(vmuint i, vmint value) OVERRIDE;
396 schoenebeck 3581 vmfloat unitFactorOfElement(vmuint i) const OVERRIDE;
397     void assignElementUnitFactor(vmuint i, vmfloat factor) OVERRIDE;
398 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
399     bool isPolyphonic() const OVERRIDE { return false; }
400 schoenebeck 2594 protected:
401     IntArrayVariable(ParserContext* ctx, bool bConst);
402     };
403     typedef Ref<IntArrayVariable,Node> IntArrayVariableRef;
404    
405 schoenebeck 3574 class RealArrayVariable FINAL : public Variable, virtual public RealArrayExpr {
406 schoenebeck 3573 ArrayList<vmfloat> values;
407 schoenebeck 3581 ArrayList<vmfloat> unitFactors;
408 schoenebeck 3573 public:
409     RealArrayVariable(ParserContext* ctx, vmint size);
410     RealArrayVariable(ParserContext* ctx, vmint size, ArgsRef values, bool _bConst = false);
411     void assign(Expression* expr) OVERRIDE {} // ignore scalar assignment
412     ExprType_t exprType() const OVERRIDE { return REAL_ARR_EXPR; }
413     virtual vmint arraySize() const OVERRIDE { return values.size(); }
414     virtual vmfloat evalRealElement(vmuint i) OVERRIDE;
415     virtual void assignRealElement(vmuint i, vmfloat value) OVERRIDE;
416 schoenebeck 3581 vmfloat unitFactorOfElement(vmuint i) const OVERRIDE;
417     void assignElementUnitFactor(vmuint i, vmfloat factor) OVERRIDE;
418 schoenebeck 3573 void dump(int level = 0) OVERRIDE;
419     bool isPolyphonic() const OVERRIDE { return false; }
420     protected:
421     RealArrayVariable(ParserContext* ctx, bool bConst);
422     };
423     typedef Ref<RealArrayVariable,Node> RealArrayVariableRef;
424    
425 schoenebeck 3574 class BuiltInIntArrayVariable FINAL : public IntArrayVariable {
426 schoenebeck 2594 String name;
427     VMInt8Array* array;
428     public:
429     BuiltInIntArrayVariable(const String& name, VMInt8Array* array);
430 schoenebeck 3557 vmint arraySize() const OVERRIDE { return array->size; }
431     vmint evalIntElement(vmuint i) OVERRIDE;
432 schoenebeck 3581 void assignIntElement(vmuint i, vmint value) OVERRIDE;
433     vmfloat unitFactorOfElement(vmuint i) const OVERRIDE { return VM_NO_FACTOR; }
434     void assignElementUnitFactor(vmuint i, vmfloat factor) OVERRIDE {}
435 schoenebeck 3253 bool isAssignable() const OVERRIDE { return !array->readonly; }
436 persson 3455 void dump(int level = 0) OVERRIDE;
437 schoenebeck 2581 };
438 schoenebeck 2594 typedef Ref<BuiltInIntArrayVariable,Node> BuiltInIntArrayVariableRef;
439 schoenebeck 2581
440 schoenebeck 3574 class IntArrayElement FINAL : public IntVariable {
441 schoenebeck 3293 IntArrayExprRef array;
442 schoenebeck 2581 IntExprRef index;
443 schoenebeck 3581 vmint currentIndex;
444 schoenebeck 2581 public:
445 schoenebeck 3293 IntArrayElement(IntArrayExprRef array, IntExprRef arrayIndex);
446 schoenebeck 3557 void assign(Expression* expr) OVERRIDE;
447     vmint evalInt() OVERRIDE;
448 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
449 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
450 schoenebeck 2581 };
451     typedef Ref<IntArrayElement,Node> IntArrayElementRef;
452    
453 schoenebeck 3574 class RealArrayElement FINAL : public RealVariable {
454 schoenebeck 3573 RealArrayExprRef array;
455     IntExprRef index;
456 schoenebeck 3581 vmint currentIndex;
457 schoenebeck 3573 public:
458     RealArrayElement(RealArrayExprRef array, IntExprRef arrayIndex);
459     void assign(Expression* expr) OVERRIDE;
460     vmfloat evalReal() OVERRIDE;
461 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
462 schoenebeck 3573 void dump(int level = 0) OVERRIDE;
463     };
464     typedef Ref<RealArrayElement,Node> RealArrayElementRef;
465    
466 schoenebeck 2581 class StringVariable : public Variable, virtual public StringExpr {
467     public:
468     StringVariable(ParserContext* ctx);
469 schoenebeck 3557 void assign(Expression* expr) OVERRIDE;
470     String evalStr() OVERRIDE;
471     void dump(int level = 0) OVERRIDE;
472     bool isPolyphonic() const OVERRIDE { return false; }
473 schoenebeck 2581 protected:
474     StringVariable(ParserContext* ctx, bool bConst);
475     };
476     typedef Ref<StringVariable,Node> StringVariableRef;
477    
478 schoenebeck 3574 class ConstStringVariable FINAL : public StringVariable {
479 schoenebeck 3581 String value;
480 schoenebeck 2581 public:
481     ConstStringVariable(ParserContext* ctx, String value = "");
482 schoenebeck 3557 void assign(Expression* expr) OVERRIDE;
483     String evalStr() OVERRIDE;
484     void dump(int level = 0) OVERRIDE;
485 schoenebeck 2581 };
486     typedef Ref<ConstStringVariable,Node> ConstStringVariableRef;
487    
488     class BinaryOp : virtual public Expression {
489     protected:
490     ExpressionRef lhs;
491     ExpressionRef rhs;
492     public:
493     BinaryOp(ExpressionRef lhs, ExpressionRef rhs) : lhs(lhs), rhs(rhs) { }
494 schoenebeck 3557 bool isConstExpr() const OVERRIDE { return lhs->isConstExpr() && rhs->isConstExpr(); }
495     bool isPolyphonic() const OVERRIDE { return lhs->isPolyphonic() || rhs->isPolyphonic(); }
496 schoenebeck 2581 };
497     typedef Ref<BinaryOp,Node> BinaryOpRef;
498    
499 schoenebeck 3582 class NumberBinaryOp : public BinaryOp, virtual public NumberExpr {
500 schoenebeck 2581 public:
501 schoenebeck 3582 NumberBinaryOp(NumberExprRef lhs, NumberExprRef rhs) : BinaryOp(lhs, rhs) { }
502 schoenebeck 3561 bool isFinal() const OVERRIDE;
503     };
504 schoenebeck 3582 typedef Ref<NumberBinaryOp,Node> NumberBinaryOpRef;
505 schoenebeck 3573
506 schoenebeck 3582 class IntBinaryOp : public NumberBinaryOp, virtual public IntExpr {
507 schoenebeck 3573 public:
508 schoenebeck 3582 IntBinaryOp(IntExprRef lhs, IntExprRef rhs) : NumberBinaryOp(lhs, rhs) { }
509 schoenebeck 3573 };
510 schoenebeck 3561 typedef Ref<IntBinaryOp,Node> IntBinaryOpRef;
511    
512 schoenebeck 3582 class VaritypeScalarBinaryOp : public NumberBinaryOp, virtual public IntExpr, virtual public RealExpr {
513 schoenebeck 3561 public:
514 schoenebeck 3582 VaritypeScalarBinaryOp(NumberExprRef lhs, NumberExprRef rhs) : NumberBinaryOp(lhs, rhs) { }
515 schoenebeck 3573 ExprType_t exprType() const OVERRIDE;
516     String evalCastToStr() OVERRIDE;
517     };
518     typedef Ref<VaritypeScalarBinaryOp,Node> VaritypeScalarBinaryOpRef;
519    
520 schoenebeck 3574 class Add FINAL : public VaritypeScalarBinaryOp {
521 schoenebeck 3573 public:
522 schoenebeck 3582 Add(NumberExprRef lhs, NumberExprRef rhs);
523 schoenebeck 3557 vmint evalInt() OVERRIDE;
524 schoenebeck 3573 vmfloat evalReal() OVERRIDE;
525 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
526 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
527 schoenebeck 2581 };
528     typedef Ref<Add,Node> AddRef;
529    
530 schoenebeck 3574 class Sub FINAL : public VaritypeScalarBinaryOp {
531 schoenebeck 2581 public:
532 schoenebeck 3582 Sub(NumberExprRef lhs, NumberExprRef rhs);
533 schoenebeck 3557 vmint evalInt() OVERRIDE;
534 schoenebeck 3573 vmfloat evalReal() OVERRIDE;
535 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
536 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
537 schoenebeck 2581 };
538     typedef Ref<Sub,Node> SubRef;
539    
540 schoenebeck 3574 class Mul FINAL : public VaritypeScalarBinaryOp {
541 schoenebeck 2581 public:
542 schoenebeck 3582 Mul(NumberExprRef lhs, NumberExprRef rhs);
543 schoenebeck 3557 vmint evalInt() OVERRIDE;
544 schoenebeck 3573 vmfloat evalReal() OVERRIDE;
545 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
546 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
547 schoenebeck 2581 };
548     typedef Ref<Mul,Node> MulRef;
549    
550 schoenebeck 3574 class Div FINAL : public VaritypeScalarBinaryOp {
551 schoenebeck 2581 public:
552 schoenebeck 3582 Div(NumberExprRef lhs, NumberExprRef rhs);
553 schoenebeck 3557 vmint evalInt() OVERRIDE;
554 schoenebeck 3573 vmfloat evalReal() OVERRIDE;
555 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
556 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
557 schoenebeck 2581 };
558     typedef Ref<Div,Node> DivRef;
559    
560 schoenebeck 3574 class Mod FINAL : public IntBinaryOp {
561 schoenebeck 2581 public:
562 schoenebeck 3581 Mod(IntExprRef lhs, IntExprRef rhs) : IntBinaryOp(lhs, rhs), Unit(VM_NO_UNIT) { }
563 schoenebeck 3557 vmint evalInt() OVERRIDE;
564 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
565 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
566 schoenebeck 2581 };
567     typedef Ref<Mod,Node> ModRef;
568    
569     class Statement : virtual public Node {
570     public:
571     virtual StmtType_t statementType() const = 0;
572     };
573     typedef Ref<Statement,Node> StatementRef;
574    
575     // Just used by parser to avoid "not a statement" parser warning, will be
576     // filtered out by parser. So it will not be part of the VM tree after parsing.
577 schoenebeck 3574 class NoOperation FINAL : public Statement {
578 schoenebeck 2581 public:
579     NoOperation() : Statement() {}
580 schoenebeck 3557 StmtType_t statementType() const OVERRIDE { return STMT_NOOP; }
581     void dump(int level = 0) OVERRIDE {}
582     bool isPolyphonic() const OVERRIDE { return false; }
583 schoenebeck 2581 };
584     typedef Ref<NoOperation,Node> NoOperationRef;
585    
586     bool isNoOperation(StatementRef statement);
587    
588     class LeafStatement : public Statement {
589     public:
590     virtual StmtFlags_t exec() = 0;
591 schoenebeck 3557 StmtType_t statementType() const OVERRIDE { return STMT_LEAF; }
592 schoenebeck 2581 };
593     typedef Ref<LeafStatement,Node> LeafStatementRef;
594    
595     class Statements : public Statement {
596     std::vector<StatementRef> args;
597     public:
598     void add(StatementRef arg) { args.push_back(arg); }
599 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
600     StmtType_t statementType() const OVERRIDE { return STMT_LIST; }
601 schoenebeck 2581 virtual Statement* statement(uint i);
602 schoenebeck 3557 bool isPolyphonic() const OVERRIDE;
603 schoenebeck 2581 };
604     typedef Ref<Statements,Node> StatementsRef;
605    
606     class BranchStatement : public Statement {
607     public:
608 schoenebeck 3557 StmtType_t statementType() const OVERRIDE { return STMT_BRANCH; }
609     virtual vmint evalBranch() = 0;
610     virtual Statements* branch(vmuint i) const = 0;
611 schoenebeck 2581 };
612    
613 schoenebeck 3574 class DynamicVariableCall FINAL : public Variable, virtual public IntExpr, virtual public StringExpr, virtual public IntArrayExpr {
614 schoenebeck 2942 VMDynVar* dynVar;
615     String varName;
616     public:
617     DynamicVariableCall(const String& name, ParserContext* ctx, VMDynVar* v);
618     ExprType_t exprType() const OVERRIDE { return dynVar->exprType(); }
619     bool isConstExpr() const OVERRIDE { return dynVar->isConstExpr(); }
620     bool isAssignable() const OVERRIDE { return dynVar->isAssignable(); }
621     bool isPolyphonic() const OVERRIDE { return false; }
622 schoenebeck 2945 void assign(Expression* expr) OVERRIDE { dynVar->assignExpr(expr); }
623 schoenebeck 3118 VMIntArrayExpr* asIntArray() const OVERRIDE { return dynVar->asIntArray(); }
624 schoenebeck 3557 vmint evalInt() OVERRIDE;
625 schoenebeck 2942 String evalStr() OVERRIDE;
626     String evalCastToStr() OVERRIDE;
627 schoenebeck 3557 vmint arraySize() const OVERRIDE { return dynVar->asIntArray()->arraySize(); }
628     vmint evalIntElement(vmuint i) OVERRIDE { return dynVar->asIntArray()->evalIntElement(i); }
629     void assignIntElement(vmuint i, vmint value) OVERRIDE { return dynVar->asIntArray()->assignIntElement(i, value); }
630 schoenebeck 3581 vmfloat unitFactorOfElement(vmuint i) const OVERRIDE { return VM_NO_FACTOR; }
631     void assignElementUnitFactor(vmuint i, vmfloat factor) OVERRIDE {}
632 schoenebeck 2942 void dump(int level = 0) OVERRIDE;
633 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
634 schoenebeck 3561 bool isFinal() const OVERRIDE { return false; }
635 schoenebeck 2942 };
636     typedef Ref<DynamicVariableCall,Node> DynamicVariableCallRef;
637    
638 schoenebeck 3846 class FunctionCall : virtual public LeafStatement, virtual public IntExpr, virtual public RealExpr, virtual public StringExpr, virtual public ArrayExpr {
639 schoenebeck 2581 String functionName;
640     ArgsRef args;
641     VMFunction* fn;
642 schoenebeck 3581 VMFnResult* result;
643 schoenebeck 2581 public:
644 schoenebeck 3581 FunctionCall(const char* function, ArgsRef args, VMFunction* fn);
645 schoenebeck 3747 virtual ~FunctionCall();
646 schoenebeck 3060 void dump(int level = 0) OVERRIDE;
647     StmtFlags_t exec() OVERRIDE;
648 schoenebeck 3557 vmint evalInt() OVERRIDE;
649 schoenebeck 3573 vmfloat evalReal() OVERRIDE;
650 schoenebeck 3846 vmint arraySize() const OVERRIDE;
651 schoenebeck 3056 VMIntArrayExpr* asIntArray() const OVERRIDE;
652 schoenebeck 3573 VMRealArrayExpr* asRealArray() const OVERRIDE;
653 schoenebeck 3060 String evalStr() OVERRIDE;
654     bool isConstExpr() const OVERRIDE { return false; }
655     ExprType_t exprType() const OVERRIDE;
656     String evalCastToStr() OVERRIDE;
657     bool isPolyphonic() const OVERRIDE { return args->isPolyphonic(); }
658 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE;
659     bool isFinal() const OVERRIDE;
660 schoenebeck 2581 protected:
661     VMFnResult* execVMFn();
662     };
663     typedef Ref<FunctionCall,Node> FunctionCallRef;
664    
665 schoenebeck 3574 class NoFunctionCall FINAL : public FunctionCall {
666 schoenebeck 3311 public:
667 schoenebeck 3581 NoFunctionCall() : FunctionCall("nothing", new Args, NULL), Unit(VM_NO_UNIT) {}
668 schoenebeck 3557 StmtType_t statementType() const OVERRIDE { return STMT_NOOP; }
669 schoenebeck 3311 };
670     typedef Ref<NoFunctionCall,Node> NoFunctionCallRef;
671    
672 schoenebeck 3804 class Subroutine : public Statements {
673 schoenebeck 2581 StatementsRef statements;
674 schoenebeck 3804 public:
675     Subroutine(StatementsRef statements);
676     Statement* statement(uint i) OVERRIDE { return statements->statement(i); }
677     void dump(int level = 0) OVERRIDE;
678     };
679     typedef Ref<Subroutine,Node> SubroutineRef;
680    
681     class UserFunction : public Subroutine {
682     public:
683     UserFunction(StatementsRef statements);
684     };
685     typedef Ref<UserFunction,Node> UserFunctionRef;
686    
687     class EventHandler : public Subroutine, virtual public VMEventHandler {
688 schoenebeck 2645 bool usingPolyphonics;
689 schoenebeck 2581 public:
690 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
691 schoenebeck 2645 EventHandler(StatementsRef statements);
692 schoenebeck 3557 bool isPolyphonic() const OVERRIDE { return usingPolyphonics; }
693 schoenebeck 2581 };
694     typedef Ref<EventHandler,Node> EventHandlerRef;
695    
696 schoenebeck 3574 class OnNote FINAL : public EventHandler {
697 schoenebeck 2581 public:
698     OnNote(StatementsRef statements) : EventHandler(statements) {}
699 schoenebeck 3557 VMEventHandlerType_t eventHandlerType() const OVERRIDE { return VM_EVENT_HANDLER_NOTE; }
700     String eventHandlerName() const OVERRIDE { return "note"; }
701 schoenebeck 2581 };
702     typedef Ref<OnNote,Node> OnNoteRef;
703    
704 schoenebeck 3574 class OnInit FINAL : public EventHandler {
705 schoenebeck 2581 public:
706     OnInit(StatementsRef statements) : EventHandler(statements) {}
707 schoenebeck 3557 VMEventHandlerType_t eventHandlerType() const OVERRIDE { return VM_EVENT_HANDLER_INIT; }
708     String eventHandlerName() const OVERRIDE { return "init"; }
709 schoenebeck 2581 };
710     typedef Ref<OnInit,Node> OnInitRef;
711    
712 schoenebeck 3574 class OnRelease FINAL : public EventHandler {
713 schoenebeck 2581 public:
714     OnRelease(StatementsRef statements) : EventHandler(statements) {}
715 schoenebeck 3557 VMEventHandlerType_t eventHandlerType() const OVERRIDE { return VM_EVENT_HANDLER_RELEASE; }
716     String eventHandlerName() const OVERRIDE { return "release"; }
717 schoenebeck 2581 };
718     typedef Ref<OnRelease,Node> OnReleaseRef;
719    
720 schoenebeck 3574 class OnController FINAL : public EventHandler {
721 schoenebeck 2581 public:
722     OnController(StatementsRef statements) : EventHandler(statements) {}
723 schoenebeck 3557 VMEventHandlerType_t eventHandlerType() const OVERRIDE { return VM_EVENT_HANDLER_CONTROLLER; }
724     String eventHandlerName() const OVERRIDE { return "controller"; }
725 schoenebeck 2581 };
726     typedef Ref<OnController,Node> OnControllerRef;
727    
728 schoenebeck 3690 class OnRpn FINAL : public EventHandler {
729     public:
730     OnRpn(StatementsRef statements) : EventHandler(statements) {}
731     VMEventHandlerType_t eventHandlerType() const OVERRIDE { return VM_EVENT_HANDLER_RPN; }
732     String eventHandlerName() const OVERRIDE { return "rpn"; }
733     };
734     typedef Ref<OnRpn,Node> OnRpnRef;
735    
736     class OnNrpn FINAL : public EventHandler {
737     public:
738     OnNrpn(StatementsRef statements) : EventHandler(statements) {}
739     VMEventHandlerType_t eventHandlerType() const OVERRIDE { return VM_EVENT_HANDLER_NRPN; }
740     String eventHandlerName() const OVERRIDE { return "nrpn"; }
741     };
742     typedef Ref<OnNrpn,Node> OnNrpnRef;
743    
744 schoenebeck 3574 class EventHandlers FINAL : virtual public Node {
745 schoenebeck 2581 std::vector<EventHandlerRef> args;
746     public:
747     EventHandlers();
748     ~EventHandlers();
749     void add(EventHandlerRef arg);
750 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
751 schoenebeck 2581 EventHandler* eventHandlerByName(const String& name) const;
752     EventHandler* eventHandler(uint index) const;
753 schoenebeck 3054 inline uint size() const { return (int) args.size(); }
754 schoenebeck 3557 bool isPolyphonic() const OVERRIDE;
755 schoenebeck 2581 };
756     typedef Ref<EventHandlers,Node> EventHandlersRef;
757    
758 schoenebeck 3574 class Assignment FINAL : public LeafStatement {
759 schoenebeck 2581 protected:
760     VariableRef variable;
761     ExpressionRef value;
762     public:
763     Assignment(VariableRef variable, ExpressionRef value);
764 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
765     StmtFlags_t exec() OVERRIDE;
766     bool isPolyphonic() const OVERRIDE { return (variable && variable->isPolyphonic()) || (value && value->isPolyphonic()); }
767 schoenebeck 2581 };
768     typedef Ref<Assignment,Node> AssignmentRef;
769    
770 schoenebeck 3574 class If FINAL : public BranchStatement {
771 schoenebeck 2581 IntExprRef condition;
772     StatementsRef ifStatements;
773     StatementsRef elseStatements;
774     public:
775     If(IntExprRef condition, StatementsRef ifStatements, StatementsRef elseStatements) :
776     condition(condition), ifStatements(ifStatements), elseStatements(elseStatements) { }
777     If(IntExprRef condition, StatementsRef statements) :
778     condition(condition), ifStatements(statements) { }
779 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
780     vmint evalBranch() OVERRIDE;
781     Statements* branch(vmuint i) const OVERRIDE;
782     bool isPolyphonic() const OVERRIDE;
783 schoenebeck 2581 };
784     typedef Ref<If,Node> IfRef;
785    
786 schoenebeck 3574 struct CaseBranch FINAL {
787 schoenebeck 2581 IntExprRef from;
788     IntExprRef to;
789     StatementsRef statements;
790     };
791     typedef std::vector<CaseBranch> CaseBranches;
792    
793 schoenebeck 3574 class SelectCase FINAL : public BranchStatement {
794 schoenebeck 2581 IntExprRef select;
795     CaseBranches branches;
796     public:
797     SelectCase(IntExprRef select, const CaseBranches& branches) : select(select), branches(branches) { }
798 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
799     vmint evalBranch() OVERRIDE;
800     Statements* branch(vmuint i) const OVERRIDE;
801     bool isPolyphonic() const OVERRIDE;
802 schoenebeck 2581 };
803     typedef Ref<SelectCase,Node> SelectCaseRef;
804    
805 schoenebeck 3574 class While FINAL : public Statement {
806 schoenebeck 2581 IntExprRef m_condition;
807     StatementsRef m_statements;
808     public:
809     While(IntExprRef condition, StatementsRef statements) :
810     m_condition(condition), m_statements(statements) {}
811 schoenebeck 3557 StmtType_t statementType() const OVERRIDE { return STMT_LOOP; }
812     void dump(int level = 0) OVERRIDE;
813 schoenebeck 2581 bool evalLoopStartCondition();
814     Statements* statements() const;
815 schoenebeck 3557 bool isPolyphonic() const OVERRIDE { return m_condition->isPolyphonic() || m_statements->isPolyphonic(); }
816 schoenebeck 2581 };
817    
818 schoenebeck 3574 class SyncBlock FINAL : public Statement {
819 schoenebeck 3260 StatementsRef m_statements;
820     public:
821     SyncBlock(StatementsRef statements) : m_statements(statements) {}
822 schoenebeck 3557 StmtType_t statementType() const OVERRIDE { return STMT_SYNC; }
823     void dump(int level = 0) OVERRIDE;
824 schoenebeck 3260 Statements* statements() const;
825 schoenebeck 3557 bool isPolyphonic() const OVERRIDE { return m_statements->isPolyphonic(); }
826 schoenebeck 3260 };
827     typedef Ref<SyncBlock,Node> SyncBlockRef;
828    
829 schoenebeck 3576 class Neg FINAL : virtual public IntExpr, virtual public RealExpr {
830 schoenebeck 3582 NumberExprRef expr;
831 schoenebeck 2581 public:
832 schoenebeck 3582 Neg(NumberExprRef expr) : Unit(expr->unitType()), expr(expr) { }
833 schoenebeck 3576 ExprType_t exprType() const OVERRIDE { return expr->exprType(); }
834     vmint evalInt() OVERRIDE { return (expr) ? -(expr->asInt()->evalInt()) : 0; }
835     vmfloat evalReal() OVERRIDE { return (expr) ? -(expr->asReal()->evalReal()) : vmfloat(0); }
836     String evalCastToStr() OVERRIDE;
837 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
838     bool isConstExpr() const OVERRIDE { return expr->isConstExpr(); }
839     bool isPolyphonic() const OVERRIDE { return expr->isPolyphonic(); }
840 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return expr->unitFactor(); }
841 schoenebeck 3561 bool isFinal() const OVERRIDE { return expr->isFinal(); }
842 schoenebeck 2581 };
843     typedef Ref<Neg,Node> NegRef;
844    
845 schoenebeck 3574 class ConcatString FINAL : public StringExpr {
846 schoenebeck 2581 ExpressionRef lhs;
847     ExpressionRef rhs;
848     public:
849     ConcatString(ExpressionRef lhs, ExpressionRef rhs) : lhs(lhs), rhs(rhs) {}
850 schoenebeck 3557 String evalStr() OVERRIDE;
851     void dump(int level = 0) OVERRIDE;
852     bool isConstExpr() const OVERRIDE;
853     bool isPolyphonic() const OVERRIDE { return lhs->isPolyphonic() || rhs->isPolyphonic(); }
854 schoenebeck 2581 };
855     typedef Ref<ConcatString,Node> ConcatStringRef;
856    
857 schoenebeck 3574 class Relation FINAL : public IntExpr {
858 schoenebeck 2581 public:
859     enum Type {
860     LESS_THAN,
861     GREATER_THAN,
862     LESS_OR_EQUAL,
863     GREATER_OR_EQUAL,
864     EQUAL,
865     NOT_EQUAL
866     };
867 schoenebeck 3581 Relation(ExpressionRef lhs, Type type, ExpressionRef rhs);
868 schoenebeck 3557 vmint evalInt() OVERRIDE;
869     void dump(int level = 0) OVERRIDE;
870     bool isConstExpr() const OVERRIDE;
871     bool isPolyphonic() const OVERRIDE { return lhs->isPolyphonic() || rhs->isPolyphonic(); }
872 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
873 schoenebeck 3561 bool isFinal() const OVERRIDE { return false; }
874 schoenebeck 2581 private:
875 schoenebeck 3573 ExpressionRef lhs;
876     ExpressionRef rhs;
877 schoenebeck 2581 Type type;
878     };
879     typedef Ref<Relation,Node> RelationRef;
880    
881 schoenebeck 3574 class Or FINAL : public IntBinaryOp {
882 schoenebeck 2581 public:
883 schoenebeck 3581 Or(IntExprRef lhs, IntExprRef rhs) : IntBinaryOp(lhs,rhs), Unit(VM_NO_UNIT) {}
884 schoenebeck 3557 vmint evalInt() OVERRIDE;
885 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
886 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
887 schoenebeck 2581 };
888     typedef Ref<Or,Node> OrRef;
889    
890 schoenebeck 3574 class BitwiseOr FINAL : public IntBinaryOp {
891 schoenebeck 2935 public:
892 schoenebeck 3581 BitwiseOr(IntExprRef lhs, IntExprRef rhs) : IntBinaryOp(lhs,rhs), Unit(VM_NO_UNIT) {}
893 schoenebeck 3557 vmint evalInt() OVERRIDE;
894     void dump(int level = 0) OVERRIDE;
895 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
896 schoenebeck 2935 };
897     typedef Ref<BitwiseOr,Node> BitwiseOrRef;
898    
899 schoenebeck 3574 class And FINAL : public IntBinaryOp {
900 schoenebeck 2581 public:
901 schoenebeck 3581 And(IntExprRef lhs, IntExprRef rhs) : IntBinaryOp(lhs,rhs), Unit(VM_NO_UNIT) {}
902 schoenebeck 3557 vmint evalInt() OVERRIDE;
903 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
904 schoenebeck 3557 void dump(int level = 0) OVERRIDE;
905 schoenebeck 2581 };
906     typedef Ref<And,Node> AndRef;
907    
908 schoenebeck 3574 class BitwiseAnd FINAL : public IntBinaryOp {
909 schoenebeck 2935 public:
910 schoenebeck 3581 BitwiseAnd(IntExprRef lhs, IntExprRef rhs) : IntBinaryOp(lhs,rhs), Unit(VM_NO_UNIT) {}
911 schoenebeck 3557 vmint evalInt() OVERRIDE;
912     void dump(int level = 0) OVERRIDE;
913 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
914 schoenebeck 2935 };
915     typedef Ref<BitwiseAnd,Node> BitwiseAndRef;
916    
917 schoenebeck 3574 class Not FINAL : virtual public IntExpr {
918 schoenebeck 2581 IntExprRef expr;
919     public:
920 schoenebeck 3581 Not(IntExprRef expr) : Unit(VM_NO_UNIT), expr(expr) {}
921 schoenebeck 3557 vmint evalInt() OVERRIDE { return !expr->evalInt(); }
922     void dump(int level = 0) OVERRIDE;
923     bool isConstExpr() const OVERRIDE { return expr->isConstExpr(); }
924     bool isPolyphonic() const OVERRIDE { return expr->isPolyphonic(); }
925 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
926 schoenebeck 3561 bool isFinal() const OVERRIDE { return expr->isFinal(); }
927 schoenebeck 2581 };
928     typedef Ref<Not,Node> NotRef;
929    
930 schoenebeck 3574 class BitwiseNot FINAL : virtual public IntExpr {
931 schoenebeck 2935 IntExprRef expr;
932     public:
933 schoenebeck 3581 BitwiseNot(IntExprRef expr) : Unit(VM_NO_UNIT), expr(expr) {}
934 schoenebeck 3557 vmint evalInt() OVERRIDE { return ~expr->evalInt(); }
935     void dump(int level = 0) OVERRIDE;
936     bool isConstExpr() const OVERRIDE { return expr->isConstExpr(); }
937     bool isPolyphonic() const OVERRIDE { return expr->isPolyphonic(); }
938 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return VM_NO_FACTOR; }
939 schoenebeck 3561 bool isFinal() const OVERRIDE { return expr->isFinal(); }
940 schoenebeck 2935 };
941     typedef Ref<BitwiseNot,Node> BitwiseNotRef;
942    
943 schoenebeck 3574 class Final FINAL : virtual public IntExpr, virtual public RealExpr {
944 schoenebeck 3582 NumberExprRef expr;
945 schoenebeck 3561 public:
946 schoenebeck 3582 Final(NumberExprRef expr) : Unit(expr->unitType()), expr(expr) {}
947 schoenebeck 3573 ExprType_t exprType() const OVERRIDE { return expr->exprType(); }
948     vmint evalInt() OVERRIDE { return expr->asInt()->evalInt(); }
949     vmfloat evalReal() OVERRIDE { return expr->asReal()->evalReal(); }
950     String evalCastToStr() OVERRIDE;
951 schoenebeck 3561 void dump(int level = 0) OVERRIDE;
952     bool isConstExpr() const OVERRIDE { return expr->isConstExpr(); }
953     bool isPolyphonic() const OVERRIDE { return expr->isPolyphonic(); }
954 schoenebeck 3581 vmfloat unitFactor() const OVERRIDE { return expr->unitFactor(); }
955 schoenebeck 3561 bool isFinal() const OVERRIDE { return true; }
956     };
957     typedef Ref<Final,Node> FinalRef;
958    
959 schoenebeck 3574 class ParserContext FINAL : public VMParserContext {
960 schoenebeck 2581 public:
961     struct Error {
962     String txt;
963     int line;
964     };
965     typedef Error Warning;
966    
967     void* scanner;
968     std::istream* is;
969 schoenebeck 3729 int nbytes;
970 schoenebeck 2588 std::vector<ParserIssue> vErrors;
971     std::vector<ParserIssue> vWarnings;
972     std::vector<ParserIssue> vIssues;
973 schoenebeck 3285 std::vector<CodeBlock> vPreprocessorComments;
974 schoenebeck 3836 std::vector<void*> vAutoFreeAfterParse;
975 schoenebeck 3733 std::map<String,PatchVarBlock> patchVars;
976 schoenebeck 2581
977     std::set<String> builtinPreprocessorConditions;
978     std::set<String> userPreprocessorConditions;
979    
980     std::map<String,VariableRef> vartable;
981 schoenebeck 3804 std::map<String,UserFunctionRef> userFnTable;
982 schoenebeck 3557 vmint globalIntVarCount;
983 schoenebeck 3573 vmint globalRealVarCount;
984 schoenebeck 3557 vmint globalStrVarCount;
985 schoenebeck 3581 vmint globalUnitFactorCount;
986 schoenebeck 3557 vmint polyphonicIntVarCount;
987 schoenebeck 3573 vmint polyphonicRealVarCount;
988 schoenebeck 3581 vmint polyphonicUnitFactorCount;
989 schoenebeck 2581
990     EventHandlersRef handlers;
991    
992     OnInitRef onInit;
993     OnNoteRef onNote;
994     OnReleaseRef onRelease;
995     OnControllerRef onController;
996 schoenebeck 3690 OnRpnRef onRpn;
997     OnNrpnRef onNrpn;
998 schoenebeck 2581
999 schoenebeck 3557 ArrayList<vmint>* globalIntMemory;
1000 schoenebeck 3573 ArrayList<vmfloat>* globalRealMemory;
1001 schoenebeck 2581 ArrayList<String>* globalStrMemory;
1002 schoenebeck 3581 ArrayList<vmfloat>* globalUnitFactorMemory;
1003 schoenebeck 3557 vmint requiredMaxStackSize;
1004 schoenebeck 2581
1005     VMFunctionProvider* functionProvider;
1006    
1007     ExecContext* execContext;
1008    
1009     ParserContext(VMFunctionProvider* parent) :
1010 schoenebeck 3729 scanner(NULL), is(NULL), nbytes(0),
1011 schoenebeck 3573 globalIntVarCount(0), globalRealVarCount(0), globalStrVarCount(0),
1012 schoenebeck 3581 globalUnitFactorCount(0),
1013 schoenebeck 3573 polyphonicIntVarCount(0), polyphonicRealVarCount(0),
1014 schoenebeck 3581 polyphonicUnitFactorCount(0),
1015 schoenebeck 3573 globalIntMemory(NULL), globalRealMemory(NULL), globalStrMemory(NULL),
1016 schoenebeck 3581 globalUnitFactorMemory(NULL),
1017 schoenebeck 3573 requiredMaxStackSize(-1),
1018 schoenebeck 2588 functionProvider(parent), execContext(NULL)
1019 schoenebeck 2581 {
1020     }
1021 schoenebeck 2588 virtual ~ParserContext();
1022 schoenebeck 2581 VariableRef globalVar(const String& name);
1023     IntVariableRef globalIntVar(const String& name);
1024 schoenebeck 3573 RealVariableRef globalRealVar(const String& name);
1025 schoenebeck 2581 StringVariableRef globalStrVar(const String& name);
1026     VariableRef variableByName(const String& name);
1027 schoenebeck 3804 UserFunctionRef userFunctionByName(const String& name);
1028 schoenebeck 3729 void addErr(int firstLine, int lastLine, int firstColumn, int lastColumn,
1029     int firstByte, int lengthBytes, const char* txt);
1030     void addWrn(int firstLine, int lastLine, int firstColumn, int lastColumn,
1031     int firstByte, int lengthBytes, const char* txt);
1032     void addPreprocessorComment(int firstLine, int lastLine, int firstColumn,
1033     int lastColumn, int firstByte, int lengthBytes);
1034 schoenebeck 2581 void createScanner(std::istream* is);
1035     void destroyScanner();
1036     bool setPreprocessorCondition(const char* name);
1037     bool resetPreprocessorCondition(const char* name);
1038     bool isPreprocessorConditionSet(const char* name);
1039 schoenebeck 3836 void autoFreeAfterParse(void* data);
1040 schoenebeck 2588 std::vector<ParserIssue> issues() const OVERRIDE;
1041     std::vector<ParserIssue> errors() const OVERRIDE;
1042     std::vector<ParserIssue> warnings() const OVERRIDE;
1043 schoenebeck 3285 std::vector<CodeBlock> preprocessorComments() const OVERRIDE;
1044 schoenebeck 2588 VMEventHandler* eventHandler(uint index) OVERRIDE;
1045     VMEventHandler* eventHandlerByName(const String& name) OVERRIDE;
1046 schoenebeck 3557 void registerBuiltInConstIntVariables(const std::map<String,vmint>& vars);
1047 schoenebeck 3590 void registerBuiltInConstRealVariables(const std::map<String,vmfloat>& vars);
1048 schoenebeck 3557 void registerBuiltInIntVariables(const std::map<String,VMIntPtr*>& vars);
1049 schoenebeck 2594 void registerBuiltInIntArrayVariables(const std::map<String,VMInt8Array*>& vars);
1050 schoenebeck 2942 void registerBuiltInDynVariables(const std::map<String,VMDynVar*>& vars);
1051 schoenebeck 2581 };
1052    
1053 schoenebeck 3574 class ExecContext FINAL : public VMExecContext {
1054 schoenebeck 2581 public:
1055     struct StackFrame {
1056     Statement* statement;
1057     int subindex;
1058    
1059     StackFrame() {
1060     statement = NULL;
1061     subindex = -1;
1062     }
1063     };
1064    
1065 schoenebeck 3557 ArrayList<vmint> polyphonicIntMemory;
1066 schoenebeck 3573 ArrayList<vmfloat> polyphonicRealMemory;
1067 schoenebeck 3581 ArrayList<vmfloat> polyphonicUnitFactorMemory;
1068 schoenebeck 2581 VMExecStatus_t status;
1069 schoenebeck 3277 StmtFlags_t flags;
1070 schoenebeck 2581 ArrayList<StackFrame> stack;
1071     int stackFrame;
1072 schoenebeck 3557 vmint suspendMicroseconds;
1073 schoenebeck 3221 size_t instructionsCount;
1074 schoenebeck 3551 struct ExitRes {
1075     Expression* value;
1076     IntLiteral intLiteral;
1077 schoenebeck 3575 RealLiteral realLiteral;
1078 schoenebeck 3551 StringLiteral stringLiteral;
1079 schoenebeck 2581
1080 schoenebeck 3581 ExitRes() :
1081     intLiteral({ .value = 0 }), realLiteral({ .value = 0.0 }),
1082     stringLiteral("") { }
1083 schoenebeck 3551 } exitRes;
1084 schoenebeck 2581
1085 schoenebeck 3551 ExecContext();
1086 schoenebeck 2581 virtual ~ExecContext() {}
1087    
1088     inline void pushStack(Statement* stmt) {
1089     stackFrame++;
1090     //printf("pushStack() -> %d\n", stackFrame);
1091     if (stackFrame >= stack.size()) return;
1092     stack[stackFrame].statement = stmt;
1093     stack[stackFrame].subindex = 0;
1094     }
1095    
1096     inline void popStack() {
1097     stack[stackFrame].statement = NULL;
1098     stack[stackFrame].subindex = -1;
1099     stackFrame--;
1100     //printf("popStack() -> %d\n", stackFrame);
1101     }
1102    
1103     inline void reset() {
1104     stack[0].statement = NULL;
1105     stack[0].subindex = -1;
1106     stackFrame = -1;
1107 schoenebeck 3277 flags = STMT_SUCCESS;
1108 schoenebeck 2581 }
1109    
1110 schoenebeck 3551 inline void clearExitRes() {
1111     exitRes.value = NULL;
1112     }
1113    
1114 schoenebeck 3557 vmint suspensionTimeMicroseconds() const OVERRIDE {
1115 schoenebeck 2581 return suspendMicroseconds;
1116     }
1117 schoenebeck 3207
1118     void resetPolyphonicData() OVERRIDE {
1119 schoenebeck 3573 if (!polyphonicIntMemory.empty())
1120     memset(&polyphonicIntMemory[0], 0, polyphonicIntMemory.size() * sizeof(vmint));
1121     if (!polyphonicRealMemory.empty())
1122     memset(&polyphonicRealMemory[0], 0, polyphonicRealMemory.size() * sizeof(vmfloat));
1123 schoenebeck 3581 if (!polyphonicUnitFactorMemory.empty()) {
1124     const vmint sz = polyphonicUnitFactorMemory.size();
1125     for (vmint i = 0; i < sz; ++i)
1126     polyphonicUnitFactorMemory[i] = VM_NO_FACTOR;
1127     }
1128 schoenebeck 3207 }
1129 schoenebeck 3221
1130 schoenebeck 3845 void copyPolyphonicDataFrom(VMExecContext* ectx) OVERRIDE;
1131    
1132 schoenebeck 3221 size_t instructionsPerformed() const OVERRIDE {
1133     return instructionsCount;
1134     }
1135 schoenebeck 3277
1136     void signalAbort() OVERRIDE {
1137     flags = StmtFlags_t(flags | STMT_ABORT_SIGNALLED);
1138     }
1139 schoenebeck 3293
1140     void forkTo(VMExecContext* ectx) const OVERRIDE;
1141 schoenebeck 3551
1142     VMExpr* exitResult() OVERRIDE {
1143     return exitRes.value;
1144     }
1145 schoenebeck 2581 };
1146    
1147     } // namespace LinuxSampler
1148    
1149     #endif // LS_INSTRPARSERTREE_H

  ViewVC Help
Powered by ViewVC