Qore Programming Language 1.19.1
Loading...
Searching...
No Matches
BuiltinFunction.h
1/* -*- mode: c++; indent-tabs-mode: nil -*- */
2/*
3 BuiltinFunction.h
4
5 Qore Programming Language
6
7 Copyright (C) 2003 - 2023 Qore Technologies, s.r.o.
8
9 Permission is hereby granted, free of charge, to any person obtaining a
10 copy of this software and associated documentation files (the "Software"),
11 to deal in the Software without restriction, including without limitation
12 the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 and/or sell copies of the Software, and to permit persons to whom the
14 Software is furnished to do so, subject to the following conditions:
15
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26
27 Note that the Qore library is released under a choice of three open-source
28 licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
29 information.
30*/
31
32#ifndef _QORE_BUILTINFUNCTION_H
33
34#define _QORE_BUILTINFUNCTION_H
35
36#include <vector>
37#include <string>
38
39class BCList;
40class BCEAList;
41
42class BuiltinSignature : public AbstractFunctionSignature {
43public:
44 DLLLOCAL BuiltinSignature(bool extra_args, const QoreTypeInfo* n_returnTypeInfo, const type_vec_t& n_typeList,
45 const arg_vec_t& n_defaultArgList, const name_vec_t& n_names)
46 : AbstractFunctionSignature(n_returnTypeInfo, n_typeList, n_defaultArgList, n_names, extra_args) {
47 for (unsigned i = 0; i < typeList.size(); ++i) {
48 bool hasDefaultArg = i < defaultArgList.size() && defaultArgList[i];
49 if (QoreTypeInfo::hasType(typeList[i])) {
50 ++num_param_types;
51 if (!hasDefaultArg) {
52 ++min_param_types;
53 }
54 }
55
56 str.append(QoreTypeInfo::getPath(typeList[i]));
57 if (names.size() > i && !names[i].empty()) {
58 str.append(" ");
59 str.append(names[i]);
60 }
61
62 if (hasDefaultArg) {
63 addDefaultArgument(str, defaultArgList[i]);
64 }
65
66 // add a comma to the signature string if it's not the last parameter
67 if (i != (typeList.size() - 1)) {
68 str.append(", ");
69 }
70 }
71 if (extra_args) {
72 if (!typeList.empty()) {
73 str.append(", ");
74 }
75 str.append("...");
76 }
77 }
78
79 DLLLOCAL virtual ~BuiltinSignature() {
80 }
81
82 DLLLOCAL virtual const QoreTypeInfo* parseGetReturnTypeInfo(int& err) const {
83 return returnTypeInfo;
84 }
85
86 DLLLOCAL virtual const QoreParseTypeInfo* getParseParamTypeInfo(unsigned num) const {
87 return nullptr;
88 }
89};
90
91// the following defines the virtual functions that are common to all builtin variants
92#define COMMON_BUILTIN_VARIANT_FUNCTIONS DLLLOCAL virtual int64 getFunctionality() const { return functionality; } \
93 DLLLOCAL virtual AbstractFunctionSignature* getSignature() const { return const_cast<BuiltinSignature*>(&signature); } \
94 DLLLOCAL virtual const QoreTypeInfo* parseGetReturnTypeInfo(int& err) const { return signature.getReturnTypeInfo(); }
95
96class BuiltinFunctionVariantBase {
97public:
98 BuiltinSignature signature;
99 // functionality bitmap for parse restrictions
100 int64 functionality;
101
102 DLLLOCAL BuiltinFunctionVariantBase(int64 flags = 0, int64 functionality = QDOM_DEFAULT,
103 const QoreTypeInfo* returnTypeInfo = nullptr, const type_vec_t& typeList = type_vec_t(),
104 const arg_vec_t& defaultArgList = arg_vec_t(), const name_vec_t& names = name_vec_t()) :
105 signature(flags & QCF_USES_EXTRA_ARGS, returnTypeInfo, typeList, defaultArgList, names),
106 functionality(functionality) {
107 //printd(5, "BuiltinFunctionVariantBase::BuiltinFunctionVariantBase() this=%p flags=%lld (%lld) functionality=%lld\n", this, flags, n_flags, functionality);
108 }
109};
110
111class BuiltinFunctionValueVariant : public AbstractQoreFunctionVariant, public BuiltinFunctionVariantBase {
112protected:
113 q_func_n_t func;
114
115public:
116 DLLLOCAL BuiltinFunctionValueVariant(q_func_n_t m, int64 n_flags, int64 n_functionality,
117 const QoreTypeInfo* n_returnTypeInfo = 0, const type_vec_t& n_typeList = type_vec_t(),
118 const arg_vec_t& n_defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t()) :
119 AbstractQoreFunctionVariant(n_flags), BuiltinFunctionVariantBase(n_flags, n_functionality,
120 n_returnTypeInfo, n_typeList, n_defaultArgList, n_names), func(m) {
121 }
122
123 // the following defines the pure virtual functions that are common to all builtin variants
124 COMMON_BUILTIN_VARIANT_FUNCTIONS
125
126 DLLLOCAL virtual QoreValue evalFunction(const char* name, CodeEvaluationHelper& ceh, ExceptionSink* xsink) const {
127 CodeContextHelper cch(xsink, CT_BUILTIN, name);
128
129 return func(ceh.getArgs(), ceh.getRuntimeFlags(), xsink);
130 }
131};
132
134
136class BuiltinFunctionExternalVariant : public AbstractQoreFunctionVariant, public BuiltinFunctionVariantBase {
137protected:
139 void* ptr;
140
141public:
142 DLLLOCAL BuiltinFunctionExternalVariant(void* ptr, q_external_func_t m, int64 n_flags, int64 n_functionality,
143 const QoreTypeInfo* n_returnTypeInfo = nullptr, const type_vec_t& n_typeList = type_vec_t(),
144 const arg_vec_t& n_defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t()) :
145 AbstractQoreFunctionVariant(n_flags), BuiltinFunctionVariantBase(n_flags, n_functionality, n_returnTypeInfo,
146 n_typeList, n_defaultArgList, n_names), func(m), ptr(ptr) {
147 }
148
149 // the following defines the pure virtual functions that are common to all builtin variants
150 COMMON_BUILTIN_VARIANT_FUNCTIONS
151
152 DLLLOCAL virtual QoreValue evalFunction(const char* name, CodeEvaluationHelper& ceh, ExceptionSink* xsink) const {
153 CodeContextHelper cch(xsink, CT_BUILTIN, name);
154
155 return func(ptr, ceh.getArgs(), ceh.getRuntimeFlags(), xsink);
156 }
157};
158
159#endif // _QORE_BUILTIN_FUNCTION
#define QDOM_DEFAULT
the default domain (no domain)
Definition: Restrictions.h:170
External function variable.
Definition: BuiltinFunction.h:136
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:50
QoreValue(* q_func_n_t)(const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin function signatures
Definition: common.h:307
std::vector< const QoreTypeInfo * > type_vec_t
vector of type information for parameter lists
Definition: common.h:251
std::vector< std::string > name_vec_t
vector of parameter names for parameter lists
Definition: common.h:257
long long int64
64bit integer type, cannot use int64_t here since it breaks the API on some 64-bit systems due to equ...
Definition: common.h:260
QoreValue(* q_external_func_t)(const void *ptr, const QoreListNode *args, q_rt_flags_t flags, ExceptionSink *xsink)
the type used for builtin function signatures for external functions
Definition: common.h:319
std::vector< QoreValue > arg_vec_t
vector of value information for default argument lists
Definition: common.h:254
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:276