blob: 994f66b782759c5ad27cae2ed1d60e3015433f6b [file] [log] [blame]
#include <torch/csrc/jit/api/object.h>
#include <ATen/core/jit_type.h>
#include <torch/csrc/jit/api/compilation_unit.h>
#include <torch/csrc/jit/frontend/resolver.h>
#include <torch/csrc/jit/frontend/sugared_value.h>
namespace torch {
namespace jit {
Object::Object(
std::shared_ptr<CompilationUnit> cu,
const c10::ClassTypePtr& type)
: Object(c10::ivalue::Object::create(
c10::StrongTypePtr(std::move(cu), type),
type->numAttributes())) {}
ObjectPtr Object::_ivalue() const {
TORCH_INTERNAL_ASSERT(_ivalue_);
return _ivalue_;
}
c10::optional<Method> Object::find_method(const std::string& basename) const {
for (Function* fn : type()->methods()) {
if (fn->name() == basename) {
return Method(_ivalue(), fn);
}
}
return c10::nullopt;
}
void Object::define(const std::string& src, const ResolverPtr& resolver) {
const auto self = SimpleSelf(type());
_ivalue()->compilation_unit()->define(
*type()->name(), src, resolver ? resolver : nativeResolver(), &self);
}
Object Object::deepcopy() const {
c10::IValue::HashAliasedIValueMap memo;
return deepcopy(memo);
}
Object Object::deepcopy(c10::IValue::HashAliasedIValueMap& memo) const {
Object obj(_ivalue()->compilation_unit(), type());
// Deepcopy slots. If a slot is a module - recursively copy it.
size_t N = type()->numAttributes();
for (size_t i = 0; i < N; ++i) {
IValue s = _ivalue()->getSlot(i);
obj._ivalue()->setAttr(type()->getAttributeName(i), s.deepcopy(memo));
}
return obj;
}
} // namespace jit
} // namespace torch