def createPathAssignment(source_ref):
    if Options.getFileReferenceMode() == "original":
        path_value = ExpressionConstantRef(
            constant=[dirname(source_ref.getFilename())],
            source_ref=source_ref,
            user_provided=True)
    else:
        path_value = ExpressionMakeList(elements=(ExpressionCallNoKeywords(
            called=ExpressionAttributeLookup(source=ExpressionImportModuleHard(
                module_name="os", import_name="path", source_ref=source_ref),
                                             attribute_name="dirname",
                                             source_ref=source_ref),
            args=ExpressionMakeTuple(
                elements=(ExpressionModuleFileAttributeRef(
                    source_ref=source_ref, ), ),
                source_ref=source_ref,
            ),
            source_ref=source_ref,
        ), ),
                                        source_ref=source_ref)

    return StatementAssignmentVariable(
        variable_ref=ExpressionTargetVariableRef(variable_name="__path__",
                                                 source_ref=source_ref),
        source=path_value,
        source_ref=source_ref)
def createPathAssignment(package, source_ref):
    if Options.getFileReferenceMode() == "original":
        path_value = makeConstantRefNode(
            constant=[os.path.dirname(source_ref.getFilename())],
            source_ref=source_ref,
            user_provided=True)
    else:
        elements = [
            ExpressionCallNoKeywords(
                called=ExpressionAttributeLookup(
                    source=ExpressionImportModuleNameHard(
                        module_name="os",
                        import_name="path",
                        source_ref=source_ref),
                    attribute_name="dirname",
                    source_ref=source_ref),
                args=ExpressionMakeTuple(
                    elements=(ExpressionModuleAttributeFileRef(
                        variable=package.getVariableForReference("__file__"),
                        source_ref=source_ref,
                    ), ),
                    source_ref=source_ref,
                ),
                source_ref=source_ref,
            )
        ]

        if package.canHaveExternalImports():
            parts = package.getFullName().split('.')

            for count in range(len(parts)):
                path_part = _makeCall(
                    "os", "environ", "get", source_ref,
                    makeConstantRefNode(
                        constant="NUITKA_PACKAGE_%s" %
                        '_'.join(parts[:count + 1]),
                        source_ref=source_ref,
                    ),
                    makeConstantRefNode(
                        constant="/notexist",
                        source_ref=source_ref,
                    ))

                if parts[count + 1:]:
                    path_part = _makeCall(
                        "os", "path", "join", source_ref, path_part,
                        makeConstantRefNode(
                            constant=os.path.join(*parts[count + 1:]),
                            source_ref=source_ref,
                        ))

                elements.append(path_part)

        path_value = ExpressionMakeList(elements=elements,
                                        source_ref=source_ref)

    return StatementAssignmentVariableName(provider=package,
                                           variable_name="__path__",
                                           source=path_value,
                                           source_ref=source_ref)
Пример #3
0
    def getRunTimeFilename(self):
        # TODO: Don't look at such things this late, push this into building.
        reference_mode = Options.getFileReferenceMode()

        if reference_mode == "original":
            return self.getCompileTimeFilename()
        elif reference_mode == "frozen":
            return "<frozen %s>" % self.getFullName()
        else:
            filename = self.getCompileTimeFilename()

            full_name = self.getFullName()

            result = os.path.basename(filename)
            current = filename

            levels = full_name.count(".")
            if self.isCompiledPythonPackage():
                levels += 1

            for _i in range(levels):
                current = os.path.dirname(current)

                result = os.path.join(os.path.basename(current), result)

            return result
