-Fixes to OpenSSL compilation (more)
-Fix bug in GDScript, now static functions can call static functions.
This commit is contained in:
@ -452,6 +452,7 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
|
||||
|
||||
const GDParser::Node *instance = on->arguments[0];
|
||||
|
||||
bool in_static=false;
|
||||
if (instance->type==GDParser::Node::TYPE_SELF) {
|
||||
//room for optimization
|
||||
|
||||
@ -465,7 +466,10 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
|
||||
|
||||
int ret;
|
||||
|
||||
if (i==1) {
|
||||
if (i==0 && on->arguments[i]->type==GDParser::Node::TYPE_SELF && codegen.function_node && codegen.function_node->_static) {
|
||||
//static call to self
|
||||
ret=(GDFunction::ADDR_TYPE_CLASS<<GDFunction::ADDR_BITS);
|
||||
} else if (i==1) {
|
||||
|
||||
if (on->arguments[i]->type!=GDParser::Node::TYPE_IDENTIFIER) {
|
||||
_set_error("Attempt to call a non-identifier.",on);
|
||||
@ -475,6 +479,7 @@ int GDCompiler::_parse_expression(CodeGen& codegen,const GDParser::Node *p_expre
|
||||
ret=codegen.get_name_map_pos(id->name);
|
||||
|
||||
} else {
|
||||
|
||||
ret = _parse_expression(codegen,on->arguments[i],slevel);
|
||||
if (ret<0)
|
||||
return ret;
|
||||
|
||||
@ -61,6 +61,10 @@ Variant *GDFunction::_get_variant(int p_address,GDInstance *p_instance,GDScript
|
||||
}
|
||||
return &self;
|
||||
} break;
|
||||
case ADDR_TYPE_CLASS: {
|
||||
|
||||
return &p_script->_static_ref;
|
||||
} break;
|
||||
case ADDR_TYPE_MEMBER: {
|
||||
//member indexing is O(1)
|
||||
if (!p_instance) {
|
||||
@ -1678,6 +1682,7 @@ Ref<GDScript> GDScript::get_base() const {
|
||||
GDScript::GDScript() {
|
||||
|
||||
|
||||
_static_ref=this;
|
||||
valid=false;
|
||||
subclass_count=0;
|
||||
initializer=NULL;
|
||||
|
||||
@ -75,13 +75,14 @@ public:
|
||||
ADDR_MASK=((1<<ADDR_BITS)-1),
|
||||
ADDR_TYPE_MASK=~ADDR_MASK,
|
||||
ADDR_TYPE_SELF=0,
|
||||
ADDR_TYPE_MEMBER=1,
|
||||
ADDR_TYPE_CLASS_CONSTANT=2,
|
||||
ADDR_TYPE_LOCAL_CONSTANT=3,
|
||||
ADDR_TYPE_STACK=4,
|
||||
ADDR_TYPE_STACK_VARIABLE=5,
|
||||
ADDR_TYPE_GLOBAL=6,
|
||||
ADDR_TYPE_NIL=7
|
||||
ADDR_TYPE_CLASS=1,
|
||||
ADDR_TYPE_MEMBER=2,
|
||||
ADDR_TYPE_CLASS_CONSTANT=3,
|
||||
ADDR_TYPE_LOCAL_CONSTANT=4,
|
||||
ADDR_TYPE_STACK=5,
|
||||
ADDR_TYPE_STACK_VARIABLE=6,
|
||||
ADDR_TYPE_GLOBAL=7,
|
||||
ADDR_TYPE_NIL=8
|
||||
};
|
||||
|
||||
struct StackDebug {
|
||||
@ -139,9 +140,9 @@ public:
|
||||
int get_max_stack_size() const;
|
||||
int get_default_argument_count() const;
|
||||
int get_default_argument_addr(int p_idx) const;
|
||||
GDScript *get_script() const { return _script; }
|
||||
GDScript *get_script() const { return _script; }
|
||||
|
||||
void debug_get_stack_member_state(int p_line,List<Pair<StringName,int> > *r_stackvars) const;
|
||||
void debug_get_stack_member_state(int p_line,List<Pair<StringName,int> > *r_stackvars) const;
|
||||
|
||||
_FORCE_INLINE_ bool is_empty() const { return _code_size==0; }
|
||||
|
||||
@ -183,6 +184,7 @@ friend class GDInstance;
|
||||
friend class GDFunction;
|
||||
friend class GDCompiler;
|
||||
friend class GDFunctions;
|
||||
Variant _static_ref; //used for static call
|
||||
Ref<GDNativeClass> native;
|
||||
Ref<GDScript> base;
|
||||
GDScript *_base; //fast pointer access
|
||||
|
||||
Reference in New Issue
Block a user