zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
U
L±dßjã@sHddlZddlZddlZddlmZddlmZGdd„deƒZdZ    dS)éNé)Úmodel©ÚVerificationErrorc@s„eZdZdZdZdd„Zdd„Zdd„Zd    d
„ZdZd d „Z    dd„Z
d[dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZeZeZeZdd„ZeZdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Z d5d6„Z!d7d8„Z"d9d:„Z#d\d=d>„Z$d?d@„Z%eZ&d]dAdB„Z'dCdD„Z(dEdF„Z)dGdH„Z*dIdJ„Z+d^dLdM„Z,d_dNdO„Z-dPdQ„Z.dRdS„Z/eZ0dTdU„Z1dVdW„Z2eZ3dXdY„Z4d;S)`ÚVGenericEngineÚgFcCs||_|j|_g|_i|_dS©N)ÚverifierÚffiÚexport_symbolsÚ_struct_pending_verification)Úselfr    ©rúGd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\cffi/vengine_gen.pyÚ__init__szVGenericEngine.__init__cCs| d|j¡dS)Nr )Ú
setdefaultr )r ÚkwdsrrrÚpatch_extension_kwdssz#VGenericEngine.patch_extension_kwdscCsT|D]J}||}|dkrtj}|D]*}tj ||¡}tj |¡r"|Sq"qdSr)ÚsysÚpathÚosÚjoinÚisfile)r Ú module_namerZ so_suffixesZ    so_suffixÚbasenameÚdirnameÚfilenamerrrÚ find_modules zVGenericEngine.find_modulecCsdSrr©r rrrÚ collect_types%szVGenericEngine.collect_typesÚcCs|j |d¡dS)NÚ
)Z_fÚwrite)r ÚwhatrrrÚ_prnt(szVGenericEngine._prntcCs`|j}|tƒ||jjƒ| d¡tjdkr\tjdkr>d}nd}|j ¡}|d||fƒdS)NÚdeclÚwin32©éZPyInit_Úinitzvoid %s%s(void) { }
)    r$Úcffimod_headerr    ÚpreambleÚ    _generaterÚplatformÚ version_infoZget_module_name)r ÚprntÚprefixÚmodnamerrrÚwrite_source_to_f+s 
 
 
 
z VGenericEngine.write_source_to_frcsjˆjj}tj tjˆjj¡}| ||¡‰ˆ     ˆd¡G‡‡‡fdd„dt
j ƒ‰ˆdƒ}ˆj    ˆd|d|S)NZloadingcs&eZdZ”Z”jZgZ‡fdd„ZdS)z/VGenericEngine.load_library.<locals>.FFILibrarycsˆjSr)Ú    _cffi_dirr)Ú
FFILibraryrrÚ__dir__Tsz7VGenericEngine.load_library.<locals>.FFILibrary.__dir__N)Ú__name__Ú
__module__Ú __qualname__Z_cffi_generic_moduler
Z    _cffi_ffir3r5r©r4Úmoduler rrr4Psr4r Zloaded©Úlibrary) r
Ú_backendrrrÚcurdirr    ZmodulefilenameÚ load_libraryÚ_loadÚtypesÚ
ModuleType)r ÚflagsÚbackendrr<rr9rr?As  zVGenericEngine.load_librarycCs$dd„|jjj ¡Dƒ}| ¡|S)NcSsg|]\}\}}||f‘qSrr)Ú.0ÚkeyÚtpZqualrrrÚ
<listcomp>^s
z4VGenericEngine._get_declarations.<locals>.<listcomp>)r
Ú_parserZ _declarationsÚitemsÚsort)r ÚlstrrrÚ_get_declarations]s
 ÿz VGenericEngine._get_declarationsc Csž| ¡D]\}}| dd¡\}}zt|d||fƒ}Wn tk
rVtd|ƒ‚YnXz|||ƒWqtk
r–}zt ||¡‚W5d}~XYqXqdS)Nú rz_generate_gen_%s_%sznot implemented in verify(): %r)rMÚsplitÚgetattrÚAttributeErrorrÚ    ExceptionrÚattach_exception_info)r Ú    step_nameÚnamerGÚkindÚrealnameÚmethodÚerrrr,csÿ ÿ
 zVGenericEngine._generatec
Ks~| ¡D]p\}}| dd¡\}}t|d||fƒ}z||||f|ŽWqtk
rv}    zt |    |¡‚W5d}    ~    XYqXqdS)NrNrz
_%s_gen_%s)rMrOrPrRrrS)
r r:rTrrUrGrVrWrXrYrrrr@rs zVGenericEngine._loadcCsdSrr©r rGrUrrrÚ_generate_nothing|sz VGenericEngine._generate_nothingcKsdSrr©r rGrUr:rrrrÚ _loaded_noopszVGenericEngine._loaded_noopcs„t|tjƒst‚|jr(| d||¡dS|j}t|jƒ}g}t    |jƒD].\}}d}t|tj
ƒrbd}|  d||f¡qFd|‰‡fdd„t |j|ƒDƒ}    |j }
t|
tj
ƒrÄ|     d|
 d    ˆ¡¡tj}
d
 |    ¡pÐd }    d |} |j  | ¡|jrø|jd } nd} d| | |    f} d|‰||
 | ˆ¡ƒ|dƒt|j tj
ƒr@d}nt|j tjƒsVd}nd}|d||d
 |¡fƒ|dƒ|ƒdS)NFr Ú*z%sx%dzargument of %scs g|]\}}| d|ˆ¡‘qS)z %s)Ú
get_c_name)rEÚtypeÚarg©ÚcontextrrrHsÿz>VGenericEngine._generate_gen_function_decl.<locals>.<listcomp>rz *rz, Zvoidú
_cffi_f_%srNz     %s%s(%s)z result of %sÚ{z*r = zreturn z   %s%s(%s);Ú})Ú
isinstancerÚFunctionPtrTypeÚAssertionErrorÚellipsisÚ_generate_gen_constr$ÚlenÚargsÚ    enumerateÚ StructOrUnionÚappendÚzipÚresultÚinsertr_Ú    void_typerr ÚabiZVoidType)r rGrUr/ZnumargsÚargnamesÚir`Z indirectionZarglistZtpresultÚ wrappernameruZfuncdeclZ result_coderrbrÚ_generate_gen_function_declŒsL
 
 
ÿ   z*VGenericEngine._generate_gen_function_declcCsjt|tjƒst‚|jr*| d|||¡}n g}|}tdd„|jDƒƒsVt|jtj    ƒr
g}t
|jƒD]6\}    }
t|
tj    ƒrt  |
¡}
|  |    |
f¡|  |
¡qd|j} t| tj    ƒrö| j dkrÊtd|  ¡fƒ‚t  | ¡} | d| ¡| dd| f¡tj} t t|ƒ| |j¡}|j |¡} d|} | | | ¡}|D]\}    }
| ||    |
|¡}q.t|||ƒt|ƒj  |¡dS)NFcss|]}t|tjƒVqdSr)rgrro)rEÚtyprrrÚ    <genexpr>Âsz6VGenericEngine._loaded_gen_function.<locals>.<genexpr>z*'%s' is used as result type, but is opaquerrrrd)rgrrhrirjÚ_load_constantÚanyrmrrrornÚ PointerTyperpZfldtypesÚ    TypeErrorÚ _get_c_namersrtÚtupler
Ú_get_cached_btypeÚ load_functionÚ_make_struct_wrapperÚsetattrr`r3)r rGrUr:r<Z newfunctionZ indirectionsÚbase_tpZ indirect_argsrwrzZindirect_resultÚBFuncrxrrrÚ_loaded_gen_function»sL ÿ 
 
ÿÿ
 
ÿ   
ÿ z#VGenericEngine._loaded_gen_functioncsP|jj‰|j |¡‰ˆdkr4|j‰‡‡‡fdd„}n‡‡‡‡fdd„}||_|S)Nrrcs ˆ ˆ¡}ˆ|f|žŽ|dS©Nr)Únew)rmÚres)ÚBTyper
ÚoldfuncrrÚnewfuncäs
z4VGenericEngine._make_struct_wrapper.<locals>.newfunccs6|dˆ…ˆ ˆ|ˆ¡f|ˆdd…}ˆ|ŽS)Nr)Únewp)rm)rŒrDrwrrrrŽés.)r
r=r‚Z_cffi_base_type)r rrwrGr†rŽr)rŒrDr
rwrrr„ßs z#VGenericEngine._make_struct_wrappercCs ||jkst‚| |d|¡dS©NÚstruct©rUriÚ_generate_struct_or_union_declrZrrrÚ_generate_gen_struct_declòsz(VGenericEngine._generate_gen_struct_declcCs| |d||¡dSr©Ú_loading_struct_or_union©r rGrUr:rrrÚ_loading_gen_structösz"VGenericEngine._loading_gen_structcKs| |¡dSr©Ú_loaded_struct_or_unionr\rrrÚ_loaded_gen_structùsz!VGenericEngine._loaded_gen_structcCs ||jkst‚| |d|¡dS©NÚunionr’rZrrrÚ_generate_gen_union_declüsz'VGenericEngine._generate_gen_union_declcCs| |d||¡dSrœr•r—rrrÚ_loading_gen_unionsz!VGenericEngine._loading_gen_unioncKs| |¡dSrr™r\rrrÚ_loaded_gen_unionsz VGenericEngine._loaded_gen_unionc Cs|jdkrdSd||f}d||f}d||f ¡}|j}|d||fƒ|dƒ|dƒ|dƒ| ¡D]Ž\}}    }
} t|    tjƒrŒ|     ¡s”|
dkr¢|d    |ƒqlz$|d
|    jd d || d |fƒWqlt    k
rø} z|dt
| ƒƒW5d} ~ XYqlXql|dƒ|j   |¡|d|fƒ|dƒ|d|ƒ|dƒ|d|ƒ|dƒ| ¡D]h\}}    }
} |
dkrpqV|d||fƒt|    tj ƒr¬|    jdkr¬|d|     ¡ƒn|d||fƒqV|dƒ|dƒ|dƒ|dƒ|d|fƒ|dƒ|ƒdS)Nz_cffi_check_%s_%sú_cffi_layout_%s_%sú%s %szstatic void %s(%s *p)rez8  /* only to generate compile-time warnings or errors */z
  (void)p;rz  (void)((p->%s) << 1);z  { %s = &p->%s; (void)tmp; }z*tmpzfield %r)Zqualsz
  /* %s */rfzintptr_t %s(intptr_t i)z,  struct _cffi_aligncheck { char x; %s y; };z  static intptr_t nums[] = {z    sizeof(%s),z)    offsetof(struct _cffi_aligncheck, y),z    offsetof(%s, %s),z    0,  /* %s */z    sizeof(((%s *)0)->%s),z    -1z  };z  return nums[i];z3  /* the next line is not executed, but compiled */z  %s(0);)ÚfldnamesÚstripr$Ú
enumfieldsrgrÚ PrimitiveTypeÚis_integer_typer_rÚstrr rpÚ    ArrayTypeÚlengthr€) r rGr0rUZ checkfuncnameÚlayoutfuncnameÚcnamer/ÚfnameÚftypeÚfbitsizeÚfqualrYrrrr“s\
   ÿÿþ $   
z-VGenericEngine._generate_struct_or_union_declcCs|jdkrdSd||f}|j d¡d}| ||¡}g}d}    ||    ƒ}
|
dkrPqd| |
¡|    d7}    q>t|tjƒrâ|jrâ|d} |d} |ddd…} |ddd…}|     ¡t
| ƒt
|ƒkrÌt
|jƒksÒnt ‚| || | f|_ nd||f  ¡}||f|j|<dS)Nr¡zintptr_t(*)(intptr_t)rrér(r¢)r£r
Ú_typeof_lockedrƒrprgrroÚpartialZ force_flattenrlriZ fixedlayoutr¤r )r rGr0rUr:r«r‡ÚfunctionÚlayoutÚnumÚxZ    totalsizeZtotalalignmentZfieldofsZ    fieldsizer¬rrrr–7s,
 
 
(z'VGenericEngine._loading_struct_or_unionc Cs|jdkrdS|j |¡||jkrdd„}|j}| |¡}|j |¡\}}||d| |¡dƒ||d| |¡dƒd}| ¡D]v\}}    }
} |
dkrœq†|||| ||¡d|fƒ||ddkrô| |    ¡} |||d| | ¡d    |fƒ|d7}q†|t    |ƒkst
‚dS)
NcSs||krtd|||fƒ‚dS)Nz'%s (we have %d, but C compiler says %d)r)Z    realvalueZ expectedvalueÚmsgrrrÚcheckZs ÿÿz5VGenericEngine._loaded_struct_or_union.<locals>.checkrzwrong total sizerzwrong total alignmentr±zwrong offset for field %rzwrong size for field %r) r£r
r‚r ÚpopÚsizeofZalignofr¥Zoffsetofrlri) r rGr¹r
ZBStructrµr¬rwr­r®r¯r°ZBFieldrrrršSs0
 
ÿ
ÿ
z&VGenericEngine._loaded_struct_or_unioncCs.t|tjƒr| ||d¡n| |d|¡dS©Nr )rgrÚEnumTypeÚ_generate_gen_enum_declr“rZrrrÚ_generate_gen_anonymous_declus z+VGenericEngine._generate_gen_anonymous_declcCs2t|tjƒr| |||d¡n| |d||¡dSr¼)rgrr½Ú_loading_gen_enumr–r—rrrÚ_loading_gen_anonymous{s z%VGenericEngine._loading_gen_anonymouscKs.t|tjƒr |j|||f|Žn
| |¡dSr)rgrr½Ú_loaded_gen_enumršr\rrrÚ_loaded_gen_anonymouss z$VGenericEngine._loaded_gen_anonymousNÚconstc
CsF|j}d||f}|j |¡|dk    rl|s.t‚|dks:t‚|d|ƒ|dƒ| ||¡|dƒ|dƒnÐ|r¶|dks|t‚|d|ƒ|dƒ|d|fƒ|d    |fƒ|dƒn†|dk    sÂt‚|dksÎt‚|d
krÜd }nd }d }    |dkrt|tjƒrd }    d }|| d|    |f|¡ƒ|dƒ|d||fƒ|dƒ|ƒdS)Nz _cffi_%s_%srÄúint %s(char *out_error)reú   return 0;rfzint %s(long long *out_value)z  *out_value = (long long)(%s);z  return (%s) <= 0;Úvarú&r zconst *z  %s%s(void)z  return (%s%s);)    r$r rpriÚ_check_int_constant_valuergrror_)
r Úis_intrUrGÚcategoryÚ check_valuer/ÚfuncnameZ    ampersandÚextrarrrrkŠs@     
 
  z"VGenericEngine._generate_gen_constcCs&t|tjƒo| ¡}| |||¡dSr)rgrr¦r§rk)r rGrUrÊrrrÚ_generate_gen_constant_decl¯sz*VGenericEngine._generate_gen_constant_declcCsd|}|dk    r*|st‚| ||¡|}nê|r°|j d¡d}|j d¡d}    | |    |¡}
|j |¡} |
| ƒ} t| dƒ}|dkr®| s®|j d¡d} |dd|j | ¡>7}nd|dks¼t‚d}t|t    j
ƒrÔd    |}|j |  ||¡¡d}    | |    |¡}
|
ƒ}t|t    j
ƒr|d}|S)
Nz_cffi_const_%sz
long long*rzint(*)(long long*)z    long longréz    (*)(void)r^) riÚ_load_known_int_constantr
r²rƒrŠÚintr»rgrror_)r rÊrGrUr:rÌrÍÚvaluerŒr‡r´ÚpÚnegativeZ    BLongLongZ fntypeextrarrrr|µs2        zVGenericEngine._load_constantcCsDt|tjƒo| ¡}| ||||¡}t|||ƒt|ƒj |¡dSr)    rgrr¦r§r|r…r`r3rp)r rGrUr:r<rÊrÓrrrÚ_loaded_gen_constantÑs z#VGenericEngine._loaded_gen_constantcCsœ|j}|dkr"|d|||fƒn|d|||fƒ|dƒ|d|ƒ|d|ƒ|dƒ|d|ƒ|d    ƒ|d
|dd …|fƒ|d ƒ|d ƒdS)Nrz&  if ((%s) > 0 || (long)(%s) != %dL) {z1  if ((%s) <= 0 || (unsigned long)(%s) != %dUL) {z    char buf[64];z    if ((%s) <= 0)z)        sprintf(buf, "%%ld", (long)(%s));z    elsez2        sprintf(buf, "%%lu", (unsigned long)(%s));z:    sprintf(out_error, "%s has the real value %s, not %s",z            "%s", buf, "%d");édz    return -1;z  })r$)r rUrÓr/rrrrÉÚs.ÿ
ÿ  ÿz(VGenericEngine._check_int_constant_valuecCsr|j d¡d}|j d¡d}| ||¡}|j |d¡}||ƒdkrn|j |¡}tjdkrft|dƒ}t|ƒ‚dS)Nzchar[]rz int(*)(char*)ér'zutf-8)    r
r²rƒrŠÚstringrr.r¨r)r r:rÍrŒr‡r´rÔÚerrorrrrrÑís   
 