Пример #4
0
    def getRunTimeFilename(self):
        # TODO: Don't look at such things this late, push this into building.
        reference_mode = Options.getFileReferenceMode()

        if reference_mode == "original":
            return self.getCompileTimeFilename()
        elif reference_mode == "frozen":
            return "<frozen %s>" % self.getFullName()
        else:
            filename = self.getCompileTimeFilename()

            full_name = self.getFullName()

            result = os.path.basename(filename)
            current = filename

            levels = full_name.count(".")
            if self.isCompiledPythonPackage():
                levels += 1

            for _i in range(levels):
                current = os.path.dirname(current)

                result = os.path.join(os.path.basename(current), result)

            return result
    def getRunTimeFilename(self):
        reference_mode = Options.getFileReferenceMode()

        if reference_mode == "original":
            return self.getCompileTimeFilename()
        elif reference_mode == "frozen":
            return "<frozen %s>" % self.getFullName()
        else:
            filename = self.getCompileTimeFilename()

            full_name = self.getFullName()

            result = os.path.basename(filename)
            current = filename

            levels = full_name.count('.')
            if self.isCompiledPythonPackage():
                levels += 1

            for _i in range(levels):
                current = os.path.dirname(current)

                result = os.path.join(
                    os.path.basename(current),
                    result
                )

            return result
Пример #6
0
    def computeExpressionRaw(self, trace_collection):
        # There is not a whole lot to do here, the path will change at run
        # time
        if Options.getFileReferenceMode() != "runtime":
            result = makeConstantRefNode(constant=self.getRunTimeFilename(),
                                         source_ref=self.getSourceReference())

            return result, "new_expression", "Using original '__file__' value."

        return self, None, None
Пример #7
0
    def computeExpression(self, constraint_collection):
        # There is not a whole lot to do here, the path will change at run
        # time
        if Options.getFileReferenceMode() != "runtime":
            result = ExpressionConstantRef(
                constant=self.getRunTimeFilename(),
                source_ref=self.getSourceReference())

            return result, "new_expression", "Resolved to fixed __file__ value."

        return self, None, None
Пример #8
0
    def computeExpression(self, constraint_collection):
        # There is not a whole lot to do here, the path will change at run
        # time
        if Options.getFileReferenceMode() != "runtime":
            result = ExpressionConstantRef(
                constant   = self.getRunTimeFilename(),
                source_ref = self.getSourceReference()
            )

            return result, "new_expression", "Using original '__file__' value."

        return self, None, None
Пример #9
0
    def computeExpressionRaw(self, trace_collection):
        # There is not a whole lot to do here, the path will change at run
        # time, but options may disable that and make it predictable.
        if Options.getFileReferenceMode() != "runtime":
            result = makeConstantRefNode(
                constant=self.variable.getModule().getRunTimeFilename(),
                source_ref=self.source_ref,
            )

            return result, "new_expression", "Using original '__file__' value."

        return self, None, None
Пример #10
0
    def computeExpressionRaw(self, trace_collection):
        # There is not a whole lot to do here, the path will change at run
        # time, but options may disable that and make it predictable.
        if Options.getFileReferenceMode() != "runtime":
            result = makeConstantRefNode(
                constant=self.variable.getModule().getRunTimeFilename(),
                source_ref=self.getSourceReference(),
            )

            return result, "new_expression", "Using original '__file__' value."

        return self, None, None
Пример #11
0
def getCodeObjectsInitCode(context):
    # There is a bit of details to this, and we are making some optimizations as
    # well as customization to what path should be put there.

    statements = []

    code_objects = context.getCodeObjects()

    # Create the always identical, but dynamic filename first thing.
    if code_objects:
        context.markAsNeedsModuleFilenameObject()
        filename_code = "module_filename_obj"

    if context.needsModuleFilenameObject():
        module_filename = context.getOwner().getRunTimeFilename()

        # We do not care about release of this object, as code object live
        # forever anyway.
        if Options.getFileReferenceMode() == "frozen" or os.path.isabs(
                module_filename):
            template = "module_filename_obj = %s;"
        else:
            template = "module_filename_obj = MAKE_RELATIVE_PATH(%s);"

        statements.append(template %
                          (context.getConstantCode(constant=module_filename)))

    for code_object_key, code_identifier in code_objects:
        # Make sure the filename is always identical.
        assert code_object_key.co_filename == module_filename, code_object_key

        args = (
            code_identifier,
            filename_code,
            ", ".join(
                str(s)
                for s in _getMakeCodeObjectArgs(code_object_key, context)),
        )

        code = "%s = MAKE_CODEOBJECT(%s, %s);" % args

        statements.append(code)

        if context.getOwner().getFullName() == "__main__":
            if code_object_key[1] == "<module>":
                statements.append("codeobj_main = %s;" % code_identifier)

    return statements
