Merge pull request #49625 from nekomatata/fix-sub-resource-cache-3.x

[3.x] Fix sub-resource storing the wrong index in cache
This commit is contained in:
Rémi Verschelde 2021-06-15 20:39:28 +02:00 committed by GitHub
commit de04394c73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 19 deletions

View File

@ -115,18 +115,8 @@ Error ResourceInteractiveLoaderText::_parse_sub_resource(VariantParser::Stream *
int index = token.value; int index = token.value;
String path = local_path + "::" + itos(index); ERR_FAIL_COND_V(!int_resources.has(index), ERR_INVALID_PARAMETER);
r_res = int_resources[index];
if (!ignore_resource_parsing) {
if (!ResourceCache::has(path)) {
r_err_str = "Can't load cached sub-resource: " + path;
return ERR_PARSE_ERROR;
}
r_res = RES(ResourceCache::get(path));
} else {
r_res = RES();
}
VariantParser::get_token(p_stream, token, line, r_err_str); VariantParser::get_token(p_stream, token, line, r_err_str);
if (token.type != VariantParser::TK_PARENTHESIS_CLOSE) { if (token.type != VariantParser::TK_PARENTHESIS_CLOSE) {
@ -425,7 +415,6 @@ Error ResourceInteractiveLoaderText::poll() {
ResourceLoader::notify_dependency_error(local_path, path, type); ResourceLoader::notify_dependency_error(local_path, path, type);
} }
} else { } else {
resource_cache.push_back(res);
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
//remember ID for saving //remember ID for saving
res->set_id_for_path(local_path, index); res->set_id_for_path(local_path, index);
@ -466,12 +455,16 @@ Error ResourceInteractiveLoaderText::poll() {
String path = local_path + "::" + itos(id); String path = local_path + "::" + itos(id);
//bool exists=ResourceCache::has(path);
Ref<Resource> res; Ref<Resource> res;
if (!ResourceCache::has(path)) { //only if it doesn't exist bool do_assign = false;
if (ResourceCache::has(path)) {
//cached, do not assign
Resource *r = ResourceCache::get(path);
res = Ref<Resource>(r);
} else {
//create
Object *obj = ClassDB::instance(type); Object *obj = ClassDB::instance(type);
if (!obj) { if (!obj) {
error_text += "Can't create sub resource of type: " + type; error_text += "Can't create sub resource of type: " + type;
@ -489,8 +482,13 @@ Error ResourceInteractiveLoaderText::poll() {
} }
res = Ref<Resource>(r); res = Ref<Resource>(r);
resource_cache.push_back(res); do_assign = true;
}
int_resources[id] = res; //always assign int resources
if (do_assign) {
res->set_path(path); res->set_path(path);
res->set_subindex(id);
} }
resource_current++; resource_current++;
@ -507,7 +505,7 @@ Error ResourceInteractiveLoaderText::poll() {
} }
if (assign != String()) { if (assign != String()) {
if (res.is_valid()) { if (do_assign) {
res->set(assign, value); res->set(assign, value);
} }
//it's assignment //it's assignment

View File

@ -60,6 +60,7 @@ class ResourceInteractiveLoaderText : public ResourceInteractiveLoader {
//Map<String,String> remaps; //Map<String,String> remaps;
Map<int, ExtResource> ext_resources; Map<int, ExtResource> ext_resources;
Map<int, RES> int_resources;
int resources_total; int resources_total;
int resource_current; int resource_current;
@ -100,7 +101,6 @@ class ResourceInteractiveLoaderText : public ResourceInteractiveLoader {
friend class ResourceFormatLoaderText; friend class ResourceFormatLoaderText;
List<RES> resource_cache;
Error error; Error error;
RES resource; RES resource;