z'VGenericEngine._load_known_int_constantcCs| dd¡}d||fS)Nú$Z___D_z _cffi_e_%s_%s)Úreplace)r r0rUrrrÚ_enum_funcnameøs zVGenericEngine._enum_funcnameÚenumcCs’|jr"|jD]}| d|¡q dS| ||¡}|j |¡|j}|d|ƒ|dƒt|j|jƒD]\}}|     ||¡qb|dƒ|dƒ|ƒdS)NTrÅrerÆrf)
r³Ú enumeratorsrkrÝr rpr$rqÚ
enumvaluesrÉ)r rGrUr0Ú
enumeratorrÍr/Ú    enumvaluerrrr¾ýs
   z&VGenericEngine._generate_gen_enum_declcsLˆjr0‡‡‡fdd„ˆjDƒ}t|ƒˆ_dˆ_nˆ ||¡}ˆ ˆ|¡dS)Ncsg|]}ˆ dˆ|ˆ¡‘qS)T)r|)rErá©r:r rGrrrHsÿz4VGenericEngine._loading_gen_enum.<locals>.<listcomp>T)r³rßrràZpartial_resolvedrÝrÑ)r rGrUr:r0ràrÍrrãrrÀsÿ
 z VGenericEngine._loading_gen_enumcCs8t|j|jƒD]$\}}t|||ƒt|ƒj |¡qdSr)rqrßràr…r`r3rp)r rGrUr:r<rárârrrrÂs zVGenericEngine._loaded_gen_enumcCs&|dkrd}n|}|jd||ddS©Nz...T)rÌ)rk)r rGrUrÌrrrÚ_generate_gen_macro_decl sz'VGenericEngine._generate_gen_macro_declcCsF|dkrd}n|}|jd||||d}t|||ƒt|ƒj |¡dSrä)r|r…r`r3rp)r rGrUr:r<rÌrÓrrrÚ_loaded_gen_macro)s ÿ z VGenericEngine._loaded_gen_macrocCs–t|tjƒrv| ¡rZ|j}d|f}|j |¡|d|ƒ|dƒ|d|fƒ|dƒt |j¡}|     d||¡nt |¡}|j    d||dddS)    Nú_cffi_sizeof_%szsize_t %s(void)rez  return sizeof(%s);rfFrÇ)rË)
