list_append(c->interfaces, multiname_clone(interface));
}
-static abc_method_t* add_method(abc_file_t*file, abc_class_t*cls, multiname_t*returntype, char body)
+abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body)
{
/* construct method object */
NEW(abc_method_t,m);
if(cls->constructor) {
return cls->constructor;
}
- abc_method_t* m = add_method(cls->file, cls, returntype, 1);
+ abc_method_t* m = abc_method_new(cls->file, returntype, 1);
cls->constructor = m;
return m;
}
if(cls->static_constructor) {
return cls->static_constructor;
}
- abc_method_t* m = add_method(cls->file, cls, returntype, 1);
+ abc_method_t* m = abc_method_new(cls->file, returntype, 1);
cls->static_constructor = m;
return m;
}
trait->value = v;
return trait;
}
-trait_t*trait_new_member(multiname_t*type, multiname_t*name,constant_t*v)
+trait_t*trait_new_member(trait_list_t**traits, multiname_t*type, multiname_t*name,constant_t*v)
{
int kind = TRAIT_SLOT;
trait_t*trait = malloc(sizeof(trait_t));
trait->attributes = kind&0xf0;
trait->name = name;
trait->type_name = type;
+
+ trait->slot_id = list_length_(traits)+1;
+ list_append_(traits, trait);
return trait;
}
-trait_t*trait_new_method(multiname_t*name, abc_method_t*m)
+trait_t*trait_new_method(trait_list_t**traits, multiname_t*name, abc_method_t*m)
{
int type = TRAIT_METHOD;
trait_t*trait = malloc(sizeof(trait_t));
trait->attributes = type&0xf0;
trait->name = name;
trait->method = m;
+
+ /* start assigning traits at position #1.
+ Weird things happen when assigning slot 0- slot 0 and 1 seem
+ to be identical */
+ trait->slot_id = list_length_(traits)+1;
+ list_append_(traits, trait);
return trait;
}
abc_method_t* abc_class_method(abc_class_t*cls, multiname_t*returntype, multiname_t*name)
{
abc_file_t*file = cls->file;
- abc_method_t* m = add_method(cls->file, cls, returntype, !(cls->flags&CLASS_INTERFACE));
- m->trait = trait_new_method(multiname_clone(name), m);
- /* start assigning traits at position #1.
- Weird things happen when assigning slot 0- slot 0 and 1 seem
- to be identical */
- m->trait->slot_id = list_length(cls->traits)+1;
- list_append(cls->traits, m->trait);
+ abc_method_t* m = abc_method_new(cls->file, returntype, !(cls->flags&CLASS_INTERFACE));
+ m->trait = trait_new_method(&cls->traits, multiname_clone(name), m);
return m;
}
abc_method_t* abc_class_staticmethod(abc_class_t*cls, multiname_t*returntype, multiname_t*name)
{
abc_file_t*file = cls->file;
- abc_method_t* m = add_method(cls->file, cls, returntype, !(cls->flags&CLASS_INTERFACE));
- m->trait = trait_new_method(multiname_clone(name), m);
- m->trait->slot_id = list_length(cls->static_traits)+1;
- list_append(cls->static_traits, m->trait);
+ abc_method_t* m = abc_method_new(cls->file, returntype, !(cls->flags&CLASS_INTERFACE));
+ m->trait = trait_new_method(&cls->static_traits, multiname_clone(name), m);
return m;
}
abc_file_t*file = cls->file;
multiname_t*m_name = multiname_clone(name);
multiname_t*m_type = multiname_clone(type);
- trait_t*t = trait_new_member(m_type, m_name, 0);
- t->slot_id = list_length(cls->traits)+1;
- list_append(cls->traits, t);
+ trait_t*t = trait_new_member(&cls->traits, m_type, m_name, 0);
return t;
}
trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*type)
abc_file_t*file = cls->file;
multiname_t*m_name = multiname_clone(name);
multiname_t*m_type = multiname_clone(type);
- trait_t*t = trait_new_member(m_type, m_name, 0);
- t->slot_id = list_length(cls->static_traits)+1;
- list_append(cls->static_traits, t);
+ trait_t*t = trait_new_member(&cls->traits, m_type, m_name, 0);
return t;
}
abc_script_t* abc_initscript(abc_file_t*file, multiname_t*returntype)
{
- abc_method_t*m = add_method(file, 0, returntype, 1);
+ abc_method_t*m = abc_method_new(file, returntype, 1);
abc_script_t* s = malloc(sizeof(abc_script_t));
s->method = m;
s->traits = list_new();
#define TRAIT_CLASS 4
#define TRAIT_FUNCTION 5
#define TRAIT_CONST 6
+
+#define TRAIT_ATTR_FINAL 0x10
+#define TRAIT_ATTR_OVERRIDE 0x20
+#define TRAIT_ATTR_METADATA 0x40
struct _trait {
constant_t*value;
};
+trait_t*trait_new_method(trait_list_t**traits, multiname_t*name, abc_method_t*m);
+
#define CLASS_SEALED 1
#define CLASS_FINAL 2
#define CLASS_INTERFACE 4
int index; //filled in during writing
};
+abc_method_t* abc_method_new(abc_file_t*file, multiname_t*returntype, char body);
+
abc_class_t* abc_class_new(abc_file_t*file, multiname_t*classname, multiname_t*superclass);
abc_class_t* abc_class_new2(abc_file_t*file, char*classname, char*superclass);
void abc_class_sealed(abc_class_t*c);
trait_t* abc_class_find_slotid(abc_class_t*c, int slotid);
-abc_method_t* abc_class_constructor(abc_class_t*cls, multiname_t*returntype);
+abc_method_t* abc_class_getconstructor(abc_class_t*cls, multiname_t*returntype);
+abc_method_t* abc_class_getstaticconstructor(abc_class_t*cls, multiname_t*returntype);
+
abc_method_t* abc_class_method(abc_class_t*cls, multiname_t*returntype, multiname_t*name);
-abc_method_t* abc_class_staticconstructor(abc_class_t*cls, multiname_t*returntype);
abc_method_t* abc_class_staticmethod(abc_class_t*cls, multiname_t*returntype, multiname_t*name);
trait_t* abc_class_slot(abc_class_t*cls, multiname_t*name, multiname_t*type);
trait_t* abc_class_staticslot(abc_class_t*cls, multiname_t*name, multiname_t*type);