static Symbol* task_proc(NodeFunction* pFunc, ParseInfo* pinfo, std::vector<Symbol*>* pvecSyms) { if(!pFunc || !pinfo) return 0; SymbolTable *pTable = new SymbolTable(); SymbolArray arrArgs; arrArgs.SetDontDel(1); const NodeFunction *pThreadFunc = 0; RuntimeInfo *pruninfo2 = new RuntimeInfo(); pThreadFunc = (NodeFunction*)pFunc/*->clone()->optimize()*/; if(pvecSyms) arrArgs.GetArr() = *pvecSyms; arrArgs.UpdateIndices(); pTable->InsertSymbol(T_STR"<args>", &arrArgs); Symbol* pRet = pThreadFunc->eval(*pinfo, *pruninfo2, pTable); pTable->RemoveSymbolNoDelete(T_STR"<ret>"); pTable->RemoveSymbolNoDelete(T_STR"<args>"); if(pTable) delete pTable; if(pvecSyms) delete_symbols(pvecSyms); //if(pThreadFunc) delete pThreadFunc; delete pruninfo2; return pRet; }
double ModCalc::calc (c_char exp) { error[0] = 0; braces = 0; top = bottom = NULL; scan_symbols (exp); if (error[0] != 0) return 0; double result = parse_explist (); if (error[0] == 0) ans = result; delete_symbols (); return result; }