Yate
yatescript.h
1
20
21#ifndef __YATESCRIPT_H
22#define __YATESCRIPT_H
23
24#include <yateclass.h>
25
26#ifdef _WINDOWS
27
28#ifdef LIBYSCRIPT_EXPORTS
29#define YSCRIPT_API __declspec(dllexport)
30#else
31#ifndef LIBYSCRIPT_STATIC
32#define YSCRIPT_API __declspec(dllimport)
33#endif
34#endif
35
36#endif /* _WINDOWS */
37
38#ifndef YSCRIPT_API
39#define YSCRIPT_API
40#endif
41
45namespace TelEngine {
46
47class ExpEvaluator;
48class ExpOperation;
49class ScriptMutex;
50
55class YSCRIPT_API ExpExtender
56{
57public:
61 virtual ~ExpExtender()
62 { }
63
68 virtual RefObject* refObj();
69
77 virtual bool hasField(ObjList& stack, const String& name, GenObject* context) const;
78
86 virtual NamedString* getField(ObjList& stack, const String& name, GenObject* context) const;
87
96 virtual bool runFunction(ObjList& stack, const ExpOperation& oper, GenObject* context);
97
105 virtual bool runField(ObjList& stack, const ExpOperation& oper, GenObject* context);
106
114 virtual bool runAssign(ObjList& stack, const ExpOperation& oper, GenObject* context);
115};
116
121class YSCRIPT_API ParsePoint
122{
123public:
132 explicit inline ParsePoint(const char*& expr, ExpEvaluator* eval = 0, unsigned int lineNo = 0,
133 const char* fileName = 0, const char* seps = 0)
134 : m_expr(expr), m_searchedSeps(seps), m_count(0), m_foundSep(0), m_lineNo(lineNo), m_eval(eval), m_fileName(fileName)
135 { }
136
142
147 ParsePoint& operator=(unsigned int line);
148
152 inline operator const char*&()
153 { return m_expr; }
154
158 inline ParsePoint& operator=(const char* newExpr)
159 {
160 m_expr = newExpr;
161 return *this;
162 }
163
167 inline ParsePoint& operator++() // prefix
168 {
169 ++m_expr;
170 return *this;
171 }
172
176 inline ParsePoint& operator++(int unused) // postfix
177 {
178 ++m_expr;
179 return *this;
180 }
181
186 inline char firstChar()
187 { return *m_expr; }
188
193 inline unsigned lineNumber() const
194 { return m_lineNo; }
195
199 const char* m_expr;
200
204 const char* m_searchedSeps;
205
209 unsigned int m_count;
210
215
219 unsigned int m_lineNo;
220
225
230};
231
236class YSCRIPT_API ExpEvaluator : public DebugEnabler
237{
238 friend class ParsePoint;
239public:
243 enum Parser {
244 C,
245 SQL,
246 };
247
251 enum Opcode {
252 // FORTH style notation of effect on stack, C-syntax expression
253 OpcNone = 0,// ( --- )
254 OpcNull, // ( --- A)
255 OpcPush, // ( --- A)
256 OpcDrop, // (A --- )
257 OpcDup, // (A --- A A)
258 OpcSwap, // (A B --- B A)
259 OpcRot, // (A B C --- B C A)
260 OpcOver, // (A B --- A B A)
261 // Arithmetic operators
262 OpcAdd, // (A B --- A+B)
263 OpcSub, // (A B --- A-B)
264 OpcMul, // (A B --- A*B)
265 OpcDiv, // (A B --- A/B)
266 OpcMod, // (A B --- A%B)
267 OpcNeg, // (A --- -A)
268 OpcIncPre, // (A --- ++A)
269 OpcDecPre, // (A --- --A)
270 OpcIncPost, // (A --- A++)
271 OpcDecPost, // (A --- A--)
272 // Bitwise logic operators
273 OpcAnd, // (A B --- A&B)
274 OpcOr, // (A B --- A|B)
275 OpcXor, // (A B --- A^B)
276 OpcNot, // (A --- ~A)
277 OpcShl, // (A B --- A<<B)
278 OpcShr, // (A B --- A>>B)
279 // Boolean logic operators
280 OpcLAnd, // (A B --- A&&B)
281 OpcLOr, // (A B --- A||B)
282 OpcLXor, // (A B --- A^^B)
283 OpcLNot, // (A --- !A)
284 // String concatenation
285 OpcCat, // (A B --- A.B)
286 // String matching
287 OpcReM, // (A B --- Amatch/B/)
288 OpcReIM, // (A B --- Amatch_insensitive/B/)
289 OpcReNm, // (A B --- A!match/B/)
290 OpcReINm, // (A B --- A!match_insensitive/B/)
291 OpcLike, // (A B --- AlikeB)
292 OpcILike, // (A B --- Alike_insensitiveB)
293 OpcNLike, // (A B --- A!likeB)
294 OpcNIlike, // (A B --- A!like_insensitiveB)
295 // Comparation operators
296 OpcEq, // (A B --- A==B)
297 OpcNe, // (A B --- A!=B)
298 OpcGt, // (A B --- A>B)
299 OpcLt, // (A B --- A<B)
300 OpcGe, // (A B --- A>=B)
301 OpcLe, // (A B --- A<=B)
302 // Ternary conditional operator
303 OpcCond, // (A B C --- A?B:C)
304 // Field naming operator
305 OpcAs, // (A B --- A[name=B])
306 // Field replacement
307 OpcField, // (A --- A)
308 // Call of function with N parameters
309 OpcFunc, // (... funcN --- func(...))
310 // Label for a jump
311 OpcLabel, // ( --- )
312 // Push with deep copy
313 OpcCopy, // ( --- CopiedA)
314 // Nullish coalescing
315 OpcNullish, // (A B --- A??B)
316 // Field assignment - can be ORed with other binary operators
317 OpcAssign = 0x0100, // (A B --- B,(&A=B))
318 // Private extension area for derived classes
319 OpcPrivate = 0x1000
320 };
321
327 explicit ExpEvaluator(const TokenDict* operators = 0, const TokenDict* unaryOps = 0);
328
333 explicit ExpEvaluator(Parser style);
334
339 ExpEvaluator(const ExpEvaluator& original);
340
344 virtual ~ExpEvaluator();
345
352 int compile(ParsePoint& expr, GenObject* context = 0);
353
360 bool evaluate(ObjList* results, GenObject* context = 0) const;
361
368 inline bool evaluate(ObjList& results, GenObject* context = 0) const
369 { return evaluate(&results,context); }
370
379 int evaluate(NamedList& results, unsigned int index = 0, const char* prefix = 0, GenObject* context = 0) const;
380
388 int evaluate(Array& results, unsigned int index, GenObject* context = 0) const;
389
394 inline bool simplify()
395 { return trySimplify(); }
396
401 inline bool inError() const
402 { return m_inError; }
403
408 inline unsigned int lineNumber() const
409 { return m_lineNo; }
410
415 virtual bool null() const;
416
423 void dump(const ObjList& codes, String& res, bool lineNo = false) const;
424
430 virtual void dump(String& res, bool lineNo = false) const;
431
438 inline String dump(const ObjList& codes, bool lineNo = false) const
439 { String s; dump(codes,s,lineNo); return s; }
440
446 inline String dump(bool lineNo = false) const
447 { String s; dump(s,lineNo); return s; }
448
453 inline const TokenDict* operators() const
454 { return m_operators; }
455
460 inline const TokenDict* unaryOps() const
461 { return m_unaryOps; }
462
467 inline ExpExtender* extender() const
468 { return m_extender; }
469
475
483 static unsigned int getLineOf(ExpOperation* op1, ExpOperation* op2 = 0, ExpOperation* op3 = 0);
484
490 static void pushOne(ObjList& stack, ExpOperation* oper);
491
497 static ExpOperation* popOne(ObjList& stack);
498
504 static ExpOperation* popAny(ObjList& stack);
505
512 virtual ExpOperation* popValue(ObjList& stack, GenObject* context = 0) const;
513
522 virtual bool runOperation(ObjList& stack, const ExpOperation& oper, GenObject* context = 0) const;
523
530 virtual bool runAllFields(ObjList& stack, GenObject* context = 0) const;
531
532protected:
538 virtual char skipWhites(ParsePoint& expr);
539
546 inline static char condLower(char chr, bool makeLower)
547 { return (makeLower && ('A' <= chr) && (chr <= 'Z')) ? (chr + ('a' - 'A')) : chr; }
548
556 Opcode getOperator(const char*& expr, const TokenDict* operators, bool caseInsensitive = false) const;
557
563 virtual bool keywordLetter(char c) const;
564
570 virtual bool keywordDigit(char c) const;
571
577 virtual bool keywordChar(char c) const;
578
584 virtual int getKeyword(const char* str) const;
585
593 bool gotError(const char* error = 0, const char* text = 0, unsigned int line = 0) const;
594
602 bool gotError(const char* error = 0, const char* text = 0, unsigned int line = 0);
603
610 inline bool gotError(const char* error, unsigned int line) const
611 { return gotError(error, 0, line); }
612
619 inline bool gotError(const char* error, unsigned int line)
620 { return gotError(error, 0, line); }
621
627 virtual void formatLineNo(String& buf, unsigned int line) const;
628
636 bool runCompile(ParsePoint& expr, char stop, GenObject* nested = 0);
637
645 virtual bool runCompile(ParsePoint& expr, const char* stop = 0, GenObject* nested = 0);
646
653 virtual char skipComments(ParsePoint& expr, GenObject* context = 0);
654
661 virtual int preProcess(ParsePoint& expr, GenObject* context = 0);
662
668 virtual Opcode getOperator(ParsePoint& expr);
669
675 virtual Opcode getUnaryOperator(ParsePoint& expr);
676
683 virtual Opcode getPostfixOperator(ParsePoint& expr, int precedence = 0);
684
690 virtual const char* getOperator(Opcode oper) const;
691
697 virtual int getPrecedence(Opcode oper) const;
698
704 virtual bool getRightAssoc(Opcode oper) const;
705
712 virtual bool getSeparator(ParsePoint& expr, bool remove);
713
721 virtual bool getInstruction(ParsePoint& expr, char stop = 0, GenObject* nested = 0);
722
730 virtual bool getOperand(ParsePoint& expr, bool endOk = true, int precedence = 0);
731
738 virtual bool getSimple(ParsePoint& expr, bool constOnly = false);
739
745 virtual bool getNumber(ParsePoint& expr);
746
752 virtual bool getString(ParsePoint& expr);
753
759 virtual bool getFunction(ParsePoint& expr);
760
767 virtual bool getString(const char*& expr, String& str);
768
776 virtual bool getEscape(const char*& expr, String& str, char sep);
777
783 virtual bool getField(ParsePoint& expr);
784
790 void addOpcode(ExpOperation* oper, unsigned int line = 0);
791
799 ExpOperation* addOpcode(Opcode oper, bool barrier = false, unsigned int line = 0);
800
808 ExpOperation* addOpcode(Opcode oper, int64_t value, bool barrier = false);
809
816
822 ExpOperation* addOpcode(int64_t value);
823
830
840 ExpOperation* addOpcode(Opcode oper, const String& name, int64_t value = 0,
841 bool barrier = false, unsigned int line = 0);
842
848
853 virtual bool trySimplify();
854
862 virtual bool runEvaluate(const ObjList& opcodes, ObjList& stack, GenObject* context = 0) const;
863
872 virtual bool runEvaluate(const ObjVector& opcodes, ObjList& stack, GenObject* context = 0, unsigned int index = 0) const;
873
880 virtual bool runEvaluate(ObjList& stack, GenObject* context = 0) const;
881
890 virtual bool runFunction(ObjList& stack, const ExpOperation& oper, GenObject* context = 0) const;
891
899 virtual bool runField(ObjList& stack, const ExpOperation& oper, GenObject* context = 0) const;
900
908 virtual bool runAssign(ObjList& stack, const ExpOperation& oper, GenObject* context = 0) const;
909
916 virtual void dump(const ExpOperation& oper, String& res, bool lineNo = false) const;
917
922
927
932
937
942
946 unsigned int m_lineNo;
947
948private:
949 bool getOperandInternal(ParsePoint& expr, bool endOk, int precedence);
950 ExpExtender* m_extender;
951};
952
957class YSCRIPT_API ExpOperation : public NamedString
958{
959 friend class ExpEvaluator;
961public:
966 inline static int64_t nonInteger()
967 { return LLONG_MIN; }
968
973 inline ExpOperation(const ExpOperation& original)
974 : NamedString(original.name(),original),
975 m_opcode(original.opcode()), m_number(original.number()), m_bool(original.isBoolean()),
976 m_isNumber(original.isNumber()), m_lineNo(original.lineNumber()), m_barrier(original.barrier())
977 { }
978
985 inline ExpOperation(const ExpOperation& original, const char* name, bool copyType = true)
986 : NamedString(name,original),
987 m_opcode(copyType ? original.opcode() : ExpEvaluator::OpcPush),
988 m_number(original.number()), m_bool(original.isBoolean()),
989 m_isNumber(original.isNumber()), m_lineNo(original.lineNumber()), m_barrier(original.barrier())
990 { }
991
998 inline explicit ExpOperation(const String& value, const char* name = 0, bool autoNum = false)
999 : NamedString(name,value),
1000 m_opcode(ExpEvaluator::OpcPush),
1001 m_number(autoNum ? value.toInt64(nonInteger()) : nonInteger()),
1002 m_bool(autoNum && value.isBoolean()),
1003 m_isNumber(autoNum && (value == YSTRING("NaN") || m_number != nonInteger())),
1004 m_lineNo(0), m_barrier(false)
1005 { if (m_bool) { m_number = value.toBoolean() ? 1 : 0; m_isNumber = true;} }
1006
1012 inline explicit ExpOperation(const char* value, const char* name = 0)
1013 : NamedString(name,value),
1014 m_opcode(ExpEvaluator::OpcPush), m_number(nonInteger()), m_bool(false),
1015 m_isNumber(false), m_lineNo(0), m_barrier(false)
1016 { }
1017
1023 inline explicit ExpOperation(int64_t value, const char* name = 0)
1024 : NamedString(name,"NaN"),
1025 m_opcode(ExpEvaluator::OpcPush),
1026 m_number(value), m_bool(false), m_isNumber(true), m_lineNo(0), m_barrier(false)
1027 { if (value != nonInteger()) String::operator=(value); }
1028
1034 inline explicit ExpOperation(bool value, const char* name = 0)
1035 : NamedString(name,String::boolText(value)),
1036 m_opcode(ExpEvaluator::OpcPush),
1037 m_number(value ? 1 : 0), m_bool(true), m_isNumber(true),
1038 m_lineNo(0), m_barrier(false)
1039 { }
1040
1048 inline ExpOperation(ExpEvaluator::Opcode oper, const char* name = 0, int64_t value = nonInteger(), bool barrier = false)
1049 : NamedString(name,""),
1050 m_opcode(oper), m_number(value), m_bool(false), m_isNumber(false),
1051 m_lineNo(0), m_barrier(barrier)
1052 { }
1053
1061 inline ExpOperation(ExpEvaluator::Opcode oper, const char* name, const char* value, bool barrier = false)
1062 : NamedString(name,value),
1063 m_opcode(oper), m_number(nonInteger()), m_bool(false), m_isNumber(false),
1064 m_lineNo(0), m_barrier(barrier)
1065 { }
1066
1075 inline ExpOperation(ExpEvaluator::Opcode oper, const char* name, const char* value, int64_t number, bool barrier)
1076 : NamedString(name,value),
1077 m_opcode(oper), m_number(number), m_bool(false), m_isNumber(true),
1078 m_lineNo(0), m_barrier(barrier)
1079 { }
1080
1086 { return m_opcode; }
1087
1092 inline bool isInteger() const
1093 { return m_number != nonInteger(); }
1094
1099 inline int64_t number() const
1100 { return m_number; }
1101
1106 inline bool isBoolean() const
1107 { return m_bool; }
1108
1113 inline bool isNumber() const
1114 { return m_isNumber; }
1115
1120 inline bool barrier() const
1121 { return m_barrier; }
1122
1127 inline unsigned int lineNumber() const
1128 { return m_lineNo; }
1129
1134 inline void lineNumber(unsigned int line)
1135 { m_lineNo = line; }
1136
1142 inline int64_t operator=(int64_t num)
1143 { m_number = num; String::operator=(num); m_isNumber = true; return num; }
1144
1150 virtual int64_t valInteger(int64_t defVal = 0) const;
1151
1156 virtual int64_t toNumber() const;
1157
1163 virtual bool valBoolean(bool defVal = false) const;
1164
1169 virtual const char* typeOf() const;
1170
1176 virtual ExpOperation* clone(const char* name) const;
1177
1182 inline ExpOperation* clone() const
1183 { return clone(name()); }
1184
1190 virtual ExpOperation* copy(ScriptMutex* mtx) const
1191 { return clone(); }
1192
1193private:
1194 ExpEvaluator::Opcode m_opcode;
1195 int64_t m_number;
1196 bool m_bool;
1197 bool m_isNumber;
1198 unsigned int m_lineNo;
1199 bool m_barrier;
1200};
1201
1206class YSCRIPT_API ExpFunction : public ExpOperation
1207{
1209public:
1216 inline ExpFunction(const char* name, long int argc = 0, bool barrier = false)
1217 : ExpOperation(ExpEvaluator::OpcFunc,name,argc,barrier)
1218 { if (name) (*this) << "[function " << name << "()]"; }
1219
1225 virtual bool valBoolean(bool defVal = false) const
1226 { return true; }
1227
1233 virtual ExpOperation* clone(const char* name) const;
1234};
1235
1240class YSCRIPT_API ExpWrapper : public ExpOperation
1241{
1242public:
1249 inline ExpWrapper(GenObject* object, const char* name = 0, bool barrier = false)
1250 : ExpOperation(ExpEvaluator::OpcPush,name,
1251 object ? object->toString().c_str() : (const char*)0,barrier),
1252 m_object(object)
1253 { }
1254
1261 inline ExpWrapper(ExpEvaluator::Opcode opcode, GenObject* object, const char* name = 0)
1262 : ExpOperation(opcode,name,object ? object->toString().c_str() : (const char*)0,false),
1263 m_object(object)
1264 { }
1265
1269 virtual ~ExpWrapper()
1270 { TelEngine::destruct(m_object); }
1271
1277 virtual void* getObject(const String& name) const;
1278
1284 virtual bool valBoolean(bool defVal = false) const;
1285
1290 virtual const char* typeOf() const;
1291
1297 virtual ExpOperation* clone(const char* name) const;
1298
1304 virtual ExpOperation* copy(ScriptMutex* mtx) const;
1305
1311 { return m_object; }
1312
1313private:
1314 GenObject* m_object;
1315};
1316
1321class YSCRIPT_API TableEvaluator
1322{
1323public:
1329
1335
1341 TableEvaluator(const TokenDict* operators, const TokenDict* unaryOps);
1342
1347
1353 virtual bool evalWhere(GenObject* context = 0);
1354
1361 virtual bool evalSelect(ObjList& results, GenObject* context = 0);
1362
1368 virtual unsigned int evalLimit(GenObject* context = 0);
1369
1375
1376protected:
1377 ExpEvaluator m_select;
1378 ExpEvaluator m_where;
1379 ExpEvaluator m_limit;
1380 unsigned int m_limitVal;
1381};
1382
1383class ScriptRun;
1384
1389class YSCRIPT_API ScriptMutex : public Mutex
1390{
1391public:
1398 inline ScriptMutex(bool recursive, const char* name)
1399 : Mutex(recursive,name), m_objTrack(false)
1400 { }
1401
1406 virtual void objCreated(GenObject* obj) = 0;
1407
1412 virtual void objDeleted(GenObject* obj) = 0;
1413
1418 inline bool objTrack() const
1419 { return m_objTrack; }
1420
1421protected:
1422 bool m_objTrack;
1423};
1424
1425
1430class YSCRIPT_API ScriptContext : public RefObject, public ExpExtender
1431{
1432public:
1437 inline explicit ScriptContext(const char* name = 0)
1438 : m_params(name)
1439 { }
1440
1446 { return m_params; }
1447
1452 inline const NamedList& params() const
1453 { return m_params; }
1454
1459 virtual NamedList* nativeParams() const
1460 { return 0; }
1461
1466 virtual const String& toString() const
1467 { return m_params; }
1468
1474 virtual void* getObject(const String& name) const;
1475
1481 { return this; }
1482
1487 virtual ScriptMutex* mutex() = 0;
1488
1496 virtual bool hasField(ObjList& stack, const String& name, GenObject* context) const;
1497
1505 virtual NamedString* getField(ObjList& stack, const String& name, GenObject* context) const;
1506
1511 virtual void fillFieldNames(ObjList& names);
1512
1520 static void fillFieldNames(ObjList& names, const NamedList& list, bool checkDupl = true, const char* skip = 0);
1521
1527 static void fillFieldNames(ObjList& names, const HashList& list);
1528
1536 virtual bool runFunction(ObjList& stack, const ExpOperation& oper, GenObject* context);
1537
1545 virtual bool runField(ObjList& stack, const ExpOperation& oper, GenObject* context);
1546
1554 virtual bool runAssign(ObjList& stack, const ExpOperation& oper, GenObject* context);
1555
1563 virtual bool copyFields(ObjList& stack, const ScriptContext& original, GenObject* context);
1564
1570 virtual void addFields(const NamedList& list, const char* skipPrefix = "__");
1571
1579 bool runMatchingField(ObjList& stack, const ExpOperation& oper, GenObject* context);
1580
1586 virtual void createdObj(GenObject* obj)
1587 { }
1588
1594 virtual void deletedObj(GenObject* obj)
1595 { }
1596
1601 virtual void trackObjs(unsigned int track = 0)
1602 { }
1603
1609 { return 0; }
1610
1611private:
1612 NamedList m_params;
1613};
1614
1619class YSCRIPT_API ScriptCode : public RefObject
1620{
1621 YCLASS(ScriptCode,RefObject)
1622public:
1628 virtual bool initialize(ScriptContext* context) const = 0;
1629
1635 virtual bool evaluate(ScriptRun& runner, ObjList& results) const = 0;
1636
1643 virtual ScriptRun* createRunner(ScriptContext* context, const char* title = 0)
1644 { return 0; }
1645
1653 virtual void getFileLine(unsigned int line, String& fileName, unsigned int& fileLine, bool wholePath = true)
1654 { }
1655};
1656
1661class YSCRIPT_API ScriptStack : public ObjList
1662{
1663 YCLASS(ScriptStack,ObjList)
1664 YNOCOPY(ScriptStack);
1665public:
1671 : m_runner(owner)
1672 { }
1673
1679 { return m_runner; }
1680
1681private:
1682 ScriptRun* m_runner;
1683};
1684
1689class YSCRIPT_API ScriptAsync : public GenObject
1690{
1691 YCLASS(ScriptAsync,GenObject)
1692public:
1698 : m_runner(owner)
1699 { }
1700
1705 { }
1706
1712 { return m_runner; }
1713
1718 virtual bool run() = 0;
1719
1720private:
1721 ScriptRun* m_runner;
1722};
1723
1728class YSCRIPT_API ScriptRun : public GenObject, public ScriptMutex
1729{
1730 friend class ScriptCode;
1731 YCLASS(ScriptRun,GenObject)
1732 YNOCOPY(ScriptRun);
1733public:
1737 enum Status {
1738 Invalid,
1739 Running,
1740 Incomplete,
1741 Succeeded,
1742 Failed,
1743 };
1744
1751
1755 virtual ~ScriptRun();
1756
1761 inline ScriptCode* code() const
1762 { return m_code; }
1763
1768 inline ScriptContext* context() const
1769 { return m_context; }
1770
1774 inline Status state() const
1775 { return m_state; }
1776
1782 static const char* textState(Status state);
1783
1788 inline const char* textState() const
1789 { return textState(m_state); }
1790
1795 inline ObjList& stack()
1796 { return m_stack; }
1797
1802 inline const ObjList& stack() const
1803 { return m_stack; }
1804
1809 inline ScriptRun* clone() const
1810 { return new ScriptRun(code(),context()); }
1811
1817 virtual Status reset(bool init = false);
1818
1823 virtual Status execute();
1824
1830 virtual Status run(bool init = true);
1831
1836 virtual bool pause();
1837
1846 virtual Status call(const String& name, ObjList& args,
1847 ExpOperation* thisObj = 0, ExpOperation* scopeObj = 0);
1848
1854 virtual bool callable(const String& name);
1855
1861 virtual bool insertAsync(ScriptAsync* oper);
1862
1868 virtual bool appendAsync(ScriptAsync* oper);
1869
1874 virtual unsigned int currentLineNo() const
1875 { return 0; }
1876
1882 virtual const String& currentFileName(bool wholePath = false) const
1883 { return String::empty(); }
1884
1889 virtual const String& traceId() const
1890 { return m_traceId; }
1891
1896 virtual void setTraceId(const String& tid)
1897 { m_traceId = tid; }
1898
1905 bool runAssign(const ExpOperation& oper, GenObject* context = 0);
1906
1908 { if (m_context) m_context->createdObj(obj); };
1910 { if (m_context) m_context->deletedObj(obj); };
1911
1912protected:
1917 virtual Status resume();
1918
1919private:
1920 ScriptCode* m_code;
1921 ScriptContext* m_context;
1922 Status m_state;
1923 ObjList m_stack;
1924 ObjList m_async;
1925 String m_traceId;
1926};
1927
1932class YSCRIPT_API ScriptParser : public GenObject
1933{
1934 YCLASS(ScriptParser,GenObject)
1935public:
1939 virtual ~ScriptParser();
1940
1949 virtual bool parse(const char* text, bool fragment = false, const char* file = 0, int len = -1) = 0;
1950
1957 virtual bool parseFile(const char* name, bool fragment = false);
1958
1962 inline void clear()
1963 { setCode(0); }
1964
1969 inline ScriptCode* code() const
1970 { return m_code; }
1971
1976 inline void setMaxFileLen(unsigned int len)
1977 { m_maxFileLen = len; }
1978
1983 inline unsigned int maxFileLen() const
1984 { return m_maxFileLen; }
1985
1991
1999 virtual ScriptRun* createRunner(ScriptCode* code, ScriptContext* context = 0, const char* title = 0) const;
2000
2007 inline ScriptRun* createRunner(ScriptContext* context = 0, const char* title = 0) const
2008 { return createRunner(code(),context,title); }
2009
2015 virtual bool callable(const String& name);
2016
2017protected:
2022 : m_code(0), m_maxFileLen(500000)
2023 { }
2024
2030
2031private:
2032 ScriptCode* m_code;
2033 unsigned int m_maxFileLen;
2034};
2035
2036class JsFunction;
2037
2042class YSCRIPT_API JsObject : public ScriptContext
2043{
2044 friend class JsFunction;
2045 YCLASS(JsObject,ScriptContext)
2046public:
2051 DumpFunc = 0x01, // Dump functions
2052 DumpProp = 0x02, // Dump non functions (data)
2053 DumpRecursive = 0x10, // Dump recursive (stop on root if not set)
2054 DumpType = 0x20, // Dump type (apply to functions also),
2055 DumpProto = 0x40, // Dump prototype
2056 DumpPropObjType = 0x80, // Dump non basic type for DumpPropOnly whithout DumpType
2057 // Masks
2058 DumpFuncOnly = DumpRecursive | DumpProto | DumpFunc,
2059 DumpPropOnly = DumpRecursive | DumpPropObjType | DumpProp,
2060 };
2061
2068 JsObject(const char* name = "Object", ScriptMutex* mtx = 0, bool frozen = false);
2069
2077 JsObject(ScriptMutex* mtx, const char* name, unsigned int line, bool frozen = 0);
2078
2086 JsObject(GenObject* context, unsigned int line, ScriptMutex* mtx = 0, bool frozen = false);
2087
2091 virtual ~JsObject();
2092
2098 { return m_mutex; }
2099
2106 virtual JsObject* clone(const char* name, const ExpOperation& oper ) const
2107 { return new JsObject(m_mutex,name,oper.lineNumber()); }
2108
2114 inline JsObject* clone(const ExpOperation& oper) const
2115 { return clone(toString(),oper); }
2116
2122 void setPrototype(GenObject* context, const String& objName);
2123
2130 virtual JsObject* copy(ScriptMutex* mtx, const ExpOperation& oper) const;
2131
2136 virtual void fillFieldNames(ObjList& names);
2137
2142 virtual const HashList* getHashListParams() const;
2143
2151 virtual bool hasField(ObjList& stack, const String& name, GenObject* context) const;
2152
2160 virtual NamedString* getField(ObjList& stack, const String& name, GenObject* context) const;
2161
2166 virtual void initConstructor(JsFunction* construct)
2167 { }
2168
2176 virtual JsObject* runConstructor(ObjList& stack, const ExpOperation& oper, GenObject* context);
2177
2186 virtual bool runFunction(ObjList& stack, const ExpOperation& oper, GenObject* context);
2187
2195 virtual bool runField(ObjList& stack, const ExpOperation& oper, GenObject* context);
2196
2204 virtual bool runAssign(ObjList& stack, const ExpOperation& oper, GenObject* context);
2205
2212 virtual ExpOperation* popValue(ObjList& stack, GenObject* context = 0);
2213
2218 virtual void clearField(const String& name)
2219 { params().clearParam(name); }
2220
2227 inline bool setIntField(const char* name, int64_t val)
2228 {
2229 if (!name)
2230 return false;
2231 params().setParam(new ExpOperation(val,name));
2232 return true;
2233 }
2234
2241 inline bool setBoolField(const char* name, bool val)
2242 {
2243 if (!name)
2244 return false;
2245 params().setParam(new ExpOperation(val,name));
2246 return true;
2247
2248 }
2249
2256 inline bool setStringField(const char* name, const char* val)
2257 {
2258 if (!name)
2259 return false;
2260 params().setParam(new ExpOperation(val,name));
2261 return true;
2262 }
2263
2270 inline bool setObjField(const char* name, JsObject* obj)
2271 {
2272 if (!(name && obj))
2273 return false;
2274 params().setParam(new ExpWrapper(obj,name));
2275 return true;
2276 }
2277
2284 bool getIntField(const String& name, int64_t& val);
2285
2292 bool getBoolField(const String& name, bool& val);
2293
2300 bool getStringField(const String& name, String& val);
2301
2308 bool getObjField(const String& name, JsObject*& obj);
2309
2314 inline bool frozen() const
2315 { return m_frozen; }
2316
2320 inline void freeze()
2321 { m_frozen = true; }
2322
2327 inline void lineNo(unsigned int line)
2328 { m_lineNo = line; }
2329
2334 inline unsigned int lineNo() const
2335 { return m_lineNo; }
2336
2343 static void addObject(NamedList& params, const char* name, JsObject* obj);
2344
2351 static void addConstructor(NamedList& params, const char* name, JsObject* obj);
2352
2362 static int extractArgs(JsObject* obj, ObjList& stack, const ExpOperation& oper,
2363 GenObject* context, ObjList& arguments);
2364
2373 inline int extractArgs(ObjList& stack, const ExpOperation& oper, GenObject* context, ObjList& arguments)
2374 { return extractArgs(this,stack,oper,context,arguments); }
2375
2382 static JsObject* buildCallContext(ScriptMutex* mtx, JsObject* thisObj = 0);
2383
2388 static void initialize(ScriptContext* context);
2389
2396 static void setLineForObj(JsObject* obj,unsigned int lineNo, bool recursive);
2397
2402 inline static const String& protoName()
2403 { return s_protoName; }
2404
2411 static void deepCopyParams(NamedList& dst, const NamedList& src, ScriptMutex* mtx);
2412
2419 static void dumpRecursive(const GenObject* obj, String& buf, unsigned int flags = 0xffffffff);
2420
2426 static void printRecursive(const GenObject* obj, unsigned int flags = 0xffffffff);
2427
2434 static ExpOperation* toJSON(const ExpOperation* oper, int spaces);
2435
2436protected:
2445 virtual bool runNative(ObjList& stack, const ExpOperation& oper, GenObject* context);
2446
2451 inline ScriptMutex* mutex() const
2452 { return m_mutex; }
2453
2458 inline void setMutex(ScriptMutex* mtx)
2459 { m_mutex = mtx; }
2460
2468 static inline void toJSON(const NamedString* ns, String& buf, int spaces, int indent = 0)
2469 { internalToJSON(ns,true,buf,spaces,indent); }
2470
2476 static String strEscape(const char* str);
2477
2478private:
2479 static void internalToJSON(const GenObject* obj, bool isStr, String& buf, int spaces, int indent = 0);
2480 static const String s_protoName;
2481 bool m_frozen;
2482 ScriptMutex* m_mutex;
2483 unsigned int m_lineNo; // creation line for this object;
2484};
2485
2490class YSCRIPT_API JsFunction : public JsObject
2491{
2492 YCLASS(JsFunction,JsObject)
2493public:
2499
2509 JsFunction(ScriptMutex* mtx, const char* name, unsigned int line, ObjList* args = 0, long int lbl = 0,
2510 ScriptCode* code = 0);
2511
2521 virtual bool runDefined(ObjList& stack, const ExpOperation& oper, GenObject* context, JsObject* thisObj = 0);
2522
2527 virtual void initConstructor(JsFunction* construct);
2528
2533 inline const ExpFunction* getFunc() const
2534 { return &m_func; }
2535
2540 inline void firstName(const char* name)
2541 { if (m_func.name().null()) const_cast<String&>(m_func.name()) = name; }
2542
2548 inline const String* formalName(unsigned int index) const
2549 { return static_cast<const String*>(m_formal[index]); }
2550
2555 inline long int label() const
2556 { return m_label; }
2557
2564 inline JsObject* copy(ScriptMutex* mtx, const ExpOperation& oper) const
2565 { return copy(mtx,0,oper); }
2566
2574 virtual JsObject* copy(ScriptMutex* mtx, const char* name, const ExpOperation& oper) const;
2575
2582 virtual JsFunction* cloneFunction(const ExpOperation& oper, ScriptMutex* mtx = 0);
2583
2584protected:
2593 virtual bool runNative(ObjList& stack, const ExpOperation& oper, GenObject* context);
2594
2595private:
2596 void init();
2597 ObjList m_formal;
2598 long int m_label;
2599 ScriptCode* m_code;
2600 ExpFunction m_func;
2601};
2602
2607class YSCRIPT_API JsArray : public JsObject
2608{
2609 friend class JsObject;
2610 YCLASS(JsArray,JsObject)
2611public:
2612
2619 JsArray(GenObject* context, unsigned int line, ScriptMutex* mtx = 0);
2620
2628 inline JsArray(ScriptMutex* mtx, const char* name, unsigned int line, bool frozen = false)
2629 : JsObject(mtx,name,line,frozen), m_length(0)
2630 { }
2631
2636 inline int32_t length() const
2637 { return m_length; }
2638
2643 inline void setLength(int32_t len)
2644 { m_length = len; }
2645
2650 void push(ExpOperation* item);
2651
2658 virtual JsObject* copy(ScriptMutex* mtx, const ExpOperation& oper) const;
2659
2668 virtual bool runAssign(ObjList& stack, const ExpOperation& oper, GenObject* context);
2669
2677 virtual bool runField(ObjList& stack, const ExpOperation& oper, GenObject* context);
2678
2683 virtual void initConstructor(JsFunction* construct);
2684
2692 virtual JsObject* runConstructor(ObjList& stack, const ExpOperation& oper, GenObject* context);
2693
2694protected:
2695
2702 virtual JsObject* clone(const char* name, const ExpOperation& oper) const
2703 { return new JsArray(mutex(),name,oper.lineNumber()); }
2704
2713 bool runNative(ObjList& stack, const ExpOperation& oper, GenObject* context);
2714
2715private:
2716
2721 JsArray(ScriptMutex* mtx = 0);
2722
2723 bool runNativeSlice(ObjList& stack, const ExpOperation& oper, GenObject* context);
2724 bool runNativeSplice(ObjList& stack, const ExpOperation& oper, GenObject* context);
2725 bool runNativeSort(ObjList& stack, const ExpOperation& oper, GenObject* context);
2726 int32_t m_length;
2727};
2728
2733class YSCRIPT_API JsRegExp : public JsObject
2734{
2735 YCLASS(JsRegExp,JsObject)
2736public:
2742
2753 JsRegExp(ScriptMutex* mtx, const char* name, unsigned int line, const char* rexp = 0, bool insensitive = false,
2754 bool extended = true, bool frozen = false);
2755
2763 JsRegExp(ScriptMutex* mtx, unsigned int line, const Regexp& rexp, bool frozen = false);
2764
2769 inline const Regexp& regexp() const
2770 { return m_regexp; }
2771
2776 inline Regexp& regexp()
2777 { return m_regexp; }
2778
2786 virtual bool runAssign(ObjList& stack, const ExpOperation& oper, GenObject* context);
2787
2795 virtual JsObject* runConstructor(ObjList& stack, const ExpOperation& oper, GenObject* context);
2796
2803 virtual JsObject* copy(ScriptMutex* mtx, const ExpOperation& oper) const;
2804
2805protected:
2812 virtual JsObject* clone(const char* name, const ExpOperation& oper) const
2813 { return new JsRegExp(mutex(),name,oper.lineNumber(),m_regexp.c_str(),
2814 m_regexp.isCaseInsensitive(),m_regexp.isExtended()); }
2815
2824 bool runNative(ObjList& stack, const ExpOperation& oper, GenObject* context);
2825
2826private:
2827 Regexp m_regexp;
2828};
2829
2834class YSCRIPT_API JsParser : public ScriptParser
2835{
2836 YCLASS(JsParser,ScriptParser)
2837public:
2843 inline JsParser(bool allowLink = true, bool allowTrace = false)
2844 : m_allowLink(allowLink), m_allowTrace(allowTrace)
2845 { }
2846
2855 virtual bool parse(const char* text, bool fragment = false, const char* file = 0, int len = -1);
2856
2862
2870 virtual ScriptRun* createRunner(ScriptCode* code, ScriptContext* context = 0, const char* title = 0) const;
2871
2878 inline ScriptRun* createRunner(ScriptContext* context = 0, const char* title = 0) const
2879 { return createRunner(code(),context,title); }
2880
2886 virtual bool callable(const String& name);
2887
2893 void adjustPath(String& script, bool extraInc = false) const;
2894
2899 inline const String& basePath() const
2900 { return m_basePath; }
2901
2906 inline const String& includePath() const
2907 { return m_includePath; }
2908
2914 inline void basePath(const char* path, const char* incPath = 0)
2915 { m_basePath = path; m_includePath = incPath; }
2916
2921 inline const String& parsedFile() const
2922 { return m_parsedFile; }
2923
2929 bool scriptChanged(const char* file) const;
2930
2938 inline bool scriptChanged(const char* file, const String& path, const String& incPath = String::empty()) const
2939 { return (path != m_basePath) || (incPath != m_includePath) || scriptChanged(file); }
2940
2945 inline void link(bool allowed = true)
2946 { m_allowLink = allowed; }
2947
2952 inline void trace(bool allowed = true)
2953 { m_allowTrace = allowed; }
2954
2962 static ScriptRun::Status eval(const String& text, ExpOperation** result = 0, ScriptContext* context = 0);
2963
2973 static ExpOperation* parseJSON(const char* text, ScriptMutex* mtx = 0, ObjList* stack = 0,
2974 GenObject* context = 0, const ExpOperation* op = 0);
2975
2981 static ExpOperation* nullClone(const char* name = 0);
2982
2988
2993 static bool isNull(const ExpOperation& oper);
2994
2999 static bool isUndefined(const ExpOperation& oper);
3000
3005 static bool isMissing(const ExpOperation& oper);
3006
3011 inline static bool isMissing(const ExpOperation* oper)
3012 { return !oper || isMissing(*oper); }
3013
3018 inline static bool isPresent(const ExpOperation& oper)
3019 { return !isMissing(oper); }
3020
3025 inline static bool isPresent(const ExpOperation* oper)
3026 { return oper && !isMissing(*oper); }
3027
3032 inline static bool isEmpty(const ExpOperation& oper)
3033 { return oper.null() || isMissing(oper); }
3034
3039 inline static bool isEmpty(const ExpOperation* oper)
3040 { return TelEngine::null(oper) || isMissing(*oper); }
3041
3046 inline static bool isFilled(const ExpOperation& oper)
3047 { return oper && !isMissing(oper); }
3048
3053 inline static bool isFilled(const ExpOperation* oper)
3054 { return !isEmpty(oper); }
3055
3056private:
3057 String m_basePath;
3058 String m_includePath;
3059 String m_parsedFile;
3060 bool m_allowLink;
3061 bool m_allowTrace;
3062};
3063
3064}; // namespace TelEngine
3065
3066#endif /* __YATESCRIPT_H */
3067
3068/* vi: set ts=8 sw=4 sts=4 noet: */
A list based Array.
Definition yateclass.h:1846
DebugEnabler(int level=TelEngine::debugLevel(), bool enabled=true)
Definition yateclass.h:319
An expression parser and evaluator.
Definition yatescript.h:237
virtual bool getString(const char *&expr, String &str)
virtual bool null() const
static ExpOperation * popAny(ObjList &stack)
const TokenDict * unaryOps() const
Definition yatescript.h:460
Parser
Definition yatescript.h:243
virtual bool runEvaluate(const ObjList &opcodes, ObjList &stack, GenObject *context=0) const
String dump(const ObjList &codes, bool lineNo=false) const
Definition yatescript.h:438
virtual bool runEvaluate(const ObjVector &opcodes, ObjList &stack, GenObject *context=0, unsigned int index=0) const
bool evaluate(ObjList *results, GenObject *context=0) const
virtual bool getString(ParsePoint &expr)
virtual bool keywordDigit(char c) const
Opcode
Definition yatescript.h:251
virtual bool runAllFields(ObjList &stack, GenObject *context=0) const
virtual const char * getOperator(Opcode oper) const
virtual bool keywordChar(char c) const
ExpOperation * popOpcode()
ExpEvaluator(const TokenDict *operators=0, const TokenDict *unaryOps=0)
virtual bool getEscape(const char *&expr, String &str, char sep)
virtual bool getField(ParsePoint &expr)
bool gotError(const char *error=0, const char *text=0, unsigned int line=0) const
unsigned int lineNumber() const
Definition yatescript.h:408
ExpOperation * addOpcode(const String &value)
virtual bool runField(ObjList &stack, const ExpOperation &oper, GenObject *context=0) const
ExpEvaluator(Parser style)
virtual char skipWhites(ParsePoint &expr)
static unsigned int getLineOf(ExpOperation *op1, ExpOperation *op2=0, ExpOperation *op3=0)
virtual bool getNumber(ParsePoint &expr)
virtual bool getOperand(ParsePoint &expr, bool endOk=true, int precedence=0)
static char condLower(char chr, bool makeLower)
Definition yatescript.h:546
virtual bool getInstruction(ParsePoint &expr, char stop=0, GenObject *nested=0)
bool m_inError
Definition yatescript.h:941
virtual bool runCompile(ParsePoint &expr, const char *stop=0, GenObject *nested=0)
unsigned int m_lineNo
Definition yatescript.h:946
bool simplify()
Definition yatescript.h:394
virtual Opcode getPostfixOperator(ParsePoint &expr, int precedence=0)
int evaluate(Array &results, unsigned int index, GenObject *context=0) const
static void pushOne(ObjList &stack, ExpOperation *oper)
virtual bool keywordLetter(char c) const
virtual bool getSeparator(ParsePoint &expr, bool remove)
ExpOperation * addOpcode(Opcode oper, bool barrier=false, unsigned int line=0)
virtual bool runAssign(ObjList &stack, const ExpOperation &oper, GenObject *context=0) const
virtual Opcode getUnaryOperator(ParsePoint &expr)
void addOpcode(ExpOperation *oper, unsigned int line=0)
virtual int getPrecedence(Opcode oper) const
ExpExtender * extender() const
Definition yatescript.h:467
bool gotError(const char *error, unsigned int line) const
Definition yatescript.h:610
ExpOperation * addOpcode(int64_t value)
int compile(ParsePoint &expr, GenObject *context=0)
virtual void dump(const ExpOperation &oper, String &res, bool lineNo=false) const
ExpOperation * addOpcode(Opcode oper, int64_t value, bool barrier=false)
virtual bool runOperation(ObjList &stack, const ExpOperation &oper, GenObject *context=0) const
bool evaluate(ObjList &results, GenObject *context=0) const
Definition yatescript.h:368
virtual int getKeyword(const char *str) const
virtual int preProcess(ParsePoint &expr, GenObject *context=0)
virtual Opcode getOperator(ParsePoint &expr)
ObjList m_opcodes
Definition yatescript.h:931
virtual ExpOperation * popValue(ObjList &stack, GenObject *context=0) const
const TokenDict * m_unaryOps
Definition yatescript.h:926
ObjList * m_lastOpcode
Definition yatescript.h:936
virtual bool getRightAssoc(Opcode oper) const
const TokenDict * m_operators
Definition yatescript.h:921
bool gotError(const char *error=0, const char *text=0, unsigned int line=0)
ExpOperation * addOpcode(Opcode oper, const String &name, int64_t value=0, bool barrier=false, unsigned int line=0)
Opcode getOperator(const char *&expr, const TokenDict *operators, bool caseInsensitive=false) const
void extender(ExpExtender *ext)
virtual bool runFunction(ObjList &stack, const ExpOperation &oper, GenObject *context=0) const
virtual void dump(String &res, bool lineNo=false) const
ExpOperation * addOpcode(bool value)
int evaluate(NamedList &results, unsigned int index=0, const char *prefix=0, GenObject *context=0) const
void dump(const ObjList &codes, String &res, bool lineNo=false) const
virtual void formatLineNo(String &buf, unsigned int line) const
virtual bool runEvaluate(ObjList &stack, GenObject *context=0) const
bool inError() const
Definition yatescript.h:401
static ExpOperation * popOne(ObjList &stack)
virtual ~ExpEvaluator()
virtual bool trySimplify()
virtual char skipComments(ParsePoint &expr, GenObject *context=0)
virtual bool getSimple(ParsePoint &expr, bool constOnly=false)
bool runCompile(ParsePoint &expr, char stop, GenObject *nested=0)
ExpEvaluator(const ExpEvaluator &original)
const TokenDict * operators() const
Definition yatescript.h:453
virtual bool getFunction(ParsePoint &expr)
String dump(bool lineNo=false) const
Definition yatescript.h:446
bool gotError(const char *error, unsigned int line)
Definition yatescript.h:619
ExpEvaluator extending interface.
Definition yatescript.h:56
virtual NamedString * getField(ObjList &stack, const String &name, GenObject *context) const
virtual bool runAssign(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual RefObject * refObj()
virtual bool hasField(ObjList &stack, const String &name, GenObject *context) const
virtual bool runFunction(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual bool runField(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual ~ExpExtender()
Definition yatescript.h:61
Helper class to declare a native function.
Definition yatescript.h:1207
ExpFunction(const char *name, long int argc=0, bool barrier=false)
Definition yatescript.h:1216
virtual bool valBoolean(bool defVal=false) const
Definition yatescript.h:1225
virtual ExpOperation * clone(const char *name) const
A single operation in an expression.
Definition yatescript.h:958
ExpOperation(const String &value, const char *name=0, bool autoNum=false)
Definition yatescript.h:998
ExpOperation(const ExpOperation &original, const char *name, bool copyType=true)
Definition yatescript.h:985
bool isNumber() const
Definition yatescript.h:1113
bool barrier() const
Definition yatescript.h:1120
ExpOperation(ExpEvaluator::Opcode oper, const char *name, const char *value, bool barrier=false)
Definition yatescript.h:1061
ExpOperation * clone() const
Definition yatescript.h:1182
unsigned int lineNumber() const
Definition yatescript.h:1127
virtual const char * typeOf() const
ExpOperation(ExpEvaluator::Opcode oper, const char *name=0, int64_t value=nonInteger(), bool barrier=false)
Definition yatescript.h:1048
virtual int64_t toNumber() const
int64_t number() const
Definition yatescript.h:1099
virtual bool valBoolean(bool defVal=false) const
bool isInteger() const
Definition yatescript.h:1092
void lineNumber(unsigned int line)
Definition yatescript.h:1134
ExpEvaluator::Opcode opcode() const
Definition yatescript.h:1085
ExpOperation(const char *value, const char *name=0)
Definition yatescript.h:1012
ExpOperation(bool value, const char *name=0)
Definition yatescript.h:1034
virtual int64_t valInteger(int64_t defVal=0) const
static int64_t nonInteger()
Definition yatescript.h:966
int64_t operator=(int64_t num)
Definition yatescript.h:1142
virtual ExpOperation * copy(ScriptMutex *mtx) const
Definition yatescript.h:1190
ExpOperation(const ExpOperation &original)
Definition yatescript.h:973
ExpOperation(int64_t value, const char *name=0)
Definition yatescript.h:1023
ExpOperation(ExpEvaluator::Opcode oper, const char *name, const char *value, int64_t number, bool barrier)
Definition yatescript.h:1075
virtual ExpOperation * clone(const char *name) const
bool isBoolean() const
Definition yatescript.h:1106
Object wrapper for evaluation.
Definition yatescript.h:1241
virtual void * getObject(const String &name) const
ExpWrapper(GenObject *object, const char *name=0, bool barrier=false)
Definition yatescript.h:1249
GenObject * object() const
Definition yatescript.h:1310
virtual const char * typeOf() const
virtual bool valBoolean(bool defVal=false) const
ExpWrapper(ExpEvaluator::Opcode opcode, GenObject *object, const char *name=0)
Definition yatescript.h:1261
virtual ~ExpWrapper()
Definition yatescript.h:1269
virtual ExpOperation * copy(ScriptMutex *mtx) const
virtual ExpOperation * clone(const char *name) const
Definition yateclass.h:1049
A hashed object list class.
Definition yateclass.h:3658
virtual JsObject * runConstructor(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual JsObject * copy(ScriptMutex *mtx, const ExpOperation &oper) const
virtual bool runAssign(ObjList &stack, const ExpOperation &oper, GenObject *context)
JsArray(ScriptMutex *mtx, const char *name, unsigned int line, bool frozen=false)
Definition yatescript.h:2628
bool runNative(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual JsObject * clone(const char *name, const ExpOperation &oper) const
Definition yatescript.h:2702
virtual void initConstructor(JsFunction *construct)
int32_t length() const
Definition yatescript.h:2636
void push(ExpOperation *item)
virtual bool runField(ObjList &stack, const ExpOperation &oper, GenObject *context)
void setLength(int32_t len)
Definition yatescript.h:2643
JsArray(GenObject *context, unsigned int line, ScriptMutex *mtx=0)
Javascript Function.
Definition yatescript.h:2491
JsFunction(ScriptMutex *mtx, const char *name, unsigned int line, ObjList *args=0, long int lbl=0, ScriptCode *code=0)
const String * formalName(unsigned int index) const
Definition yatescript.h:2548
long int label() const
Definition yatescript.h:2555
JsObject * copy(ScriptMutex *mtx, const ExpOperation &oper) const
Definition yatescript.h:2564
virtual JsObject * copy(ScriptMutex *mtx, const char *name, const ExpOperation &oper) const
const ExpFunction * getFunc() const
Definition yatescript.h:2533
virtual void initConstructor(JsFunction *construct)
virtual bool runDefined(ObjList &stack, const ExpOperation &oper, GenObject *context, JsObject *thisObj=0)
virtual bool runNative(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual JsFunction * cloneFunction(const ExpOperation &oper, ScriptMutex *mtx=0)
JsFunction(ScriptMutex *mtx=0)
void firstName(const char *name)
Definition yatescript.h:2540
Javascript Object.
Definition yatescript.h:2043
virtual NamedString * getField(ObjList &stack, const String &name, GenObject *context) const
virtual void fillFieldNames(ObjList &names)
static ExpOperation * toJSON(const ExpOperation *oper, int spaces)
virtual JsObject * runConstructor(ObjList &stack, const ExpOperation &oper, GenObject *context)
bool getIntField(const String &name, int64_t &val)
virtual JsObject * copy(ScriptMutex *mtx, const ExpOperation &oper) const
virtual bool runAssign(ObjList &stack, const ExpOperation &oper, GenObject *context)
static void toJSON(const NamedString *ns, String &buf, int spaces, int indent=0)
Definition yatescript.h:2468
virtual JsObject * clone(const char *name, const ExpOperation &oper) const
Definition yatescript.h:2106
unsigned int lineNo() const
Definition yatescript.h:2334
static int extractArgs(JsObject *obj, ObjList &stack, const ExpOperation &oper, GenObject *context, ObjList &arguments)
static void dumpRecursive(const GenObject *obj, String &buf, unsigned int flags=0xffffffff)
bool getStringField(const String &name, String &val)
static String strEscape(const char *str)
DumpFlags
Definition yatescript.h:2050
static void initialize(ScriptContext *context)
bool frozen() const
Definition yatescript.h:2314
virtual bool hasField(ObjList &stack, const String &name, GenObject *context) const
JsObject(const char *name="Object", ScriptMutex *mtx=0, bool frozen=false)
static JsObject * buildCallContext(ScriptMutex *mtx, JsObject *thisObj=0)
bool setStringField(const char *name, const char *val)
Definition yatescript.h:2256
virtual void initConstructor(JsFunction *construct)
Definition yatescript.h:2166
static const String & protoName()
Definition yatescript.h:2402
bool setObjField(const char *name, JsObject *obj)
Definition yatescript.h:2270
virtual bool runFunction(ObjList &stack, const ExpOperation &oper, GenObject *context)
static void addConstructor(NamedList &params, const char *name, JsObject *obj)
static void setLineForObj(JsObject *obj, unsigned int lineNo, bool recursive)
void setPrototype(GenObject *context, const String &objName)
virtual bool runField(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual const HashList * getHashListParams() const
void setMutex(ScriptMutex *mtx)
Definition yatescript.h:2458
void lineNo(unsigned int line)
Definition yatescript.h:2327
static void deepCopyParams(NamedList &dst, const NamedList &src, ScriptMutex *mtx)
bool setBoolField(const char *name, bool val)
Definition yatescript.h:2241
void freeze()
Definition yatescript.h:2320
virtual ~JsObject()
static void addObject(NamedList &params, const char *name, JsObject *obj)
virtual void clearField(const String &name)
Definition yatescript.h:2218
int extractArgs(ObjList &stack, const ExpOperation &oper, GenObject *context, ObjList &arguments)
Definition yatescript.h:2373
bool getObjField(const String &name, JsObject *&obj)
static void printRecursive(const GenObject *obj, unsigned int flags=0xffffffff)
virtual bool runNative(ObjList &stack, const ExpOperation &oper, GenObject *context)
ScriptMutex * mutex() const
Definition yatescript.h:2451
bool getBoolField(const String &name, bool &val)
virtual ScriptMutex * mutex()
Definition yatescript.h:2097
JsObject(GenObject *context, unsigned int line, ScriptMutex *mtx=0, bool frozen=false)
virtual ExpOperation * popValue(ObjList &stack, GenObject *context=0)
bool setIntField(const char *name, int64_t val)
Definition yatescript.h:2227
JsObject * clone(const ExpOperation &oper) const
Definition yatescript.h:2114
JsObject(ScriptMutex *mtx, const char *name, unsigned int line, bool frozen=0)
const String & includePath() const
Definition yatescript.h:2906
static ExpOperation * parseJSON(const char *text, ScriptMutex *mtx=0, ObjList *stack=0, GenObject *context=0, const ExpOperation *op=0)
static bool isEmpty(const ExpOperation *oper)
Definition yatescript.h:3039
static bool isFilled(const ExpOperation *oper)
Definition yatescript.h:3053
static bool isNull(const ExpOperation &oper)
const String & basePath() const
Definition yatescript.h:2899
virtual bool callable(const String &name)
static bool isMissing(const ExpOperation &oper)
static bool isEmpty(const ExpOperation &oper)
Definition yatescript.h:3032
static bool isUndefined(const ExpOperation &oper)
void trace(bool allowed=true)
Definition yatescript.h:2952
JsParser(bool allowLink=true, bool allowTrace=false)
Definition yatescript.h:2843
static bool isMissing(const ExpOperation *oper)
Definition yatescript.h:3011
void basePath(const char *path, const char *incPath=0)
Definition yatescript.h:2914
bool scriptChanged(const char *file) const
static bool isFilled(const ExpOperation &oper)
Definition yatescript.h:3046
virtual bool parse(const char *text, bool fragment=false, const char *file=0, int len=-1)
const String & parsedFile() const
Definition yatescript.h:2921
static JsObject * nullObject()
static bool isPresent(const ExpOperation *oper)
Definition yatescript.h:3025
ScriptRun * createRunner(ScriptContext *context=0, const char *title=0) const
Definition yatescript.h:2878
static bool isPresent(const ExpOperation &oper)
Definition yatescript.h:3018
virtual ScriptContext * createContext() const
static ScriptRun::Status eval(const String &text, ExpOperation **result=0, ScriptContext *context=0)
void adjustPath(String &script, bool extraInc=false) const
void link(bool allowed=true)
Definition yatescript.h:2945
static ExpOperation * nullClone(const char *name=0)
virtual ScriptRun * createRunner(ScriptCode *code, ScriptContext *context=0, const char *title=0) const
bool scriptChanged(const char *file, const String &path, const String &incPath=String::empty()) const
Definition yatescript.h:2938
virtual JsObject * runConstructor(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual JsObject * copy(ScriptMutex *mtx, const ExpOperation &oper) const
virtual bool runAssign(ObjList &stack, const ExpOperation &oper, GenObject *context)
bool runNative(ObjList &stack, const ExpOperation &oper, GenObject *context)
JsRegExp(ScriptMutex *mtx=0)
virtual JsObject * clone(const char *name, const ExpOperation &oper) const
Definition yatescript.h:2812
JsRegExp(ScriptMutex *mtx, unsigned int line, const Regexp &rexp, bool frozen=false)
const Regexp & regexp() const
Definition yatescript.h:2769
Regexp & regexp()
Definition yatescript.h:2776
JsRegExp(ScriptMutex *mtx, const char *name, unsigned int line, const char *rexp=0, bool insensitive=false, bool extended=true, bool frozen=false)
bool recursive() const
Mutex(bool recursive=false, const char *name=0)
A named string container class.
Definition yateclass.h:5016
A named string class.
Definition yateclass.h:3481
NamedString(const char *name, const char *value=0)
virtual const String & toString() const
const String & name() const
Definition yateclass.h:3495
An object list class.
Definition yateclass.h:1454
A vector holding GenObjects.
Definition yateclass.h:1692
String m_fileName
Definition yatescript.h:229
char m_foundSep
Definition yatescript.h:214
unsigned int m_count
Definition yatescript.h:209
ParsePoint & operator=(ParsePoint &parsePoint)
ParsePoint & operator++()
Definition yatescript.h:167
const char * m_searchedSeps
Definition yatescript.h:204
unsigned int m_lineNo
Definition yatescript.h:219
ParsePoint & operator=(const char *newExpr)
Definition yatescript.h:158
ParsePoint(const char *&expr, ExpEvaluator *eval=0, unsigned int lineNo=0, const char *fileName=0, const char *seps=0)
Definition yatescript.h:132
ParsePoint & operator=(unsigned int line)
ParsePoint & operator++(int unused)
Definition yatescript.h:176
unsigned lineNumber() const
Definition yatescript.h:193
const char * m_expr
Definition yatescript.h:199
char firstChar()
Definition yatescript.h:186
ExpEvaluator * m_eval
Definition yatescript.h:224
Definition yateclass.h:1174
A regexp matching class.
Definition yateclass.h:3271
Asynchronous execution support.
Definition yatescript.h:1690
virtual ~ScriptAsync()
Definition yatescript.h:1704
ScriptRun * runner()
Definition yatescript.h:1711
virtual bool run()=0
ScriptAsync(ScriptRun *owner)
Definition yatescript.h:1697
Script parsed code.
Definition yatescript.h:1620
virtual bool evaluate(ScriptRun &runner, ObjList &results) const =0
virtual bool initialize(ScriptContext *context) const =0
virtual ScriptRun * createRunner(ScriptContext *context, const char *title=0)
Definition yatescript.h:1643
virtual void getFileLine(unsigned int line, String &fileName, unsigned int &fileLine, bool wholePath=true)
Definition yatescript.h:1653
Script execution context.
Definition yatescript.h:1431
virtual NamedString * getField(ObjList &stack, const String &name, GenObject *context) const
virtual void fillFieldNames(ObjList &names)
virtual ScriptMutex * mutex()=0
virtual bool runAssign(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual void * getObject(const String &name) const
virtual void deletedObj(GenObject *obj)
Definition yatescript.h:1594
virtual void addFields(const NamedList &list, const char *skipPrefix="__")
virtual RefObject * refObj()
Definition yatescript.h:1480
virtual void trackObjs(unsigned int track=0)
Definition yatescript.h:1601
virtual bool hasField(ObjList &stack, const String &name, GenObject *context) const
bool runMatchingField(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual ObjList * countAllocations()
Definition yatescript.h:1608
virtual void createdObj(GenObject *obj)
Definition yatescript.h:1586
virtual bool copyFields(ObjList &stack, const ScriptContext &original, GenObject *context)
virtual bool runFunction(ObjList &stack, const ExpOperation &oper, GenObject *context)
virtual const String & toString() const
Definition yatescript.h:1466
static void fillFieldNames(ObjList &names, const HashList &list)
virtual bool runField(ObjList &stack, const ExpOperation &oper, GenObject *context)
ScriptContext(const char *name=0)
Definition yatescript.h:1437
const NamedList & params() const
Definition yatescript.h:1452
virtual NamedList * nativeParams() const
Definition yatescript.h:1459
NamedList & params()
Definition yatescript.h:1445
static void fillFieldNames(ObjList &names, const NamedList &list, bool checkDupl=true, const char *skip=0)
Script context serialization mutex.
Definition yatescript.h:1390
virtual void objDeleted(GenObject *obj)=0
bool objTrack() const
Definition yatescript.h:1418
ScriptMutex(bool recursive, const char *name)
Definition yatescript.h:1398
virtual void objCreated(GenObject *obj)=0
void setCode(ScriptCode *code)
virtual bool callable(const String &name)
ScriptParser()
Definition yatescript.h:2021
virtual bool parseFile(const char *name, bool fragment=false)
virtual bool parse(const char *text, bool fragment=false, const char *file=0, int len=-1)=0
unsigned int maxFileLen() const
Definition yatescript.h:1983
virtual ~ScriptParser()
ScriptRun * createRunner(ScriptContext *context=0, const char *title=0) const
Definition yatescript.h:2007
virtual ScriptContext * createContext() const
void clear()
Definition yatescript.h:1962
void setMaxFileLen(unsigned int len)
Definition yatescript.h:1976
virtual ScriptRun * createRunner(ScriptCode *code, ScriptContext *context=0, const char *title=0) const
ScriptCode * code() const
Definition yatescript.h:1969
Script runtime execution.
Definition yatescript.h:1729
const char * textState() const
Definition yatescript.h:1788
virtual Status run(bool init=true)
virtual Status call(const String &name, ObjList &args, ExpOperation *thisObj=0, ExpOperation *scopeObj=0)
virtual bool pause()
ObjList & stack()
Definition yatescript.h:1795
ScriptRun * clone() const
Definition yatescript.h:1809
Status state() const
Definition yatescript.h:1774
virtual bool callable(const String &name)
void objCreated(GenObject *obj)
Definition yatescript.h:1907
virtual const String & currentFileName(bool wholePath=false) const
Definition yatescript.h:1882
Status
Definition yatescript.h:1737
ScriptRun(ScriptCode *code, ScriptContext *context=0)
bool runAssign(const ExpOperation &oper, GenObject *context=0)
static const char * textState(Status state)
virtual Status execute()
virtual ~ScriptRun()
virtual unsigned int currentLineNo() const
Definition yatescript.h:1874
virtual const String & traceId() const
Definition yatescript.h:1889
void objDeleted(GenObject *obj)
Definition yatescript.h:1909
const ObjList & stack() const
Definition yatescript.h:1802
virtual bool appendAsync(ScriptAsync *oper)
virtual bool insertAsync(ScriptAsync *oper)
virtual void setTraceId(const String &tid)
Definition yatescript.h:1896
ScriptContext * context() const
Definition yatescript.h:1768
ScriptCode * code() const
Definition yatescript.h:1761
virtual Status reset(bool init=false)
virtual Status resume()
ScriptRun * runner()
Definition yatescript.h:1678
ScriptStack(ScriptRun *owner)
Definition yatescript.h:1670
A C-style string handling class.
Definition yateclass.h:2131
const char * c_str() const
Definition yateclass.h:2236
int64_t toInt64(int64_t defvalue=0, int base=0, int64_t minvalue=LLONG_MIN, int64_t maxvalue=LLONG_MAX, bool clamp=true) const
bool null() const
Definition yateclass.h:2265
static const char * boolText(bool value)
Definition yateclass.h:2229
bool toBoolean(bool defvalue=false) const
String & operator=(const String &value)
Definition yateclass.h:2567
static const String & empty()
virtual bool evalWhere(GenObject *context=0)
virtual ~TableEvaluator()
virtual unsigned int evalLimit(GenObject *context=0)
TableEvaluator(ExpEvaluator::Parser style)
TableEvaluator(const TableEvaluator &original)
TableEvaluator(const TokenDict *operators, const TokenDict *unaryOps)
void extender(ExpExtender *ext)
virtual bool evalSelect(ObjList &results, GenObject *context=0)
Definition yatemime.h:34
Definition yateclass.h:848