Skip to content

Commit

Permalink
Renamed the bind_native functions to bind_vararg, should make it show…
Browse files Browse the repository at this point in the history
… the documentation more clearly and also make it easier to bind to C#
  • Loading branch information
reduz committed Sep 7, 2016
1 parent 19bd661 commit 828e1c0
Show file tree
Hide file tree
Showing 13 changed files with 55 additions and 60 deletions.
6 changes: 1 addition & 5 deletions core/func_ref.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,7 @@ void FuncRef::_bind_methods() {
MethodInfo mi;
mi.name="call_func";
Vector<Variant> defargs;
for(int i=0;i<10;i++) {
mi.arguments.push_back( PropertyInfo( Variant::NIL, "arg"+itos(i)));
defargs.push_back(Variant());
}
ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"call_func:Variant",&FuncRef::call_func,mi,defargs);
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"call_func:Variant",&FuncRef::call_func,mi,defargs);

}

Expand Down
19 changes: 12 additions & 7 deletions core/method_bind.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ enum MethodFlags {
METHOD_FLAG_REVERSE=16, // used for events
METHOD_FLAG_VIRTUAL=32,
METHOD_FLAG_FROM_SCRIPT=64,
METHOD_FLAG_VARARG=128,
METHOD_FLAGS_DEFAULT=METHOD_FLAG_NORMAL,
};

Expand Down Expand Up @@ -229,7 +230,7 @@ class MethodBind {
Vector<StringName> get_argument_names() const;
#endif
void set_hint_flags(uint32_t p_hint) { hint_flags=p_hint; }
uint32_t get_hint_flags() const { return hint_flags|(is_const()?METHOD_FLAG_CONST:0); }
uint32_t get_hint_flags() const { return hint_flags|(is_const()?METHOD_FLAG_CONST:0)|(is_vararg()?METHOD_FLAG_VARARG:0); }
virtual String get_instance_type() const=0;

_FORCE_INLINE_ int get_argument_count() const { return argument_count; };
Expand Down Expand Up @@ -267,7 +268,7 @@ class MethodBind {
_FORCE_INLINE_ int get_method_id() const { return method_id; }
_FORCE_INLINE_ bool is_const() const { return _const; }
_FORCE_INLINE_ bool has_return() const { return _returns; }

virtual bool is_vararg() const { return false; }

void set_default_arguments(const Vector<Variant>& p_defargs);

Expand All @@ -277,7 +278,7 @@ class MethodBind {


template<class T>
class MethodBindNative : public MethodBind {
class MethodBindVarArg : public MethodBind {
public:
typedef Variant (T::*NativeCall)(const Variant**,int ,Variant::CallError &);
protected:
Expand Down Expand Up @@ -319,22 +320,26 @@ class MethodBindNative : public MethodBind {
}

#ifdef PTRCALL_ENABLED
virtual void ptrcall(Object* p_object,const void** p_args,void* r_ret) {} //todo
virtual void ptrcall(Object* p_object,const void** p_args,void* r_ret) {
ERR_FAIL(); //can't call
} //todo
#endif


void set_method(NativeCall p_method) { call_method=p_method; }
virtual bool is_const() const { return false; }
virtual String get_instance_type() const { return T::get_type_static(); }

MethodBindNative() { call_method=NULL; _set_returns(true);}
virtual bool is_vararg() const { return true; }

MethodBindVarArg() { call_method=NULL; _set_returns(true);}
};


template<class T >
MethodBind* create_native_method_bind( Variant (T::*p_method)(const Variant**,int ,Variant::CallError &), const MethodInfo& p_info ) {
MethodBind* create_vararg_method_bind( Variant (T::*p_method)(const Variant**,int ,Variant::CallError &), const MethodInfo& p_info ) {

MethodBindNative<T > * a = memnew( (MethodBindNative<T >) );
MethodBindVarArg<T > * a = memnew( (MethodBindVarArg<T >) );
a->set_method(p_method);
a->set_method_info(p_info);
return a;
Expand Down
24 changes: 4 additions & 20 deletions core/object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1693,42 +1693,26 @@ void Object::_bind_methods() {
MethodInfo mi;
mi.name="emit_signal";
mi.arguments.push_back( PropertyInfo( Variant::STRING, "signal"));
Vector<Variant> defargs;
for(int i=0;i<VARIANT_ARG_MAX;i++) {
mi.arguments.push_back( PropertyInfo( Variant::NIL, "arg"+itos(i)));
defargs.push_back(Variant());
}


ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"emit_signal",&Object::_emit_signal,mi,defargs);
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"emit_signal",&Object::_emit_signal,mi);
}

{
MethodInfo mi;
mi.name="call";
mi.arguments.push_back( PropertyInfo( Variant::STRING, "method"));
Vector<Variant> defargs;
for(int i=0;i<10;i++) {
mi.arguments.push_back( PropertyInfo( Variant::NIL, "arg"+itos(i)));
defargs.push_back(Variant());
}


ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"call:Variant",&Object::_call_bind,mi,defargs);

ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"call:Variant",&Object::_call_bind,mi);
}

{
MethodInfo mi;
mi.name="call_deferred";
mi.arguments.push_back( PropertyInfo( Variant::STRING, "method"));
Vector<Variant> defargs;
for(int i=0;i<VARIANT_ARG_MAX;i++) {
mi.arguments.push_back( PropertyInfo( Variant::NIL, "arg"+itos(i)));
defargs.push_back(Variant());
}


ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"call_deferred",&Object::_call_deferred_bind,mi,defargs);
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"call_deferred",&Object::_call_deferred_bind,mi);
}

