moved back to old acc
[vox.git] / src / core / repr.cpp
blob87364f4146996699668517b01fc237bb36259c20
2 #include "baselib.hpp"
3 #include "string.hpp"
4 #include <sstream>
6 #define Err(...) \
7 { \
8 this->returns = v->ThrowError(__VA_ARGS__); \
9 return; \
12 VXRepr::VXRepr(VXState* _v, const VXObject& ob): v(_v), root_ob(ob)
14 returns = VX_OK;
15 do_serialize(root_ob);
18 void VXRepr::do_serialize(const VXObject& o)
20 switch(o.Type())
22 case VX_OT_NULL:
23 strm << "null";
24 break;
25 case VX_OT_CLOSURE:
26 case VX_OT_NATIVECLOSURE:
27 /* TODO: this is where the function proto should be emitted */
28 case VX_OT_INSTANCE:
29 case VX_OT_CLASS:
30 case VX_OT_WEAKREF:
31 emit_othertype(o);
32 break;
33 case VX_OT_STRING:
34 emit_string(o);
35 break;
36 case VX_OT_ARRAY:
37 emit_array(o);
38 break;
39 case VX_OT_TABLE:
40 emit_table(o);
41 break;
42 case VX_OT_INTEGER:
43 strm << o.Integer();
44 break;
45 case VX_OT_FLOAT:
46 strm << o.Float();
47 break;
48 default:
49 Err("cannot serialize type '%s'", o.TypeString());
50 break;
54 void VXRepr::emit_othertype(const VXObject& o)
56 const VXUserPointer o_addr = VXUserPointer(&o);
57 strm << "<" << o.TypeString() << " at " << o_addr << ">";
60 void VXRepr::emit_string(const VXObject& o)
62 std::string tmp;
63 const char* str_p;
64 VXInteger len_p;
65 o.String(&str_p, &len_p);
66 tmp.append(str_p, len_p);
67 strm << strhelp_quote(tmp);
70 void VXRepr::emit_table(const VXObject& o)
72 VXInteger size;
73 VXInteger count = 0;
74 VXInteger ridx = 0; // start at first index
75 VXObject outkey;
76 VXObject outval;
77 VXTableObj* tb = o.Table();
78 size = tb->Size();
79 strm << "{";
80 while((ridx = tb->Next(false, ridx, outkey, outval)) != -1)
82 do_serialize(outkey);
83 strm << ": ";
84 do_serialize(outval);
85 if((count+1) != size)
87 strm << ", ";
89 count++;
91 strm << "}";
94 void VXRepr::emit_array(const VXObject& o)
96 VXInteger size;
97 VXInteger ridx = 0; // start at first index
98 VXObject outkey;
99 VXObject outval;
100 VXArrayObj* arr = o.Array();
101 size = arr->Size();
102 strm << "[";
103 while((ridx = arr->Next(ridx, outkey, outval)) != -1)
105 do_serialize(outval);
106 if(ridx != size)
108 strm << ", ";
111 strm << "]";
114 std::string VXRepr::str()
116 return this->strm.str();
119 VXInteger VXRepr::status()
121 return returns;