Skip to content

Commit 5fd05b6

Browse files
committed
Starting port to godot 4.0
1 parent 7bc2a92 commit 5fd05b6

21 files changed

+897
-887
lines changed

ecmascript.cpp

Lines changed: 50 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include "ecmascript.h"
2-
#include "core/engine.h"
2+
#include "core/config/engine.h"
33
#include "core/io/file_access_encrypted.h"
44
#include "ecmascript_instance.h"
55
#include "ecmascript_language.h"
@@ -15,8 +15,7 @@ ECMAScript::ECMAScript() {
1515
ECMAScript::~ECMAScript() {
1616
}
1717

18-
bool ECMAScript::can_instance() const {
19-
18+
bool ECMAScript::can_instantiate() const {
2019
#ifdef TOOLS_ENABLED
2120
return is_valid() && (is_tool() || ScriptServer::is_scripting_enabled());
2221
#else
@@ -37,7 +36,7 @@ ScriptInstance *ECMAScript::instance_create(Object *p_this) {
3736
ERR_FAIL_NULL_V_MSG(binder, NULL, "Cannot create instance from this thread");
3837
const ECMAClassInfo *cls = NULL;
3938
ECMAscriptScriptError ecma_err;
40-
if (!bytecode.empty()) {
39+
if (!bytecode.is_empty()) {
4140
cls = binder->parse_ecma_class(bytecode, script_path, false, &ecma_err);
4241
} else {
4342
cls = binder->parse_ecma_class(code, script_path, false, &ecma_err);
@@ -88,7 +87,7 @@ Error ECMAScript::reload(bool p_keep_state) {
8887
ECMAScriptBinder *binder = ECMAScriptLanguage::get_thread_binder(Thread::get_caller_id());
8988
ERR_FAIL_COND_V_MSG(binder == NULL, ERR_INVALID_DATA, "Cannot load script in this thread");
9089
ECMAscriptScriptError ecma_err;
91-
if (!bytecode.empty()) {
90+
if (!bytecode.is_empty()) {
9291
ecma_class = binder->parse_ecma_class(bytecode, script_path, true, &ecma_err);
9392
} else {
9493
ecma_class = binder->parse_ecma_class(code, script_path, true, &ecma_err);
@@ -102,19 +101,15 @@ Error ECMAScript::reload(bool p_keep_state) {
102101
set_last_modified_time(FileAccess::get_modified_time(script_path));
103102
p_keep_state = true;
104103

105-
for (Set<Object *>::Element *E = instances.front(); E; E = E->next()) {
106-
Object *owner = E->get();
107-
108-
Map<StringName, Variant> values;
104+
for (Object *owner : instances) {
105+
HashMap<StringName, Variant> values;
109106
if (p_keep_state) {
110-
const StringName *p = ecma_class->properties.next(NULL);
111-
while (p) {
112-
values.insert(*p, owner->get(*p));
113-
p = ecma_class->properties.next(p);
107+
for (const KeyValue<StringName, ECMAProperyInfo> &pair : ecma_class->properties) {
108+
values.insert(pair.key, owner->get(pair.key));
114109
}
115110
}
116111

117-
ScriptInstance *si = E->get()->get_script_instance();
112+
ScriptInstance *si = owner->get_script_instance();
118113
if (si->is_placeholder()) {
119114
PlaceHolderScriptInstance *psi = static_cast<PlaceHolderScriptInstance *>(si);
120115
if (ecma_class->tool) {
@@ -130,10 +125,10 @@ Error ECMAScript::reload(bool p_keep_state) {
130125
}
131126

132127
if (p_keep_state) {
133-
for (Map<StringName, Variant>::Element *E = values.front(); E; E = E->next()) {
134-
if (const ECMAProperyInfo *epi = ecma_class->properties.getptr(E->key())) {
135-
const Variant &backup = E->value();
136-
owner->set(E->key(), backup.get_type() == epi->type ? backup : epi->default_value);
128+
for (const KeyValue<StringName, Variant> &pair : values) {
129+
if (const ECMAProperyInfo *epi = ecma_class->properties.getptr(pair.key)) {
130+
const Variant &backup = pair.value;
131+
owner->set(pair.key, backup.get_type() == epi->type ? backup : epi->default_value);
137132
}
138133
}
139134
}
@@ -175,18 +170,15 @@ bool ECMAScript::is_tool() const {
175170

176171
void ECMAScript::get_script_method_list(List<MethodInfo> *p_list) const {
177172
if (!ecma_class) return;
178-
const StringName *key = ecma_class->methods.next(NULL);
179-
while (key) {
180-
p_list->push_back(ecma_class->methods.get(*key));
181-
key = ecma_class->methods.next(key);
173+
for (const KeyValue<StringName, MethodInfo> &pair : ecma_class->methods) {
174+
p_list->push_back(pair.value);
182175
}
183176
}
184177

185178
void ECMAScript::get_script_property_list(List<PropertyInfo> *p_list) const {
186179
if (!ecma_class) return;
187-
for (const StringName *name = ecma_class->properties.next(NULL); name; name = ecma_class->properties.next(name)) {
188-
const ECMAProperyInfo &pi = ecma_class->properties.get(*name);
189-
p_list->push_back(pi);
180+
for (const KeyValue<StringName, ECMAProperyInfo> &pair : ecma_class->properties) {
181+
p_list->push_back(pair.value);
190182
}
191183
}
192184

@@ -208,15 +200,15 @@ void ECMAScript::update_exports() {
208200
if (!ecma_class) return;
209201

210202
List<PropertyInfo> props;
211-
Map<StringName, Variant> values;
212-
for (const StringName *name = ecma_class->properties.next(NULL); name; name = ecma_class->properties.next(name)) {
213-
const ECMAProperyInfo pi = ecma_class->properties.get(*name);
203+
HashMap<StringName, Variant> values;
204+
for (const KeyValue<StringName, ECMAProperyInfo> &pair : ecma_class->properties) {
205+
const ECMAProperyInfo &pi = pair.value;
214206
props.push_back(pi);
215-
values[*name] = pi.default_value;
207+
values[pair.key] = pi.default_value;
216208
}
217209

218-
for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) {
219-
E->get()->update(props, values);
210+
for (PlaceHolderScriptInstance *s : placeholders) {
211+
s->update(props, values);
220212
}
221213
#endif
222214
}
@@ -228,8 +220,8 @@ bool ECMAScript::has_script_signal(const StringName &p_signal) const {
228220

229221
void ECMAScript::get_script_signal_list(List<MethodInfo> *r_signals) const {
230222
if (!ecma_class) return;
231-
for (const StringName *name = ecma_class->signals.next(NULL); name; name = ecma_class->signals.next(name)) {
232-
r_signals->push_back(ecma_class->signals.get(*name));
223+
for (const KeyValue<StringName, MethodInfo> &pair : ecma_class->signals) {
224+
r_signals->push_back(pair.value);
233225
}
234226
}
235227

@@ -240,19 +232,19 @@ bool ECMAScript::is_valid() const {
240232
void ECMAScript::_bind_methods() {
241233
}
242234

243-
RES ResourceFormatLoaderECMAScript::load(const String &p_path, const String &p_original_path, Error *r_error) {
235+
Ref<Resource> ResourceFormatLoaderECMAScript::load(const String &p_path, const String &p_original_path, Error *r_error) {
244236
Error err = OK;
245237
Ref<ECMAScriptModule> module = ResourceFormatLoaderECMAScriptModule::load_static(p_path, p_original_path, &err);
246238
if (r_error) *r_error = err;
247-
ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot load script file '" + p_path + "'.");
239+
ERR_FAIL_COND_V_MSG(err != OK, Ref<Resource>(), "Cannot load script file '" + p_path + "'.");
248240
Ref<ECMAScript> script;
249-
script.instance();
241+
script.instantiate();
250242
script->set_script_path(p_path);
251243
script->bytecode = module->get_bytecode();
252244
script->set_source_code(module->get_source_code());
253245
err = script->reload();
254246
if (r_error) *r_error = err;
255-
ERR_FAIL_COND_V_MSG(err != OK, RES(), "Parse source code from file '" + p_path + "' failed.");
247+
ERR_FAIL_COND_V_MSG(err != OK, Ref<Resource>(), "Parse source code from file '" + p_path + "' failed.");
256248
#ifdef TOOLS_ENABLED
257249
ECMAScriptLanguage::get_singleton()->get_scripts().insert(script);
258250
#endif
@@ -279,21 +271,20 @@ String ResourceFormatLoaderECMAScript::get_resource_type(const String &p_path) c
279271
return "";
280272
}
281273

282-
Error ResourceFormatSaverECMAScript::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {
274+
Error ResourceFormatSaverECMAScript::save(const String &p_path, const Ref<Resource> &p_resource, uint32_t p_flags) {
283275

284276
Ref<ECMAScript> script = p_resource;
285277
ERR_FAIL_COND_V(script.is_null(), ERR_INVALID_PARAMETER);
286278

287279
String source = script->get_source_code();
288280

289281
Error err;
290-
FileAccessRef file = FileAccess::open(p_path, FileAccess::WRITE, &err);
282+
Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err);
291283
ERR_FAIL_COND_V_MSG(err, err, "Cannot save file '" + p_path + "'.");
292284
file->store_string(source);
293285
if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) {
294286
return ERR_CANT_CREATE;
295287
}
296-
file->close();
297288

298289
if (ScriptServer::is_reload_scripts_on_save_enabled()) {
299290
script->reload();
@@ -302,14 +293,14 @@ Error ResourceFormatSaverECMAScript::save(const String &p_path, const RES &p_res
302293
return OK;
303294
}
304295

305-
void ResourceFormatSaverECMAScript::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const {
296+
void ResourceFormatSaverECMAScript::get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const {
306297
if (Object::cast_to<ECMAScript>(*p_resource)) {
307298
p_extensions->push_back(EXT_JSCLASS);
308299
}
309300
}
310301

311-
bool ResourceFormatSaverECMAScript::recognize(const RES &p_resource) const {
312-
return Object::cast_to<ECMAScript>(*p_resource) != NULL;
302+
bool ResourceFormatSaverECMAScript::recognize(const Ref<Resource> &p_resource) const {
303+
return Object::cast_to<ECMAScript>(*p_resource) != nullptr;
313304
}
314305

315306
void ECMAScriptModule::_bind_methods() {
@@ -326,8 +317,8 @@ ECMAScriptModule::ECMAScriptModule() {
326317
set_source_code("module.exports = {};" ENDL);
327318
}
328319

329-
RES ResourceFormatLoaderECMAScriptModule::load(const String &p_path, const String &p_original_path, Error *r_error) {
330-
return load_static(p_path, p_original_path, r_error);
320+
Ref<Resource> ResourceFormatLoaderECMAScriptModule::load(const String &p_path, const String &p_original_path, Error *r_error) {
321+
Ref<Resource>turn load_static(p_path, p_original_path, r_error);
331322
}
332323

333324
void ResourceFormatLoaderECMAScriptModule::get_recognized_extensions(List<String> *p_extensions) const {
@@ -350,24 +341,24 @@ String ResourceFormatLoaderECMAScriptModule::get_resource_type(const String &p_p
350341
return "";
351342
}
352343

353-
RES ResourceFormatLoaderECMAScriptModule::load_static(const String &p_path, const String &p_original_path, Error *r_error) {
344+
Ref<Resource> ResourceFormatLoaderECMAScriptModule::load_static(const String &p_path, const String &p_original_path, Error *r_error) {
354345
Error err = ERR_FILE_CANT_OPEN;
355346
Ref<ECMAScriptModule> module;
356-
module.instance();
347+
module.instantiate();
357348
module->set_script_path(p_path);
358349
if (p_path.ends_with("." EXT_JSMODULE) || p_path.ends_with("." EXT_JSCLASS) || p_path.ends_with("." EXT_JSON)) {
359350
String code = FileAccess::get_file_as_string(p_path, &err);
360351
if (r_error) *r_error = err;
361-
ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot load source code from file '" + p_path + "'.");
352+
ERR_FAIL_COND_V_MSG(err != OK, Ref<Resource>(), "Cannot load source code from file '" + p_path + "'.");
362353
module->set_source_code(code);
363354
} else if (p_path.ends_with("." EXT_JSMODULE_BYTECODE) || p_path.ends_with("." EXT_JSCLASS_BYTECODE)) {
364355
module->set_bytecode(FileAccess::get_file_as_array(p_path, &err));
365356
if (r_error) *r_error = err;
366-
ERR_FAIL_COND_V_MSG(err != OK, RES(), "Cannot load bytecode from file '" + p_path + "'.");
357+
ERR_FAIL_COND_V_MSG(err != OK, Ref<Resource>(), "Cannot load bytecode from file '" + p_path + "'.");
367358
} else if (p_path.ends_with("." EXT_JSMODULE_ENCRYPTED) || p_path.ends_with("." EXT_JSCLASS_ENCRYPTED)) {
368-
FileAccess *fa = FileAccess::open(p_path, FileAccess::READ);
369-
if (fa->is_open()) {
370-
FileAccessEncrypted *fae = memnew(FileAccessEncrypted);
359+
Ref<FileAccess> fa = FileAccess::open(p_path, FileAccess::READ);
360+
if (fa.is_valid() && fa->is_open()) {
361+
Ref<FileAccessEncrypted> fae = memnew(FileAccessEncrypted);
371362
Vector<uint8_t> key;
372363
key.resize(32);
373364
for (int i = 0; i < key.size(); i++) {
@@ -376,7 +367,7 @@ RES ResourceFormatLoaderECMAScriptModule::load_static(const String &p_path, cons
376367
err = fae->open_and_parse(fa, key, FileAccessEncrypted::MODE_READ);
377368
if (err == OK) {
378369
Vector<uint8_t> encrypted_code;
379-
encrypted_code.resize(fae->get_len());
370+
encrypted_code.resize(fae->get_length());
380371
fae->get_buffer(encrypted_code.ptrw(), encrypted_code.size());
381372

382373
String code;
@@ -385,45 +376,36 @@ RES ResourceFormatLoaderECMAScriptModule::load_static(const String &p_path, cons
385376
} else {
386377
module->set_source_code(code);
387378
}
388-
fa->close();
389-
fae->close();
390-
memdelete(fae);
391-
} else {
392-
fa->close();
393-
fae->close();
394-
memdelete(fae);
395-
memdelete(fa);
396379
}
397380
} else {
398381
err = ERR_CANT_OPEN;
399382
}
400383
}
401384
if (r_error) *r_error = err;
402-
ERR_FAIL_COND_V(err != OK, RES());
385+
ERR_FAIL_COND_V(err != OK, Ref<Resource>());
403386
return module;
404387
}
405388

406-
Error ResourceFormatSaverECMAScriptModule::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {
389+
Error ResourceFormatSaverECMAScriptModule::save(const String &p_path, const Ref<Resource> &p_resource, uint32_t p_flags) {
407390
Ref<ECMAScriptModule> module = p_resource;
408391
ERR_FAIL_COND_V(module.is_null(), ERR_INVALID_PARAMETER);
409392
String source = module->get_source_code();
410393
Error err;
411-
FileAccessRef file = FileAccess::open(p_path, FileAccess::WRITE, &err);
394+
Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err);
412395
ERR_FAIL_COND_V_MSG(err, err, "Cannot save file '" + p_path + "'.");
413396
file->store_string(source);
414397
if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) {
415398
return ERR_CANT_CREATE;
416399
}
417-
file->close();
418400
return OK;
419401
}
420402

421-
void ResourceFormatSaverECMAScriptModule::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const {
403+
void ResourceFormatSaverECMAScriptModule::get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const {
422404
if (Object::cast_to<ECMAScriptModule>(*p_resource)) {
423405
p_extensions->push_back(EXT_JSMODULE);
424406
}
425407
}
426408

427-
bool ResourceFormatSaverECMAScriptModule::recognize(const RES &p_resource) const {
428-
return Object::cast_to<ECMAScriptModule>(*p_resource) != NULL;
409+
bool ResourceFormatSaverECMAScriptModule::recognize(const Ref<Resource> &p_resource) const {
410+
return Object::cast_to<ECMAScriptModule>(*p_resource) != nullptr;
429411
}

0 commit comments

Comments
 (0)