Ejemplo n.º 1
0
    def emitVariableAssignCode(cls, value_name, needs_release, tmp_name,
                               ref_count, in_place, emit, context):

        assert not in_place

        if tmp_name.c_type == "nuitka_bool":
            emit("%s = %s;" % (value_name, tmp_name))
        else:
            if tmp_name.c_type == "PyObject *":
                test_code = "%s == Py_True" % tmp_name
            else:
                assert False, tmp_name

            cls.emitAssignmentCodeFromBoolCondition(to_name=value_name,
                                                    condition=test_code,
                                                    emit=emit)

            # TODO: Refcount and context needs release are redundant.
            if ref_count:
                getReleaseCode(tmp_name, emit, context)
Ejemplo n.º 2
0
    def emitAssignmentCodeFromConstant(cls, to_name, constant, emit, context):
        # Many cases to deal with, pylint: disable=too-many-branches,too-many-statements

        if type(constant) is dict:
            if constant:
                for key, value in iterItems(constant):
                    # key cannot be mutable.
                    assert not isMutable(key)
                    if isMutable(value):
                        needs_deep = True
                        break
                else:
                    needs_deep = False

                if needs_deep:
                    code = "DEEP_COPY(%s)" % context.getConstantCode(constant)
                else:
                    code = "PyDict_Copy(%s)" % context.getConstantCode(
                        constant)
            else:
                code = "PyDict_New()"

            ref_count = 1
        elif type(constant) is set:
            if constant:
                code = "PySet_New(%s)" % context.getConstantCode(constant)
            else:
                code = "PySet_New(NULL)"

            ref_count = 1
        elif type(constant) is list:
            if constant:
                for value in constant:
                    if isMutable(value):
                        needs_deep = True
                        break
                else:
                    needs_deep = False

                if needs_deep:
                    code = "DEEP_COPY(%s)" % context.getConstantCode(constant)
                else:
                    code = "LIST_COPY(%s)" % context.getConstantCode(constant)
            else:
                code = "PyList_New(0)"

            ref_count = 1
        elif type(constant) is tuple:
            for value in constant:
                if isMutable(value):
                    needs_deep = True
                    break
            else:
                needs_deep = False

            if needs_deep:
                code = "DEEP_COPY(%s)" % context.getConstantCode(constant)

                ref_count = 1
            else:
                code = context.getConstantCode(constant)

                ref_count = 0
        elif type(constant) is bytearray:
            code = "BYTEARRAY_COPY(%s)" % context.getConstantCode(constant)
            ref_count = 1
        else:
            code = context.getConstantCode(constant=constant)

            ref_count = 0

        if to_name.c_type == "PyObject *":
            value_name = to_name
        else:
            value_name = context.allocateTempName("constant_value")

        emit("%s = %s;" % (value_name, code))

        if to_name is not value_name:
            cls.emitAssignConversionCode(
                to_name=to_name,
                value_name=value_name,
                needs_check=False,
                emit=emit,
                context=context,
            )

            # Above is supposed to transfer ownership.
            if ref_count:
                getReleaseCode(value_name, emit, context)
        else:
            if ref_count:
                context.addCleanupTempName(value_name)