Qore Programming Language 1.19.2
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 {
289public:
290 DLLLOCAL MethodCallNode(const QoreProgramLocation* loc, char* name, QoreParseListNode* n_args)
291 : AbstractMethodCallNode(loc, NT_METHOD_CALL, n_args), c_str(name) {
292 //printd(0, "MethodCallNode::MethodCallNode() this=%p name='%s' args=%p (len=%d)\n", this, c_str, args,
293 // args ? args->size() : -1);
294 }
295
296 DLLLOCAL MethodCallNode(const MethodCallNode& old, QoreListNode* n_args)
297 : AbstractMethodCallNode(old, n_args), c_str(old.c_str ? strdup(old.c_str) : nullptr), pseudo(old.pseudo) {
298 }
299
300 DLLLOCAL virtual ~MethodCallNode() {
301 if (c_str)
302 free(c_str);
303 }
304
305 using AbstractMethodCallNode::exec;
306 DLLLOCAL QoreValue exec(QoreObject* o, ExceptionSink* xsink) const;
307
308 DLLLOCAL QoreValue execPseudo(const QoreValue n, ExceptionSink* xsink) const;
309
310 DLLLOCAL virtual const char* getName() const {
311 return c_str ? c_str : "copy";
312 }
313
314 DLLLOCAL const char* getRawName() const {
315 return c_str;
316 }
317
318 DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const {
319 str.sprintf("'%s' %smethod call (%p)", getName(), pseudo ? "pseudo " : "", this);
320 return 0;
321 }
322
323 DLLLOCAL virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const {
324 del = true;
325 QoreString* rv = new QoreString();
326 getAsString(*rv, foff, xsink);
327 return rv;
328 }
329
330 DLLLOCAL char* takeName() {
331 char* rv = c_str;
332 c_str = 0;
333 return rv;
334 }
335
336 // returns the type name as a c string
337 DLLLOCAL virtual const char* getTypeName() const {
338 return getStaticTypeName();
339 }
340
341 DLLLOCAL static const char* getStaticTypeName() {
342 return "method call";
343 }
344
345 DLLLOCAL void parseSetClassAndMethod(const QoreClass* n_qc, const QoreMethod* n_method) {
346 assert(!qc);
347 assert(!method);
348 qc = n_qc;
349 method = n_method;
350 assert(qc);
351 assert(method);
352 }
353
354 DLLLOCAL void setPseudo(const QoreTypeInfo* pti) {
355 assert(!pseudo && !pseudoTypeInfo);
356 pseudo = true;
357 pseudoTypeInfo = pti;
358 }
359
360 DLLLOCAL bool isPseudo() const {
361 return pseudo;
362 }
363
364 DLLLOCAL const QoreTypeInfo* getPseudoTypeInfo() const {
365 return pseudoTypeInfo;
366 }
367
368protected:
369 char* c_str;
370 const QoreTypeInfo* pseudoTypeInfo = nullptr;
371 bool pseudo = false;
372
373 using AbstractFunctionCallNode::evalImpl;
374 DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const {
375 assert(false);
376 return QoreValue();
377 }
378
379 // note that the class and method are set in QoreDotEvalOperatorNode::parseInitImpl()
380 DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context) {
381 parse_context.typeInfo = nullptr;
382 return parseArgs(parse_context, nullptr, nullptr);
383 }
384};
385
386class SelfFunctionCallNode : public AbstractMethodCallNode {
387public:
388 DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, char* n, QoreParseListNode* n_args)
389 : AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, parse_get_class()), ns(n), is_copy(false) {
390 }
391
392 DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, char* n, QoreParseListNode* n_args,
393 const QoreMethod* m, const QoreClass* n_qc, const qore_class_private* class_ctx) :
394 AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, n_qc, m), ns(n),
395 class_ctx(class_ctx), is_copy(false) {
396 }
397
398 DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, char* n, QoreParseListNode* n_args,
399 const QoreClass* n_qc) : AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, n_qc), ns(n), is_copy(false) {
400 }
401
402 DLLLOCAL SelfFunctionCallNode(const QoreProgramLocation* loc, NamedScope* n_ns, QoreParseListNode* n_args)
403 : AbstractMethodCallNode(loc, NT_SELF_CALL, n_args, parse_get_class()), ns(n_ns), is_copy(false) {
404 }
405
406 DLLLOCAL SelfFunctionCallNode(const SelfFunctionCallNode& old, QoreListNode* n_args)
407 : AbstractMethodCallNode(old, n_args), ns(old.ns), is_copy(old.is_copy) {
408 }
409
410 DLLLOCAL int parseInitCall(QoreValue& val, QoreParseContext& parse_context);
411
412 DLLLOCAL virtual ~SelfFunctionCallNode() {
413 }
414
415 DLLLOCAL virtual const char* getTypeName() const {
416 return "in-object method call";
417 }
418
419 DLLLOCAL virtual const char* getName() const {
420 return ns.ostr;
421 }
422
423 using AbstractFunctionCallNode::evalImpl;
424 DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
425
426 DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const;
427 DLLLOCAL virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const;
428
429 DLLLOCAL AbstractQoreNode* makeReferenceNodeAndDeref();
430
431protected:
432 NamedScope ns;
433 const qore_class_private* class_ctx = nullptr;
434 bool is_copy;
435 bool is_abstract = false;
436
437 DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context);
438};
439
441
443class SetSelfFunctionCallNode : public SelfFunctionCallNode {
444public:
445 DLLLOCAL SetSelfFunctionCallNode(const SelfFunctionCallNode& old, QoreListNode* n_args);
446
447 using AbstractFunctionCallNode::evalImpl;
448 DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
449
450 using AbstractFunctionCallNode::deref;
451 DLLLOCAL virtual void deref(ExceptionSink* xsink) {
452 assert(self);
453 if (deref_self) {
454 self->deref(xsink);
455 }
456 }
457
458protected:
459 QoreObject* self;
460 const qore_class_private* cls;
461 mutable bool deref_self = true;
462};
463
464class StaticMethodCallNode : public AbstractFunctionCallNode {
465protected:
466 NamedScope* scope = nullptr;
467 const QoreMethod* method = nullptr;
468
469 using AbstractFunctionCallNode::evalImpl;
470 DLLLOCAL virtual QoreValue evalImpl(bool& needs_deref, ExceptionSink* xsink) const;
471
472 DLLLOCAL virtual int parseInitImpl(QoreValue& val, QoreParseContext& parse_context);
473
474 DLLLOCAL virtual const QoreTypeInfo* getTypeInfo() const;
475
476public:
477 DLLLOCAL StaticMethodCallNode(const QoreProgramLocation* loc, NamedScope* n_scope, QoreParseListNode* args) : AbstractFunctionCallNode(loc, NT_STATIC_METHOD_CALL, args), scope(n_scope) {
478 }
479
480 // used when copying (for background expressions with processed arguments)
481 DLLLOCAL StaticMethodCallNode(const StaticMethodCallNode& old, QoreListNode* args) : AbstractFunctionCallNode(old, args), method(old.method) {
482 }
483
484 DLLLOCAL StaticMethodCallNode(const QoreProgramLocation* loc, const QoreMethod* m, QoreParseListNode* args) : AbstractFunctionCallNode(loc, NT_STATIC_METHOD_CALL, args), method(m) {
485 }
486
487 DLLLOCAL virtual ~StaticMethodCallNode() {
488 delete scope;
489 }
490
491 DLLLOCAL const QoreMethod* getMethod() const {
492 return method;
493 }
494
495 DLLLOCAL virtual int getAsString(QoreString &str, int foff, ExceptionSink* xsink) const {
496 str.sprintf("static method call %s::%s() (%p)", method->getClass()->getName(), method->getName(), this);
497 return 0;
498 }
499
500 DLLLOCAL virtual QoreString* getAsString(bool& del, int foff, ExceptionSink* xsink) const {
501 del = true;
502 QoreString* rv = new QoreString();
503 getAsString(*rv, foff, xsink);
504 return rv;
505 }
506
507 DLLLOCAL virtual const char* getName() const {
508 return method->getName();
509 }
510
511 // returns the type name as a c string
512 DLLLOCAL virtual const char* getTypeName() const {
513 return getStaticTypeName();
514 }
515
516 DLLLOCAL AbstractQoreNode* makeReferenceNodeAndDeref();
517
518 DLLLOCAL static const char* getStaticTypeName() {
519 return "static method call";
520 }
521
522 DLLLOCAL NamedScope* takeScope() {
523 NamedScope* rv = scope;
524 scope = 0;
525 return rv;
526 }
527
528 DLLLOCAL QoreParseListNode* takeParseArgs() {
529 QoreParseListNode* rv = parse_args;
530 parse_args = nullptr;
531 return rv;
532 }
533};
534
535#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:253
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:139
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:443
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