Skip to content

Commit

Permalink
Fix compile error for godot 4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Geequlim committed Aug 23, 2022
1 parent 5fd05b6 commit 254fe19
Show file tree
Hide file tree
Showing 13 changed files with 519 additions and 626 deletions.
10 changes: 1 addition & 9 deletions ecmascript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,6 @@ PlaceHolderScriptInstance *ECMAScript::placeholder_instance_create(Object *p_thi
#endif
}

bool ECMAScript::is_placeholder_fallback_enabled() const {
#ifdef TOOLS_ENABLED
return Engine::get_singleton()->is_editor_hint() && false;
#else
return false;
#endif
}

Error ECMAScript::reload(bool p_keep_state) {
ecma_class = NULL;
Error err = OK;
Expand Down Expand Up @@ -318,7 +310,7 @@ ECMAScriptModule::ECMAScriptModule() {
}

Ref<Resource> ResourceFormatLoaderECMAScriptModule::load(const String &p_path, const String &p_original_path, Error *r_error) {
Ref<Resource>turn load_static(p_path, p_original_path, r_error);
return load_static(p_path, p_original_path, r_error);
}

void ResourceFormatLoaderECMAScriptModule::get_recognized_extensions(List<String> *p_extensions) const {
Expand Down
86 changes: 41 additions & 45 deletions ecmascript.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,64 +28,60 @@ class ECMAScript : public Script {
String code;
String script_path;
Vector<uint8_t> bytecode;

const BasicECMAClassInfo *ecma_class;

#ifdef TOOLS_ENABLED
HashSet<PlaceHolderScriptInstance *> placeholders;
virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder);
virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) override;
#endif

Dictionary rpc_config;

protected:
void _notification(int p_what) {}
static void _bind_methods();

public:
virtual bool can_instantiate() const;

/* TODO */ virtual Ref<Script> get_base_script() const { return nullptr; } //for script inheritance
/* TODO */ virtual bool inherits_script(const Ref<Script> &p_script) const { return false; }

virtual StringName get_instance_base_type() const;
virtual ScriptInstance *instance_create(Object *p_this);
virtual bool instance_has(const Object *p_this) const;
virtual PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this);
virtual bool can_instantiate() const override;

virtual bool is_placeholder_fallback_enabled() const;
virtual Ref<Script> get_base_script() const override { return nullptr; }
virtual bool inherits_script(const Ref<Script> &p_script) const override { return false; }

virtual bool has_source_code() const { return true; }
virtual String get_source_code() const { return code; }
virtual StringName get_instance_base_type() const override;
virtual ScriptInstance *instance_create(Object *p_this) override;
virtual PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this) override;
virtual bool instance_has(const Object *p_this) const override;

virtual void set_source_code(const String &p_code) { code = p_code; }
virtual Error reload(bool p_keep_state = true);
virtual bool has_source_code() const override { return true; }
virtual String get_source_code() const override { return code; }
virtual void set_source_code(const String &p_code) override { code = p_code; }
virtual Error reload(bool p_keep_state = true) override;

virtual bool has_method(const StringName &p_method) const;
virtual MethodInfo get_method_info(const StringName &p_method) const;
#ifdef TOOLS_ENABLED
_FORCE_INLINE_ virtual Vector<DocData::ClassDoc> get_documentation() const override { return Vector<DocData::ClassDoc>(); }
#endif

virtual bool is_tool() const;
virtual bool is_valid() const;
virtual bool has_method(const StringName &p_method) const override;
virtual MethodInfo get_method_info(const StringName &p_method) const override;

virtual void get_script_method_list(List<MethodInfo> *p_list) const;
virtual void get_script_property_list(List<PropertyInfo> *p_list) const;
virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const;
virtual bool is_tool() const override;
virtual bool is_valid() const override;

virtual bool has_script_signal(const StringName &p_signal) const;
virtual void get_script_signal_list(List<MethodInfo> *r_signals) const;
virtual ScriptLanguage *get_language() const override;

