Qore Programming Language 1.13.0
Loading...
Searching...
No Matches
FunctionCallNode.h
1/* -*- mode: c++; indent-tabs-mode: nil -*- */
2/*
3 FunctionCallNode.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_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
40class FunctionCallBase {
41protected:
42 QoreParseListNode* parse_args = nullptr;
43 QoreListNode* args = nullptr;
44 const AbstractQoreFunctionVariant* variant = nullptr;
45
46public:
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
79class AbstractFunctionCallNode : public ParseNode, public FunctionCallBase {
80protected:
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
97public:
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
134class FunctionCallNode : public AbstractFunctionCallNode {
135public:
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
221protected:
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
243class ProgramFunctionCallNode : public FunctionCallNode {
244public:
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
255class AbstractMethodCallNode : public AbstractFunctionCallNode {
256protected:
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
267public:
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
288class MethodCallNode : public AbstractMethodCallNode {
289protected:
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
306public:
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
383class SelfFunctionCallNode : public AbstractMethodCallNode {
384protected:
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
391public:
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
439class SetSelfFunctionCallNode : public SelfFunctionCallNode {
440public:
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
454protected:
455 QoreObject* self;
456 const qore_class_private* cls;
457 mutable bool deref_self = true;
458};
459
460class StaticMethodCallNode : public AbstractFunctionCallNode {
461protected:
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
472public:
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:50
defines a Qore-language class
Definition: QoreClass.h:249
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:135
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:128
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:276