static void Cbev_dataCB_dispatcher(enum e_buffereventCB cat, struct bufferevent *bev, void *arg) { kbuffereventCBArg *cbArg = arg; KonohaContext *kctx = cbArg->kctx; BEGIN_UnusedStack(lsfp); KClass *returnType = kMethod_GetReturnType(cbArg->kcb[cat]->method); KUnsafeFieldSet(lsfp[0].asObject, K_NULL); KUnsafeFieldSet(lsfp[1].asObject, (kObject *)cbArg->cbev); KUnsafeFieldSet(lsfp[2].asObject, (kObject *)cbArg->arg); KStackSetFuncAll(lsfp, KLIB Knull(kctx, returnType), 0/*UL*/, cbArg->kcb[cat], 2); KStackCall(lsfp); END_UnusedStack(); }
/* * cbufferevent Class (*buffer_event_cb)() 1st stage callback from event_base_dispatch(), NEVER BE CALLED FROM OTHERS. */ static void Cbev_eventCB_1st(struct bufferevent *bev, short what, void *arg) { kbuffereventCBArg *cbArg = arg; KonohaContext *kctx = cbArg->kctx; BEGIN_UnusedStack(lsfp); KClass *returnType = kMethod_GetReturnType(cbArg->kcb[BEV_EventCB]->method); KUnsafeFieldSet(lsfp[0].asObject, K_NULL); KUnsafeFieldSet(lsfp[1].asObject, (kObject *)cbArg->cbev); lsfp[2].intValue = what; KUnsafeFieldSet(lsfp[3].asObject, (kObject *)cbArg->arg); KStackSetFuncAll(lsfp, KLIB Knull(kctx, returnType), 0/*UL*/, cbArg->kcb[BEV_EventCB], 3); KStackCall(lsfp); END_UnusedStack(); }
/* * cevent_base Class 1st stage callback from event_base_dispatch(), NEVER BE CALLED FROM OTHERS. */ static void cevent_callback_1st(evutil_socket_t evd, short event, void *arg) { keventCBArg *cbArg = arg; KonohaContext *kctx = cbArg->kctx; BEGIN_UnusedStack(lsfp); KClass *returnType = kMethod_GetReturnType(cbArg->kcb->method); KUnsafeFieldSet(lsfp[0].asObject, K_NULL); lsfp[1].intValue = evd; lsfp[2].intValue = event; KUnsafeFieldSet(lsfp[3].asObject, (kObject *)cbArg->arg); KStackSetFuncAll(lsfp, KLIB Knull(kctx, returnType), 0/*UL*/, cbArg->kcb, 3); KStackCall(lsfp); END_UnusedStack(); }
//## Prototype Prototype.(Object o); static KMETHOD Prototype_(KonohaContext *kctx, KonohaStack *sfp) { ksymbol_t symbol = KDynamicCallSymbol(sfp); KKeyValue *kvs = KLIB kObjectProto_GetKeyValue(kctx, sfp[0].asObject, symbol); if(kvs != NULL) { KClass *c = KClass_(kvs->attrTypeId); kParam *cparam = KClass_cparam(c); if(KClass_isFunc(c) && cparam->psize <= KDynamicCallArgument(sfp)) { KClass *thisClass = kObject_class(sfp[0].asObject), *returnType = KGetReturnType(sfp); kFunc *fo = (kFunc *)kvs->FuncValue; KStackSetFunc(sfp, fo); KStackDynamicTypeCheck(kctx, sfp, fo->method, thisClass); KStackCall(sfp); KStackReturnTypeCheck(kctx, sfp, fo->method, thisClass, returnType); } } }
static int konoha_handler(request_rec *r) { //konoha_config_t *conf = ap_get_module_config( // r->server->module_config, &konoha_module); if(strcmp(r->handler, "konoha-script")) { return DECLINED; } //if(r->method_number != M_GET) { // TODO // return HTTP_METHOD_NOT_ALLOWED; //} KClass *cRequest; KonohaContext* konoha = konoha_create(&cRequest, 1); //assert(cRequest != NULL); r->content_encoding = "utf-8"; ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, "filename=%s", r->filename); if(Konoha_LoadScript(konoha, r->filename)) { return DECLINED; } KonohaContext *kctx = konoha; kNameSpace *ns = KNULL(NameSpace); kMethod *mtd = KLIB kNameSpace_GetMethodByParamSizeNULL(kctx, ns, KClass_System, KMethodName_("handler"), -1, KMethodMatch_NoOption); // fixme if(mtd == NULL) { ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, "System.handler() not found"); return -1; } /* XXX: We assume Request Object may not be freed by GC */ kObject *req_obj = KLIB new_kObject(kctx, OnStack, cRequest, (uintptr_t)r); BEGIN_UnusedStack(lsfp); KStackSetObjectValue(lsfp[K_CALLDELTA+0].asObject, K_NULL); KStackSetObjectValue(lsfp[K_CALLDELTA+1].asObject, req_obj); { KonohaStack *sfp = lsfp + K_CALLDELTA; KStackSetMethodAll(sfp, KLIB Knull(kctx, KClass_Int), 0/*UL*/, mtd, 1); KStackCall(sfp); } END_UnusedStack(); int ret = lsfp[0].intValue; Konoha_Destroy(konoha); return ret; }