/* process_pending_events -- * Process currently pending events * by calling event-hook and event-idle * until no events are left. */ void process_pending_events(void) { MM_ENTER; int timer_fired = 0; call_spoll(); at *hndl = ev_peek(); for(;;) { while (hndl) { /* Call the handler method <handle> */ at *event = event_get(hndl, true); if (CONSP(event)) { class_t *cl = classof(hndl); at *m = getmethod(cl, at_handle); if (m) { at *args = new_cons(quote(event), NIL); send_message(NIL, hndl, at_handle, args); } } /* Check for more events */ call_spoll(); hndl = ev_peek(); } /* Check for timer events */ if (timer_fired) break; timer_fire(); timer_fired = 1; hndl = ev_peek(); } MM_EXIT; }
void fastscan() { struct methodchain *methodstack=NULL; struct namer *namer=allocatenamer(); struct genhashtable *calltable=genallocatehashtable((int (*)(void *)) &hashmethod, (int (*)(void *,void *)) &comparemethod); struct genhashtable *statictable=genallocatehashtable((int (*)(void *)) &hashmethod, (int (*)(void *,void *)) &comparemethod); while(1) { char *line=getline(); #ifdef DEBUG printf("------------------------------------------------------\n"); #endif if (line==0) { outputinfo(namer, calltable,statictable); return; } #ifdef DEBUG printf("[%s]\n",line); #endif switch(line[0]) { case 'C': break; case 'O': break; case 'N': { /* Natively created object...may not have pointer to it*/ char buf[1000]; sscanf(line,"NI: %s",buf); getclass(namer,buf); } break; case 'U': { /* New object*/ char buf[1000]; sscanf(line,"UI: %s",buf); getclass(namer,buf); } break; case 'K': break; case 'L': /* Do Load */ { struct localvars * lv=(struct localvars *) calloc(1, sizeof(struct localvars)); long long uid, objuid; char fieldname[600], classname[600], fielddesc[600]; sscanf(line,"LF: %s %ld %s %lld %s %s %s %lld",lv->name,&lv->linenumber, lv->sourcename, &objuid, classname, fieldname, fielddesc, &uid); getfield(namer,classname, fieldname,fielddesc); } break; case 'G': /* Do Array Load */ break; case 'M': /* Mark Local*/ break; case 'I': /* Enter Method*/ { struct methodchain* methodchain=(struct methodchain *) calloc(1,sizeof(struct methodchain)); char classname[600], methodname[600],signature[600]; int isStatic; sscanf(line,"IM: %s %s %s %d", classname, methodname, signature, &isStatic); methodchain->method=getmethod(namer, classname, methodname, signature); methodchain->caller=methodstack; if (!gencontains(statictable, methodchain->method)) { int * staticflag=(int *)malloc(sizeof (int)); *staticflag=isStatic; genputtable(statictable, methodchain->method, staticflag); } if (methodstack!=NULL) { if (!gencontains(calltable, methodchain->method)) { struct methodchain *mc=(struct methodchain *) calloc(1,sizeof(struct methodchain)); mc->method=methodstack->method; genputtable(calltable, methodchain->method, mc); } else { struct methodchain *tosearch=(struct methodchain *)gengettable(calltable, methodchain->method); while(tosearch->method!=methodstack->method) { if (tosearch->caller==NULL) { struct methodchain *mc=(struct methodchain *) calloc(1,sizeof(struct methodchain)); mc->method=methodstack->method; tosearch->caller=mc; break; } tosearch=tosearch->caller; } } } methodstack=methodchain; } break; case 'R': /* Return from method */ { struct methodchain* caller=methodstack->caller; free(methodstack); methodstack=caller; } break; case 'F': /* Field Assignment */ { long long suid; long long duid; char classname[1000]; char fieldname[1000]; char descname[1000]; sscanf(line,"FA: %lld %s %s %s %lld", &suid, classname, fieldname, descname, &duid); getfield(namer, classname, fieldname, descname); } break; case 'A': /* Array Assignment */ { long long suid; long long duid; long index; sscanf(line,"AA: %lld %ld %lld", &suid, &index, &duid); } break; } free(line); } }