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

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

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

revision 3575 by schoenebeck, Wed Aug 28 11:12:04 2019 UTC revision 3577 by schoenebeck, Wed Aug 28 15:23:23 2019 UTC
# Line 78  VMFnResult* VMStringResultFunction::succ Line 78  VMFnResult* VMStringResultFunction::succ
78  }  }
79    
80  ///////////////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////////////
81    // class VMScalarNumberResultFunction
82    
83    VMFnResult* VMScalarNumberResultFunction::errorResult(vmint i) {
84        intResult.flags = StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
85        intResult.value = i;
86        return &intResult;
87    }
88    
89    VMFnResult* VMScalarNumberResultFunction::errorResult(vmfloat f) {
90        realResult.flags = StmtFlags_t(STMT_ABORT_SIGNALLED | STMT_ERROR_OCCURRED);
91        realResult.value = f;
92        return &realResult;
93    }
94    
95    VMFnResult* VMScalarNumberResultFunction::successResult(vmint i) {
96        intResult.flags = STMT_SUCCESS;
97        intResult.value = i;
98        return &intResult;
99    }
100    
101    VMFnResult* VMScalarNumberResultFunction::successResult(vmfloat f) {
102        realResult.flags = STMT_SUCCESS;
103        realResult.value = f;
104        return &realResult;
105    }
106    
107    ///////////////////////////////////////////////////////////////////////////
108  // built-in script function:  message()  // built-in script function:  message()
109    
110  bool CoreVMFunction_message::acceptsArgType(vmint iArg, ExprType_t type) const {  bool CoreVMFunction_message::acceptsArgType(vmint iArg, ExprType_t type) const {
# Line 181  VMFnResult* CoreVMFunction_wait::exec(VM Line 208  VMFnResult* CoreVMFunction_wait::exec(VM
208  ///////////////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////////////
209  // built-in script function:  abs()  // built-in script function:  abs()
210    
211    ExprType_t CoreVMFunction_abs::returnType(VMFnArgs* args) {
212        return args->arg(0)->exprType();
213    }
214    
215  bool CoreVMFunction_abs::acceptsArgType(vmint iArg, ExprType_t type) const {  bool CoreVMFunction_abs::acceptsArgType(vmint iArg, ExprType_t type) const {
216      return type == INT_EXPR;      return type == INT_EXPR || type == REAL_EXPR;
217  }  }
218    
219  VMFnResult* CoreVMFunction_abs::exec(VMFnArgs* args) {  VMFnResult* CoreVMFunction_abs::exec(VMFnArgs* args) {
220      return successResult( ::abs(args->arg(0)->asInt()->evalInt()) );      VMExpr* arg = args->arg(0);
221        if (arg->exprType() == REAL_EXPR)
222            return successResult( ::fabs(arg->asReal()->evalReal()) );
223        else
224            return successResult( ::abs(arg->asInt()->evalInt()) );
225  }  }
226    
227  ///////////////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////////////
# Line 280  VMFnResult* CoreVMFunction_sh_right::exe Line 315  VMFnResult* CoreVMFunction_sh_right::exe
315  ///////////////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////////////
316  // built-in script function:  min()  // built-in script function:  min()
317    
318    ExprType_t CoreVMFunction_min::returnType(VMFnArgs* args) {
319        return (args->arg(0)->exprType() == REAL_EXPR ||
320                args->arg(1)->exprType() == REAL_EXPR) ? REAL_EXPR : INT_EXPR;
321    }
322    
323    bool CoreVMFunction_min::acceptsArgType(vmint iArg, ExprType_t type) const {
324        return type == INT_EXPR || type == REAL_EXPR;
325    }
326    
327  VMFnResult* CoreVMFunction_min::exec(VMFnArgs* args) {  VMFnResult* CoreVMFunction_min::exec(VMFnArgs* args) {
328      vmint l = args->arg(0)->asInt()->evalInt();      VMExpr* a = args->arg(0);
329      vmint r = args->arg(1)->asInt()->evalInt();      VMExpr* b = args->arg(1);
330      return successResult(l < r ? l : r);      if (a->exprType() == REAL_EXPR && b->exprType() == REAL_EXPR) {
331            vmfloat l = a->asReal()->evalReal();
332            vmfloat r = b->asReal()->evalReal();
333            return successResult(l < r ? l : r);
334        } else if (a->exprType() == REAL_EXPR && b->exprType() == INT_EXPR) {
335            vmfloat l = a->asReal()->evalReal();
336            vmint   r = b->asInt()->evalInt();
337            return successResult(l < r ? l : r);
338        } else if (a->exprType() == INT_EXPR && b->exprType() == REAL_EXPR) {
339            vmint   l = a->asInt()->evalInt();
340            vmfloat r = b->asReal()->evalReal();
341            return successResult(l < r ? l : r);
342        } else {
343            vmint l = a->asInt()->evalInt();
344            vmint r = b->asInt()->evalInt();
345            return successResult(l < r ? l : r);
346        }
347  }  }
348    
349  ///////////////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////////////
350  // built-in script function:  max()  // built-in script function:  max()
351    
352    ExprType_t CoreVMFunction_max::returnType(VMFnArgs* args) {
353        return (args->arg(0)->exprType() == REAL_EXPR ||
354                args->arg(1)->exprType() == REAL_EXPR) ? REAL_EXPR : INT_EXPR;
355    }
356    
357    bool CoreVMFunction_max::acceptsArgType(vmint iArg, ExprType_t type) const {
358        return type == INT_EXPR || type == REAL_EXPR;
359    }
360    
361  VMFnResult* CoreVMFunction_max::exec(VMFnArgs* args) {  VMFnResult* CoreVMFunction_max::exec(VMFnArgs* args) {
362      vmint l = args->arg(0)->asInt()->evalInt();      VMExpr* a = args->arg(0);
363      vmint r = args->arg(1)->asInt()->evalInt();      VMExpr* b = args->arg(1);
364      return successResult(l > r ? l : r);      if (a->exprType() == REAL_EXPR && b->exprType() == REAL_EXPR) {
365            vmfloat l = a->asReal()->evalReal();
366            vmfloat r = b->asReal()->evalReal();
367            return successResult(l > r ? l : r);
368        } else if (a->exprType() == REAL_EXPR && b->exprType() == INT_EXPR) {
369            vmfloat l = a->asReal()->evalReal();
370            vmint   r = b->asInt()->evalInt();
371            return successResult(l > r ? l : r);
372        } else if (a->exprType() == INT_EXPR && b->exprType() == REAL_EXPR) {
373            vmint   l = a->asInt()->evalInt();
374            vmfloat r = b->asReal()->evalReal();
375            return successResult(l > r ? l : r);
376        } else {
377            vmint l = a->asInt()->evalInt();
378            vmint r = b->asInt()->evalInt();
379            return successResult(l > r ? l : r);
380        }
381  }  }
382    
383  ///////////////////////////////////////////////////////////////////////////  ///////////////////////////////////////////////////////////////////////////

Legend:
Removed from v.3575  
changed lines
  Added in v.3577

  ViewVC Help
Powered by ViewVC