rbind 0.0.34 → 0.0.35
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbind/default_parser.rb +2 -1
- data/lib/rbind/tools/hdr_parser.py +94 -27
- data/rbind.gemspec +2 -2
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0892dada4084e4b38bcb49d3dca8106a038e5a2c82a4a87d420532327ac942e7'
|
4
|
+
data.tar.gz: 482377fb03e5b125550de5596365a01be1762e5bcc5596dec3b37dec5f27a0aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19adf245b190083bac225917b50ac8169deef19137364196a3623f7e3d547fb5a9c773ff59193589a204ff2666184c1805e4d359abd76a05aa504bf0165667a7
|
7
|
+
data.tar.gz: a0e111070064d5a1baca4bfb7799dc98dd6ed034d3a207a04e5005db254beb7016f50038b3dae51748fe9834fcb1edbb2344969a8a88242502fbd951c684dabf
|
data/lib/rbind/default_parser.rb
CHANGED
@@ -367,7 +367,8 @@ module Rbind
|
|
367
367
|
@extern_package_name = extern_package_name
|
368
368
|
|
369
369
|
a = split(string)
|
370
|
-
#remove number at the end of the file
|
370
|
+
#remove namespances and number at the end of the file
|
371
|
+
a.pop if (a.last =~/namespaces:/) == 0
|
371
372
|
a.pop if a.last.to_i != 0
|
372
373
|
|
373
374
|
line_number = 1
|
@@ -52,13 +52,13 @@ class CppHeaderParser(object):
|
|
52
52
|
def get_macro_arg(self, arg_str, npos):
|
53
53
|
npos2 = npos3 = arg_str.find("(", npos)
|
54
54
|
if npos2 < 0:
|
55
|
-
print("Error: no arguments for the macro at %d" % (self.lineno
|
55
|
+
print("Error: no arguments for the macro at %s:%d" % (self.hname, self.lineno))
|
56
56
|
sys.exit(-1)
|
57
57
|
balance = 1
|
58
58
|
while 1:
|
59
59
|
t, npos3 = self.find_next_token(arg_str, ['(', ')'], npos3+1)
|
60
60
|
if npos3 < 0:
|
61
|
-
print("Error: no matching ')' in the macro call at %d" % (self.lineno
|
61
|
+
print("Error: no matching ')' in the macro call at %s:%d" % (self.hname, self.lineno))
|
62
62
|
sys.exit(-1)
|
63
63
|
if t == '(':
|
64
64
|
balance += 1
|
@@ -110,6 +110,11 @@ class CppHeaderParser(object):
|
|
110
110
|
if npos >= 0:
|
111
111
|
modlist.append("/C")
|
112
112
|
|
113
|
+
npos = arg_str.find("&&")
|
114
|
+
if npos >= 0:
|
115
|
+
arg_str = arg_str.replace("&&", '')
|
116
|
+
modlist.append("/RRef")
|
117
|
+
|
113
118
|
npos = arg_str.find("&")
|
114
119
|
if npos >= 0:
|
115
120
|
modlist.append("/Ref")
|
@@ -160,7 +165,7 @@ class CppHeaderParser(object):
|
|
160
165
|
angle_stack.append(0)
|
161
166
|
elif w == "," or w == '>':
|
162
167
|
if not angle_stack:
|
163
|
-
print("Error at %d: argument contains ',' or '>' not within template arguments" % (self.lineno
|
168
|
+
print("Error at %s:%d: argument contains ',' or '>' not within template arguments" % (self.hname, self.lineno))
|
164
169
|
sys.exit(-1)
|
165
170
|
if w == ",":
|
166
171
|
arg_type += "_and_"
|
@@ -190,7 +195,7 @@ class CppHeaderParser(object):
|
|
190
195
|
p1 = arg_name.find("[")
|
191
196
|
p2 = arg_name.find("]",p1+1)
|
192
197
|
if p2 < 0:
|
193
|
-
print("Error at %d: no closing ]" % (self.lineno
|
198
|
+
print("Error at %s:%d: no closing ]" % (self.hname, self.lineno))
|
194
199
|
sys.exit(-1)
|
195
200
|
counter_str = arg_name[p1+1:p2].strip()
|
196
201
|
if counter_str == "":
|
@@ -254,6 +259,8 @@ class CppHeaderParser(object):
|
|
254
259
|
l = l.replace("CV_EXPORTS_W_SIMPLE", "")
|
255
260
|
modlist.append("/Simple")
|
256
261
|
npos = l.find("CV_EXPORTS_AS")
|
262
|
+
if npos < 0:
|
263
|
+
npos = l.find('CV_WRAP_AS')
|
257
264
|
if npos >= 0:
|
258
265
|
macro_arg, npos3 = self.get_macro_arg(l, npos)
|
259
266
|
modlist.append("=" + macro_arg)
|
@@ -429,10 +436,18 @@ class CppHeaderParser(object):
|
|
429
436
|
# filter off some common prefixes, which are meaningless for Python wrappers.
|
430
437
|
# note that we do not strip "static" prefix, which does matter;
|
431
438
|
# it means class methods, not instance methods
|
432
|
-
decl_str = self.batch_replace(decl_str, [("static inline", ""),
|
433
|
-
|
434
|
-
|
435
|
-
|
439
|
+
decl_str = self.batch_replace(decl_str, [("static inline", ""),
|
440
|
+
("inline", ""),
|
441
|
+
("explicit ", ""),
|
442
|
+
("CV_EXPORTS_W", ""),
|
443
|
+
("CV_EXPORTS", ""),
|
444
|
+
("CV_CDECL", ""),
|
445
|
+
("CV_WRAP ", " "),
|
446
|
+
("CV_INLINE", ""),
|
447
|
+
("CV_DEPRECATED", ""),
|
448
|
+
("CV_DEPRECATED_EXTERNAL", ""),
|
449
|
+
("CV_NODISCARD_STD", ""),
|
450
|
+
("CV_NODISCARD", "")]).strip()
|
436
451
|
|
437
452
|
if decl_str.strip().startswith('virtual'):
|
438
453
|
virtual_method = True
|
@@ -570,8 +585,8 @@ class CppHeaderParser(object):
|
|
570
585
|
arg_type, arg_name, modlist, argno = self.parse_arg(a, argno)
|
571
586
|
if self.wrap_mode:
|
572
587
|
# TODO: Vectors should contain UMat, but this is not very easy to support and not very needed
|
573
|
-
vector_mat = "vector_{}".format(
|
574
|
-
vector_mat_template = "vector<{}>".format(
|
588
|
+
vector_mat = "vector_{}".format(mat)
|
589
|
+
vector_mat_template = "vector<{}>".format(mat)
|
575
590
|
|
576
591
|
if arg_type == "InputArray":
|
577
592
|
arg_type = mat
|
@@ -656,6 +671,10 @@ class CppHeaderParser(object):
|
|
656
671
|
stack_top = self.block_stack[-1]
|
657
672
|
context = stack_top[self.BLOCK_TYPE]
|
658
673
|
|
674
|
+
if stmt.startswith('inline namespace'):
|
675
|
+
# emulate anonymous namespace
|
676
|
+
return "namespace", "", True, None
|
677
|
+
|
659
678
|
stmt_type = ""
|
660
679
|
if end_token == "{":
|
661
680
|
stmt_type = "block"
|
@@ -713,6 +732,8 @@ class CppHeaderParser(object):
|
|
713
732
|
return stmt_type, classname, True, decl
|
714
733
|
|
715
734
|
if stmt.startswith("enum") or stmt.startswith("namespace"):
|
735
|
+
# NB: Drop inheritance syntax for enum
|
736
|
+
stmt = stmt.split(':')[0]
|
716
737
|
stmt_list = stmt.rsplit(" ", 1)
|
717
738
|
if len(stmt_list) < 2:
|
718
739
|
stmt_list.append("<unnamed>")
|
@@ -792,6 +813,7 @@ class CppHeaderParser(object):
|
|
792
813
|
COMMENT = 1 # inside a multi-line comment
|
793
814
|
DIRECTIVE = 2 # inside a multi-line preprocessor directive
|
794
815
|
DOCSTRING = 3 # inside a multi-line docstring
|
816
|
+
DIRECTIVE_IF_0 = 4 # inside a '#if 0' directive
|
795
817
|
|
796
818
|
state = SCAN
|
797
819
|
|
@@ -801,19 +823,56 @@ class CppHeaderParser(object):
|
|
801
823
|
self.lineno = 0
|
802
824
|
self.wrap_mode = wmode
|
803
825
|
|
826
|
+
depth_if_0 = 0
|
827
|
+
|
804
828
|
for l0 in linelist:
|
805
829
|
self.lineno += 1
|
806
830
|
#print(state, self.lineno, l0)
|
807
831
|
|
808
832
|
l = l0.strip()
|
809
833
|
|
834
|
+
# G-API specific aliases
|
835
|
+
l = self.batch_replace(l, [
|
836
|
+
("GAPI_EXPORTS", "CV_EXPORTS"),
|
837
|
+
("GAPI_EXPORTS_W", "CV_EXPORTS_W"),
|
838
|
+
("GAPI_EXPORTS_W_SIMPLE","CV_EXPORTS_W_SIMPLE"),
|
839
|
+
("GAPI_WRAP", "CV_WRAP"),
|
840
|
+
("GAPI_PROP", "CV_PROP"),
|
841
|
+
("GAPI_PROP_RW", "CV_PROP_RW"),
|
842
|
+
('defined(GAPI_STANDALONE)', '0'),
|
843
|
+
])
|
844
|
+
|
810
845
|
if state == SCAN and l.startswith("#"):
|
811
846
|
state = DIRECTIVE
|
812
847
|
# fall through to the if state == DIRECTIVE check
|
813
848
|
|
814
849
|
if state == DIRECTIVE:
|
815
|
-
if
|
816
|
-
|
850
|
+
if l.endswith("\\"):
|
851
|
+
continue
|
852
|
+
state = SCAN
|
853
|
+
l = re.sub(r'//(.+)?', '', l).strip() # drop // comment
|
854
|
+
if l in [
|
855
|
+
'#if 0',
|
856
|
+
'#if defined(__OPENCV_BUILD)', '#ifdef __OPENCV_BUILD',
|
857
|
+
'#if !defined(OPENCV_BINDING_PARSER)', '#ifndef OPENCV_BINDING_PARSER',
|
858
|
+
]:
|
859
|
+
state = DIRECTIVE_IF_0
|
860
|
+
depth_if_0 = 1
|
861
|
+
continue
|
862
|
+
|
863
|
+
if state == DIRECTIVE_IF_0:
|
864
|
+
if l.startswith('#'):
|
865
|
+
l = l[1:].strip()
|
866
|
+
if l.startswith("if"):
|
867
|
+
depth_if_0 += 1
|
868
|
+
continue
|
869
|
+
if l.startswith("endif"):
|
870
|
+
depth_if_0 -= 1
|
871
|
+
if depth_if_0 == 0:
|
872
|
+
state = SCAN
|
873
|
+
else:
|
874
|
+
# print('---- {:30s}:{:5d}: {}'.format(hname[-30:], self.lineno, l))
|
875
|
+
pass
|
817
876
|
continue
|
818
877
|
|
819
878
|
if state == COMMENT:
|
@@ -826,7 +885,7 @@ class CppHeaderParser(object):
|
|
826
885
|
if state == DOCSTRING:
|
827
886
|
pos = l.find("*/")
|
828
887
|
if pos < 0:
|
829
|
-
docstring +=
|
888
|
+
docstring += l0
|
830
889
|
continue
|
831
890
|
docstring += l[:pos] + "\n"
|
832
891
|
l = l[pos+2:]
|
@@ -842,7 +901,12 @@ class CppHeaderParser(object):
|
|
842
901
|
sys.exit(-1)
|
843
902
|
|
844
903
|
while 1:
|
845
|
-
|
904
|
+
# NB: Avoid parsing '{' for case:
|
905
|
+
# foo(Obj&& = {});
|
906
|
+
if re.search(r'=\s*\{\s*\}', l):
|
907
|
+
token, pos = ';', len(l)
|
908
|
+
else:
|
909
|
+
token, pos = self.find_next_token(l, [";", "\"", "{", "}", "//", "/*"])
|
846
910
|
|
847
911
|
if not token:
|
848
912
|
block_head += " " + l
|
@@ -912,14 +976,17 @@ class CppHeaderParser(object):
|
|
912
976
|
else:
|
913
977
|
decls.append(decl)
|
914
978
|
|
915
|
-
if self._generate_gpumat_decls and "cv.cuda
|
979
|
+
if self._generate_gpumat_decls and ("cv.cuda" in decl[0] or decl[0] in [
|
980
|
+
"cv.imshow", # https://github.com/opencv/opencv/issues/18553
|
981
|
+
]):
|
916
982
|
# If function takes as one of arguments Mat or vector<Mat> - we want to create the
|
917
|
-
# same declaration working with GpuMat
|
983
|
+
# same declaration working with GpuMat
|
918
984
|
args = decl[3]
|
919
985
|
has_mat = len(list(filter(lambda x: x[0] in {"Mat", "vector_Mat"}, args))) > 0
|
920
986
|
if has_mat:
|
921
987
|
_, _, _, gpumat_decl = self.parse_stmt(stmt, token, mat="cuda::GpuMat", docstring=docstring)
|
922
|
-
|
988
|
+
if gpumat_decl != decl:
|
989
|
+
decls.append(gpumat_decl)
|
923
990
|
|
924
991
|
if self._generate_umat_decls:
|
925
992
|
# If function takes as one of arguments Mat or vector<Mat> - we want to create the
|
@@ -928,12 +995,13 @@ class CppHeaderParser(object):
|
|
928
995
|
has_mat = len(list(filter(lambda x: x[0] in {"Mat", "vector_Mat"}, args))) > 0
|
929
996
|
if has_mat:
|
930
997
|
_, _, _, umat_decl = self.parse_stmt(stmt, token, mat="UMat", docstring=docstring)
|
931
|
-
|
998
|
+
if umat_decl != decl:
|
999
|
+
decls.append(umat_decl)
|
932
1000
|
|
933
1001
|
docstring = ""
|
934
1002
|
if stmt_type == "namespace":
|
935
1003
|
chunks = [block[1] for block in self.block_stack if block[0] == 'namespace'] + [name]
|
936
|
-
self.namespaces.add('.'.join(chunks))
|
1004
|
+
self.namespaces.add('.'.join(filter(lambda c: len(c)> 0, chunks)))
|
937
1005
|
else:
|
938
1006
|
stmt_type, name, parse_flag = "block", "", False
|
939
1007
|
|
@@ -972,13 +1040,12 @@ class CppHeaderParser(object):
|
|
972
1040
|
print()
|
973
1041
|
|
974
1042
|
if __name__ == '__main__':
|
975
|
-
parser = CppHeaderParser(generate_umat_decls=
|
1043
|
+
parser = CppHeaderParser(generate_umat_decls=False, generate_gpumat_decls=False)
|
976
1044
|
decls = []
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
decls += parser.parse(hname)
|
982
|
-
else:
|
983
|
-
decls += parser.parse(sys.argv[1])
|
1045
|
+
# for hname in opencv_hdr_list:
|
1046
|
+
# decls += parser.parse(hname)
|
1047
|
+
for hname in sys.argv[1:]:
|
1048
|
+
decls += parser.parse(hname, wmode=True)
|
984
1049
|
parser.print_decls(decls)
|
1050
|
+
print(len(decls))
|
1051
|
+
print("namespaces:", " ".join(sorted(parser.namespaces)))
|
data/rbind.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.35
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Duda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -128,8 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
128
|
- !ruby/object:Gem::Version
|
129
129
|
version: 1.3.6
|
130
130
|
requirements: []
|
131
|
-
|
132
|
-
rubygems_version: 2.7.6
|
131
|
+
rubygems_version: 3.3.5
|
133
132
|
signing_key:
|
134
133
|
specification_version: 4
|
135
134
|
summary: Library for genereating automated ffi-bindings for c/c++ libraries
|