1
1
#include " ecmascript.h"
2
- #include " core/engine.h"
2
+ #include " core/config/ engine.h"
3
3
#include " core/io/file_access_encrypted.h"
4
4
#include " ecmascript_instance.h"
5
5
#include " ecmascript_language.h"
@@ -15,8 +15,7 @@ ECMAScript::ECMAScript() {
15
15
ECMAScript::~ECMAScript () {
16
16
}
17
17
18
- bool ECMAScript::can_instance () const {
19
-
18
+ bool ECMAScript::can_instantiate () const {
20
19
#ifdef TOOLS_ENABLED
21
20
return is_valid () && (is_tool () || ScriptServer::is_scripting_enabled ());
22
21
#else
@@ -37,7 +36,7 @@ ScriptInstance *ECMAScript::instance_create(Object *p_this) {
37
36
ERR_FAIL_NULL_V_MSG (binder, NULL , " Cannot create instance from this thread" );
38
37
const ECMAClassInfo *cls = NULL ;
39
38
ECMAscriptScriptError ecma_err;
40
- if (!bytecode.empty ()) {
39
+ if (!bytecode.is_empty ()) {
41
40
cls = binder->parse_ecma_class (bytecode, script_path, false , &ecma_err);
42
41
} else {
43
42
cls = binder->parse_ecma_class (code, script_path, false , &ecma_err);
@@ -88,7 +87,7 @@ Error ECMAScript::reload(bool p_keep_state) {
88
87
ECMAScriptBinder *binder = ECMAScriptLanguage::get_thread_binder (Thread::get_caller_id ());
89
88
ERR_FAIL_COND_V_MSG (binder == NULL , ERR_INVALID_DATA, " Cannot load script in this thread" );
90
89
ECMAscriptScriptError ecma_err;
91
- if (!bytecode.empty ()) {
90
+ if (!bytecode.is_empty ()) {
92
91
ecma_class = binder->parse_ecma_class (bytecode, script_path, true , &ecma_err);
93
92
} else {
94
93
ecma_class = binder->parse_ecma_class (code, script_path, true , &ecma_err);
@@ -102,19 +101,15 @@ Error ECMAScript::reload(bool p_keep_state) {
102
101
set_last_modified_time (FileAccess::get_modified_time (script_path));
103
102
p_keep_state = true ;
104
103
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;
109
106
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 ));
114
109
}
115
110
}
116
111
117
- ScriptInstance *si = E-> get () ->get_script_instance ();
112
+ ScriptInstance *si = owner ->get_script_instance ();
118
113
if (si->is_placeholder ()) {
119
114
PlaceHolderScriptInstance *psi = static_cast <PlaceHolderScriptInstance *>(si);
120
115
if (ecma_class->tool ) {
@@ -130,10 +125,10 @@ Error ECMAScript::reload(bool p_keep_state) {
130
125
}
131
126
132
127
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 );
137
132
}
138
133
}
139
134
}
@@ -175,18 +170,15 @@ bool ECMAScript::is_tool() const {
175
170
176
171
void ECMAScript::get_script_method_list (List<MethodInfo> *p_list) const {
177
172
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 );
182
175
}
183
176
}
184
177
185
178
void ECMAScript::get_script_property_list (List<PropertyInfo> *p_list) const {
186
179
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 );
190
182
}
191
183
}
192
184
@@ -208,15 +200,15 @@ void ECMAScript::update_exports() {
208
200
if (!ecma_class) return ;
209
201
210
202
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 ;
214
206
props.push_back (pi);
215
- values[*name ] = pi.default_value ;
207
+ values[pair. key ] = pi.default_value ;
216
208
}
217
209
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);
220
212
}
221
213
#endif
222
214
}
@@ -228,8 +220,8 @@ bool ECMAScript::has_script_signal(const StringName &p_signal) const {
228
220
229
221
void ECMAScript::get_script_signal_list (List<MethodInfo> *r_signals) const {
230
222
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 );
233
225
}
234
226
}
235
227
@@ -240,19 +232,19 @@ bool ECMAScript::is_valid() const {
240
232
void ECMAScript::_bind_methods () {
241
233
}
242
234
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) {
244
236
Error err = OK;
245
237
Ref<ECMAScriptModule> module = ResourceFormatLoaderECMAScriptModule::load_static (p_path, p_original_path, &err);
246
238
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 + " '." );
248
240
Ref<ECMAScript> script;
249
- script.instance ();
241
+ script.instantiate ();
250
242
script->set_script_path (p_path);
251
243
script->bytecode = module ->get_bytecode ();
252
244
script->set_source_code (module ->get_source_code ());
253
245
err = script->reload ();
254
246
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." );
256
248
#ifdef TOOLS_ENABLED
257
249
ECMAScriptLanguage::get_singleton ()->get_scripts ().insert (script);
258
250
#endif
@@ -279,21 +271,20 @@ String ResourceFormatLoaderECMAScript::get_resource_type(const String &p_path) c
279
271
return " " ;
280
272
}
281
273
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) {
283
275
284
276
Ref<ECMAScript> script = p_resource;
285
277
ERR_FAIL_COND_V (script.is_null (), ERR_INVALID_PARAMETER);
286
278
287
279
String source = script->get_source_code ();
288
280
289
281
Error err;
290
- FileAccessRef file = FileAccess::open (p_path, FileAccess::WRITE, &err);
282
+ Ref<FileAccess> file = FileAccess::open (p_path, FileAccess::WRITE, &err);
291
283
ERR_FAIL_COND_V_MSG (err, err, " Cannot save file '" + p_path + " '." );
292
284
file->store_string (source);
293
285
if (file->get_error () != OK && file->get_error () != ERR_FILE_EOF) {
294
286
return ERR_CANT_CREATE;
295
287
}
296
- file->close ();
297
288
298
289
if (ScriptServer::is_reload_scripts_on_save_enabled ()) {
299
290
script->reload ();
@@ -302,14 +293,14 @@ Error ResourceFormatSaverECMAScript::save(const String &p_path, const RES &p_res
302
293
return OK;
303
294
}
304
295
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 {
306
297
if (Object::cast_to<ECMAScript>(*p_resource)) {
307
298
p_extensions->push_back (EXT_JSCLASS);
308
299
}
309
300
}
310
301
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 ;
313
304
}
314
305
315
306
void ECMAScriptModule::_bind_methods () {
@@ -326,8 +317,8 @@ ECMAScriptModule::ECMAScriptModule() {
326
317
set_source_code (" module.exports = {};" ENDL);
327
318
}
328
319
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);
331
322
}
332
323
333
324
void ResourceFormatLoaderECMAScriptModule::get_recognized_extensions (List<String> *p_extensions) const {
@@ -350,24 +341,24 @@ String ResourceFormatLoaderECMAScriptModule::get_resource_type(const String &p_p
350
341
return " " ;
351
342
}
352
343
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) {
354
345
Error err = ERR_FILE_CANT_OPEN;
355
346
Ref<ECMAScriptModule> module ;
356
- module .instance ();
347
+ module .instantiate ();
357
348
module ->set_script_path (p_path);
358
349
if (p_path.ends_with (" ." EXT_JSMODULE) || p_path.ends_with (" ." EXT_JSCLASS) || p_path.ends_with (" ." EXT_JSON)) {
359
350
String code = FileAccess::get_file_as_string (p_path, &err);
360
351
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 + " '." );
362
353
module ->set_source_code (code);
363
354
} else if (p_path.ends_with (" ." EXT_JSMODULE_BYTECODE) || p_path.ends_with (" ." EXT_JSCLASS_BYTECODE)) {
364
355
module ->set_bytecode (FileAccess::get_file_as_array (p_path, &err));
365
356
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 + " '." );
367
358
} 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);
371
362
Vector<uint8_t > key;
372
363
key.resize (32 );
373
364
for (int i = 0 ; i < key.size (); i++) {
@@ -376,7 +367,7 @@ RES ResourceFormatLoaderECMAScriptModule::load_static(const String &p_path, cons
376
367
err = fae->open_and_parse (fa, key, FileAccessEncrypted::MODE_READ);
377
368
if (err == OK) {
378
369
Vector<uint8_t > encrypted_code;
379
- encrypted_code.resize (fae->get_len ());
370
+ encrypted_code.resize (fae->get_length ());
380
371
fae->get_buffer (encrypted_code.ptrw (), encrypted_code.size ());
381
372
382
373
String code;
@@ -385,45 +376,36 @@ RES ResourceFormatLoaderECMAScriptModule::load_static(const String &p_path, cons
385
376
} else {
386
377
module ->set_source_code (code);
387
378
}
388
- fa->close ();
389
- fae->close ();
390
- memdelete (fae);
391
- } else {
392
- fa->close ();
393
- fae->close ();
394
- memdelete (fae);
395
- memdelete (fa);
396
379
}
397
380
} else {
398
381
err = ERR_CANT_OPEN;
399
382
}
400
383
}
401
384
if (r_error) *r_error = err;
402
- ERR_FAIL_COND_V (err != OK, RES ());
385
+ ERR_FAIL_COND_V (err != OK, Ref<Resource> ());
403
386
return module ;
404
387
}
405
388
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) {
407
390
Ref<ECMAScriptModule> module = p_resource;
408
391
ERR_FAIL_COND_V (module .is_null (), ERR_INVALID_PARAMETER);
409
392
String source = module ->get_source_code ();
410
393
Error err;
411
- FileAccessRef file = FileAccess::open (p_path, FileAccess::WRITE, &err);
394
+ Ref<FileAccess> file = FileAccess::open (p_path, FileAccess::WRITE, &err);
412
395
ERR_FAIL_COND_V_MSG (err, err, " Cannot save file '" + p_path + " '." );
413
396
file->store_string (source);
414
397
if (file->get_error () != OK && file->get_error () != ERR_FILE_EOF) {
415
398
return ERR_CANT_CREATE;
416
399
}
417
- file->close ();
418
400
return OK;
419
401
}
420
402
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 {
422
404
if (Object::cast_to<ECMAScriptModule>(*p_resource)) {
423
405
p_extensions->push_back (EXT_JSMODULE);
424
406
}
425
407
}
426
408
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 ;
429
411
}
0 commit comments