rgrr©Úlength_is_unknownr$r rpr~Úitemrk)r rGrUr/rÍÚtp_ptrrrrÚ_generate_gen_variable_decl6s 
 
z*VGenericEngine._generate_gen_variable_declcs\t|tjƒrè| ¡rˆd|f}|j d¡d}| ||¡}|ƒ}|j |j¡}    t    ||j 
|    ¡ƒ\}
} | dkr~t d||jfƒ‚|  |
¡}t  |j¡} | d| ||¡} |jdk    rÈ|j |¡}|j || ¡} t||| ƒt|ƒj |¡dSd|}|j | d|¡¡d}| ||¡}|ƒ‰‡fdd    „}‡fd
d „}tt|ƒ|t||ƒƒt|ƒj |¡dS) Nrçzsize_t(*)(void)rz/bad size: %r does not seem to be an array of %sFz _cffi_var_%sz
*(*)(void)csˆdSr‰rr;©ÚptrrrÚgettergsz3VGenericEngine._loaded_gen_variable.<locals>.gettercs |ˆd<dSr‰r)r<rÓrìrrÚsetterisz3VGenericEngine._loaded_gen_variable.<locals>.setter)rgrr©rèr
r²rƒr‚réÚdivmodr»rZresolve_lengthr~r|rªÚcastr…r`r3rpr_Úproperty)r rGrUr:r<rÍr‡r´ÚsizeZ    BItemTyperªÚrestrêrÓZBArrayrîrïrrìrÚ_loaded_gen_variableHs> 
 ÿÿ
 
     z#VGenericEngine._loaded_gen_variable)r )r)NrÄN)N)rÞ)rÞ)5r6r7r8Z
_class_keyZ_gen_python_modulerrrrr$r2r?rMr,r@r[r]Z_generate_gen_typedef_declZ_loading_gen_typedefZ_loaded_gen_typedefryZ_loading_gen_functionrˆr„r”r˜r›ržrŸr r“r–ršr¿rÁrÃrkrÏZ_loading_gen_constantr|rÖrÉrÑrÝr¾rÀrÂråZ_loading_gen_macrorærëZ_loading_gen_variablerõrrrrr sh
 
 
 
-$1"    ÿ
%
     
 
 
 rad
#include <stdio.h>
#include <stddef.h>
#include <stdarg.h>
#include <errno.h>
#include <sys/types.h>   /* XXX for ssize_t on some platforms */
 
/* this block of #ifs should be kept exactly identical between
   c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
   and cffi/_cffi_include.h */
#if defined(_MSC_VER)
# include <malloc.h>   /* for alloca() */
# if _MSC_VER < 1600   /* MSVC < 2010 */
   typedef __int8 int8_t;
   typedef __int16 int16_t;
   typedef __int32 int32_t;
   typedef __int64 int64_t;
   typedef unsigned __int8 uint8_t;
   typedef unsigned __int16 uint16_t;
   typedef unsigned __int32 uint32_t;
   typedef unsigned __int64 uint64_t;
   typedef __int8 int_least8_t;
   typedef __int16 int_least16_t;
   typedef __int32 int_least32_t;
   typedef __int64 int_least64_t;
   typedef unsigned __int8 uint_least8_t;
   typedef unsigned __int16 uint_least16_t;
   typedef unsigned __int32 uint_least32_t;
   typedef unsigned __int64 uint_least64_t;
   typedef __int8 int_fast8_t;
   typedef __int16 int_fast16_t;
   typedef __int32 int_fast32_t;
   typedef __int64 int_fast64_t;
   typedef unsigned __int8 uint_fast8_t;
   typedef unsigned __int16 uint_fast16_t;
   typedef unsigned __int32 uint_fast32_t;
   typedef unsigned __int64 uint_fast64_t;
   typedef __int64 intmax_t;
   typedef unsigned __int64 uintmax_t;
# else
#  include <stdint.h>
# endif
# if _MSC_VER < 1800   /* MSVC < 2013 */
#  ifndef __cplusplus
    typedef unsigned char _Bool;
#  endif
# endif
#else
# include <stdint.h>
# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
#  include <alloca.h>
# endif
#endif
)
rrrAr rrÚrÚobjectrr*rrrrÚ<module>s  g