ObjectTypeDB::bind_method(_MD("callv:Variant","method","arg_array"),&Object::callv);
Expand Down
4 changes: 2 additions & 2 deletions core/object_type_db.h
Original file line number Diff line number Diff line change
Expand Up @@ -415,13 +415,13 @@ class ObjectTypeDB {

#endif
template<class M>
static MethodBind* bind_native_method(uint32_t p_flags, StringName p_name, M p_method,const MethodInfo& p_info=MethodInfo(),const Vector<Variant>& p_default_args=Vector<Variant>()) {
static MethodBind* bind_vararg_method(uint32_t p_flags, StringName p_name, M p_method,const MethodInfo& p_info=MethodInfo(),const Vector<Variant>& p_default_args=Vector<Variant>()) {

GLOBAL_LOCK_FUNCTION;



MethodBind *bind = create_native_method_bind(p_method,p_info);
MethodBind *bind = create_vararg_method_bind(p_method,p_info);
ERR_FAIL_COND_V(!bind,NULL);

String rettype;
Expand Down
16 changes: 4 additions & 12 deletions core/undo_redo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -490,27 +490,19 @@ void UndoRedo::_bind_methods() {
mi.name="add_do_method";
mi.arguments.push_back( PropertyInfo( Variant::OBJECT, "object"));
mi.arguments.push_back( PropertyInfo( Variant::STRING, "method"));
Vector<Variant> defargs;
for(int i=0;i<VARIANT_ARG_MAX;++i) {
mi.arguments.push_back( PropertyInfo( Variant::NIL, "arg"+itos(i)));
defargs.push_back(Variant());
}

ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"add_do_method",&UndoRedo::_add_do_method,mi,defargs);

ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"add_do_method",&UndoRedo::_add_do_method,mi);
}

{
MethodInfo mi;
mi.name="add_undo_method";
mi.arguments.push_back( PropertyInfo( Variant::OBJECT, "object"));
mi.arguments.push_back( PropertyInfo( Variant::STRING, "method"));
Vector<Variant> defargs;
for(int i=0;i<VARIANT_ARG_MAX;++i) {
mi.arguments.push_back( PropertyInfo( Variant::NIL, "arg"+itos(i)));
defargs.push_back(Variant());
}

ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"add_undo_method",&UndoRedo::_add_undo_method,mi,defargs);

ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"add_undo_method",&UndoRedo::_add_undo_method,mi);
}

ObjectTypeDB::bind_method(_MD("add_do_property","object", "property", "value:Variant"),&UndoRedo::add_do_property);
Expand Down
2 changes: 1 addition & 1 deletion modules/gdscript/gd_function.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1437,7 +1437,7 @@ void GDFunctionState::_bind_methods() {

ObjectTypeDB::bind_method(_MD("resume:Variant","arg"),&GDFunctionState::resume,DEFVAL(Variant()));
ObjectTypeDB::bind_method(_MD("is_valid"),&GDFunctionState::is_valid);
ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"_signal_callback",&GDFunctionState::_signal_callback,MethodInfo("_signal_callback"));
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"_signal_callback",&GDFunctionState::_signal_callback,MethodInfo("_signal_callback"));

}

Expand Down
2 changes: 1 addition & 1 deletion modules/gdscript/gd_script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,7 @@ void GDScript::_get_property_list(List<PropertyInfo> *p_properties) const {

void GDScript::_bind_methods() {

ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"new",&GDScript::_new,MethodInfo(Variant::OBJECT,"new"));
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"new",&GDScript::_new,MethodInfo(Variant::OBJECT,"new"));

ObjectTypeDB::bind_method(_MD("get_as_byte_code"),&GDScript::get_as_byte_code);

