Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def buildBinaryOpNode(provider, node, source_ref):
operator = getKind(node.op)
if operator == "Div" and source_ref.getFutureSpec().isFutureDivision():
operator = "TrueDiv"
return ExpressionOperationBinary(
operator = operator,
left = buildNode(provider, node.left, source_ref),
right = buildNode(provider, node.right, source_ref),
source_ref = source_ref
)
def buildComparisonNode(provider, node, source_ref):
from nuitka.nodes.NodeMakingHelpers import makeComparisonNode
assert len( node.comparators ) == len( node.ops )
# Comparisons are re-formulated as described in the developer manual. When
# having multiple compators, things require assignment expressions and
# references of them to work properly. Then they can become normal "and"
# code.
# The operands are split out
left = buildNode( provider, node.left, source_ref )
rights = [
buildNode( provider, comparator, source_ref )
for comparator in
node.comparators
]
# Only the first comparison has as left operands as the real thing, the
# others must reference the previous comparison right one temp variable ref.
result = []
# For PyLint to like it, this will hold the previous one, normally.
keeper_variable = None
for comparator, right in zip( node.ops, rights ):
if result:
# Now we know it's not the only one, so we change the "left" to be a
# reference to the previously saved right side.
left = ExpressionTempKeeperRef(
def buildConditionalExpressionNode(provider, node, source_ref):
return ExpressionConditional(
condition = buildNode(provider, node.test, source_ref),
yes_expression = buildNode(provider, node.body, source_ref),
no_expression = buildNode(provider, node.orelse, source_ref),
source_ref = source_ref
)
# is really an "index" lookup, with a slice object. And the "..." lookup is
# also an index loopup, with it as the argument. So this splits things into
# two different operations, "subscript" with a single "subscript" object. Or
# a slice lookup with a lower and higher boundary. These things should
# behave similar, but they are different slots.
kind = getKind( node.slice )
if kind == "Index":
return ExpressionSubscriptLookup(
expression = buildNode( provider, node.value, source_ref ),
subscript = buildNode( provider, node.slice.value, source_ref ),
source_ref = source_ref
)
elif kind == "Slice":
lower = buildNode( provider, node.slice.lower, source_ref, True )
upper = buildNode( provider, node.slice.upper, source_ref, True )
if node.slice.step is not None:
step = buildNode( provider, node.slice.step, source_ref )
return ExpressionSubscriptLookup(
expression = buildNode( provider, node.value, source_ref ),
subscript = ExpressionSliceObject(
lower = lower,
upper = upper,
step = step,
source_ref = source_ref
),
source_ref = source_ref
)
else:
return ExpressionSliceLookup(
node.attr
)
elif kind == "Subscript":
slice_kind = getKind( node.slice )
if slice_kind == "Index":
return "Subscript", (
buildNode( provider, node.value, source_ref ),
buildNode( provider, node.slice.value, source_ref )
)
elif slice_kind == "Slice":
lower = buildNode( provider, node.slice.lower, source_ref, True )
upper = buildNode( provider, node.slice.upper, source_ref, True )
if node.slice.step is not None:
step = buildNode( provider, node.slice.step, source_ref )
return "Subscript", (
buildNode( provider, node.value, source_ref ),
ExpressionSliceObject(
lower = lower,
upper = upper,
step = step,
source_ref = source_ref
)
)
else:
return "Slice", (
buildNode( provider, node.value, source_ref ),
lower,
upper
)
buildNode(
provider = function_body,
node = node.elt,
source_ref = source_ref
),
source_ref = source_ref
)
else:
assert emit_class is ExpressionDictOperationSet
current_body = emit_class(
ExpressionTempVariableRef(
variable = container_tmp.makeReference(function_body),
source_ref = source_ref
),
key = buildNode(
provider = function_body,
node = node.key,
source_ref = source_ref,
),
value = buildNode(
provider = function_body,
node = node.value,
source_ref = source_ref,
),
source_ref = source_ref
)
current_body = StatementExpressionOnly(
expression = current_body,
source_ref = source_ref
)
keys.append(
ExpressionConstantRef(
constant = keyword.arg,
source_ref = source_ref,
user_provided = True
)
)
values.append(
buildNode( provider, keyword.value, source_ref )
)
list_star_arg = buildNode( provider, node.starargs, source_ref, True )
dict_star_arg = buildNode( provider, node.kwargs, source_ref, True )
return _makeCallNode(
called = buildNode( provider, node.func, source_ref ),
positional_args = positional_args,
keys = keys,
values = values,
list_star_arg = list_star_arg,
dict_star_arg = dict_star_arg,
source_ref = source_ref,
)
def buildExtSliceNode(provider, node, source_ref):
elements = []
for dim in node.slice.dims:
dim_kind = getKind( dim )
if dim_kind == "Slice":
lower = buildNode( provider, dim.lower, source_ref, True )
upper = buildNode( provider, dim.upper, source_ref, True )
step = buildNode( provider, dim.step, source_ref, True )
element = ExpressionSliceObject(
lower = lower,
upper = upper,
step = step,
source_ref = source_ref
)
elif dim_kind == "Ellipsis":
element = ExpressionConstantRef(
constant = Ellipsis,
source_ref = source_ref,
user_provided = True
)
elif dim_kind == "Index":
element = buildNode(
provider = provider,
step = buildNode( provider, dim.step, source_ref, True )
element = ExpressionSliceObject(
lower = lower,
upper = upper,
step = step,
source_ref = source_ref
)
elif dim_kind == "Ellipsis":
element = ExpressionConstantRef(
constant = Ellipsis,
source_ref = source_ref,
user_provided = True
)
elif dim_kind == "Index":
element = buildNode(
provider = provider,
node = dim.value,
source_ref = source_ref
)
else:
assert False, dim
elements.append( element )
return makeSequenceCreationOrConstant(
sequence_kind = "tuple",
elements = elements,
source_ref = source_ref
)
def buildYieldNode(provider, node, source_ref):
_markAsGenerator( provider, node, source_ref )
if node.value is not None:
return ExpressionYield(
expression = buildNode( provider, node.value, source_ref ),
source_ref = source_ref
)
else:
return ExpressionYield(
expression = ExpressionConstantRef(
constant = None,
source_ref = source_ref,
user_provided = True
),
source_ref = source_ref
)