virtual void update_exports(); //editor tool
virtual bool has_script_signal(const StringName &p_signal) const override;
virtual void get_script_signal_list(List<MethodInfo> *r_signals) const override;

/* TODO */ virtual int get_member_line(const StringName &p_member) const { return -1; }
/* TODO */ virtual void get_constants(HashMap<StringName, Variant> *p_constants) {}
/* TODO */ virtual void get_members(HashSet<StringName> *p_constants) {}
virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const override;

virtual ScriptLanguage *get_language() const;
virtual void update_exports() override;
virtual void get_script_method_list(List<MethodInfo> *p_list) const override;
virtual void get_script_property_list(List<PropertyInfo> *p_list) const override;

_FORCE_INLINE_ String get_script_path() const { return script_path; }
_FORCE_INLINE_ void set_script_path(const String &p_path) { script_path = p_path; }

#ifdef TOOLS_ENABLED
_FORCE_INLINE_ virtual Vector<DocData::ClassDoc> get_documentation() { return Vector<DocData::ClassDoc>(); }
#endif // TOOLS_ENABLED
virtual const Variant get_rpc_config() const override { return rpc_config; }

ECMAScript();
virtual ~ECMAScript();
Expand All @@ -95,18 +91,18 @@ class ResourceFormatLoaderECMAScript : public ResourceFormatLoader {
GDCLASS(ResourceFormatLoaderECMAScript, ResourceFormatLoader)
public:
virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
virtual bool handles_type(const String &p_type) const;
virtual String get_resource_type(const String &p_path) const;
virtual void get_recognized_extensions(List<String> *p_extensions) const override;
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const override;
virtual bool handles_type(const String &p_type) const override;
virtual String get_resource_type(const String &p_path) const override;
};

class ResourceFormatSaverECMAScript : public ResourceFormatSaver {
GDCLASS(ResourceFormatSaverECMAScript, ResourceFormatSaver)
public:
virtual Error save(const String &p_path, const Ref<Resource> &p_resource, uint32_t p_flags = 0);
virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const;
virtual bool recognize(const Ref<Resource> &p_resource) const;
virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const override;
virtual bool recognize(const Ref<Resource> &p_resource) const override;
};

