bool CatchBlock::proc(CObjRef exn, VariableEnvironment &env) const { if (exn.instanceof(m_ename.c_str())) { if (m_body) { env.get(String(m_vname)) = exn; m_body->eval(env); } return true; } return false; }
Object c_StaticExceptionWaitHandle::ti_create(const char* cls, CObjRef exception) { if (!exception.instanceof("Exception")) { STATIC_METHOD_INJECTION_BUILTIN(StaticExceptionWaitHandle, StaticExceptionWaitHandle::create); Object e(SystemLib::AllocInvalidArgumentExceptionObject( "Expected exception to be an instance of Exception")); throw e; } p_StaticExceptionWaitHandle wh = NEWOBJ(c_StaticExceptionWaitHandle)(); tvWriteObject(exception.get(), &wh->m_resultOrException); return wh; }
Object c_ContinuationWaitHandle::ti_start(const char* cls, CObjRef continuation) { AsioSession* session = AsioSession::Get(); if (UNLIKELY(!continuation.instanceof(SystemLib::s_ContinuationClass))) { Object e(SystemLib::AllocInvalidArgumentExceptionObject( "Expected continuation to be an instance of Continuation")); throw e; } uint16_t depth = session->getCurrentWaitHandleDepth(); if (UNLIKELY(depth >= MAX_DEPTH)) { Object e(SystemLib::AllocInvalidOperationExceptionObject( "Asio stack overflow")); throw e; } c_Continuation* cont = static_cast<c_Continuation*>(continuation.get()); if (!cont->m_waitHandle.isNull()) { if (session->isInContext()) { // throws if cross-context cycle found cont->m_waitHandle->enterContext(session->getCurrentContextIdx()); } return cont->m_waitHandle; } if (UNLIKELY(cont->m_index != -1)) { assert(cont->m_running); Object e(SystemLib::AllocInvalidOperationExceptionObject( "Encountered an attempt to start currently running continuation")); throw e; } p_ContinuationWaitHandle wh = NEWOBJ(c_ContinuationWaitHandle)(); wh->start(cont, depth + 1); if (UNLIKELY(session->hasOnStartedCallback())) { session->onStarted(wh); } return wh; }
bool f_is_a(CObjRef object, CStrRef class_name) { return object.instanceof(class_name); }
bool f_hphp_instanceof(CObjRef obj, CStrRef name) { return obj.instanceof(name.data()); }
bool CatchBlock::match(CObjRef exn) const { return exn.instanceof(m_ename.c_str()); }