def createPathAssignment(source_ref):
    if Options.getFileReferenceMode() == "original":
        path_value = ExpressionConstantRef(
            constant      = [
                dirname(source_ref.getFilename())
            ],
            source_ref    = source_ref,
            user_provided = True
        )
    else:
        path_value = ExpressionMakeList(
            elements   = (
                ExpressionCallNoKeywords(
                    called     = ExpressionAttributeLookup(
                        source         = ExpressionImportModuleHard(
                            module_name = "os",
                            import_name = "path",
                            source_ref  = source_ref
                        ),
                        attribute_name = "dirname",
                        source_ref     = source_ref
                    ),
                    args       = ExpressionMakeTuple(
                        elements   = (
                            ExpressionModuleFileAttributeRef(
                                source_ref = source_ref,
                            ),
                        ),
                        source_ref = source_ref,
                    ),
                    source_ref = source_ref,
                ),
            ),
            source_ref = source_ref
        )

    return  StatementAssignmentVariable(
        variable_ref = ExpressionTargetVariableRef(
            variable_name = "__path__",
            source_ref    = source_ref
        ),
        source       = path_value,
        source_ref   = source_ref
    )
Пример #13
0
    def getRunTimeFilename(self):
        reference_mode = Options.getFileReferenceMode()

        if reference_mode == "original":
            return self.getCompileTimeFilename()
        elif reference_mode == "frozen":
            return "<frozen %s>" % self.getFullName()
        else:
            filename = self.getCompileTimeFilename()

            full_name = self.getFullName()

            result = Utils.basename(filename)
            current = filename

            levels = full_name.count('.')
            if self.isCompiledPythonPackage():
                levels += 1

            for _i in range(levels):
                current = Utils.dirname(current)
                result = Utils.joinpath(Utils.basename(current), result)

            return result
def createPathAssignment(package, source_ref):
    if Options.getFileReferenceMode() == "original":
        path_value = makeConstantRefNode(
            constant=[os.path.dirname(source_ref.getFilename())],
            source_ref=source_ref,
            user_provided=True,
        )
    else:
        elements = [
            ExpressionCallNoKeywords(
                called=ExpressionAttributeLookup(
                    source=ExpressionImportModuleNameHard(
                        module_name="os", import_name="path", source_ref=source_ref
                    ),
                    attribute_name="dirname",
                    source_ref=source_ref,
                ),
                args=ExpressionMakeTuple(
                    elements=(
                        ExpressionModuleAttributeFileRef(
                            variable=package.getVariableForReference("__file__"),
                            source_ref=source_ref,
                        ),
                    ),
                    source_ref=source_ref,
                ),
                source_ref=source_ref,
            )
        ]

        if package.canHaveExternalImports():
            parts = package.getFullName().split(".")

            for count in range(len(parts)):
                path_part = _makeCall(
                    "os",
                    "environ",
                    "get",
                    source_ref,
                    makeConstantRefNode(
                        constant="NUITKA_PACKAGE_%s" % "_".join(parts[: count + 1]),
                        source_ref=source_ref,
                    ),
                    makeConstantRefNode(constant="/notexist", source_ref=source_ref),
                )

                if parts[count + 1 :]:
                    path_part = _makeCall(
                        "os",
                        "path",
                        "join",
                        source_ref,
                        path_part,
                        makeConstantRefNode(
                            constant=os.path.join(*parts[count + 1 :]),
                            source_ref=source_ref,
                        ),
                    )

                elements.append(path_part)

        path_value = ExpressionMakeList(elements=elements, source_ref=source_ref)

    return StatementAssignmentVariableName(
        provider=package,
        variable_name="__path__",
        source=path_value,
        source_ref=source_ref,
    )