class ECMAScriptModule : public TextFile {
Expand All @@ -130,10 +126,10 @@ class ResourceFormatLoaderECMAScriptModule : public ResourceFormatLoader {
GDCLASS(ResourceFormatLoaderECMAScriptModule, ResourceFormatLoader)
public:
virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
virtual void get_recognized_extensions(List<String> *p_extensions) const;
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const;
virtual bool handles_type(const String &p_type) const;
virtual String get_resource_type(const String &p_path) const;
virtual void get_recognized_extensions(List<String> *p_extensions) const override;
virtual void get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const override;
virtual bool handles_type(const String &p_type) const override;
virtual String get_resource_type(const String &p_path) const override;

static Ref<Resource> load_static(const String &p_path, const String &p_original_path = "", Error *r_error = NULL);
};
Expand All @@ -142,8 +138,8 @@ class ResourceFormatSaverECMAScriptModule : public ResourceFormatSaver {
GDCLASS(ResourceFormatSaverECMAScriptModule, ResourceFormatSaver)
public:
virtual Error save(const String &p_path, const Ref<Resource> &p_resource, uint32_t p_flags = 0);
virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const;
virtual bool recognize(const Ref<Resource> &p_resource) const;
virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const override;
virtual bool recognize(const Ref<Resource> &p_resource) const override;
};

#endif // ECMASCRIPT_H
9 changes: 4 additions & 5 deletions ecmascript_binder.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,10 @@ class ECMAScriptBinder {
virtual void language_finalize() = 0;
virtual void frame() = 0;

virtual void *alloc_object_binding_data(Object *p_object) = 0;
virtual void free_object_binding_data(void *p_gc_handle) = 0;

virtual void godot_refcount_incremented(RefCounted *p_object) = 0;
virtual bool godot_refcount_decremented(RefCounted *p_object) = 0;
virtual ECMAScriptGCHandler *alloc_object_binding_data(Object *p_object) = 0;
virtual void free_object_binding_data(ECMAScriptGCHandler *p_gc_handle) = 0;
virtual void godot_refcount_incremented(ECMAScriptGCHandler *p_gc_handle) = 0;
virtual bool godot_refcount_decremented(ECMAScriptGCHandler *p_gc_handle) = 0;

virtual Error eval_string(const String &p_source, EvalType type, const String &p_path, ECMAScriptGCHandler &r_ret) = 0;
virtual Error safe_eval_text(const String &p_source, EvalType type, const String &p_path, String &r_error, ECMAScriptGCHandler &r_ret) = 0;
Expand Down
2 changes: 1 addition & 1 deletion ecmascript_instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Variant::Type ECMAScriptInstance::get_property_type(const StringName &p_name, bo
return Variant::NIL;
}

Variant ECMAScriptInstance::call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
Variant ECMAScriptInstance::callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
if (binder == NULL || ecma_object.ecma_object == NULL) {
r_error.error = Callable::CallError::CALL_ERROR_INSTANCE_IS_NULL;
ERR_FAIL_V(Variant());
Expand Down
35 changes: 11 additions & 24 deletions ecmascript_instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,34 +18,21 @@ class ECMAScriptInstance : public ScriptInstance {
const ECMAClassInfo *ecma_class;

public:
virtual bool set(const StringName &p_name, const Variant &p_value);
virtual bool get(const StringName &p_name, Variant &r_ret) const;
virtual void get_property_list(List<PropertyInfo> *p_properties) const;
virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = NULL) const;
virtual bool set(const StringName &p_name, const Variant &p_value) override;
virtual bool get(const StringName &p_name, Variant &r_ret) const override;
virtual void get_property_list(List<PropertyInfo> *p_properties) const override;
virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = nullptr) const override;

virtual Object *get_owner() { return owner; }
virtual Ref<Script> get_script() const;
virtual void get_method_list(List<MethodInfo> *p_list) const override;
virtual bool has_method(const StringName &p_method) const override;

virtual void get_method_list(List<MethodInfo> *p_list) const;
virtual bool has_method(const StringName &p_method) const;
virtual Variant callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;

virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
virtual Object *get_owner() override { return owner; }
virtual Ref<Script> get_script() const override;
virtual ScriptLanguage *get_language() override;

/* TODO */ virtual void notification(int p_notification) {}

//this is used by script languages that keep a reference counter of their own
//you can make make Ref<> not die when it reaches zero, so deleting the reference
//depends entirely from the script

/* TODO */ virtual void refcount_incremented() {}
/* TODO */ virtual bool refcount_decremented() { return true; } //return true if it can die

/* TODO */ virtual bool is_placeholder() const { return false; }

/* TODO */ virtual void property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid) {}
/* TODO */ virtual Variant property_get_fallback(const StringName &p_name, bool *r_valid) { return Variant(); }

virtual ScriptLanguage *get_language();
virtual void notification(int p_notification) override{};

ECMAScriptInstance();
~ECMAScriptInstance();
Expand Down
82 changes: 44 additions & 38 deletions ecmascript_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,52 @@
#include "core/io/file_access.h"
ECMAScriptLanguage *ECMAScriptLanguage::singleton = NULL;

namespace ECMAScriptInstanceBindingCallbacks {

static void *create_callback(void *p_token, void *p_instance) {
if (ECMAScriptBinder *binder = ECMAScriptLanguage::get_singleton()->get_thread_binder(Thread::get_caller_id())) {
return binder->alloc_object_binding_data(static_cast<Object *>(p_instance));
}
return nullptr;
}

static void free_callback(void *p_token, void *p_instance, void *p_binding) {
if (ECMAScriptBinder *binder = ECMAScriptLanguage::get_singleton()->get_thread_binder(Thread::get_caller_id())) {
return binder->free_object_binding_data(static_cast<ECMAScriptGCHandler *>(p_binding));
}
}

static GDNativeBool reference_callback(void *p_token, void *p_binding, GDNativeBool p_reference) {
if (ECMAScriptBinder *binder = ECMAScriptLanguage::get_singleton()->get_thread_binder(Thread::get_caller_id())) {
if (p_reference) {
binder->godot_refcount_incremented(static_cast<ECMAScriptGCHandler *>(p_binding));
return false;
} else {
return binder->godot_refcount_decremented(static_cast<ECMAScriptGCHandler *>(p_binding));
}
}
return true;
}

} // namespace ECMAScriptInstanceBindingCallbacks

ECMAScriptLanguage::ECMAScriptLanguage() {
ERR_FAIL_COND(singleton);
singleton = this;
main_binder = memnew(QuickJSBinder);
instance_binding_callbacks.create_callback = ECMAScriptInstanceBindingCallbacks::create_callback;
instance_binding_callbacks.free_callback = ECMAScriptInstanceBindingCallbacks::free_callback;
instance_binding_callbacks.reference_callback = ECMAScriptInstanceBindingCallbacks::reference_callback;
}

ECMAScriptLanguage::~ECMAScriptLanguage() {
memdelete(main_binder);
}

void ECMAScriptLanguage::init() {
ERR_FAIL_NULL(main_binder);
main_binder->initialize();
execute_file("bin/test.js");
}

void ECMAScriptLanguage::finish() {
Expand Down Expand Up @@ -212,7 +255,7 @@ Ref<Script> ECMAScriptLanguage::get_template(const String &p_class_name, const S
}

Ref<Script> ECMAScriptLanguage::make_template(const String &p_template, const String &p_class_name, const String &p_base_class_name) const {
Ref<Script> script;
Ref<ECMAScript> script;
script.instantiate();
String src = script->get_source_code();
src = src.replace("%BASE%", p_base_class_name).replace("%CLASS%", p_class_name);
Expand Down Expand Up @@ -267,32 +310,6 @@ void ECMAScriptLanguage::get_recognized_extensions(List<String> *p_extensions) c
p_extensions->push_back(EXT_JSCLASS_BYTECODE);
}

void *ECMAScriptLanguage::alloc_instance_binding_data(Object *p_object) {
if (ECMAScriptBinder *binder = get_thread_binder(Thread::get_caller_id())) {
return binder->alloc_object_binding_data(p_object);
}
return NULL;
}

void ECMAScriptLanguage::free_instance_binding_data(void *p_data) {
if (ECMAScriptBinder *binder = get_thread_binder(Thread::get_caller_id())) {
return binder->free_object_binding_data(p_data);
}
}

void ECMAScriptLanguage::refcount_incremented_instance_binding(Object *p_object) {
if (ECMAScriptBinder *binder = get_thread_binder(Thread::get_caller_id())) {
binder->godot_refcount_incremented(static_cast<RefCounted *>(p_object));
}
}

bool ECMAScriptLanguage::refcount_decremented_instance_binding(Object *p_object) {
if (ECMAScriptBinder *binder = get_thread_binder(Thread::get_caller_id())) {
return binder->godot_refcount_decremented(static_cast<RefCounted *>(p_object));
}
return true;
}

void ECMAScriptLanguage::frame() {
main_binder->frame();
}
Expand Down Expand Up @@ -325,14 +342,3 @@ String ECMAScriptLanguage::globalize_relative_path(const String &p_relative, con
}
return file;
}

ECMAScriptLanguage::ECMAScriptLanguage() {

ERR_FAIL_COND(singleton);
singleton = this;
main_binder = memnew(QuickJSBinder);
}

ECMAScriptLanguage::~ECMAScriptLanguage() {
memdelete(main_binder);
}
Loading

0 comments on commit 254fe19

Please sign in to comment.