|
Blender V4.5
|
#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) |
Expression Parser State | |
| #define | MAKE_CHAR2(a, b) (((a) << 8) | (b)) |
| #define | CHECK_ERROR(condition) |
| #define | TOKEN_ID MAKE_CHAR2('I', 'D') |
| #define | TOKEN_NUMBER MAKE_CHAR2('0', '0') |
| #define | TOKEN_GE MAKE_CHAR2('>', '=') |
| #define | TOKEN_LE MAKE_CHAR2('<', '=') |
| #define | TOKEN_NE MAKE_CHAR2('!', '=') |
| #define | TOKEN_EQ MAKE_CHAR2('=', '=') |
| #define | TOKEN_AND MAKE_CHAR2('A', 'N') |
| #define | TOKEN_OR MAKE_CHAR2('O', 'R') |
| #define | TOKEN_NOT MAKE_CHAR2('N', 'O') |
| #define | TOKEN_IF MAKE_CHAR2('I', 'F') |
| #define | TOKEN_ELSE MAKE_CHAR2('E', 'L') |
| static const char * | token_eq_characters = "!=><" |
| static const char * | token_characters = "~`!@#$%^&*+-=/\\?:;<>(){}[]|.,\"'" |
| static KeywordTokenDef | keyword_list [] |
| static ExprOp * | parse_add_op (ExprParseState *state, eOpCode code, int stack_delta) |
| static int | parse_add_jump (ExprParseState *state, eOpCode code) |
| static void | parse_set_jump (ExprParseState *state, int jump) |
| static bool | parse_add_func (ExprParseState *state, std::variant< UnaryOpFunc, BinaryOpFunc, TernaryOpFunc > funcptr) |
| static bool | parse_next_token (ExprParseState *state) |
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().
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 |
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, blender::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 blender::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 blender::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 OPCODE_PARAMETER, ExprPyLike_Parsed::ops, and blender::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 blender::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, ExprParseState::cur, 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, keyword_list, MAKE_CHAR2, KeywordTokenDef::name, out, state, STREQ, KeywordTokenDef::token, 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, ExprOp::ival, BuiltinConstDef::name, BuiltinOpDef::name, 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, TOKEN_NUMBER, and BuiltinConstDef::value.
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().