Пример #15
0
def getCodeObjectsInitCode(context):
    # There is a bit of details to this, code objects have many flags to deal
    # with, and we are making some optimizations as well as customization to
    # what path should be put there, pylint: disable=R0912

    statements = []

    code_objects = context.getCodeObjects()

    # Create the always identical, but dynamic filename first thing.
    if code_objects:
        context.markAsNeedsModuleFilenameObject()
        filename_code = "module_filename_obj"

    if context.needsModuleFilenameObject():
        module_filename = context.getOwner().getRunTimeFilename()

        # We do not care about release of this object, as code object live
        # forever anyway.
        if Options.getFileReferenceMode() == "frozen":
            template = "module_filename_obj = %s;"
        else:
            template = "module_filename_obj = MAKE_RELATIVE_PATH( %s );"

        statements.append(
            template % (
                context.getConstantCode(
                    constant = module_filename
                )
            )
        )

    for code_object_key, code_identifier in code_objects:
        co_flags = []

        # Make sure the filename is always identical.
        assert code_object_key[0] == module_filename

        if code_object_key[2] != 0 and \
           (code_object_key[7] or Utils.python_version < 340):
            co_flags.append("CO_NEWLOCALS")

        if code_object_key[6]:
            co_flags.append("CO_GENERATOR")

        if code_object_key[7]:
            co_flags.append("CO_OPTIMIZED")

        if code_object_key[8]:
            co_flags.append("CO_VARARGS")

        if code_object_key[9]:
            co_flags.append("CO_VARKEYWORDS")

        if not code_object_key[10]:
            co_flags.append("CO_NOFREE")

        co_flags.extend(code_object_key[11])

        if Utils.python_version < 300:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %s );" % (
                code_identifier,
                filename_code,
                getConstantCode(
                    constant = code_object_key[1],
                    context  = context
                ),
                code_object_key[2],
                getConstantCode(
                    constant = code_object_key[3],
                    context  = context
                ),
                code_object_key[4],
                " | ".join(co_flags) or '0',
            )
        else:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %d, %s );" % (
                code_identifier,
                filename_code,
                getConstantCode(
                    constant = code_object_key[1],
                    context  = context
                ),
                code_object_key[2],
                getConstantCode(
                    constant = code_object_key[3],
                    context  = context
                ),
                code_object_key[4],
                code_object_key[5],
                " | ".join(co_flags) or  '0',
            )

        statements.append(code)

    return statements
def getNameSpacePathExpression(package, source_ref):
    """Create the __path__ expression for a package."""

    reference_mode = Options.getFileReferenceMode()

    if reference_mode == "original":
        return makeConstantRefNode(
            constant=[package.getCompileTimeDirectory()],
            source_ref=source_ref,
        )
    elif reference_mode == "frozen":
        return makeConstantRefNode(
            constant=[],
            source_ref=source_ref,
        )
    else:
        elements = [
            ExpressionCallNoKeywords(
                called=makeExpressionAttributeLookup(
                    expression=makeExpressionImportModuleNameHard(
                        module_name="os", import_name="path", source_ref=source_ref
                    ),
                    attribute_name="dirname",
                    source_ref=source_ref,
                ),
                args=makeExpressionMakeTuple(
                    elements=(
                        ExpressionModuleAttributeFileRef(
                            variable=package.getVariableForReference("__file__"),
                            source_ref=source_ref,
                        ),
                    ),
                    source_ref=source_ref,
                ),
                source_ref=source_ref,
            )
        ]

        if package.canHaveExternalImports():
            parts = package.getFullName().asString().split(".")

            for count in range(len(parts)):
                path_part = _makeCall(
                    "os",
                    "environ",
                    "get",
                    source_ref,
                    makeConstantRefNode(
                        constant="NUITKA_PACKAGE_%s" % "_".join(parts[: count + 1]),
                        source_ref=source_ref,
                    ),
                    makeConstantRefNode(constant="/notexist", source_ref=source_ref),
                )

                if parts[count + 1 :]:
                    path_part = _makeCall(
                        "os",
                        "path",
                        "join",
                        source_ref,
                        path_part,
                        makeConstantRefNode(
                            constant=os.path.join(*parts[count + 1 :]),
                            source_ref=source_ref,
                        ),
                    )

                elements.append(path_part)

        return makeExpressionMakeList(elements=elements, source_ref=source_ref)
