@@ -365,6 +365,59 @@ def patch_plugins(plugins):
365365 return result
366366
367367
368+ def _build_source_keylist (source , code , closure ):
369+ result = []
370+ flist = ('dllmethod' , 'init_pytransform' , 'init_runtime' , '_load_library' ,
371+ 'get_registration_code' , 'get_expired_days' , 'get_hd_info' ,
372+ 'get_license_info' , 'get_license_code' , 'format_platname' ,
373+ 'pyarmor_init' , 'pyarmor_runtime' )
374+
375+ def _make_value (co ):
376+ return len (co .co_names ), len (co .co_consts ), len (co .co_code )
377+
378+ def _make_code_key (co ):
379+ v1 = _make_value (co )
380+ v2 = _make_value (co .co_consts [1 ]) if co .co_name == 'dllmethod' else None
381+ co_closure = getattr (co , closure , None )
382+ v3 = _make_value (getattr (co_closure [0 ].cell_contents , code )) \
383+ if co_closure else None
384+ return v1 , v2 , v3
385+
386+ mod_co = compile (source , 'pytransform' , 'exec' )
387+ result .append ((- 1 , _make_code_key (mod_co )))
388+ mod_consts = mod_co .co_consts
389+ for i in range (len (mod_consts )):
390+ co_const = mod_consts [i ]
391+ co = getattr (co_const , code , None )
392+ if co and co .co_name in flist :
393+ result .append ((i , _make_code_key (co )))
394+ return result
395+
396+
397+ def _build_pytransform_keylist (mod , code , closure ):
398+ result = []
399+ flist = ('dllmethod' , 'init_pytransform' , 'init_runtime' , '_load_library' ,
400+ 'get_registration_code' , 'get_expired_days' , 'get_hd_info' ,
401+ 'get_license_info' , 'get_license_code' , 'format_platname' ,
402+ 'pyarmor_init' , 'pyarmor_runtime' )
403+
404+ def _make_value (co ):
405+ return len (co .co_names ), len (co .co_consts ), len (co .co_code )
406+
407+ def _make_code_key (co ):
408+ v1 = _make_value (co )
409+ v2 = _make_value (co .co_consts [1 ]) if co .co_name == 'dllmethod' else None
410+ co_closure = getattr (co , closure , None )
411+ v3 = _make_value (getattr (co_closure [0 ].cell_contents , code )) \
412+ if co_closure else None
413+ return v1 , v2 , v3
414+
415+ for name in flist :
416+ co = getattr (getattr (mod , name ), code )
417+ result .append ((name , _make_code_key (co )))
418+ return result
419+
420+
368421def make_protect_pytransform (template = None , filename = None , rpath = None ):
369422 if filename is None :
370423 filename = pytransform ._pytransform ._name
@@ -382,10 +435,12 @@ def make_protect_pytransform(template=None, filename=None, rpath=None):
382435
383436 code = '__code__' if sys .version_info [0 ] == 3 else 'func_code'
384437 closure = '__closure__' if sys .version_info [0 ] == 3 else 'func_closure'
385- rpath = 'pytransform.os.path.dirname(__file__)' if rpath is None \
386- else repr (rpath )
438+ keylist = _build_pytransform_keylist (pytransform , code , closure )
439+ rpath = 'pytransform.os.path.dirname(pytransform.__file__)' \
440+ if rpath is None else repr (rpath )
387441 return buf .format (code = code , closure = closure , size = size , checksum = cosum ,
388- rpath = rpath , filename = repr (os .path .basename (filename )))
442+ keylist = keylist , rpath = rpath ,
443+ filename = repr (os .path .basename (filename )))
389444
390445
391446def _frozen_modname (filename , filename2 ):
0 commit comments