gdjn  Diff

Differences From Artifact [ab1704aae3]:

To Artifact [2d0266f6b4]:


     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   };