static void EDGE_GetNodes( DaoProcess *proc, DaoValue *p[], int N ) { DaoxEdge *self = (DaoxEdge*) p[0]; DaoTuple *res = DaoProcess_PutTuple( proc, 2 ); DaoTuple_SetItem( res, (DaoValue*)self->first, 0 ); DaoTuple_SetItem( res, (DaoValue*)self->second, 1 ); }
static void TRIA_Get( DaoProcess *proc, DaoValue *p[], int N ) { DaoxTriangulator *self = (DaoxTriangulator*) DaoValue_TryCastCdata( p[0], daox_type_triangulator ); DaoTuple *tuple = DaoProcess_PutTuple( proc, 3 ); DaoxTriangle *triangle = self->triangles->data.triangles; daoint index = p[1]->xInteger.value; if( index < 0 || index >= self->triangles->size ) return; triangle += index; tuple->values[0]->xInteger.value = triangle->index[0]; tuple->values[1]->xInteger.value = triangle->index[1]; tuple->values[2]->xInteger.value = triangle->index[2]; }
static void STD_Compile( DaoProcess *proc, DaoValue *p[], int N ) { char *source = DaoValue_TryGetMBString( p[0] ); DaoNamespace *ns = DaoValue_CastNamespace( p[1] ); DaoTuple *tuple = DaoProcess_PutTuple( proc, 0 ); if( ns == NULL ) ns = proc->activeNamespace; DaoTuple_SetItem( tuple, (DaoValue*) ns, 0 ); if( DaoProcess_Compile( proc, ns, source ) ==0 ){ DaoTuple_SetItem( tuple, dao_none_value, 1 ); return; } DaoTuple_SetItem( tuple, ns->mainRoutines->items.pValue[ ns->mainRoutines->size-1 ], 1 ); }
static void DaoSTD_Compile( DaoProcess *proc, DaoValue *p[], int N ) { char *source = DaoValue_TryGetChars( p[0] ); DaoNamespace *ns, *import = DaoValue_CastNamespace( p[1] ); DaoTuple *tuple = DaoProcess_PutTuple( proc, 0 ); ns = DaoNamespace_New( proc->vmSpace, "std::compile" ); if( import != NULL ) DaoNamespace_AddParent( ns, import ); DaoTuple_SetItem( tuple, (DaoValue*) ns, 0 ); if( DaoProcess_Compile( proc, ns, source ) ==0 ){ DaoTuple_SetItem( tuple, dao_none_value, 1 ); return; } DaoTuple_SetItem( tuple, ns->mainRoutines->items.pValue[ ns->mainRoutines->size-1 ], 1 ); }
static void SYS_Ctime( DaoProcess *proc, DaoValue *p[], int N ) { struct tm *ctime; time_t t = (time_t)p[0]->xInteger.value; DaoTuple *tuple = DaoProcess_PutTuple( proc, 0 ); DaoValue **items = tuple->items; if( t == 0 ) t = time(NULL); ctime = gmtime( & t ); items[0]->xInteger.value = ctime->tm_year + 1900; items[1]->xInteger.value = ctime->tm_mon + 1; items[2]->xInteger.value = ctime->tm_mday; items[3]->xInteger.value = ctime->tm_wday + 1; items[4]->xInteger.value = ctime->tm_hour; items[5]->xInteger.value = ctime->tm_min; items[6]->xInteger.value = ctime->tm_sec; }
static void DaoMT_Functional( DaoProcess *proc, DaoValue *P[], int N, int F ) { DMutex mutex; DCondVar condv; DaoTaskData *tasks; DaoValue *param = P[0]; DaoValue *result = NULL; DaoList *list = NULL; DaoArray *array = NULL; DaoVmCode *sect = DaoGetSectionCode( proc->activeCode ); int i, entry, threads = P[1]->xInteger.value; daoint index = -1, status = 0, joined = 0; DNode *node = NULL; switch( F ){ case DVM_FUNCT_MAP : if( param->type == DAO_ARRAY ){ array = DaoProcess_PutArray( proc ); result = (DaoValue*) array; }else{ list = DaoProcess_PutList( proc ); result = (DaoValue*) list; } break; case DVM_FUNCT_APPLY : DaoProcess_PutValue( proc, param ); break; case DVM_FUNCT_FIND : DaoProcess_PutValue( proc, dao_none_value ); break; } if( threads <= 0 ) threads = 2; if( sect == NULL || DaoMT_PushSectionFrame( proc ) == 0 ) return; if( list ){ DArray_Clear( & list->items ); if( param->type == DAO_LIST ) DArray_Resize( & list->items, param->xList.items.size, NULL ); if( param->type == DAO_MAP ) DArray_Resize( & list->items, param->xMap.items->size, NULL ); #ifdef DAO_WITH_NUMARRAY }else if( array && F == DVM_FUNCT_MAP ){ DaoArray_GetSliceShape( (DaoArray*) param, & array->dims, & array->ndim ); DaoArray_ResizeArray( array, array->dims, array->ndim ); #endif } DMutex_Init( & mutex ); DCondVar_Init( & condv ); entry = proc->topFrame->entry; tasks = (DaoTaskData*) dao_calloc( threads, sizeof(DaoTaskData) ); DaoProcess_PopFrame( proc ); for(i=0; i<threads; i++){ DaoTaskData *task = tasks + i; task->param = param; task->result = result; task->proto = proc; task->sect = sect; task->funct = F; task->entry = entry; task->first = i; task->step = threads; task->index = & index; task->node = & node; task->joined = & joined; task->condv = & condv; task->mutex = & mutex; task->clone = DaoVmSpace_AcquireProcess( proc->vmSpace ); task->clone->mutex = & mutex; if( i ) DaoCallServer_AddTask( DaoMT_RunFunctional, task, 1 ); } DaoMT_RunFunctional( tasks ); DMutex_Lock( & mutex ); while( joined < threads ) DCondVar_TimedWait( & condv, & mutex, 0.01 ); DMutex_Unlock( & mutex ); for(i=0; i<threads; i++){ DaoTaskData *task = tasks + i; DaoVmSpace_ReleaseProcess( proc->vmSpace, task->clone ); status |= task->status; } if( F == DVM_FUNCT_FIND ){ DaoTuple *tuple = DaoProcess_PutTuple( proc, 0 ); if( param->type == DAO_LIST && index != -1 ){ DaoValue **items = param->xList.items.items.pValue; GC_ShiftRC( items[index], tuple->items[1] ); tuple->items[1] = items[index]; tuple->items[0]->xInteger.value = index; }else if( param->type == DAO_MAP && node ){ GC_ShiftRC( node->key.pValue, tuple->items[0] ); GC_ShiftRC( node->value.pValue, tuple->items[1] ); tuple->items[0] = node->key.pValue; tuple->items[1] = node->value.pValue; } } if( status ) DaoProcess_RaiseException( proc, DAO_ERROR, "code section execution failed!" ); DMutex_Destroy( & mutex ); DCondVar_Destroy( & condv ); dao_free( tasks ); }