MethodTable* MethodTable::duplicate(STATE) { size_t size, i; MethodTable* dup = 0; utilities::thread::SpinLock::LockGuard lg(lock_); size = bins_->to_native(); dup = MethodTable::create(state, size); // Allow for subclassing. dup->klass(state, class_object(state)); size_t num = bins_->to_native(); MethodTableBucket* entry = 0; for(i = 0; i < num; i++) { entry = try_as<MethodTableBucket>(values_->at(state, i)); while(entry) { dup->store(state, entry->name(), entry->method(), entry->visibility()); entry = try_as<MethodTableBucket>(entry->next()); } } return dup; }
MethodTable* MethodTable::duplicate(STATE) { size_t size, i; MethodTable *dup; size = bins_->to_native(); dup = MethodTable::create(state, size); // Allow for subclassing. dup->klass(state, class_object(state)); size_t num = entries_->to_native(); Array* entries = all_entries(state); for(i = 0; i < num; i++) { MethodTableBucket* entry = as<MethodTableBucket>(entries->get(state, i)); dup->store(state, entry->name(), entry->method(), entry->visibility()); } return dup; }
/* The MethodTable.allocate primitive. */ MethodTable* MethodTable::allocate(STATE, Object* self) { MethodTable* tbl = create(state, METHODTABLE_MIN_SIZE); tbl->klass(state, as<Class>(self)); tbl->lock_.init(); return tbl; }