/[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 2935 by schoenebeck, Sun Jul 10 14:24:13 2016 UTC revision 2951 by schoenebeck, Fri Jul 15 20:07:47 2016 UTC
# 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        // ( required for GCC and Visual Studio, see:
716        //   http://stackoverflow.com/questions/25842902/why-stdstring-concatenation-operator-works-like-right-associative-one
717        //   Personally I am not convinced that this is "not a bug" of the
718        //   compiler/STL implementation and the allegedly underlying "function call"
719        //   nature causing this is IMO no profound reason that the C++ language's
720        //   "+" operator's left associativity is ignored. -- Christian, 2016-07-14 )
721        String l = lhs->evalCastToStr();
722        String r = rhs->evalCastToStr();
723        return l + r;
724  }  }
725    
726  void ConcatString::dump(int level) {  void ConcatString::dump(int level) {
# Line 837  void BitwiseNot::dump(int level) { Line 882  void BitwiseNot::dump(int level) {
882      printf(")\n");      printf(")\n");
883  }  }
884    
885    StatementsRef ParserContext::userFunctionByName(const String& name) {
886        if (!userFnTable.count(name)) {
887            return StatementsRef();
888        }
889        return userFnTable.find(name)->second;
890    }
891    
892  VariableRef ParserContext::variableByName(const String& name) {  VariableRef ParserContext::variableByName(const String& name) {
893      if (!vartable.count(name)) {      if (!vartable.count(name)) {
894          return VariableRef();          return VariableRef();
# Line 961  void ParserContext::registerBuiltInIntAr Line 1013  void ParserContext::registerBuiltInIntAr
1013          vartable[it->first] = ref;          vartable[it->first] = ref;
1014      }      }
1015  }  }
1016    
1017    void ParserContext::registerBuiltInDynVariables(const std::map<String,VMDynVar*>& vars) {
1018        for (std::map<String,VMDynVar*>::const_iterator it = vars.begin();
1019             it != vars.end(); ++it)
1020        {
1021            DynamicVariableCallRef ref = new DynamicVariableCall(it->first, this, it->second);
1022            vartable[it->first] = ref;
1023        }
1024    }
1025    
1026  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.2935  
changed lines
  Added in v.2951

  ViewVC Help
Powered by ViewVC