FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
pythonnet/src/runtime/indexer.cs at master · attackgithub/pythonnet · GitHub
attackgithub
pythonnet
Repository navigation
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
pythonnet
/
src
/
runtime
/
indexer.cs
Copy path
More file actions
More file actions
Latest commit
History
History
History
118 lines (103 loc) · 3.47 KB
Breadcrumbs
pythonnet
/
src
/
runtime
/
indexer.cs
Copy path
File metadata and controls
118 lines (103 loc) · 3.47 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
using
System
;
using
System
.
Reflection
;
namespace
Python
.
Runtime
{
/// <summary>
/// Bundles the information required to support an indexer property.
/// </summary>
internal
class
Indexer
{
public
MethodBinder
GetterBinder
;
public
MethodBinder
SetterBinder
;
public
Indexer
(
)
{
GetterBinder
=
new
MethodBinder
(
)
;
SetterBinder
=
new
MethodBinder
(
)
;
}
public
bool
CanGet
{
get
{
return
GetterBinder
.
Count
>
0
;
}
}
public
bool
CanSet
{
get
{
return
SetterBinder
.
Count
>
0
;
}
}
public
void
AddProperty
(
PropertyInfo
pi
)
{
MethodInfo
getter
=
pi
.
GetGetMethod
(
true
)
;
MethodInfo
setter
=
pi
.
GetSetMethod
(
true
)
;
if
(
getter
!=
null
)
{
GetterBinder
.
AddMethod
(
getter
)
;
}
if
(
setter
!=
null
)
{
SetterBinder
.
AddMethod
(
setter
)
;
}
}
internal
IntPtr
GetItem
(
IntPtr
inst
,
IntPtr
args
)
{
return
GetterBinder
.
Invoke
(
inst
,
args
,
IntPtr
.
Zero
)
;
}
internal
void
SetItem
(
IntPtr
inst
,
IntPtr
args
)
{
SetterBinder
.
Invoke
(
inst
,
args
,
IntPtr
.
Zero
)
;
}
internal
bool
NeedsDefaultArgs
(
IntPtr
args
)
{
var
pynargs
=
Runtime
.
PyTuple_Size
(
args
)
;
MethodBase
[
]
methods
=
SetterBinder
.
GetMethods
(
)
;
if
(
methods
.
Length
==
0
)
{
return
false
;
}
MethodBase
mi
=
methods
[
0
]
;
ParameterInfo
[
]
pi
=
mi
.
GetParameters
(
)
;
// need to subtract one for the value
int
clrnargs
=
pi
.
Length
-
1
;
if
(
pynargs
==
clrnargs
||
pynargs
>
clrnargs
)
{
return
false
;
}
for
(
var
v
=
pynargs
;
v
<
clrnargs
;
v
++
)
{
if
(
pi
[
v
]
.
DefaultValue
==
DBNull
.
Value
)
{
return
false
;
}
}
return
true
;
}
/// <summary>
/// This will return default arguments a new instance of a tuple. The size
/// of the tuple will indicate the number of default arguments.
/// </summary>
/// <param name="args">This is pointing to the tuple args passed in</param>
/// <returns>a new instance of the tuple containing the default args</returns>
internal
IntPtr
GetDefaultArgs
(
IntPtr
args
)
{
// if we don't need default args return empty tuple
if
(
!
NeedsDefaultArgs
(
args
)
)
{
return
Runtime
.
PyTuple_New
(
0
)
;
}
var
pynargs
=
Runtime
.
PyTuple_Size
(
args
)
;
// Get the default arg tuple
MethodBase
[
]
methods
=
SetterBinder
.
GetMethods
(
)
;
MethodBase
mi
=
methods
[
0
]
;
ParameterInfo
[
]
pi
=
mi
.
GetParameters
(
)
;
int
clrnargs
=
pi
.
Length
-
1
;
IntPtr
defaultArgs
=
Runtime
.
PyTuple_New
(
clrnargs
-
pynargs
)
;
for
(
var
i
=
0
;
i
<
clrnargs
-
pynargs
;
i
++
)
{
if
(
pi
[
i
+
pynargs
]
.
DefaultValue
==
DBNull
.
Value
)
{
continue
;
}
IntPtr
arg
=
Converter
.
ToPython
(
pi
[
i
+
pynargs
]
.
DefaultValue
,
pi
[
i
+
pynargs
]
.
ParameterType
)
;
Runtime
.
PyTuple_SetItem
(
defaultArgs
,
i
,
arg
)
;
}
return
defaultArgs
;
}
}
}
Back
|
FazBrowse Home
|
New Git URL