static void DaoObject_Print( DaoValue *self0, DaoProcess *proc, DaoStream *stream, DMap *cycData ) { int ec; char buf[50]; DaoObject *self = & self0->xObject; sprintf( buf, "[%p]", self ); if( self0 == self->defClass->objType->value ){ DaoStream_WriteString( stream, self->defClass->className ); DaoStream_WriteChars( stream, "[null]" ); return; } if( cycData != NULL && DMap_Find( cycData, self ) != NULL ){ DaoStream_WriteString( stream, self->defClass->className ); DaoStream_WriteChars( stream, buf ); return; } if( cycData ) MAP_Insert( cycData, self, self ); DString_SetChars( proc->mbstring, "serialize" ); DaoValue_Clear( & proc->stackValues[0] ); ec = DaoObject_InvokeMethod( self, proc->activeObject, proc, proc->mbstring, NULL,0,1,1 ); if( ec && ec != DAO_ERROR_FIELD_NOTEXIST ){ DaoProcess_RaiseException( proc, daoExceptionNames[ec], proc->mbstring->chars, NULL ); }else if( ec == DAO_ERROR_FIELD_NOTEXIST || proc->stackValues[0] == NULL ){ DaoStream_WriteString( stream, self->defClass->className ); DaoStream_WriteChars( stream, buf ); }else{ DaoValue_Print( proc->stackValues[0], proc, stream, cycData ); } }
static void DaoIO_Writeln0( DaoStream *self, DaoProcess *proc, DaoValue *p[], int N ) { DaoValue *params[DAO_MAX_PARAM]; DMap *cycmap = NULL; int i; if( DaoIO_CheckMode( self, proc, DAO_STREAM_WRITABLE ) == 0 ) return; for(i=0; i<N; i++){ if( p[i]->type > DAO_ARRAY ){ cycmap = DHash_New(0,0); break; } } /* // DaoValue_Print() may call user defined function and change the stack // and invalidate the parameter array: */ memmove( params, p, N*sizeof(DaoValue*) ); for(i=0; i<N; i++){ if( params[i]->type > DAO_ARRAY ) DMap_Reset( cycmap ); DaoValue_Print( params[i], self, cycmap, proc ); if( i+1<N ) DaoStream_WriteChars( self, " "); } DaoStream_WriteChars( self, "\n"); if( cycmap ) DMap_Delete( cycmap ); }
static void DaoCallServer_ActivateEvents() { DaoCallServer *server = daoCallServer; char message[128]; daoint i, j, count = 0; if( server->finishing == 0 ) return; if( server->idle != server->total ) return; if( server->events->size != 0 ) return; if( server->events2->size == 0 ) return; #ifdef DEBUG sprintf( message, "WARNING: try activating events (%i,%i,%i,%i)!\n", server->total, server->idle, (int)server->events->size, (int)server->events2->size ); DaoStream_WriteChars( mainVmSpace->errorStream, message ); #endif for(i=0; i<server->events2->size; ++i){ DaoTaskEvent *event = (DaoTaskEvent*) server->events2->items.pVoid[i]; DaoChannel *chan = event->channel; DaoFuture *fut = event->future; int move = 0, closed = 0; switch( event->type ){ case DAO_EVENT_WAIT_TASKLET : move = fut->precond == NULL || fut->precond->state == DAO_CALL_FINISHED; break; case DAO_EVENT_WAIT_RECEIVING : move = chan->buffer->size > 0; if( chan->cap <= 0 && chan->buffer->size == 0 ) move = 1; break; case DAO_EVENT_WAIT_SENDING : move = chan->buffer->size < chan->cap; break; case DAO_EVENT_WAIT_SELECT : if( event->selects == NULL ) continue; move = DaoTaskEvent_CheckSelect( event ); break; default: break; } if( move ){ DList_Append( server->events, event ); DList_Erase( server->events2, i, 1 ); count += 1; i -= 1; } } DCondVar_Signal( & server->condv ); if( count == 0 ){ DaoStream *stream = mainVmSpace->errorStream; DaoStream_WriteChars( stream, "ERROR: All tasklets are suspended - deadlock!\n" ); #if DEBUG fprintf( stderr, "ERROR: All tasklets are suspended - deadlock!\n" ); #endif exit(1); } }
static void TEST_Run( DaoProcess *proc, DaoValue* p[], int N ) { DString *prefix = p[0]->xString.value; DList *funcs = proc->activeNamespace->definedRoutines; DaoStream *out = DaoVmSpace_StdioStream( proc->vmSpace ); daoint i; char buf[100]; for ( i = 0; i < funcs->size; ++i ){ DaoRoutine *rout = funcs->items.pRoutine[i]; // find global routines matching prefix if ( strncmp( rout->routName->chars, prefix->chars, prefix->size ) == 0 ){ // ignore 'main()' if ( strcmp( rout->routName->chars, "main" ) == 0 ) continue; // run if ( !( rout->attribs & DAO_ROUT_DECORATOR ) && rout->parCount == 0 ){ if ( DaoProcess_Call( proc, rout, NULL, NULL, 0 ) == DAO_ERROR ){ // failed char buf[512]; snprintf( buf, sizeof(buf), "unexpected error running '%s'", rout->routName->chars ); DaoProcess_RaiseError( proc, "Error::Test", buf ); return; } } } } DMutex_Lock( &test_mtx ); snprintf( buf, sizeof(buf), "Summary: %i tests, %i passed, %i failed, %i skipped\n", test_count, pass_count, fail_count, skip_count ); DaoStream_WriteChars( out, buf ); test_count = pass_count = fail_count = skip_count = 0; DMutex_Unlock( &test_mtx ); }
void DaoObject_Print( DaoValue *self, DaoStream *stream, DMap *cycmap, DaoProcess *proc ) { int ec = 0; char buf[50]; DMap *inmap = cycmap; DaoObject *object = (DaoObject*) self; DaoValue *params[2]; DaoRoutine *meth; sprintf( buf, "[%p]", object ); if( self == object->defClass->objType->value ){ DaoStream_WriteString( stream, object->defClass->className ); DaoStream_WriteChars( stream, "[null]" ); return; } if( cycmap != NULL && DMap_Find( cycmap, object ) != NULL ){ DaoStream_WriteString( stream, object->defClass->className ); DaoStream_WriteChars( stream, buf ); return; } if( cycmap == NULL ) cycmap = DHash_New(0,0); DMap_Insert( cycmap, self, self ); DaoValue_Clear( & proc->stackValues[0] ); params[0] = (DaoValue*) dao_type_string; params[1] = (DaoValue*) stream; meth = DaoClass_FindMethod( object->defClass, "(string)", NULL ); if( meth ){ ec = DaoProcess_Call( proc, meth, self, params, 2 ); if( ec ) ec = DaoProcess_Call( proc, meth, self, params, 1 ); }else{ meth = DaoClass_FindMethod( object->defClass, "serialize", NULL ); if( meth ) ec = DaoProcess_Call( proc, meth, self, NULL, 0 ); } if( ec ){ DaoProcess_RaiseException( proc, daoExceptionNames[ec], proc->string->chars, NULL ); }else if( meth && proc->stackValues[0] ){ DaoValue_Print( proc->stackValues[0], stream, cycmap, proc ); }else{ DaoStream_WriteString( stream, object->defClass->className ); DaoStream_WriteChars( stream, buf ); } if( inmap == NULL ) DMap_Delete( cycmap ); }
static void DaoObject_Print( DaoValue *self0, DaoProcess *proc, DaoStream *stream, DMap *cycData ) { int ec = 0; char buf[50]; DaoObject *self = & self0->xObject; DaoValue *params[2]; DaoRoutine *meth; sprintf( buf, "[%p]", self ); if( self0 == self->defClass->objType->value ){ DaoStream_WriteString( stream, self->defClass->className ); DaoStream_WriteChars( stream, "[null]" ); return; } if( cycData != NULL && DMap_Find( cycData, self ) != NULL ){ DaoStream_WriteString( stream, self->defClass->className ); DaoStream_WriteChars( stream, buf ); return; } if( cycData ) MAP_Insert( cycData, self, self ); DaoValue_Clear( & proc->stackValues[0] ); params[0] = (DaoValue*) dao_type_string; params[1] = (DaoValue*) stream; meth = DaoClass_FindMethod( self->defClass, "(string)", NULL ); if( meth ){ ec = DaoProcess_Call( proc, meth, self0, params, 2 ); if( ec ) ec = DaoProcess_Call( proc, meth, self0, params, 1 ); }else{ meth = DaoClass_FindMethod( self->defClass, "serialize", NULL ); if( meth ) ec = DaoProcess_Call( proc, meth, self0, NULL, 0 ); } if( ec ){ DaoProcess_RaiseException( proc, daoExceptionNames[ec], proc->string->chars, NULL ); }else if( meth && proc->stackValues[0] ){ DaoValue_Print( proc->stackValues[0], proc, stream, cycData ); }else{ DaoStream_WriteString( stream, self->defClass->className ); DaoStream_WriteChars( stream, buf ); } }
static int SetCharColor( DaoStream *stream, int color, const char *csi ) { char buf[20]; if( IsaTTY( stream ) == 0 ) return 254; if( color == 254 ) snprintf( buf, sizeof( buf ), CSI_RESET ); else snprintf( buf, sizeof( buf ), csi, color ); DaoStream_WriteChars( stream, buf ); return 254; }
static void DaoCinValue_Print( DaoValue *self, DaoStream *stream, DMap *cycmap, DaoProcess *proc ) { int ec = 0; char buf[50]; DaoRoutine *meth; DaoValue *args[2]; DaoType *type = self->xCinValue.cintype->vatype; DMap *inmap = cycmap; if( cycmap != NULL && DMap_Find( cycmap, self ) != NULL ){ sprintf( buf, "[%p]", self ); DaoStream_WriteString( stream, type->name ); DaoStream_WriteChars( stream, buf ); return; } if( cycmap == NULL ) cycmap = DHash_New(0,0); DMap_Insert( cycmap, self, self ); args[0] = (DaoValue*) proc->vmSpace->typeString; args[1] = (DaoValue*) stream; meth = DaoType_FindFunctionChars( type, "(string)" ); if( meth ){ ec = DaoProcess_Call( proc, meth, self, args, 2 ); if( ec ) ec = DaoProcess_Call( proc, meth, self, args, 1 ); }else{ meth = DaoType_FindFunctionChars( type, "serialize" ); if( meth ) ec = DaoProcess_Call( proc, meth, self, NULL, 0 ); } if( meth == NULL ){ DaoValue_Print( self->xCinValue.value, stream, cycmap, proc ); }else if( ec ){ DaoProcess_RaiseException( proc, daoExceptionNames[ec], proc->string->chars, NULL ); }else if( meth && proc->stackValues[0] ){ DaoValue_Print( proc->stackValues[0], stream, cycmap, proc ); }else{ DaoStream_WriteString( stream, type->name ); DaoStream_WriteChars( stream, buf ); } if( inmap == NULL ) DMap_Delete( cycmap ); }
void DaoProcess_Trace( DaoProcess *self, int depth ) { DaoStream *stream = self->vmSpace->stdioStream; DaoStackFrame *frame = self->topFrame; int k, i = 0; while( frame && frame->routine ){ DaoRoutine *routine = frame->routine; if( depth && ++i > depth ) break; DaoStream_SetColor( stream, "white", "green" ); DaoStream_WriteString( stream, routine->routName ); DaoStream_WriteChars( stream, "()" ); DaoStream_SetColor( stream, NULL, NULL ); DaoStream_WriteChars( stream, ": " ); DaoStream_SetColor( stream, "green", NULL ); if( routine->routType ) DaoStream_WriteString( stream, routine->routType->name ); DaoStream_SetColor( stream, NULL, NULL ); if( frame->routine->body ){ k = (i==1) ? (int)( self->activeCode - frame->codes ) : frame->entry; if( k >= 0 && k < frame->routine->body->annotCodes->size ){ DaoStream_WriteChars( stream, ", instruction " ); DaoStream_WriteInt( stream, k ); DaoStream_WriteChars( stream, " at line " ); DaoStream_WriteInt( stream, frame->routine->body->annotCodes->items.pVmc[k]->line ); } } DaoStream_WriteChars( stream, " in " ); DaoStream_WriteString( stream, routine->nameSpace->name ); DaoStream_WriteChars( stream, ";" ); DaoStream_WriteNewLine( stream ); frame = frame->prev; } }
void DaoValue_Print( DaoValue *self, DaoStream *stream, DMap *cycmap, DaoProcess *proc ) { DaoTypeCore *core = DaoValue_GetTypeCore( self ); if( self == NULL ){ DaoStream_WriteChars( stream, "none[0x0]" ); return; } if( core == NULL || core->Print == NULL ){ if( self->type == DAO_CSTRUCT || self->type == DAO_CDATA ){ core = DaoCstruct_GetDefaultCore(); core->Print( self, stream, cycmap, proc ); return; } } if( core != NULL && core->Print != NULL && core->Print != DaoValue_Print ){ core->Print( self, stream, cycmap, proc ); return; } DaoStream_WriteChars( stream, core != NULL ? core->name : "Unknown" ); DaoStream_WriteChars( stream, "[" ); DaoStream_WritePointer( stream, self ); DaoStream_WriteChars( stream, "]" ); }
void DaoSTD_Debug( DaoProcess *proc, DaoValue *p[], int N ) { DaoDebugger *debugger = proc->vmSpace->debugger; DaoStream *stream = proc->vmSpace->stdioStream; DString *input; if( ! (proc->vmSpace->options & DAO_OPTION_DEBUG ) ) return; input = DString_New(); if( N > 0 && DaoValue_CastCstruct( p[0], dao_type_stream ) ){ stream = (DaoStream*)p[0]; p ++; N --; } if( N > 0 ){ Dao_AboutVars( proc, p, N, input ); DaoStream_WriteString( stream, input ); DaoStream_WriteChars( stream, "\n" ); DString_Delete( input ); return; } DString_Delete( input ); if( debugger && debugger->Debug ) debugger->Debug( debugger, proc, stream ); }
void DaoProfiler_Report( DaoProfiler *self0, DaoStream *stream ) { DaoComplex com = {DAO_COMPLEX,0,0,0,1,{0.0,0.0}}; DaoxProfiler *self = (DaoxProfiler*) self0; DMap *summary = DMap_New( DAO_DATA_VALUE, 0 ); DMap *summary2 = DMap_New( DAO_DATA_VALUE, 0 ); DString *name1 = DString_New(); DString *name2 = DString_New(); DNode *it, *it2; int count, max = 20; char buf1[32]; char buf2[24]; char buf[120]; for(it=DMap_First(self->profile); it; it=DMap_Next(self->profile,it)){ DaoRoutine *callee = (DaoRoutine*) it->key.pValue; com.value = DaoProfiler_Sum( it->value.pMap ); com.value.real = - com.value.real; com.value.imag = - com.value.imag; DMap_Insert( summary, & com, it ); } DaoStream_WriteChars( stream, "\n" ); DaoStream_WriteChars( stream, delimiter ); DaoStream_WriteChars( stream, delimiter2 ); snprintf( buf, sizeof(buf), header_format, "Routine", "#Calls", "CPU Time" ); DaoStream_WriteChars( stream, buf ); DaoStream_WriteChars( stream, delimiter2 ); for(count=max,it=DMap_First(summary); it; it=DMap_Next(summary,it),--count){ DNode *it2 = (DNode*) it->value.pVoid; dao_complex data = it->key.pValue->xComplex.value; DaoRoutine *callee = (DaoRoutine*) it2->key.pValue; DaoRoutine_MakeName( callee, name1, 28, 10, 2 ); snprintf( buf, sizeof(buf), row_format, name1->chars, (int) -data.imag, -data.real ); DaoStream_WriteChars( stream, buf ); if( count == 0 ) break; } DaoStream_WriteChars( stream, "\n" ); DaoStream_WriteChars( stream, delimiter3 ); snprintf( buf, sizeof(buf), header_format2, "Routine", "Caller", "#Calls", "CPU Time" ); DaoStream_WriteChars( stream, buf ); DaoStream_WriteChars( stream, delimiter3 ); for(count=max,it=DMap_First(summary); it; it=DMap_Next(summary,it),--count){ DNode *it2 = (DNode*) it->value.pVoid; DaoRoutine *callee = (DaoRoutine*) it2->key.pValue; DMap *profile = it2->value.pMap; DaoRoutine_MakeName( callee, name1, 30, 0, 0 ); DMap_Reset( summary2 ); for(it2=DMap_First(profile); it2; it2=DMap_Next(profile,it2)){ DaoRoutine *caller = (DaoRoutine*) it2->key.pValue; DaoComplex *data = (DaoComplex*) it2->value.pValue; com.value.real = - data->value.real; com.value.imag = - data->value.imag; DMap_Insert( summary2, & com, caller ); } for(it2=DMap_First(summary2); it2; it2=DMap_Next(summary2,it2)){ DaoRoutine *caller = (DaoRoutine*) it2->value.pValue; dao_complex data = it2->key.pValue->xComplex.value; DString_Reset( name2, 0 ); if( caller ) DaoRoutine_MakeName( caller, name2, 22, 0, 0 ); snprintf( buf, sizeof(buf), row_format2, name1->chars, name2->chars, (int) -data.imag, -data.real ); DaoStream_WriteChars( stream, buf ); DString_Reset( name1, 0 ); } if( count == 0 ) break; } DString_Delete( name1 ); DString_Delete( name2 ); }
void DaoStream_PrintHL( DaoStream *self, int tag, const char *text ) { DaoStream_TryHighlight( self, tag ); DaoStream_WriteChars( self, text ); DaoStream_TryHighlight( self, 0 ); }
void DaoStream_WriteNewLine( DaoStream *self ) { DaoStream_WriteChars( self, daoConfig.iscgi ? "<br/>" : "\n" ); }