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

Diff of /linuxsampler/trunk/src/scriptvm/tree.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2888 by schoenebeck, Sun Apr 24 18:16:10 2016 UTC revision 2945 by schoenebeck, Thu Jul 14 00:22:26 2016 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (c) 2014 Christian Schoenebeck and Andreas Persson   * Copyright (c) 2014 - 2016 Christian Schoenebeck and Andreas Persson
3   *   *
4   * http://www.linuxsampler.org   * http://www.linuxsampler.org
5   *   *
# Line 102  void Mul::dump(int level) { Line 102  void Mul::dump(int level) {
102    
103  int Div::evalInt() {  int Div::evalInt() {
104      IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);      IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
105      IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);;      IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
106      return (pLHS && pRHS) ? pRHS->evalInt() == 0 ? 0 : pLHS->evalInt() / pRHS->evalInt() : 0;      if (!pLHS || !pRHS) return 0;
107        int l = pLHS->evalInt();
108        int r = pRHS->evalInt();
109        if (r == 0) return 0;
110        return l / r;
111  }  }
112    
113  void Div::dump(int level) {  void Div::dump(int level) {
# Line 243  bool Statements::isPolyphonic() const { Line 247  bool Statements::isPolyphonic() const {
247      return false;      return false;
248  }  }
249    
250    DynamicVariableCall::DynamicVariableCall(const String& name, ParserContext* ctx, VMDynVar* v)
251        : Variable(ctx, 0, false), dynVar(v), varName(name)
252    {
253    }
254    
255    int DynamicVariableCall::evalInt() {
256        VMIntExpr* expr = dynamic_cast<VMIntExpr*>(dynVar);
257        if (!expr) return 0;
258        return expr->evalInt();
259    }
260    
261    String DynamicVariableCall::evalStr() {
262        VMStringExpr* expr = dynamic_cast<VMStringExpr*>(dynVar);
263        if (!expr) return "";
264        return expr->evalStr();
265    }
266    
267    String DynamicVariableCall::evalCastToStr() {
268        if (dynVar->exprType() == STRING_EXPR) {
269            return evalStr();
270        } else {
271            VMIntExpr* intExpr = dynamic_cast<VMIntExpr*>(dynVar);
272            return intExpr ? ToString(intExpr->evalInt()) : "";
273        }
274    }
275    
276    void DynamicVariableCall::dump(int level) {
277        printIndents(level);
278        printf("Dynamic Variable '%s'\n", varName.c_str());
279    }
280    
281  void FunctionCall::dump(int level) {  void FunctionCall::dump(int level) {
282      printIndents(level);      printIndents(level);
283      printf("FunctionCall '%s' args={\n", functionName.c_str());      printf("FunctionCall '%s' args={\n", functionName.c_str());
# Line 342  int IntVariable::evalInt() { Line 377  int IntVariable::evalInt() {
377    
378  void IntVariable::dump(int level) {  void IntVariable::dump(int level) {
379      printIndents(level);      printIndents(level);
380        printf("IntVariable\n");
381      //printf("IntVariable memPos=%d\n", memPos);      //printf("IntVariable memPos=%d\n", memPos);
382  }  }
383    
# Line 675  void Neg::dump(int level) { Line 711  void Neg::dump(int level) {
711  }  }
712    
713  String ConcatString::evalStr() {  String ConcatString::evalStr() {
714      return lhs->evalCastToStr() + rhs->evalCastToStr();      // temporaries required here to enforce the associative left (to right) order
715        String l = lhs->evalCastToStr();
716        String r = rhs->evalCastToStr();
717        return l + r;
718  }  }
719    
720  void ConcatString::dump(int level) {  void ConcatString::dump(int level) {
# Line 769  void Or::dump(int level) { Line 808  void Or::dump(int level) {
808      printf(")\n");      printf(")\n");
809  }  }
810    
811    int BitwiseOr::evalInt() {
812        IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
813        IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
814        return pLHS->evalInt() | pRHS->evalInt();
815    }
816    
817    void BitwiseOr::dump(int level) {
818        printIndents(level);
819        printf("BitwiseOr(\n");
820        lhs->dump(level+1);
821        printIndents(level);
822        printf(",\n");
823        rhs->dump(level+1);
824        printIndents(level);
825        printf(")\n");
826    }
827    
828  int And::evalInt() {  int And::evalInt() {
829      IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);      IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
830      if (!pLHS->evalInt()) return 0;      if (!pLHS->evalInt()) return 0;
# Line 787  void And::dump(int level) { Line 843  void And::dump(int level) {
843      printf(")\n");      printf(")\n");
844  }  }
845    
846    int BitwiseAnd::evalInt() {
847        IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs);
848        IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);
849        return pLHS->evalInt() & pRHS->evalInt();
850    }
851    
852    void BitwiseAnd::dump(int level) {
853        printIndents(level);
854        printf("BitwiseAnd(\n");
855        lhs->dump(level+1);
856        printIndents(level);
857        printf(",\n");
858        rhs->dump(level+1);
859        printIndents(level);
860        printf(")\n");
861    }
862    
863  void Not::dump(int level) {  void Not::dump(int level) {
864      printIndents(level);      printIndents(level);
865      printf("Not(\n");      printf("Not(\n");
# Line 795  void Not::dump(int level) { Line 868  void Not::dump(int level) {
868      printf(")\n");      printf(")\n");
869  }  }
870    
871    void BitwiseNot::dump(int level) {
872        printIndents(level);
873        printf("BitwiseNot(\n");
874        expr->dump(level+1);
875        printIndents(level);
876        printf(")\n");
877    }
878    
879  VariableRef ParserContext::variableByName(const String& name) {  VariableRef ParserContext::variableByName(const String& name) {
880      if (!vartable.count(name)) {      if (!vartable.count(name)) {
881          return VariableRef();          return VariableRef();
# Line 828  ParserContext::~ParserContext() { Line 909  ParserContext::~ParserContext() {
909      }      }
910  }  }
911    
912  void ParserContext::addErr(int line, int column, const char* txt) {  void ParserContext::addErr(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt) {
913      ParserIssue e;      ParserIssue e;
914      e.type = PARSER_ERROR;      e.type = PARSER_ERROR;
915      e.txt = txt;      e.txt = txt;
916      e.line = line;      e.firstLine = firstLine;
917      e.column = column;      e.lastLine = lastLine;
918        e.firstColumn = firstColumn;
919        e.lastColumn = lastColumn;
920      vErrors.push_back(e);      vErrors.push_back(e);
921      vIssues.push_back(e);      vIssues.push_back(e);
922  }  }
923    
924  void ParserContext::addWrn(int line, int column, const char* txt) {  void ParserContext::addWrn(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt) {
925      ParserIssue w;      ParserIssue w;
926      w.type = PARSER_WARNING;      w.type = PARSER_WARNING;
927      w.txt = txt;      w.txt = txt;
928      w.line = line;      w.firstLine = firstLine;
929      w.column = column;      w.lastLine = lastLine;
930        w.firstColumn = firstColumn;
931        w.lastColumn = lastColumn;
932      vWarnings.push_back(w);      vWarnings.push_back(w);
933      vIssues.push_back(w);      vIssues.push_back(w);
934  }  }
# Line 915  void ParserContext::registerBuiltInIntAr Line 1000  void ParserContext::registerBuiltInIntAr
1000          vartable[it->first] = ref;          vartable[it->first] = ref;
1001      }      }
1002  }  }
1003    
1004    void ParserContext::registerBuiltInDynVariables(const std::map<String,VMDynVar*>& vars) {
1005        for (std::map<String,VMDynVar*>::const_iterator it = vars.begin();
1006             it != vars.end(); ++it)
1007        {
1008            DynamicVariableCallRef ref = new DynamicVariableCall(it->first, this, it->second);
1009            vartable[it->first] = ref;
1010        }
1011    }
1012    
1013  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.2888  
changed lines
  Added in v.2945

  ViewVC Help
Powered by ViewVC