Пример #17
0
def getCodeObjectsInitCode(context):
    # There is a bit of details to this, code objects have many flags to deal
    # with, and we are making some optimizations as well as customization to
    # what path should be put there, pylint: disable=too-many-branches

    statements = []

    code_objects = context.getCodeObjects()

    # Create the always identical, but dynamic filename first thing.
    if code_objects:
        context.markAsNeedsModuleFilenameObject()
        filename_code = "module_filename_obj"

    if context.needsModuleFilenameObject():
        module_filename = context.getOwner().getRunTimeFilename()

        # We do not care about release of this object, as code object live
        # forever anyway.
        if Options.getFileReferenceMode() == "frozen" or os.path.isabs(module_filename):
            template = "module_filename_obj = %s;"
        else:
            template = "module_filename_obj = MAKE_RELATIVE_PATH( %s );"

        statements.append(
            template % (context.getConstantCode(constant=module_filename))
        )

    for code_object_key, code_identifier in code_objects:
        co_flags = []

        # Make sure the filename is always identical.
        assert code_object_key[0] == module_filename

        if code_object_key[6] in ("Module", "Class", "Function"):
            pass
        elif code_object_key[6] == "Generator":
            co_flags.append("CO_GENERATOR")
        elif code_object_key[6] == "Coroutine":
            co_flags.append("CO_COROUTINE")
        elif code_object_key[6] == "Asyncgen":
            co_flags.append("CO_ASYNC_GENERATOR")
        else:
            assert False, code_object_key[6]

        if code_object_key[7]:
            co_flags.append("CO_OPTIMIZED")

        if code_object_key[8]:
            co_flags.append("CO_NEWLOCALS")

        if code_object_key[9]:
            co_flags.append("CO_VARARGS")

        if code_object_key[10]:
            co_flags.append("CO_VARKEYWORDS")

        if not code_object_key[11]:
            co_flags.append("CO_NOFREE")

        co_flags.extend(code_object_key[12])

        if python_version < 300:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %s );" % (
                code_identifier,
                filename_code,
                context.getConstantCode(constant=code_object_key[1]),
                code_object_key[2],
                context.getConstantCode(constant=code_object_key[3]),
                code_object_key[4],
                " | ".join(co_flags) or "0",
            )
        else:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %d, %s );" % (
                code_identifier,
                filename_code,
                context.getConstantCode(constant=code_object_key[1]),
                code_object_key[2],
                context.getConstantCode(constant=code_object_key[3]),
                code_object_key[4],
                code_object_key[5],
                " | ".join(co_flags) or "0",
            )

        statements.append(code)

        if context.getOwner().getFullName() == "__main__":
            if code_object_key[1] == "<module>":
                statements.append("codeobj_main = %s;" % code_identifier)
    return statements
