Qore Programming Language  1.12.0
BuiltinFunction.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  BuiltinFunction.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2003 - 2022 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 
39 class BCList;
40 class BCEAList;
41 
42 class BuiltinSignature : public AbstractFunctionSignature {
43 public:
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) {
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  str.append(QoreTypeInfo::getPath(typeList[i]));
56  if (names.size() > i && !names[i].empty()) {
57  str.append(" ");
58  str.append(names[i]);
59  }
60 
61  if (hasDefaultArg) {
62  addDefaultArgument(str, defaultArgList[i]);
63  }
64 
65  // add a comma to the signature string if it's not the last parameter
66  if (i != (typeList.size() - 1))
67  str.append(", ");
68  }
69  if (extra_args) {
70  if (!typeList.empty())
71  str.append(", ");
72  str.append("...");
73  }
74  }
75 
76  DLLLOCAL virtual ~BuiltinSignature() {
77  }
78 
79  DLLLOCAL virtual const QoreTypeInfo* parseGetReturnTypeInfo(int& err) const {
80  return returnTypeInfo;
81  }
82 
83  DLLLOCAL virtual const QoreParseTypeInfo* getParseParamTypeInfo(unsigned num) const {
84  return nullptr;
85  }
86 };
87 
88 // the following defines the virtual functions that are common to all builtin variants
89 #define COMMON_BUILTIN_VARIANT_FUNCTIONS DLLLOCAL virtual int64 getFunctionality() const { return functionality; } \
90  DLLLOCAL virtual AbstractFunctionSignature* getSignature() const { return const_cast<BuiltinSignature*>(&signature); } \
91  DLLLOCAL virtual const QoreTypeInfo* parseGetReturnTypeInfo(int& err) const { return signature.getReturnTypeInfo(); }
92 
93 class BuiltinFunctionVariantBase {
94 public:
95  BuiltinSignature signature;
96  // functionality bitmap for parse restrictions
97  int64 functionality;
98 
99  DLLLOCAL BuiltinFunctionVariantBase(int64 n_functionality = QDOM_DEFAULT,
100  const QoreTypeInfo* n_returnTypeInfo = nullptr, const type_vec_t& n_typeList = type_vec_t(),
101  const arg_vec_t& n_defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t()) :
102  signature(n_functionality & QCF_USES_EXTRA_ARGS, n_returnTypeInfo, n_typeList, n_defaultArgList, n_names),
103  functionality(n_functionality) {
104  //printd(5, "BuiltinFunctionVariantBase::BuiltinFunctionVariantBase() this=%p flags=%lld (%lld) functionality=%lld\n", this, flags, n_flags, functionality);
105  }
106 };
107 
108 class BuiltinFunctionValueVariant : public AbstractQoreFunctionVariant, public BuiltinFunctionVariantBase {
109 protected:
110  q_func_n_t func;
111 
112 public:
113  DLLLOCAL BuiltinFunctionValueVariant(q_func_n_t m, int64 n_flags, int64 n_functionality,
114  const QoreTypeInfo* n_returnTypeInfo = 0, const type_vec_t& n_typeList = type_vec_t(),
115  const arg_vec_t& n_defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t()) :
116  AbstractQoreFunctionVariant(n_flags), BuiltinFunctionVariantBase(n_functionality, n_returnTypeInfo,
117  n_typeList, n_defaultArgList, n_names), func(m) {
118  }
119 
120  // the following defines the pure virtual functions that are common to all builtin variants
121  COMMON_BUILTIN_VARIANT_FUNCTIONS
122 
123  DLLLOCAL virtual QoreValue evalFunction(const char* name, CodeEvaluationHelper& ceh, ExceptionSink* xsink) const {
124  CodeContextHelper cch(xsink, CT_BUILTIN, name);
125 
126  return func(ceh.getArgs(), ceh.getRuntimeFlags(), xsink);
127  }
128 };
129 
131 
133 class BuiltinFunctionExternalVariant : public AbstractQoreFunctionVariant, public BuiltinFunctionVariantBase {
134 protected:
135  q_external_func_t func;
136  void* ptr;
137 
138 public:
139  DLLLOCAL BuiltinFunctionExternalVariant(void* ptr, q_external_func_t m, int64 n_flags, int64 n_functionality,
140  const QoreTypeInfo* n_returnTypeInfo = nullptr, const type_vec_t& n_typeList = type_vec_t(),
141  const arg_vec_t& n_defaultArgList = arg_vec_t(), const name_vec_t& n_names = name_vec_t()) :
142  AbstractQoreFunctionVariant(n_flags), BuiltinFunctionVariantBase(n_functionality, n_returnTypeInfo,
143  n_typeList, n_defaultArgList, n_names), func(m), ptr(ptr) {
144  }
145 
146  // the following defines the pure virtual functions that are common to all builtin variants
147  COMMON_BUILTIN_VARIANT_FUNCTIONS
148 
149  DLLLOCAL virtual QoreValue evalFunction(const char* name, CodeEvaluationHelper& ceh, ExceptionSink* xsink) const {
150  CodeContextHelper cch(xsink, CT_BUILTIN, name);
151 
152  return func(ptr, ceh.getArgs(), ceh.getRuntimeFlags(), xsink);
153  }
154 };
155 
156 #endif // _QORE_BUILTIN_FUNCTION
#define QDOM_DEFAULT
the default domain (no domain)
Definition: Restrictions.h:159
External function variable.
Definition: BuiltinFunction.h:133
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:48
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:275