Object listNew(void* state){ VirtualMachine *vm = (VirtualMachine*)state; /*int len = 10; Object objArr[10]; getArgs(state, &len, objArr); Object* objs = objArr; Object *objs2; if (len != 10){ objs2 = new Object[len]; getArgs(state, &len, objs2); objs = objs2; }*/ int len; Object* objs = NULL; getArgs2(state, &len, &objs); List* l = new List; for (int i = 0; i < len; ++i) l->vec.push_back(objs[i]); Object obj; delete []objs; obj.type = USEROBJ | LISTOBJ; obj.value.userData = new UserData(vm->listCls,l); setGC(state, obj.value.userData); return obj; }
void GenerationalGarbageCollector::add( const Collectable *c ) { if( 0 == c ) return; if( c->getGC() == this ) return; if( c->getGC() ) c->getGC()->remove( c ); { Mutex::ScopedLock lock( &m_lock ); setGC( c, this ); setGCIndex( c, index_t( m_cs.size() ) ); setGCGeneration( c, 0 ); m_cs.push_back( c ); } // m_lock #ifdef GC_DEBUG std::cerr << "add " << c << " to " << this << ", index = " << c->gc_index << std::endl; #endif }
void GenerationalGarbageCollector::remove( const Collectable *c ) { assert( c->getGC() == this ); { Mutex::ScopedLock lock( &m_lock ); const index_t index = c->getGCIndex(); if( index < m_cs.size() ) { if( m_cs[ index ] == c ) { #ifdef GC_DEBUG std::cerr << "remove " << c << " from " << this << ", index = " << c->m_gc_index << std::endl; #endif m_cs[ index ] = 0; setGC( c, nullptr ); setGCIndex( c, 0 ); } } } // m_lock }