Пример #18
0
def getCodeObjectsInitCode(context):
    # There is a bit of details to this, code objects have many flags to deal
    # with, and we are making some optimizations as well as customization to
    # what path should be put there, pylint: disable=R0912

    statements = []

    code_objects = context.getCodeObjects()

    # Create the always identical, but dynamic filename first thing.
    if code_objects:
        context.markAsNeedsModuleFilenameObject()
        filename_code = "module_filename_obj"

    if context.needsModuleFilenameObject():
        module_filename = context.getOwner().getRunTimeFilename()

        # We do not care about release of this object, as code object live
        # forever anyway.
        if Options.getFileReferenceMode() == "frozen":
            template = "module_filename_obj = %s;"
        else:
            template = "module_filename_obj = MAKE_RELATIVE_PATH( %s );"

        statements.append(template %
                          (context.getConstantCode(constant=module_filename)))

    for code_object_key, code_identifier in code_objects:
        co_flags = []

        # Make sure the filename is always identical.
        assert code_object_key[0] == module_filename

        if code_object_key[2] != 0 and \
           (code_object_key[7] or Utils.python_version < 340):
            co_flags.append("CO_NEWLOCALS")

        if code_object_key[6]:
            co_flags.append("CO_GENERATOR")

        if code_object_key[7]:
            co_flags.append("CO_OPTIMIZED")

        if code_object_key[8]:
            co_flags.append("CO_VARARGS")

        if code_object_key[9]:
            co_flags.append("CO_VARKEYWORDS")

        if not code_object_key[10]:
            co_flags.append("CO_NOFREE")

        co_flags.extend(code_object_key[11])

        if Utils.python_version < 300:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %s );" % (
                code_identifier,
                filename_code,
                getConstantCode(constant=code_object_key[1], context=context),
                code_object_key[2],
                getConstantCode(constant=code_object_key[3], context=context),
                code_object_key[4],
                " | ".join(co_flags) or '0',
            )
        else:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %d, %s );" % (
                code_identifier,
                filename_code,
                getConstantCode(constant=code_object_key[1], context=context),
                code_object_key[2],
                getConstantCode(constant=code_object_key[3], context=context),
                code_object_key[4],
                code_object_key[5],
                " | ".join(co_flags) or '0',
            )

        statements.append(code)

    return statements
Пример #19
0
def getCodeObjectsInitCode(context):
    # There is a bit of details to this, code objects have many flags to deal
    # with, and we are making some optimizations as well as customization to
    # what path should be put there, pylint: disable=too-many-branches

    statements = []

    code_objects = context.getCodeObjects()

    # Create the always identical, but dynamic filename first thing.
    if code_objects:
        context.markAsNeedsModuleFilenameObject()
        filename_code = "module_filename_obj"

    if context.needsModuleFilenameObject():
        module_filename = context.getOwner().getRunTimeFilename()

        # We do not care about release of this object, as code object live
        # forever anyway.
        if Options.getFileReferenceMode() == "frozen" or os.path.isabs(
                module_filename):
            template = "module_filename_obj = %s;"
        else:
            template = "module_filename_obj = MAKE_RELATIVE_PATH( %s );"

        statements.append(template %
                          (context.getConstantCode(constant=module_filename)))

    for code_object_key, code_identifier in code_objects:
        co_flags = []

        # Make sure the filename is always identical.
        assert code_object_key[0] == module_filename

        if code_object_key[6] in ("Module", "Class", "Function"):
            pass
        elif code_object_key[6] == "Generator":
            co_flags.append("CO_GENERATOR")
        elif code_object_key[6] == "Coroutine":
            co_flags.append("CO_COROUTINE")
        elif code_object_key[6] == "Asyncgen":
            co_flags.append("CO_ASYNC_GENERATOR")
        else:
            assert False, code_object_key[6]

        if code_object_key[7]:
            co_flags.append("CO_OPTIMIZED")

        if code_object_key[8]:
            co_flags.append("CO_NEWLOCALS")

        if code_object_key[9]:
            co_flags.append("CO_VARARGS")

        if code_object_key[10]:
            co_flags.append("CO_VARKEYWORDS")

        if not code_object_key[11]:
            co_flags.append("CO_NOFREE")

        co_flags.extend(code_object_key[12])

        if python_version < 300:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %s );" % (
                code_identifier,
                filename_code,
                context.getConstantCode(constant=code_object_key[1]),
                code_object_key[2],
                context.getConstantCode(constant=code_object_key[3]),
                code_object_key[4],
                " | ".join(co_flags) or "0",
            )
        else:
            code = "%s = MAKE_CODEOBJ( %s, %s, %d, %s, %d, %d, %s );" % (
                code_identifier,
                filename_code,
                context.getConstantCode(constant=code_object_key[1]),
                code_object_key[2],
                context.getConstantCode(constant=code_object_key[3]),
                code_object_key[4],
                code_object_key[5],
                " | ".join(co_flags) or "0",
            )

        statements.append(code)

        if context.getOwner().getFullName() == "__main__":
            if code_object_key[1] == "<module>":
                statements.append("codeobj_main = %s;" % code_identifier)
    return statements