|
Blender V5.0
|
#include <cctype>#include <cfenv>#include <cmath>#include <cstddef>#include <cstdlib>#include <cstring>#include <variant>#include "MEM_guardedalloc.h"#include "BLI_alloca.h"#include "BLI_expr_pylike_eval.h"#include "BLI_math_base.h"#include "BLI_utildefines.h"#include "BLI_vector.hh"Go to the source code of this file.
Classes | |
| struct | ExprOp |
| struct | ExprPyLike_Parsed |
| struct | BuiltinConstDef |
| struct | BuiltinOpDef |
| struct | KeywordTokenDef |
| struct | ExprParseState |
Macros | |
| #define | FAIL_IF(condition) |
Internal Types | |
| enum | eOpCode { OPCODE_CONST , OPCODE_FUNC1 , OPCODE_FUNC2 , OPCODE_FUNC3 , OPCODE_PARAMETER , OPCODE_MIN , OPCODE_MAX , OPCODE_JMP , OPCODE_JMP_ELSE , OPCODE_JMP_OR , OPCODE_JMP_AND , OPCODE_CMP_CHAIN } |
| using | UnaryOpFunc = double (*)(double) |
| using | BinaryOpFunc = double (*)(double, double) |
| using | TernaryOpFunc = double (*)(double, double, double) |
Built-In Operations | |
| static BuiltinConstDef | builtin_consts [] |
| static BuiltinOpDef | builtin_ops [] |
| static double | op_negate (double arg) |
| static double | op_mul (double a, double b) |
| static double | op_div (double a, double b) |
| static double | op_add (double a, double b) |
| static double | op_sub (double a, double b) |
| static double | op_radians (double arg) |
| static double | op_degrees (double arg) |
| static double | op_log2 (double a, double b) |
| static double | op_lerp (double a, double b, double x) |
| static double | op_clamp (double arg) |
| static double | op_clamp3 (double arg, double minv, double maxv) |
| static double | op_smoothstep (double a, double b, double x) |
| static double | op_not (double a) |
| static double | op_eq (double a, double b) |
| static double | op_ne (double a, double b) |
| static double | op_lt (double a, double b) |
| static double | op_le (double a, double b) |
| static double | op_gt (double a, double b) |
| static double | op_ge (double a, double b) |
Simple evaluator for a subset of Python expressions that can be computed using purely double precision floating point values.
Supported subset:
The implementation has no global state and can be used multi-threaded.
Definition in file expr_pylike_eval.cc.
| #define CHECK_ERROR | ( | condition | ) |
Definition at line 450 of file expr_pylike_eval.cc.
Referenced by parse_add(), parse_and(), parse_cmp(), parse_cmp_chain(), parse_expr(), parse_mul(), parse_next_token(), parse_not(), parse_or(), and parse_unary().
| #define FAIL_IF | ( | condition | ) |
Referenced by BLI_expr_pylike_eval().
| #define MAKE_CHAR2 | ( | a, | |
| b ) |
Definition at line 448 of file expr_pylike_eval.cc.
Referenced by parse_next_token().
| #define TOKEN_AND MAKE_CHAR2('A', 'N') |
Definition at line 464 of file expr_pylike_eval.cc.
Referenced by parse_and().
| #define TOKEN_ELSE MAKE_CHAR2('E', 'L') |
Definition at line 468 of file expr_pylike_eval.cc.
Referenced by parse_expr().
| #define TOKEN_EQ MAKE_CHAR2('=', '=') |
Definition at line 463 of file expr_pylike_eval.cc.
Referenced by parse_get_cmp_func().
| #define TOKEN_GE MAKE_CHAR2('>', '=') |
Definition at line 460 of file expr_pylike_eval.cc.
Referenced by parse_get_cmp_func().
| #define TOKEN_ID MAKE_CHAR2('I', 'D') |
Definition at line 458 of file expr_pylike_eval.cc.
Referenced by parse_next_token(), and parse_unary().
| #define TOKEN_IF MAKE_CHAR2('I', 'F') |
Definition at line 467 of file expr_pylike_eval.cc.
Referenced by parse_expr().
| #define TOKEN_LE MAKE_CHAR2('<', '=') |
Definition at line 461 of file expr_pylike_eval.cc.
Referenced by parse_get_cmp_func().
| #define TOKEN_NE MAKE_CHAR2('!', '=') |
Definition at line 462 of file expr_pylike_eval.cc.
Referenced by parse_get_cmp_func().
| #define TOKEN_NOT MAKE_CHAR2('N', 'O') |
Definition at line 466 of file expr_pylike_eval.cc.
Referenced by parse_not().
| #define TOKEN_NUMBER MAKE_CHAR2('0', '0') |
Definition at line 459 of file expr_pylike_eval.cc.
Referenced by parse_next_token(), and parse_unary().
| #define TOKEN_OR MAKE_CHAR2('O', 'R') |
Definition at line 465 of file expr_pylike_eval.cc.
Referenced by parse_or().
| using BinaryOpFunc = double (*)(double, double) |
Definition at line 81 of file expr_pylike_eval.cc.
| using TernaryOpFunc = double (*)(double, double, double) |
Definition at line 82 of file expr_pylike_eval.cc.
| using UnaryOpFunc = double (*)(double) |
Definition at line 80 of file expr_pylike_eval.cc.
| enum eOpCode |
| Enumerator | |
|---|---|
| OPCODE_CONST | Double constant: (-> dval). |
| OPCODE_FUNC1 | 1 argument function call: (a -> func1(a)). |
| OPCODE_FUNC2 | 2 argument function call: (a b -> func2(a,b)). |
| OPCODE_FUNC3 | 3 argument function call: (a b c -> func3(a,b,c)). |
| OPCODE_PARAMETER | Parameter access: (-> params[ival]). |
| OPCODE_MIN | Minimum of multiple inputs: (a b c... -> min); ival = arg count. |
| OPCODE_MAX | Maximum of multiple inputs: (a b c... -> max); ival = arg count. |
| OPCODE_JMP | Jump (pc += jmp_offset) |
| OPCODE_JMP_ELSE | Pop and jump if zero: (a -> ); JUMP IF NOT a. |
| OPCODE_JMP_OR | Jump if nonzero, or pop: (a -> a JUMP) IF a ELSE (a -> ). |
| OPCODE_JMP_AND | Jump if zero, or pop: (a -> a JUMP) IF NOT a ELSE (a -> ). |
| OPCODE_CMP_CHAIN | For comparison chaining: (a b -> 0 JUMP) IF NOT func2(a,b) ELSE (a b -> b). |
Definition at line 53 of file expr_pylike_eval.cc.
| eExprPyLike_EvalStatus BLI_expr_pylike_eval | ( | struct ExprPyLike_Parsed * | expr, |
| const double * | param_values, | ||
| int | param_values_len, | ||
| double * | r_result ) |
Evaluate the expression with the given parameters. The order and number of parameters must match the names given to parse.
Definition at line 148 of file expr_pylike_eval.cc.
References ExprOp::arg, BLI_array_alloca, BLI_expr_pylike_is_valid(), CLAMP_MAX, CLAMP_MIN, Vector< T, InlineBufferCapacity, Allocator >::data(), ExprOp::dval, EXPR_PYLIKE_DIV_BY_ZERO, EXPR_PYLIKE_FATAL_ERROR, EXPR_PYLIKE_INVALID, EXPR_PYLIKE_MATH_ERROR, EXPR_PYLIKE_SUCCESS, FAIL_IF, ExprOp::ival, ExprPyLike_Parsed::max_stack, OPCODE_CMP_CHAIN, OPCODE_CONST, OPCODE_FUNC1, OPCODE_FUNC2, OPCODE_FUNC3, OPCODE_JMP, OPCODE_JMP_AND, OPCODE_JMP_ELSE, OPCODE_JMP_OR, OPCODE_MAX, OPCODE_MIN, OPCODE_PARAMETER, ExprPyLike_Parsed::ops, and Vector< T, InlineBufferCapacity, Allocator >::size().
Referenced by driver_evaluate_simple_expr(), expr_pylike_const_test(), expr_pylike_error_test(), TEST(), TEST(), and verify_eval_result().
| void BLI_expr_pylike_free | ( | struct ExprPyLike_Parsed * | expr | ) |
Free the parsed data; NULL argument is ok.
Definition at line 110 of file expr_pylike_eval.cc.
Referenced by BKE_driver_invalidate_expression(), driver_compile_simple_expr(), and fcurve_free_driver().
| bool BLI_expr_pylike_is_constant | ( | const ExprPyLike_Parsed * | expr | ) |
Definition at line 120 of file expr_pylike_eval.cc.
References OPCODE_CONST, ExprPyLike_Parsed::ops, and Vector< T, InlineBufferCapacity, Allocator >::size().
| bool BLI_expr_pylike_is_using_param | ( | const ExprPyLike_Parsed * | expr, |
| int | index ) |
Definition at line 125 of file expr_pylike_eval.cc.
References i, OPCODE_PARAMETER, ExprPyLike_Parsed::ops, and Vector< T, InlineBufferCapacity, Allocator >::size().
| bool BLI_expr_pylike_is_valid | ( | const ExprPyLike_Parsed * | expr | ) |
Definition at line 115 of file expr_pylike_eval.cc.
References ExprPyLike_Parsed::ops, and Vector< T, InlineBufferCapacity, Allocator >::size().
Referenced by BLI_expr_pylike_eval().
| ExprPyLike_Parsed * BLI_expr_pylike_parse | ( | const char * | expression, |
| const char ** | param_names, | ||
| int | param_names_len ) |
Compile the expression and return the result.
Parse the expression for evaluation later. Returns non-NULL even on failure; use is_valid to check.
Definition at line 1038 of file expr_pylike_eval.cc.
References BLI_assert, ExprPyLike_Parsed::max_stack, ExprPyLike_Parsed::ops, parse_expr(), parse_next_token(), and state.
Referenced by driver_compile_simple_expr_impl(), expr_pylike_const_test(), expr_pylike_parse_fail_test(), parse_for_eval(), TEST(), and TEST().
|
static |
|
static |
Definition at line 321 of file expr_pylike_eval.cc.
References CLAMP.
|
static |
Definition at line 327 of file expr_pylike_eval.cc.
References CLAMP.
|
static |
Definition at line 306 of file expr_pylike_eval.cc.
References M_PI.
|
static |
|
static |
Definition at line 345 of file expr_pylike_eval.cc.
References b.
Referenced by parse_get_cmp_func().
|
static |
Definition at line 370 of file expr_pylike_eval.cc.
References b.
Referenced by parse_get_cmp_func().
|
static |
Definition at line 365 of file expr_pylike_eval.cc.
References b.
Referenced by parse_get_cmp_func().
|
static |
Definition at line 360 of file expr_pylike_eval.cc.
References b.
Referenced by parse_get_cmp_func().
|
static |
Definition at line 316 of file expr_pylike_eval.cc.
|
static |
Definition at line 311 of file expr_pylike_eval.cc.
|
static |
Definition at line 355 of file expr_pylike_eval.cc.
References b.
Referenced by parse_get_cmp_func().
|
static |
|
static |
Definition at line 350 of file expr_pylike_eval.cc.
References b.
Referenced by parse_get_cmp_func().
|
static |
Definition at line 276 of file expr_pylike_eval.cc.
Referenced by parse_unary().
|
static |
Definition at line 340 of file expr_pylike_eval.cc.
Referenced by parse_not().
|
static |
Definition at line 301 of file expr_pylike_eval.cc.
References M_PI.
|
static |
Definition at line 333 of file expr_pylike_eval.cc.
|
static |
Definition at line 296 of file expr_pylike_eval.cc.
References b.
Referenced by bmo_connect_vert_pair_exec(), bmo_contextual_create_exec(), bridge_loop_pair(), and parse_add().
|
static |
Definition at line 860 of file expr_pylike_eval.cc.
References CHECK_ERROR, op_add(), op_sub(), parse_add_func(), parse_mul(), parse_next_token(), and state.
Referenced by parse_cmp(), and parse_cmp_chain().
|
static |
Definition at line 538 of file expr_pylike_eval.cc.
References ExprOp::arg, BLI_assert, ExprOp::dval, ExprOp::func1, ExprOp::func2, ExprOp::func3, OPCODE_CONST, OPCODE_FUNC1, OPCODE_FUNC2, OPCODE_FUNC3, parse_add_op(), result, and state.
Referenced by parse_add(), parse_cmp_chain(), parse_mul(), parse_not(), and parse_unary().
|
static |
Definition at line 524 of file expr_pylike_eval.cc.
References parse_add_op(), and state.
Referenced by parse_and(), parse_expr(), and parse_or().
|
static |
Definition at line 510 of file expr_pylike_eval.cc.
References CLAMP_MIN, and state.
Referenced by parse_add_func(), parse_add_jump(), parse_cmp_chain(), and parse_unary().
|
static |
Definition at line 948 of file expr_pylike_eval.cc.
References CHECK_ERROR, jump(), OPCODE_JMP_AND, parse_add_jump(), parse_and(), parse_next_token(), parse_not(), parse_set_jump(), state, and TOKEN_AND.
Referenced by parse_and(), and parse_or().
|
static |
Definition at line 922 of file expr_pylike_eval.cc.
References CHECK_ERROR, parse_add(), parse_cmp_chain(), parse_get_cmp_func(), parse_next_token(), and state.
Referenced by parse_not().
|
static |
Definition at line 902 of file expr_pylike_eval.cc.
References ExprOp::arg, CHECK_ERROR, ExprOp::func2, jump(), OPCODE_CMP_CHAIN, parse_add(), parse_add_func(), parse_add_op(), parse_cmp_chain(), parse_get_cmp_func(), parse_next_token(), parse_set_jump(), and state.
Referenced by parse_cmp(), and parse_cmp_chain().
|
static |
Definition at line 978 of file expr_pylike_eval.cc.
References CHECK_ERROR, blender::Vector< T, InlineBufferCapacity, Allocator >::clear_and_shrink(), blender::Vector< T, InlineBufferCapacity, Allocator >::data(), OPCODE_JMP, OPCODE_JMP_ELSE, parse_add_jump(), parse_expr(), parse_next_token(), parse_or(), parse_set_jump(), size(), state, TOKEN_ELSE, and TOKEN_IF.
Referenced by BLI_expr_pylike_parse(), parse_expr(), parse_function_args(), and parse_unary().
|
static |
Definition at line 718 of file expr_pylike_eval.cc.
References parse_expr(), parse_next_token(), and state.
Referenced by parse_unary().
|
static |
Definition at line 882 of file expr_pylike_eval.cc.
References op_eq(), op_ge(), op_gt(), op_le(), op_lt(), op_ne(), TOKEN_EQ, TOKEN_GE, TOKEN_LE, and TOKEN_NE.
Referenced by parse_cmp(), and parse_cmp_chain().
|
static |
Definition at line 838 of file expr_pylike_eval.cc.
References CHECK_ERROR, op_div(), op_mul(), parse_add_func(), parse_next_token(), parse_unary(), and state.
Referenced by parse_add().
|
static |
Definition at line 611 of file expr_pylike_eval.cc.
References CHECK_ERROR, ELEM, i, keyword_list, MAKE_CHAR2, out, state, STREQ, token_characters, token_eq_characters, TOKEN_ID, and TOKEN_NUMBER.
Referenced by BLI_expr_pylike_parse(), parse_add(), parse_and(), parse_cmp(), parse_cmp_chain(), parse_expr(), parse_function_args(), parse_mul(), parse_not(), parse_or(), and parse_unary().
|
static |
Definition at line 937 of file expr_pylike_eval.cc.
References CHECK_ERROR, op_not(), parse_add_func(), parse_cmp(), parse_next_token(), parse_not(), state, and TOKEN_NOT.
Referenced by parse_and(), and parse_not().
|
static |
Definition at line 963 of file expr_pylike_eval.cc.
References CHECK_ERROR, jump(), OPCODE_JMP_OR, parse_add_jump(), parse_and(), parse_next_token(), parse_or(), parse_set_jump(), state, and TOKEN_OR.
Referenced by parse_expr(), and parse_or().
|
static |
Definition at line 531 of file expr_pylike_eval.cc.
Referenced by parse_and(), parse_cmp_chain(), parse_expr(), and parse_or().
|
static |
Definition at line 752 of file expr_pylike_eval.cc.
References ExprOp::arg, builtin_consts, builtin_ops, CHECK_ERROR, count, ExprOp::dval, i, ExprOp::ival, name, op_negate(), OPCODE_CONST, OPCODE_MAX, OPCODE_MIN, OPCODE_PARAMETER, parse_add_func(), parse_add_op(), parse_expr(), parse_function_args(), parse_next_token(), parse_unary(), state, STREQ, TOKEN_ID, and TOKEN_NUMBER.
Referenced by parse_mul(), and parse_unary().
|
static |
|
static |
Definition at line 412 of file expr_pylike_eval.cc.
Referenced by parse_unary().
|
static |
Definition at line 478 of file expr_pylike_eval.cc.
Referenced by denoise_func(), merge_func(), and parse_next_token().
|
static |
Definition at line 471 of file expr_pylike_eval.cc.
Referenced by parse_next_token().
|
static |
Definition at line 470 of file expr_pylike_eval.cc.
Referenced by parse_next_token().