1111#include < tvm/relay/expr_functor.h>
1212#include < tvm/relay/logging.h>
1313#include < tvm/runtime/memory_manager.h>
14+ #include < tvm/runtime/object.h>
1415
1516namespace tvm {
1617namespace relay {
1718namespace vm {
1819
19- using runtime::NDArray;
20-
21- enum struct VMObjectTag {
22- kTensor ,
23- kClosure ,
24- kDatatype ,
25- kExternalFunc ,
26- };
27-
28- inline std::string VMObjectTagString (VMObjectTag tag) {
29- switch (tag) {
30- case VMObjectTag::kClosure :
31- return " Closure" ;
32- case VMObjectTag::kDatatype :
33- return " Datatype" ;
34- case VMObjectTag::kTensor :
35- return " Tensor" ;
36- case VMObjectTag::kExternalFunc :
37- return " ExternalFunction" ;
38- default :
39- LOG (FATAL) << " Object tag is not supported." ;
40- return " " ;
41- }
42- }
43-
44- // TODO(@jroesch): Use intrusive pointer.
45- struct VMObjectCell {
46- VMObjectTag tag;
47- VMObjectCell (VMObjectTag tag) : tag(tag) {}
48- VMObjectCell () {}
49- virtual ~VMObjectCell () {}
50- };
51-
52- struct VMTensorCell : public VMObjectCell {
53- tvm::runtime::NDArray data;
54- VMTensorCell (const tvm::runtime::NDArray& data)
55- : VMObjectCell(VMObjectTag::kTensor ), data(data) {}
56- };
57-
58- struct VMObject {
59- std::shared_ptr<VMObjectCell> ptr;
60- VMObject (std::shared_ptr<VMObjectCell> ptr) : ptr(ptr) {}
61- VMObject () : ptr() {}
62- VMObject (const VMObject& obj) : ptr(obj.ptr) {}
63- VMObjectCell* operator ->() {
64- return this ->ptr .operator ->();
65- }
66- };
67-
68- struct VMDatatypeCell : public VMObjectCell {
69- size_t tag;
70- std::vector<VMObject> fields;
71-
72- VMDatatypeCell (size_t tag, const std::vector<VMObject>& fields)
73- : VMObjectCell(VMObjectTag::kDatatype ), tag(tag), fields(fields) {}
74- };
75-
76- struct VMClosureCell : public VMObjectCell {
77- size_t func_index;
78- std::vector<VMObject> free_vars;
79-
80- VMClosureCell (size_t func_index, const std::vector<VMObject>& free_vars)
81- : VMObjectCell(VMObjectTag::kClosure ), func_index(func_index), free_vars(free_vars) {}
82- };
83-
84-
85- inline VMObject VMTensor (const tvm::runtime::NDArray& data) {
86- auto ptr = std::make_shared<VMTensorCell>(data);
87- return std::dynamic_pointer_cast<VMObjectCell>(ptr);
88- }
89-
90- inline VMObject VMDatatype (size_t tag, const std::vector<VMObject>& fields) {
91- auto ptr = std::make_shared<VMDatatypeCell>(tag, fields);
92- return std::dynamic_pointer_cast<VMObjectCell>(ptr);
93- }
94-
95- inline VMObject VMTuple (const std::vector<VMObject>& fields) {
96- return VMDatatype (0 , fields);
97- }
98-
99- inline VMObject VMClosure (size_t func_index, std::vector<VMObject> free_vars) {
100- auto ptr = std::make_shared<VMClosureCell>(func_index, free_vars);
101- return std::dynamic_pointer_cast<VMObjectCell>(ptr);
102- }
103-
104- inline NDArray ToNDArray (const VMObject& obj) {
105- CHECK (obj.ptr .get ());
106- CHECK (obj.ptr ->tag == VMObjectTag::kTensor ) << " Expect Tensor, Got " << VMObjectTagString (obj.ptr ->tag );
107- std::shared_ptr<VMTensorCell> o = std::dynamic_pointer_cast<VMTensorCell>(obj.ptr );
108- return o->data ;
109- }
20+ using namespace tvm ::runtime;
11021
11122enum struct Opcode {
11223 Push,
@@ -235,8 +146,8 @@ struct VirtualMachine {
235146 std::vector<PackedFunc> packed_funcs;
236147 std::vector<VMFunction> functions;
237148 std::vector<VMFrame> frames;
238- std::vector<VMObject > stack;
239- std::vector<VMObject > constants;
149+ std::vector<Object > stack;
150+ std::vector<Object > constants;
240151
241152 // Frame State
242153 size_t func_index;
@@ -255,8 +166,8 @@ struct VirtualMachine {
255166 void InvokeGlobal (const VMFunction& func);
256167 void Run ();
257168
258- VMObject Invoke (const VMFunction& func, const std::vector<VMObject >& args);
259- VMObject Invoke (const GlobalVar& global, const std::vector<VMObject >& args);
169+ Object Invoke (const VMFunction& func, const std::vector<Object >& args);
170+ Object Invoke (const GlobalVar& global, const std::vector<Object >& args);
260171
261172 // Ignore the method that dumps register info at compile-time if debugging
262173 // mode is not enabled.
0 commit comments