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)
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): # 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
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
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
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
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
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
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 )
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, )
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)
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
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 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