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;
}
Exemple #2
0
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
}
Exemple #3
0
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
}