/[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 2942 by schoenebeck, Wed Jul 13 15:51:06 2016 UTC revision 3034 by schoenebeck, Mon Oct 31 00:05:00 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 355  IntVariable::IntVariable(ParserContext* Line 359  IntVariable::IntVariable(ParserContext*
359    
360  void IntVariable::assign(Expression* expr) {  void IntVariable::assign(Expression* expr) {
361      IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);      IntExpr* intExpr = dynamic_cast<IntExpr*>(expr);
362      if (intExpr)      if (intExpr) {
363          if (polyphonic)          if (polyphonic)
364              context->execContext->polyphonicIntMemory[memPos] = intExpr->evalInt();              context->execContext->polyphonicIntMemory[memPos] = intExpr->evalInt();
365          else          else
366              (*context->globalIntMemory)[memPos] = intExpr->evalInt();              (*context->globalIntMemory)[memPos] = intExpr->evalInt();
367        }
368  }  }
369    
370  int IntVariable::evalInt() {  int IntVariable::evalInt() {
# Line 373  int IntVariable::evalInt() { Line 378  int IntVariable::evalInt() {
378    
379  void IntVariable::dump(int level) {  void IntVariable::dump(int level) {
380      printIndents(level);      printIndents(level);
381        printf("IntVariable\n");
382      //printf("IntVariable memPos=%d\n", memPos);      //printf("IntVariable memPos=%d\n", memPos);
383  }  }
384    
# Line 706  void Neg::dump(int level) { Line 712  void Neg::dump(int level) {
712  }  }
713    
714  String ConcatString::evalStr() {  String ConcatString::evalStr() {
715      return lhs->evalCastToStr() + rhs->evalCastToStr();      // temporaries required here to enforce the associative left (to right) order
716        // ( required for GCC and Visual Studio, see:
717        //   http://stackoverflow.com/questions/25842902/why-stdstring-concatenation-operator-works-like-right-associative-one
718        //   Personally I am not convinced that this is "not a bug" of the
719        //   compiler/STL implementation and the allegedly underlying "function call"
720        //   nature causing this is IMO no profound reason that the C++ language's
721        //   "+" operator's left associativity is ignored. -- Christian, 2016-07-14 )
722        String l = lhs->evalCastToStr();
723        String r = rhs->evalCastToStr();
724        return l + r;
725  }  }
726    
727  void ConcatString::dump(int level) {  void ConcatString::dump(int level) {
# Line 868  void BitwiseNot::dump(int level) { Line 883  void BitwiseNot::dump(int level) {
883      printf(")\n");      printf(")\n");
884  }  }
885    
886    StatementsRef ParserContext::userFunctionByName(const String& name) {
887        if (!userFnTable.count(name)) {
888            return StatementsRef();
889        }
890        return userFnTable.find(name)->second;
891    }
892    
893  VariableRef ParserContext::variableByName(const String& name) {  VariableRef ParserContext::variableByName(const String& name) {
894      if (!vartable.count(name)) {      if (!vartable.count(name)) {
895          return VariableRef();          return VariableRef();

Legend:
Removed from v.2942  
changed lines
  Added in v.3034

  ViewVC Help
Powered by ViewVC