Qore Programming Language  1.10.0
FunctionCallNode.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  FunctionCallNode.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_FUNCTIONCALLNODE_H
33 
34 #define _QORE_FUNCTIONCALLNODE_H
35 
36 #include <qore/Qore.h>
37 #include "qore/intern/QoreParseListNode.h"
38 #include "qore/intern/FunctionList.h"
39 
40 class FunctionCallBase {
41 protected:
42  QoreParseListNode* parse_args = nullptr;
43  QoreListNode* args = nullptr;
44  const AbstractQoreFunctionVariant* variant = nullptr;
45 
46 public:
47  DLLLOCAL FunctionCallBase(QoreParseListNode* parse_args, QoreListNode* args = nullptr) : parse_args(parse_args), args(args) {
48  }
49 
50  DLLLOCAL FunctionCallBase(const FunctionCallBase& old) :
51  parse_args(old.parse_args ? old.parse_args->listRefSelf() : nullptr),
52  args(old.args ? old.args->listRefSelf() : nullptr),
53  variant(old.variant) {
54  }
55 
56  DLLLOCAL FunctionCallBase(const FunctionCallBase& old, QoreListNode* n_args) : args(n_args), variant(old.variant) {
57  }
58 
59  DLLLOCAL ~FunctionCallBase() {
60  if (parse_args)
61  parse_args->deref();
62  if (args)
63  args->deref(nullptr);
64  }
65 
66  DLLLOCAL const QoreParseListNode* getParseArgs() const { return parse_args; }
67 
68  DLLLOCAL const QoreListNode* getArgs() const { return args; }
69 
70  // ns can be nullptr if the function is a method
71  DLLLOCAL int parseArgsVariant(const QoreProgramLocation* loc, QoreParseContext& parse_context, QoreFunction* func,
72  qore_ns_private* ns);
73 
74  DLLLOCAL const AbstractQoreFunctionVariant* getVariant() const {
75  return variant;
76  }
77 };
78 
79 class AbstractFunctionCallNode : public ParseNode, public FunctionCallBase {
80 protected:
81  // set to true if the arg list is a temporary list and can be destroyed when evaluating
82  // such as when the node was created during background operation execution
83  bool tmp_args = false;
84 
85  DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const = 0;
86 
87  DLLLOCAL void doFlags(int64 flags) {
88  if (flags & QCF_RET_VALUE_ONLY) {
89  set_effect(false);
90  set_effect_as_root(false);
91  }
92  if (flags & QCF_CONSTANT) {
93  set_effect_as_root(false);
94  }
95  }
96 
97 public:
98  DLLLOCAL AbstractFunctionCallNode(const QoreProgramLocation* loc, qore_type_t t, QoreParseListNode* n_args, bool needs_eval = true) : ParseNode(loc, t, needs_eval), FunctionCallBase(n_args) {
99  }
100 
101  DLLLOCAL AbstractFunctionCallNode(const QoreProgramLocation* loc, qore_type_t t, QoreParseListNode* parse_args, QoreListNode* args, bool needs_eval = true) : ParseNode(loc, t, needs_eval), FunctionCallBase(parse_args, args) {
102  }
103 
104  DLLLOCAL AbstractFunctionCallNode(const AbstractFunctionCallNode& old) : ParseNode(old), FunctionCallBase(old) {
105  }
106 
107  DLLLOCAL AbstractFunctionCallNode(const AbstractFunctionCallNode& old, QoreListNode* n_args) : ParseNode(old), FunctionCallBase(old, n_args), tmp_args(true) {
108  }
109 
110  DLLLOCAL virtual ~AbstractFunctionCallNode() {
111  // there could be an object here in the case of a background expression
112  if (args) {
113  ExceptionSink xsink;
114  args->deref(&xsink);
115  args = nullptr;
116  }
117  }
118 
119  // ns can be nullptr if the function is a method
120  DLLLOCAL int parseArgs(QoreParseContext& parse_context, QoreFunction* func, qore_ns_private* ns) {
121  int err = parseArgsVariant(loc, parse_context, func, ns);
122  // clear "effect" flag if possible, only if QCF_CONSTANT is set on the variant or function
123  if (variant) {
124  doFlags(variant->getFlags());
125  } else if (func) {
126  doFlags(func->parseGetUniqueFlags());
127  }
128  return err;
129  }
130 
131  DLLLOCAL virtual const char* getName() const = 0;
132 };
133 
134 class FunctionCallNode : public AbstractFunctionCallNode {
135 public:
136  DLLLOCAL FunctionCallNode(const FunctionCallNode& old, QoreListNode* args) : AbstractFunctionCallNode(old, args), fe(old.fe), pgm(old.pgm), finalized(old.finalized) {
137  }
138 
139  DLLLOCAL FunctionCallNode(const QoreProgramLocation* loc, const FunctionEntry* f, QoreParseListNode* a) : AbstractFunctionCallNode(loc, NT_FUNCTION_CALL, a), fe(f) {
140  }
141 
142  DLLLOCAL FunctionCallNode(const QoreProgramLocation* loc, const FunctionEntry* f, QoreListNode* a, QoreProgram* n_pgm) : AbstractFunctionCallNode(loc, NT_FUNCTION_CALL, nullptr, a), fe(f), pgm(n_pgm) {
143  }
144 
145  // normal function call constructor
146  DLLLOCAL FunctionCallNode(const QoreProgramLocation* loc, char* name, QoreParseListNode* a) : AbstractFunctionCallNode(loc, NT_FUNCTION_CALL, a), c_str(name) {
147  }
148 
149  DLLLOCAL virtual ~FunctionCallNode() {
150  printd(5, "FunctionCallNode::~FunctionCallNode(): fe: %p c_str: %p (%s) args: %p\n", fe, c_str, c_str ? c_str : "n/a", args);
151  if (c_str)
152  free(c_str);
153  }
154 
155  DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
156  DLLLOCAL virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const;
157 
158  // returns the type name as a c string
159  DLLLOCAL virtual const char* getTypeName() const {
160  return "function call";
161  }
162 
163  DLLLOCAL QoreProgram* getProgram() const {
164  return const_cast<QoreProgram*>(pgm);
165  }
166 
167  DLLLOCAL int parseInitCall(QoreValue& val, QoreParseContext& parse_context);
168 
169  DLLLOCAL int parseInitFinalizedCall(QoreValue& val, QoreParseContext& parse_context);
170 
171  DLLLOCAL virtual const char* getName() const {
172  return fe ? fe->getName() : c_str;
173  }
174 
175  DLLLOCAL const QoreFunction* getFunction() const {
176  return fe ? fe->getFunction() : nullptr;
177  }
178 
179  // FIXME: delete when unresolved function call node implemented properly
180  DLLLOCAL char* takeName() {
181  char* str = c_str;
182  c_str = 0;
183  return str;
184  }
185 
186  // FIXME: delete when unresolved function call node implemented properly
187  DLLLOCAL QoreParseListNode* takeParseArgs() {
188  QoreParseListNode* rv = parse_args;
189  parse_args = nullptr;
190  return rv;
191  }
192 
193  DLLLOCAL QoreListNode* takeArgs() {
194  QoreListNode* rv = args;
195  args = nullptr;
196  return rv;
197  }
198 
199  DLLLOCAL AbstractQoreNode* makeReferenceNodeAndDeref() {
200  if (args) {
201  parse_error(*loc, "argument given to call reference");
202  return this;
203  }
204 
205  assert(!fe);
206  AbstractQoreNode* rv = makeReferenceNodeAndDerefImpl();
207  deref();
208  return rv;
209  }
210 
211  DLLLOCAL virtual AbstractQoreNode* makeReferenceNodeAndDerefImpl();
212 
213  DLLLOCAL bool isFinalized() const {
214  return finalized;
215  }
216 
217  DLLLOCAL void setFinalized() {
218  finalized = true;
219  }
220 
221 protected:
222  const FunctionEntry* fe = nullptr;
223  QoreProgram* pgm = nullptr;
224  char* c_str = nullptr;
225  // was this call enclosed in parentheses (in which case it will not be converted to a method call)
226  bool finalized = false;
227 
228  using AbstractFunctionCallNode::evalImpl;
229  DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
230 
231  DLLLOCAL FunctionCallNode(const QoreProgramLocation* loc, char* name, QoreParseListNode* a, qore_type_t n_type) : AbstractFunctionCallNode(loc, n_type, a), c_str(name), finalized(false) {
232  }
233 
234  DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context);
235 
236  DLLLOCAL virtual const QoreTypeInfo* getTypeInfo() const {
237  return variant
238  ? variant->parseGetReturnTypeInfo()
239  : (fe ? fe->getFunction()->parseGetUniqueReturnTypeInfo() : nullptr);
240  }
241 };
242 
243 class ProgramFunctionCallNode : public FunctionCallNode {
244 public:
245  DLLLOCAL ProgramFunctionCallNode(const QoreProgramLocation* loc, char* name, QoreParseListNode* a) : FunctionCallNode(loc, name, a, NT_PROGRAM_FUNC_CALL) {
246  }
247 
248  DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context) {
249  return parseInitCall(val, parse_context);
250  }
251 
252  DLLLOCAL virtual AbstractQoreNode* makeReferenceNodeAndDerefImpl();
253 };
254 
255 class AbstractMethodCallNode : public AbstractFunctionCallNode {
256 protected:
257  // if a method pointer can be resolved at parse time, then the class
258  // is used to compare the runtime class; if they are equal, then no search
259  // is needed
260  const QoreClass* qc;
261  const QoreMethod* method;
262 
263  DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context) = 0;
264 
265  DLLLOCAL virtual const QoreTypeInfo* getTypeInfo() const;
266 
267 public:
268  DLLLOCAL AbstractMethodCallNode(const QoreProgramLocation* loc, qore_type_t t, QoreParseListNode* n_args, const QoreClass* n_qc = nullptr, const QoreMethod* m = nullptr) : AbstractFunctionCallNode(loc, t, n_args), qc(n_qc), method(m) {
269  }
270 
271  DLLLOCAL AbstractMethodCallNode(const AbstractMethodCallNode& old) : AbstractFunctionCallNode(old), qc(old.qc), method(old.method) {
272  }
273 
274  DLLLOCAL AbstractMethodCallNode(const AbstractMethodCallNode& old, QoreListNode* n_args) : AbstractFunctionCallNode(old, n_args), qc(old.qc), method(old.method) {
275  }
276 
277  DLLLOCAL QoreValue exec(QoreObject* o, const char* cstr, const qore_class_private* ctx, ExceptionSink* xsink) const;
278 
279  DLLLOCAL const QoreClass* getClass() const {
280  return qc;
281  }
282 
283  DLLLOCAL const QoreMethod* getMethod() const {
284  return method;
285  }
286 };
287 
288 class MethodCallNode : public AbstractMethodCallNode {
289 protected:
290  char* c_str;
291  const QoreTypeInfo* pseudoTypeInfo = nullptr;
292  bool pseudo = false;
293 
294  using AbstractFunctionCallNode::evalImpl;
295  DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const {
296  assert(false);
297  return QoreValue();
298  }
299 
300  // note that the class and method are set in QoreDotEvalOperatorNode::parseInitImpl()
301  DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context) {
302  parse_context.typeInfo = nullptr;
303  return parseArgs(parse_context, nullptr, nullptr);
304  }
305 
306 public:
307  DLLLOCAL MethodCallNode(const QoreProgramLocation* loc, char* name, QoreParseListNode* n_args) : AbstractMethodCallNode(loc, NT_METHOD_CALL, n_args), c_str(name) {
308  //printd(0, "MethodCallNode::MethodCallNode() this=%p name='%s' args=%p (len=%d)\n", this, c_str, args, args ? args->size() : -1);
309  }
310 
311  DLLLOCAL MethodCallNode(const MethodCallNode &old, QoreListNode* n_args) : AbstractMethodCallNode(old, n_args), c_str(old.c_str ? strdup(old.c_str) : nullptr), pseudo(old.pseudo) {
312  }
313 
314  DLLLOCAL virtual ~MethodCallNode() {
315  if (c_str)
316  free(c_str);
317  }
318 
319  using AbstractMethodCallNode::exec;
320  DLLLOCAL QoreValue exec(QoreObject* o, ExceptionSink* xsink) const;
321 
322  DLLLOCAL QoreValue execPseudo(const QoreValue n, ExceptionSink* xsink) const;
323 
324  DLLLOCAL virtual const char* getName() const {
325  return c_str ? c_str : "copy";
326  }
327 
328  DLLLOCAL const char* getRawName() const {
329  return c_str;
330  }
331 
332  DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const {
333  str.sprintf("'%s' %smethod call (%p)", getName(), pseudo ? "pseudo " : "", this);
334  return 0;
335  }
336 
337  DLLLOCAL virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const {
338  del = true;
339  QoreString* rv = new QoreString();
340  getAsString(*rv, foff, xsink);
341  return rv;
342  }
343 
344  DLLLOCAL char* takeName() {
345  char* rv = c_str;
346  c_str = 0;
347  return rv;
348  }
349 
350  // returns the type name as a c string
351  DLLLOCAL virtual const char* getTypeName() const {
352  return getStaticTypeName();
353  }
354 
355  DLLLOCAL static const char* getStaticTypeName() {
356  return "method call";
357  }
358 
359  DLLLOCAL void parseSetClassAndMethod(const QoreClass* n_qc, const QoreMethod* n_method) {
360  assert(!qc);
361  assert(!method);
362  qc = n_qc;
363  method = n_method;
364  assert(qc);
365  assert(method);
366  }
367 
368  DLLLOCAL void setPseudo(const QoreTypeInfo* pti) {
369  assert(!pseudo && !pseudoTypeInfo);
370  pseudo = true;
371  pseudoTypeInfo = pti;
372  }
373 
374  DLLLOCAL bool isPseudo() const {
375  return pseudo;
376  }
377 
378  DLLLOCAL const QoreTypeInfo* getPseudoTypeInfo() const {
379  return pseudoTypeInfo;
380  }
381 };
382 
383 class SelfFunctionCallNode : public AbstractMethodCallNode {
384 protected:
385  NamedScope ns;
386  const qore_class_private* class_ctx = nullptr;
387  bool is_copy;
388 
389  DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context);
390 
391 public:
392  DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, char* n, QoreParseListNode* n_args)
393  : AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, parse_get_class()), ns(n), is_copy(false) {
394  }
395 
396  DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, char* n, QoreParseListNode* n_args,
397  const QoreMethod* m, const QoreClass* n_qc, const qore_class_private* class_ctx) :
398  AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, n_qc, m), ns(n),
399  class_ctx(class_ctx), is_copy(false) {
400  }
401 
402  DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, char* n, QoreParseListNode* n_args,
403  const QoreClass* n_qc) : AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, n_qc), ns(n), is_copy(false) {
404  }
405 
406  DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, NamedScope* n_ns, QoreParseListNode* n_args)
407  : AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, parse_get_class()), ns(n_ns), is_copy(false) {
408  }
409 
410  DLLLOCAL SelfFunctionCallNode(const SelfFunctionCallNode& old, QoreListNode* n_args)
411  : AbstractMethodCallNode(old, n_args), ns(old.ns), is_copy(old.is_copy) {
412  }
413 
414  DLLLOCAL int parseInitCall(QoreValue& val, QoreParseContext& parse_context);
415 
416  DLLLOCAL virtual ~SelfFunctionCallNode() {
417  }
418 
419  DLLLOCAL virtual const char* getTypeName() const {
420  return "in-object method call";
421  }
422 
423  DLLLOCAL virtual const char* getName() const {
424  return ns.ostr;
425  }
426 
427  using AbstractFunctionCallNode::evalImpl;
428  DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
429 
430  DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
431  DLLLOCAL virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const;
432 
433  DLLLOCAL AbstractQoreNode* makeReferenceNodeAndDeref();
434 };
435 
437 
439 class SetSelfFunctionCallNode : public SelfFunctionCallNode {
440 public:
441  DLLLOCAL SetSelfFunctionCallNode(const SelfFunctionCallNode& old, QoreListNode* n_args);
442 
443  using AbstractFunctionCallNode::evalImpl;
444  DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
445 
446  using AbstractFunctionCallNode::deref;
447  DLLLOCAL virtual void deref(ExceptionSink* xsink) {
448  assert(self);
449  if (deref_self) {
450  self->deref(xsink);
451  }
452  }
453 
454 protected:
455  QoreObject* self;
456  const qore_class_private* cls;
457  mutable bool deref_self = true;
458 };
459 
460 class StaticMethodCallNode : public AbstractFunctionCallNode {
461 protected:
462  NamedScope* scope = nullptr;
463  const QoreMethod* method = nullptr;
464 
465  using AbstractFunctionCallNode::evalImpl;
466  DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
467 
468  DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context);
469 
470  DLLLOCAL virtual const QoreTypeInfo* getTypeInfo() const;
471 
472 public:
473  DLLLOCAL StaticMethodCallNode(const QoreProgramLocation* loc, NamedScope* n_scope, QoreParseListNode* args) : AbstractFunctionCallNode(loc, NT_STATIC_METHOD_CALL, args), scope(n_scope) {
474  }
475 
476  // used when copying (for background expressions with processed arguments)
477  DLLLOCAL StaticMethodCallNode(const StaticMethodCallNode& old, QoreListNode* args) : AbstractFunctionCallNode(old, args), method(old.method) {
478  }
479 
480  DLLLOCAL StaticMethodCallNode(const QoreProgramLocation* loc, const QoreMethod* m, QoreParseListNode* args) : AbstractFunctionCallNode(loc, NT_STATIC_METHOD_CALL, args), method(m) {
481  }
482 
483  DLLLOCAL virtual ~StaticMethodCallNode() {
484  delete scope;
485  }
486 
487  DLLLOCAL const QoreMethod* getMethod() const {
488  return method;
489  }
490 
491  DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const {
492  str.sprintf("static method call %s::%s() (%p)", method->getClass()->getName(), method->getName(), this);
493  return 0;
494  }
495 
496  DLLLOCAL virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const {
497  del = true;
498  QoreString* rv = new QoreString();
499  getAsString(*rv, foff, xsink);
500  return rv;
501  }
502 
503  DLLLOCAL virtual const char* getName() const {
504  return method->getName();
505  }
506 
507  // returns the type name as a c string
508  DLLLOCAL virtual const char* getTypeName() const {
509  return getStaticTypeName();
510  }
511 
512  DLLLOCAL AbstractQoreNode* makeReferenceNodeAndDeref();
513 
514  DLLLOCAL static const char* getStaticTypeName() {
515  return "static method call";
516  }
517 
518  DLLLOCAL NamedScope* takeScope() {
519  NamedScope* rv = scope;
520  scope = 0;
521  return rv;
522  }
523 
524  DLLLOCAL QoreParseListNode* takeParseArgs() {
525  QoreParseListNode* rv = parse_args;
526  parse_args = nullptr;
527  return rv;
528  }
529 };
530 
531 #endif
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:57
DLLLOCAL bool needs_eval() const
returns true if the object needs evaluation to return a value, false if not
Definition: AbstractQoreNode.h:145
DLLEXPORT void deref(ExceptionSink *xsink)
decrements the reference count and calls derefImpl() if there_can_be_only_one is false,...
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:48
defines a Qore-language class
Definition: QoreClass.h:239
DLLEXPORT const char * getName() const
returns the class name
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:52
a method in a QoreClass
Definition: QoreClass.h:125
DLLEXPORT const char * getName() const
returns the method's name
DLLEXPORT const QoreClass * getClass() const
returns a pointer to the parent class
the implementation of Qore's object data type, reference counted, dynamically-allocated only
Definition: QoreObject.h:60
supports parsing and executing Qore-language code, reference counted, dynamically-allocated only
Definition: QoreProgram.h:127
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:93
DLLEXPORT int sprintf(const char *fmt,...)
this will concatentate a formatted string to the existing string according to the format string and t...
Used in arguments background expressions to ensure that the object context is set for the call.
Definition: FunctionCallNode.h:439
virtual DLLLOCAL QoreValue evalImpl(bool &needs_deref, ExceptionSink *xsink) const
optionally evaluates the argument
int16_t qore_type_t
used to identify unique Qore data and parse types (descendents of AbstractQoreNode)
Definition: common.h:70
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
const qore_type_t NT_STATIC_METHOD_CALL
type value for StaticMethodCallNode (private class)
Definition: node_types.h:74
const qore_type_t NT_FUNCTION_CALL
type value for FunctionCallNode
Definition: node_types.h:59
const qore_type_t NT_SELF_CALL
type value for SelfFunctionCallNode (private class)
Definition: node_types.h:75
const qore_type_t NT_PROGRAM_FUNC_CALL
type value for ProgramFunctionCallNode (private class)
Definition: node_types.h:79
const qore_type_t NT_METHOD_CALL
type value for MethodCallNode (private class)
Definition: node_types.h:73
DLLEXPORT QoreProgram * getProgram()
returns the current QoreProgram
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:275