Differences From
Artifact [ab1704aae3]:
1 1 (* [ʞ] src/janet-rsrc.gcd vi:ft=d
2 2 * ~ lexi hale <lexi@hale.su>
3 3 * 🄯 AGPLv3
4 4 * ? implement the saving and loading of janet scripts
5 5 *)
6 -use "util.h";
6 +use "util-gd.h";
7 7 use <assert.h>;
8 8 use "janet-lang.h";
9 9
10 10 use {
11 11 static gd_packedStringArray
12 12 janetExts(void) {
13 13 gd_packedStringArray r = {};
................................................................................
40 40 || gdu_symEq(&type, "JanetScriptImage");
41 41 };
42 42 impl _get_resource_type(string path) -> string {
43 43 const char* str = "";
44 44 switch (janetKind(&path)) {
45 45 case janetFileImage: str="JanetScriptImage"; break;
46 46 case janetFileText: str="JanetScriptText"; break;
47 + default: break;
47 48 }
48 49 return gdu_str(str);
49 50 };
50 51 use {
51 52 static inline gd_variant
52 53 vFromErr(int64_t err) {
53 54 gd_variant v;
................................................................................
65 66 };
66 67 impl _load
67 68 ( string path;
68 69 string origPath;
69 70 bool subThreads;
70 71 int cacheMode;
71 72 ) -> variant {
73 + (* yes it's a bit hinky using hardwired static dispatch here
74 + * but ye gods, at least it spares us from having to use the
75 + * horrible gdscript ptrcall mechanism *)
76 + GDExtensionObjectPtr obj = nullptr;
77 + auto cpath = _gdu_string_stackp(&path);
78 + gd_string path_mine = gdu_str_sz(cpath.v, cpath.sz);
79 + auto fd = gd_fileAccess_open(path_mine,
80 + gd_FileAccess_ModeFlags_read);
81 + // auto cpath = _gdu_string_stackp(&path_mine);
82 + printf("janet: loading from file %zu %s\n", cpath.sz, cpath.v);
83 + /* gd_refCounted_reference(fd); */
72 84 switch (janetKind(&path)) {
73 85 case janetFileImage: {
74 86 auto s = gdjn_class_JanetScriptImage_new();
75 - return vFromObj(gdu_cast(s->self, "Resource"));
87 + gdjn_class_JanetScript_method__set_path(&s->super, path_mine, false);
88 + gdjn_class_JanetScriptImage_method__reload(s, false);
89 + obj = s -> self;
90 + break;
76 91 };
77 92 case janetFileText: {
78 93 auto s = gdjn_class_JanetScriptText_new();
79 - return vFromObj(gdu_cast(s->self, "Resource"));
80 - };
81 - default: {
82 - return vFromErr(gd_Error_errFileUnrecognized);
94 + gdjn_class_JanetScript_method__set_path(&s->super, path_mine, false);
95 +
96 + auto text = gd_fileAccess_getAsText(fd, false);
97 + gdjn_class_JanetScriptText_method__set_source_code
98 + (s, text);
99 + _t(string).dtor(&text);
100 + obj = s -> self;
101 + break;
83 102 };
103 + default: break;
84 104 }
105 + gd_fileAccess_close(fd);
106 + _t(string).dtor(&path_mine);
107 + /* gd_refCounted_unreference(fd); */
108 + if (obj) return vFromObj(gdu_cast(obj, "Resource"));
109 + else return vFromErr(gd_Error_errFileUnrecognized);
85 110 };
86 111 };
87 112
88 113
89 114 class JanetScriptSaver is ResourceFormatSaver {
90 115 use {
91 116 static inline bool
................................................................................
94 119 || _gdu_objIs(res, JanetScriptText);
95 120 }
96 121 };
97 122 impl _get_recognized_extensions() -> packed-string-array {
98 123 return janetExts();
99 124 };
100 125 impl _recognize(ref Resource res) -> bool {
126 + printf("checking against res %p\n", res);
101 127 return gdjn_isJanet(res);
102 128 };
103 129 impl _save(ref Resource res, string path, int flags) -> int {
104 130 gd_refCounted_reference(res);
105 131 assert(gdjn_isJanet(res));
106 - gd_string path_mine;
107 - _t(string).copy(&path_mine, (void const*[]) {&path});
132 + gd_string path_mine = gdu_string_dup(&path);
108 133 auto fd = gd_fileAccess_open(path,
109 134 gd_FileAccess_ModeFlags_write);
110 135 gd_refCounted_reference(fd);
111 136
112 137 if (_gdu_objIs(res, JanetScriptText)) {
113 138 auto asText = gdu_cast(res, "JanetScriptText");
114 139 gd_string src = gd_script_getSourceCode(asText);
115 140 gd_fileAccess_storeString(fd, src);
116 141 _t(string).dtor(&src);
117 - auto data = gdjn_class_JanetScriptText_data(res);
118 142 } else if (_gdu_objIs(res, JanetScriptImage)) {
119 - auto asImg = gdu_cast(res, "JanetScriptImage");
120 - auto data = gdjn_class_JanetScriptImage_data(res);
143 + // auto asImg = gdu_cast(res, "JanetScriptImage");
144 + // auto data = gdjn_class_JanetScriptImage_data(res);
121 145 };
122 146
123 - gd_fileAccess_close(fd);
147 + // gd_fileAccess_close(fd);
124 148 _t(string).dtor(&path_mine);
149 + printf("number of surviving saver refs: %zu\n", gd_refCounted_getReferenceCount(gdu_cast(me -> self, "RefCounted")));
125 150 gd_refCounted_unreference(fd);
126 151 gd_refCounted_unreference(res);
152 + return gd_Error_ok;
127 153 };
128 154 };