Expand Down
2 changes: 1 addition & 1 deletion modules/visual_script/visual_script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2439,7 +2439,7 @@ void VisualScriptFunctionState::_bind_methods() {
ObjectTypeDB::bind_method(_MD("connect_to_signal","obj","signals","args"),&VisualScriptFunctionState::connect_to_signal);
ObjectTypeDB::bind_method(_MD("resume:Array","args"),&VisualScriptFunctionState::resume,DEFVAL(Variant()));
ObjectTypeDB::bind_method(_MD("is_valid"),&VisualScriptFunctionState::is_valid);
ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"_signal_callback",&VisualScriptFunctionState::_signal_callback,MethodInfo("_signal_callback"));
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"_signal_callback",&VisualScriptFunctionState::_signal_callback,MethodInfo("_signal_callback"));
}

VisualScriptFunctionState::VisualScriptFunctionState() {
Expand Down
8 changes: 8 additions & 0 deletions modules/visual_script/visual_script_func_nodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,14 @@ void VisualScriptFunctionCall::_update_method_cache() {

method_cache.return_val = mb->get_argument_info(-1);
#endif

if (mb->is_vararg()) {
//for vararg just give it 10 arguments (should be enough for most use cases)
for(int i=0;i<10;i++) {
method_cache.arguments.push_back(PropertyInfo(Variant::NIL,"arg"+itos(i)));
use_default_args++;
}
}
} else if (script.is_valid() && script->has_method(function)) {

method_cache = script->get_method_info(function);
Expand Down
10 changes: 5 additions & 5 deletions scene/main/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2903,16 +2903,16 @@ void Node::_bind_methods() {


mi.name="rpc";
ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"rpc",&Node::_rpc_bind,mi);
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"rpc",&Node::_rpc_bind,mi);
mi.name="rpc_unreliable";
ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"rpc_unreliable",&Node::_rpc_unreliable_bind,mi);
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"rpc_unreliable",&Node::_rpc_unreliable_bind,mi);

mi.arguments.push_front( PropertyInfo( Variant::INT, "peer_") );
mi.arguments.push_front( PropertyInfo( Variant::INT, "peer_id") );

mi.name="rpc_id";
ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"rpc_id",&Node::_rpc_id_bind,mi);
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"rpc_id",&Node::_rpc_id_bind,mi);
mi.name="rpc_unreliable_id";
ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"rpc_unreliable_id",&Node::_rpc_unreliable_id_bind,mi);
ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"rpc_unreliable_id",&Node::_rpc_unreliable_id_bind,mi);


}
Expand Down
8 changes: 2 additions & 6 deletions scene/main/scene_main_loop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2200,13 +2200,9 @@ void SceneTree::_bind_methods() {
mi.arguments.push_back( PropertyInfo( Variant::INT, "flags"));
mi.arguments.push_back( PropertyInfo( Variant::STRING, "group"));
mi.arguments.push_back( PropertyInfo( Variant::STRING, "method"));
Vector<Variant> defargs;
for(int i=0;i<VARIANT_ARG_MAX;i++) {
mi.arguments.push_back( PropertyInfo( Variant::NIL, "arg"+itos(i)));
defargs.push_back(Variant());
}

ObjectTypeDB::bind_native_method(METHOD_FLAGS_DEFAULT,"call_group",&SceneTree::_call_group,mi,defargs);

ObjectTypeDB::bind_vararg_method(METHOD_FLAGS_DEFAULT,"call_group",&SceneTree::_call_group,mi);

ObjectTypeDB::bind_method(_MD("set_current_scene","child_node:Node"),&SceneTree::set_current_scene);
ObjectTypeDB::bind_method(_MD("get_current_scene:Node"),&SceneTree::get_current_scene);
Expand Down
5 changes: 5 additions & 0 deletions tools/doc/doc_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,11 @@ void DocData::generate(bool p_basic_types) {
if (method.qualifiers!="")
method.qualifiers+=" ";
method.qualifiers+="const";

} else if (E->get().flags&METHOD_FLAG_VARARG) {
if (method.qualifiers!="")
method.qualifiers+=" ";
method.qualifiers+="vararg";
}

for(int i=-1;i<E->get().arguments.size();i++) {
Expand Down
9 changes: 9 additions & 0 deletions tools/editor/editor_help.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -882,6 +882,15 @@ Error EditorHelp::_goto_desc(const String& p_class,int p_vscr) {
class_desc->pop();
}

if (cd.methods[i].qualifiers.find("vararg")!=-1) {
class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/text_color"));
class_desc->add_text(",");
class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/symbol_color"));
class_desc->add_text(" ... ");
class_desc->pop();
class_desc->pop();
}

class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/symbol_color"));
class_desc->add_text(cd.methods[i].arguments.size()?" )":")");
class_desc->pop();
Expand Down

0 comments on commit 828e1c0

Please sign in to comment.