(self, expr, local_vars, allow_recursion)
| 890 | return v, should_abort |
| 891 | |
| 892 | def interpret_expression(self, expr, local_vars, allow_recursion): |
| 893 | expr = expr.strip() |
| 894 | |
| 895 | if expr == '': # Empty expression |
| 896 | return None |
| 897 | |
| 898 | if expr.startswith('('): |
| 899 | parens_count = 0 |
| 900 | for m in re.finditer(r'[()]', expr): |
| 901 | if m.group(0) == '(': |
| 902 | parens_count += 1 |
| 903 | else: |
| 904 | parens_count -= 1 |
| 905 | if parens_count == 0: |
| 906 | sub_expr = expr[1:m.start()] |
| 907 | sub_result = self.interpret_expression(sub_expr, local_vars, allow_recursion) |
| 908 | remaining_expr = expr[m.end():].strip() |
| 909 | if not remaining_expr: |
| 910 | return sub_result |
| 911 | else: |
| 912 | expr = json.dumps(sub_result) + remaining_expr |
| 913 | break |
| 914 | else: |
| 915 | raise JSInterpreterError('Premature end of parens in %r' % expr) |
| 916 | |
| 917 | for op, opfunc in self._ASSIGN_OPERATORS: |
| 918 | m = re.match(r'(?x)(?P<out>%s)(?:\[(?P<index>[^\]]+?)\])?\s*%s(?P<expr>.*)$' % |
| 919 | (self._VARNAME_PATTERN, re.escape(op)), expr) |
| 920 | if m is None: |
| 921 | continue |
| 922 | right_val = self.interpret_expression(m.group('expr'), local_vars, allow_recursion - 1) |
| 923 | |
| 924 | if m.groupdict().get('index'): |
| 925 | lvar = local_vars[m.group('out')] |
| 926 | idx = self.interpret_expression(m.group('index'), local_vars, allow_recursion) |
| 927 | assert isinstance(idx, int) |
| 928 | cur = lvar[idx] |
| 929 | val = opfunc(cur, right_val) |
| 930 | lvar[idx] = val |
| 931 | return val |
| 932 | else: |
| 933 | cur = local_vars.get(m.group('out')) |
| 934 | val = opfunc(cur, right_val) |
| 935 | local_vars[m.group('out')] = val |
| 936 | return val |
| 937 | |
| 938 | if expr.isdigit(): |
| 939 | return int(expr) |
| 940 | |
| 941 | var_m = re.match(r'(?!if|return|true|false)(?P<name>%s)$' % self._VARNAME_PATTERN, expr) |
| 942 | if var_m: |
| 943 | return local_vars[var_m.group('name')] |
| 944 | |
| 945 | try: |
| 946 | return json.loads(expr) |
| 947 | except ValueError: |
| 948 | pass |
| 949 |
no test coverage detected