char *ConsoleCommand::ConsoleCompleteHelper(const char *word, int state) { static std::vector<String> matches; if (state == 0) { if (!l_Url) matches = ConsoleHandler::GetAutocompletionSuggestions(word, *l_ScriptFrame); else { Array::Ptr suggestions; /* Remote debug console. */ try { suggestions = AutoCompleteScript(l_Session, word, l_ScriptFrame->Sandboxed); } catch (...) { return nullptr; //Errors are just ignored here. } matches.clear(); ObjectLock olock(suggestions); std::copy(suggestions->Begin(), suggestions->End(), std::back_inserter(matches)); } } if (state >= static_cast<int>(matches.size())) return nullptr; return strdup(matches[state].CStr()); }
static Array::Ptr ArraySort(const std::vector<Value>& args) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast<Array::Ptr>(vframe->Self); Array::Ptr arr = self->ShallowClone(); if (args.empty()) { ObjectLock olock(arr); std::sort(arr->Begin(), arr->End()); } else { Function::Ptr function = args[0]; if (vframe->Sandboxed && !function->IsSideEffectFree()) BOOST_THROW_EXCEPTION(ScriptError("Sort function must be side-effect free.")); ObjectLock olock(arr); std::sort(arr->Begin(), arr->End(), boost::bind(ArraySortCmp, args[0], _1, _2)); } return arr; }
static Value FunctionCallV(const Value& thisArg, const Array::Ptr& args) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Function::Ptr self = static_cast<Function::Ptr>(vframe->Self); REQUIRE_NOT_NULL(self); std::vector<Value> uargs; { ObjectLock olock(args); uargs = std::vector<Value>(args->Begin(), args->End()); } return self->InvokeThis(thisArg, uargs); }
char *ConsoleCommand::ConsoleCompleteHelper(const char *word, int state) { static std::vector<String> matches; if (state == 0) { if (!l_ApiClient) matches = ConsoleHandler::GetAutocompletionSuggestions(word, *l_ScriptFrame); else { boost::mutex mutex; boost::condition_variable cv; bool ready = false; Array::Ptr suggestions; l_ApiClient->AutocompleteScript(l_Session, word, l_ScriptFrame->Sandboxed, std::bind(&ConsoleCommand::AutocompleteScriptCompletionHandler, std::ref(mutex), std::ref(cv), std::ref(ready), _1, _2, std::ref(suggestions))); { boost::mutex::scoped_lock lock(mutex); while (!ready) cv.wait(lock); } matches.clear(); ObjectLock olock(suggestions); std::copy(suggestions->Begin(), suggestions->End(), std::back_inserter(matches)); } } if (state >= static_cast<int>(matches.size())) return nullptr; return strdup(matches[state].CStr()); }