mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
adds support for functor in member (#22433)
* adds support for functor in member * improves functor test
This commit is contained in:
@@ -1149,14 +1149,19 @@ proc isReloadable(m: BModule; prc: PSym): bool =
|
||||
proc isNonReloadable(m: BModule; prc: PSym): bool =
|
||||
return m.hcrOn and sfNonReloadable in prc.flags
|
||||
|
||||
proc parseVFunctionDecl(val: string; name, params, retType, superCall: var string; isFnConst, isOverride, isMemberVirtual: var bool; isCtor: bool) =
|
||||
proc parseVFunctionDecl(val: string; name, params, retType, superCall: var string; isFnConst, isOverride, isMemberVirtual: var bool; isCtor: bool, isFunctor=false) =
|
||||
var afterParams: string = ""
|
||||
if scanf(val, "$*($*)$s$*", name, params, afterParams):
|
||||
if name.strip() == "operator" and params == "": #isFunctor?
|
||||
parseVFunctionDecl(afterParams, name, params, retType, superCall, isFnConst, isOverride, isMemberVirtual, isCtor, true)
|
||||
return
|
||||
isFnConst = afterParams.find("const") > -1
|
||||
isOverride = afterParams.find("override") > -1
|
||||
isMemberVirtual = name.find("virtual ") > -1
|
||||
if isMemberVirtual:
|
||||
name = name.replace("virtual ", "")
|
||||
if isFunctor:
|
||||
name = "operator ()"
|
||||
if isCtor:
|
||||
discard scanf(afterParams, ":$s$*", superCall)
|
||||
else:
|
||||
|
||||
@@ -7,6 +7,7 @@ false
|
||||
hello foo
|
||||
hello boo
|
||||
hello boo
|
||||
FunctorSupport!
|
||||
destructing
|
||||
destructing
|
||||
'''
|
||||
@@ -51,3 +52,13 @@ let booAsFoo = cast[FooPtr](newCpp[Boo]())
|
||||
foo.salute()
|
||||
boo.salute()
|
||||
booAsFoo.salute()
|
||||
|
||||
type
|
||||
NimFunctor = object
|
||||
discard
|
||||
proc invoke(f: NimFunctor, n:int) {.member:"operator ()('2 #2)" .} =
|
||||
echo "FunctorSupport!"
|
||||
|
||||
{.experimental: "callOperator".}
|
||||
proc `()`(f: NimFunctor, n:int) {.importcpp:"#(@)" .}
|
||||
NimFunctor()(1)
|
||||
|
||||
Reference in New Issue
Block a user