
    0h\                         S SK r S SKrS SKrS SKrS SKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSK	Jr  SrS	rS
rSrSrSrSrSr " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)    N)parse   )ast)message)utils)TransformerException)to_underscores                @      c                       \ rS rSrSS jrSrg)IntrospectionBinary,   Nc                 \    Xl         Uc  [        R                  " SS5      U l        g X l        g )N ztmp-introspect)argstempfilemkdtemptmpdir)selfr   r   s      3/lib/gobject-introspection/giscanner/gdumpparser.py__init__IntrospectionBinary.__init__.   s&    	>"**2/?@DK K    )r   r   N__name__
__module____qualname____firstlineno__r   __static_attributes__ r   r   r   r   ,   s    !r   r   c                       \ rS rSrS rSrg)
Unresolved6   c                     Xl         g r   target)r   r,   s     r   r   Unresolved.__init__8   s    r   r+   Nr    r&   r   r   r(   r(   6   s    r   r(   c                       \ rS rSrSrg)UnknownTypeError<   r&   N)r!   r"   r#   r$   r%   r&   r   r   r/   r/   <   s    r   r/   c                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r Sr!g )!GDumpParserr   c                     Xl         UR                  U l        S U l        / U l        / U l        0 U l        0 U l        0 U l        0 U l	        g r   )
_transformer	namespace
_namespace_binary_get_type_functions_error_quark_functions_error_domains_boxed_types_pointer_types_private_internal_types)r   transformers     r   r   GDumpParser.__init__B   sL    '%//#% &(#  ')$r   c                    [        U R                  R                  5       5       H5  n[        U[        R
                  5      (       d  M$  U R                  U5        M7     U R                  R                  S:X  d  U R                  R                  S:X  a]  [        U R                  R                  5       5       H5  n[        U[        R                  5      (       d  M$  U R                  U5        M7     gg)z~Do parsing steps that don't involve the introspection binary

This does enough work that get_type_functions() can be called.

GObjectGLibN)
listr6   values
isinstancer   Function_initparse_functionnameRecord_initparse_gobject_record)r   nodes     r   
init_parseGDumpParser.init_parseO   s     //12D$--((. 3 ??9,0D0D0NT__3356dCJJ//2248 7 1Or   c                     U R                   $ r   )r8   r   s    r   get_get_type_functions"GDumpParser.get_get_type_functions`   s    '''r   c                     U R                   $ r   )r9   rO   s    r   get_error_quark_functions%GDumpParser.get_error_quark_functionsc   s    ***r   c                     Xl         g r   )r7   )r   binarys     r   set_introspection_binary$GDumpParser.set_introspection_binaryf   s    r   c                 j   U R                  5       nUR                  5       nU H7  nUR                  S:X  a  U R                  U5        M&  U R	                  U5        M9     U R
                  R                  5        H  u  pEU R                  U5        M     U R                  R                  5        H  u  pFU R                  U5        M     [        U R                  R                  5       5       HE  n[        U[        R                  [        R                   45      (       d  M4  U R#                  U5        MG     / nU R                  R                  5        H  u  pG[        U[        R$                  5      (       d  M&  UR&                  c  M5  UR&                  n	U	S:X  a  MI  U	(       d   U5       eU R(                  R+                  U	5      u  pXR                  L d   eU R                  R-                  U5      nU(       d   U5       eUR/                  U5        M     U H  nU R                  R1                  U5        M      g)z9Do remaining parsing steps requiring introspection binaryzerror-quarkNintern)_execute_binary_get_treegetroottag_introspect_error_quark_introspect_typer;   items_pair_boxed_typer<   _pair_pointer_typerC   r6   rD   rE   r   Class	Interface_find_class_record
Registeredget_typer4   split_csymbolgetappendremove)r   treerootchildrH   boxedpointerrK   	to_removeget_type_namensget_type_funcs               r   r   GDumpParser.parsei   s   
 ,,.||~EyyM),,U3%%e,	   ,,224KD!!%( 5!00668MD##G, 9//12D$CMM :;;''- 3 	////1JD$//DMM4M $ H,$*d*}!..<<]K
__,,, $ 3 3D 9$*d*}  / 2 DOO""4( r   c                 .   [         R                  R                  U R                  R                  S5      n[        USSS9 nU R                   H6  nUR                  S5        UR                  U5        UR                  S5        M8     U R                   H6  nUR                  S5        UR                  U5        UR                  S5        M8     SSS5        [         R                  R                  U R                  R                  S	5      n/ n[         R                  R                  S
5      nU(       a  UR                  UR                  5       5        UR                  U R                  R                  5        UR                  SU< SU< 35          [        R                   " U["        R$                  ["        R&                  S9  [-        U5      [.        R0                  " S5      (       d+  [.        R2                  " U R                  R                  5        $ $ ! , (       d  f       GNM= f! [        R(                   a  n[+        U5      eSnAff = f! [.        R0                  " S5      (       d+  [.        R2                  " U R                  R                  5        f f = f)zwLoad the library (or executable), returning an XML
blob containing data gleaned from GObject's primitive introspection.zfunctions.txtwzutf-8)encodingz	get-type:
zerror-quark:Nzdump.xmlGI_CROSS_LAUNCHERz--introspect-dump=,)stdoutstderrz
save-temps)ospathjoinr7   r   openr8   writer9   environri   extendsplitr   rj   
subprocess
check_callsysr|   r}   CalledProcessError
SystemExitr   r   have_debug_flagrmtree)r   in_pathffuncout_pathr   launcheres           r   r[   $GDumpParser._execute_binary_get_tree   s    '',,t||22OD'31Q00$ 1 33' 4 2 77<< 3 3Z@ ::>>"56KK()DLL%%&(CD		2$%%d3::cjjQ ?((66T\\001 7= 212 00 $ m#$
 ((66T\\001 7s8    BH2H% 
I 
H"%I	9II		I AJc                    UR                   nUR                  S5      (       a  g UR                  S5      (       d  UR                  S5      (       a  U R                  U5        g UR                  S5      (       a  U R	                  U5        g g )N_	_get_type
_get_gtype_error_quark)symbol
startswithendswith_initparse_get_type_function_initparse_error_quark_function)r   r   r   s      r   rG   GDumpParser._initparse_function   sl    S!!ook**fool.K.K--d3__^,,006 -r   c                     UR                   S:X  a  gUR                  5       (       a&  U R                  R                  UR                   5        gg)Ng_variant_get_gtypeTF)r   is_type_meta_functionr8   rj   r   r   s     r   r   (GDumpParser._initparse_get_type_function   s?    ;;//%%''$$++DKK8r   c                     UR                   R                  R                  S:w  a  gU R                  R	                  UR
                  5        g)NGQuarkFT)retvaltypectyper9   rj   r   r   s     r   r   +GDumpParser._initparse_error_quark_function   s8    KK""h.##**4;;7r   c           	         UR                   R                  S5      (       a  UR                   S;  a  S nUR                   S:w  a  [        R                  " SS9n[	        UR                   5      R                  5       n[        R                  " UR                   UUR                  UR                  R                  SS5      SUS9nS	Ul	        UR                   S:X  a  S	Ul
        U R                  U5        U R                  R                  US	S
9  g UR                   S:X  a%  [        R                  " SSSSS9U R                  S'   g UR                   S:X  a9  U R                  R!                  S5      R"                  Ul        SUl        SUl        g g )N	ParamSpec)ParamSpecPoolParamSpecClassParamSpecTypeInfozGObject.ParamSpec)target_ginameSpecr   rZ   )r   
gtype_namerg   c_symbol_prefixTreplaceVariantGVariantvariantr   rg   r   InitiallyUnownedClassObjectClassF)rH   r   r   Typer	   lowerrc   r   r   fundamentalis_abstract_add_record_fieldsr6   rj   Boxedr;   ri   fieldsopaque	disguised)r   recordparentprefixrK   s        r   rJ   %GDumpParser._initparse_gobject_record   sG   KK"";//KKWWF{{k)0CD#FKK0668F99V[[&#)<<(.(<(<VR(H&.-35D  $D{{k)#' ##D)OO""4"6[[I%,/IIiAK?GFO-QDj) [[33 !OO//>EEFM!FM$F 4r   c                    UR                   S;   a  U R                  U5        g UR                   S:X  a  U R                  U5        g UR                   S:X  a  U R                  U5        g UR                   S:X  a  U R	                  U5        g UR                   S:X  a  U R                  U5        g UR                   S:X  a  U R                  U5        g [        SUR                   5      e)N)enumflagsclass	interfacero   rp   r   z"Unhandled introspection XML tag %s)r]   _introspect_enum_introspect_object_introspect_interface_introspect_boxed_introspect_pointer_introspect_fundamental
ValueError)r   xmlnodes     r   r_   GDumpParser._introspect_type   s    ;;++!!'*[[G###G,[[K'&&w/[[G#""7+[[I%$$W-[[M)((1A7;;OOr   c                    UR                   S   nU R                  U5      u  p4 U R                  R                  U5      n0 n0 nU R                  R                  W5      n	[        U	[        R                  [        R                  45      (       aC  U	R                   H3  n
U
R                  XzR                  '   U
R                   XR                  '   M5     / nUR#                  S5       H  n
U
R                   S   R%                  SS5      nX;   a	  X|   nX   nOU
R                   S   nU
R                   S   nUR'                  [        R(                  " UUUU
R                   S   U
R                   S   5      5        M     UR*                  S:X  a  [        R                  nO[        R                  nU" XRUUUUR                   S   S	9nU R                  R'                  US
S9  g ! [         a!  n[
        R                  " U5         S nAGNS nAff = f)NrH   membernick-r   valuer   get-type)r   r   membersrg   Tr   )attrib_split_type_and_symbol_prefixr4   strip_identifierr   r   fatalr6   ri   rE   r   EnumBitfieldr   r   rH   r   findallr   rj   Memberr]   )r   r   	type_namerg   r   	enum_namer   previous_valuesprevious_symbolspreviousr   r   rH   r   r   klassrK   s                    r   r   GDumpParser._introspect_enum  s   NN6*	&*&H&H&Q#	))::9EI ??&&y1h3<< 899"**/5||,06 - + ooh/F ==(00c:D&'-)/g.v.NN3::d&+&,&,mmF&;&,mmF&;	= > 0$ ;;'!LLEHHEY )%4$%nnZ8	:
 	tT2Y $ 	MM!	s   G 
H%HHc                 \   UR                   S   nU R                  R                  U5      u  p4X0R                  L d   eUS;   a@  [        R
                  " SUR                   S   < SU R                  R                  < S35        UR                  S5      (       a  SnOSnX$S	[        U5      *  4$ )
z6Infer the C symbol prefix from the _get_type function.r   )rg   r   zThe GObject name 'rH   z>' isn't compatible
with the configured identifier prefixes:
  z`
The class would have no name.  Most likely you want to specify a
different --identifier-prefix.r   r   N)	r   r4   rh   r6   r   r   identifier_prefixesr   len)r   r   rg   rs   rH   type_suffixs         r   r   )GDumpParser._split_type_and_symbol_prefix7  s    >>*-&&44X>
__$$$--MM &-^^F%;T__=`=`	b c
 ==%%%K&K1[!1 1233r   c           
         UR                   S   n[        UR                   R                  SS5      5      n[        UR                   R                  SS5      5      nU R                  U5      u  pV U R                  R                  U5      n[        R                  " WS UUUUUS9n	U R                  X5        U R                  X5        U R                  X5        U R                  X5        U R                  U	5        U R                   R#                  U	SS9  g ! [         a   n[        R                  " U5         S nANS nAff = fNrH   abstractFfinal)r   rg   r   r   is_finalTr   )r   boolri   r   r4   r   r   r   r   r   rc   _parse_parents_introspect_properties_introspect_signals"_introspect_implemented_interfacesr   r6   rj   )
r   r   r   r   r   rg   r   object_namer   rK   s
             r   r   GDumpParser._introspect_objectH  s   NN6*	7>>--j%@A**7E:;&*&H&H&Q#	++<<YGK yyd$-"*)8%0"*, 	G*##D2  ///>%tT2 $ 	MM!	s   .D 
D=D88D=c                    UR                   S   nU R                  U5      u  p4 U R                  R                  U5      n[        R                  " WS UUUS9nU R                  Xq5        U R                  Xq5        UR                  S5       HL  nUR                   S   n	[        R                  R                  U	5      n
UR                  R                  U
5        MN     U R                   R#                  UR$                  5      n['        U[        R(                  5      (       a  UR*                  Ul        O&[
        R,                  " USUR$                  < S35        UR                   S   R/                  S5      (       a  XpR0                  U'   g U R                   R                  USS	9  g ! [         a!  n[
        R                  " U5         S nAGNS nAff = f)
NrH   r   prerequisitez(Couldn't find associated structure for ''r   r   Tr   )r   r   r4   r   r   r   r   r   rd   r   r   r   r   create_from_gtype_nameprerequisitesrj   r6   ri   rH   rE   rI   r   	warn_noder   r=   )r   r   r   rg   r   interface_namer   rK   rn   rH   prereqr   s               r   r   !GDumpParser._introspect_interface^  st   NN6*	&*&H&H&Q#	!..??	JN }}^T(1&.-<> 	##D2  /__^4E<<'DXX44T:F%%f- 5
 $$TYY/fcjj))DJdUYU^U^$ab >>*%00556:((3OO""4"61 $ 	MM!	s   F# #
G-G		Gc                 b    [         R                  " SSSSS9nX R                  UR                  '   g )NParamSpecMiniObjectGParamSpecMiniObject#gst_param_spec_mini_object_get_typeparam_spec_mini_objectr   )r   r   r;   r   )r   r   rK   s      r   &_introspect_boxed_gstreamer_workaround2GDumpParser._introspect_boxed_gstreamer_workaround  s1    yy.;Q"G)AC .2$//*r   c                 h   UR                   S   nUS:X  a  U R                  U5        g  U R                  R                  U5      nU R                  U5      u  pV[        R                  " WUUUS9nXpR                  UR                  '   g ! [         a   n[
        R                  " U5         S nANhS nAff = f)NrH   r  r   )r   r  r4   r   r   r   r   r   r   r   r;   r   r   r   r   rH   r   rg   r   rK   s           r   r   GDumpParser._introspect_boxed  s    NN6*	 ..77@	$$55i@D
 '+&H&H&Q#yy)"*)8: .2$//* $ 	MM!	s   B 
B1B,,B1c                 8   UR                   S   n U R                  R                  U5      nU R                  U5      u  pV[        R                  " WUUUS9nXpR                  UR                  '   g ! [         a   n[        R
                  " U5         S nANhS nAff = f)NrH   r   )r   r4   r   r   r   r   r   r   Pointerr<   r   r  s           r   r   GDumpParser._introspect_pointer  s    NN6*		$$55i@D '+&H&H&Q#{{4I$,+:< 04DOO, $ 	MM!	s   A/ /
B9BBc                     / nUR                  S5       H@  n[        R                  R                  UR                  S   5      nUR                  U5        MB     X1l        g )N
implementsrH   )r   r   r   r   r   rj   
interfaces)r   rK   r   gt_interfacesr   gitypes         r   r   .GDumpParser._introspect_implemented_interfaces  sN     6IXX44Y5E5Ef5MNF  ( 7 (r   c           	         UR                  S5       H  nUR                  S   n[        UR                  S   5      nU[        -  S:g  nU[        -  S:g  nU[
        -  S:g  nU[        -  S:g  n	UR                  R                  S5      n
[        R                  " UR                  S   [        R                  R                  U5      XgX5      nXl        UR                  R                  U5        M     UR                  Ul        g )Npropertyr   r   r   zdefault-valuerH   )r   r   intG_PARAM_READABLEG_PARAM_WRITABLEG_PARAM_CONSTRUCTG_PARAM_CONSTRUCT_ONLYri   r   Propertyr   r   default_value
propertiesrj   )r   rK   r   pspecr   r   readablewritable	constructconstruct_onlyr!  props               r   r   "GDumpParser._introspect_properties  s    __Z0ELL(EW-.E 00Q6H 00Q6H!22q8I#&<<BN!LL,,_=M<<V$//6I?D "/OO""4( 1 //r   c                    UR                  S5       GH  nUR                  S   n[        R                  R	                  U5      n[        R
                  " U5      n/ nUR                  R                  S5      nUR                  R                  SS5      S:H  n	UR                  R                  SS5      S:H  n
UR                  R                  SS5      S:H  nUR                  R                  S	S5      S:H  n[        UR                  S
5      5       H  u  pUS:X  a  SnO	SUS-
  < 3nUR                  S   n[        R                  R	                  U5      n[        R                  " UU5      n[        R                  Ul
        UR                  U5        M     [        R                  " UR                  S   XgXU
XS9nUR                  R                  U5        GM     UR                  Ul        g )Nsignalreturnwhenz
no-recurse01detailedactionzno-hooksparamr   objectpr   r   rH   )r-  
no_recurser0  r1  no_hooks)r   r   r   r   r   Returnri   	enumerate	ParameterPARAM_TRANSFER_NONEtransferrj   Signalsignals)r   rK   r   signal_inforctypertypereturn_
parametersr-  r5  r0  r1  r6  i	parameterargnamepctypeptyper2  r+  s                       r   r   GDumpParser._introspect_signals  s   "??84K ''1FHH33F;Ejj'GJ%%))&1D$++//cBcIJ"))--j#>#EH ''++Hc:cAF"))--j#>#EH )+*=*=g*F G6&G  ()1u/G"))&177?gu5!$!8!8!!%( !H ZZ 2 26 :G%)8'-BF LL'/ 50 ||r   c                     UR                   R                  SS5      nUS:w  a&  [        [        S UR	                  S5      5      5      nO/ nXBl        g )Nparentsr   c                 @    [         R                  R                  U 5      $ r   )r   r   r   )ss    r   <lambda>,GDumpParser._parse_parents.<locals>.<lambda>  s    chh.M.Ma.Pr   r{   )r   ri   rC   mapr   parent_chain)r   r   rK   parents_strparent_typess        r   r   GDumpParser._parse_parents  sO    nn((B7"$P$/$5$5c$:!< =L L(r   c           
      J   UR                   S   n[        UR                   R                  SS5      5      n[        UR                   R                  SS5      5      nU R                  U5      u  pV U R                  R                  U5      n[        R                  " US UUUUUS9n	U R                  X5        SU	l        U R                  X5        U R                  U	5        U R                  R!                  U	SS9  g ! [         a   n[        R                  " U5         S nAg S nAff = fr   )r   r   ri   r   r4   r   r   r   warnr   rc   r   r   r   r   r6   rj   )
r   r   r   r   r   rg   r   fundamental_namer   rK   s
             r   r   #GDumpParser._introspect_fundamental  s   NN6*	7>>--j%@A**7E:;&*&H&H&Q#	#00AA)L
 yy)4$-"*)8%0"*, 	G*//>%tT2 $ 	LLO	s   .C8 8
D"DD"c                 H   U R                   R                  UR                  5      n[        U[        R
                  5      (       d  g UR                  Ul        UR                  Ul        UR                   H+  n[        U[        R                  5      (       d  M$  SUl	        M-     g NF)
r6   ri   rH   rE   r   rI   r   r   Fieldr%  )r   rK   r   fields       r   r   GDumpParser._add_record_fields  sl    $$TYY/&#**--\\
mm[[E%++ "'	 !r   c                 L   UR                   S   nUR                   S   nU R                  R                  U5      nUc  g [        R                  " UR
                  UR                  UR                  UR                  UR                  U5      nU R                  R                  USS9  g )NfunctiondomainTr   )r   r6   get_by_symbolr   ErrorQuarkFunctionrH   r   rB  throwsr   rj   )r   r   r   error_domainr^  rK   s         r   r^   #GDumpParser._introspect_error_quark  s    
+~~h/??008%%hmmX__&.&9&98??&.oo|E 	tT2r   c                      U R                   R                  UR                  5      nU R                  R                  W5      nU(       d  U R                  R                  U5        g [        U[        R                  [        R                  45      (       aN  UR                  UR                  UR                  5        UR                  c   eUR                  Ul        SUl        g g! [         a   n[        R
                  " U5         S nANS nAff = frY  )r4   r   r   r   r   r   r6   ri   rj   rE   r   rI   Union	add_gtyperg   r   r   )r   ro   rH   r   	pair_nodes        r   ra   GDumpParser._pair_boxed_type  s    	$$55e6F6FGD OO''-	OO""5)	CJJ		#:;; 0 0%..A((444(-(=(=I% #(I $ 	MM!	s   %C# #
D-DDc                     U R                   R                  UR                  5      nU R                  R                  W5      nUc  g [        U[        R                  [        R                  45      (       aG  UR                  UR                  UR                  5        UR                  c   eUR                  Ul        g g ! [         a   n[        R
                  " U5         S nANS nAff = fr   )r4   r   r   r   r   r   r6   ri   rE   r   rI   rf  rg  rg   r   )r   rp   rH   r   rh  s        r   rb   GDumpParser._pair_pointer_type(  s    	$$55g6H6HID OO''-		CJJ		#:;; 2 2G4D4DE**666(/(?(?I% < $ 	MM!	s   %B= =
C'C""C'c                    S n[        U[        R                  5      (       a)  U R                  R	                  UR
                  S-   5      nO:S H4  nU R                  R	                  UR
                  U-   5      nU(       d  M4    O   U(       a  [        U[        R                  5      (       d  g UR                  5       Ul        UR                  U5        UR                  5       Ul
        g )Nrc   )Ifacerd   )rE   r   rc   r6   ri   rH   rI   create_typeglib_type_structinherit_file_positionsis_gtype_struct_for)r   clspair_recordsuffixs       r   re   GDumpParser._find_class_record6  s    c399%%//--chh.@AK0"oo11#((V2CD; 1 
;

 C C*668"";/*-//*;'r   )	r7   r;   r:   r9   r8   r6   r<   r=   r4   N)"r!   r"   r#   r$   r   rL   rP   rS   rW   r   r[   rG   r   r   rJ   r_   r   r   r   r   r  r   r   r   r   r   r   r   r   r^   ra   rb   re   r%   r&   r   r   r2   r2   @   s    	*9"(+%)R#2N7	%BP 13f4"3,7B22*
4(*"$6)32'
3(@<r   r2   )r~   r   r   r   xml.etree.ElementTreer   r   r   r   r   r>   r   r	   r  r  r  r  G_PARAM_LAX_VALIDATIONG_PARAM_STATIC_NAMEG_PARAM_STATIC_NICKG_PARAM_STATIC_BLURBr3  r   r(   	Exceptionr/   r2   r&   r   r   <module>r|     s   * 
 
   '    - !         !& ! 	y 	D<& D<r   