int namelen = strlen(name);
if(m->type==QNAME || m->type==QNAMEA || m->type==POSTFIXTYPE) {
- char*nsname = escape_string(m->ns->name);
+ char*nsname = m->ns?escape_string(m->ns->name):strdup("NULL");
mname = malloc(strlen(nsname)+namelen+32);
strcpy(mname, "<q");
if(m->type == QNAMEA)
strcat(mname, ",attr");
- strcat(mname, ">[");
- strcat(mname,access2str(m->ns->access));
- strcat(mname, "]");
+ strcat(mname, ">");
+ if(m->ns) {
+ strcat(mname,"[");
+ strcat(mname,access2str(m->ns->access));
+ strcat(mname, "]");
+ }
strcat(mname, nsname);
free(nsname);
strcat(mname, "::");
// ------------------------------- constants -------------------------------------
-#define NS_TYPE(x) ((x) == 0x08 || (x) == 0x16 || (x) == 0x17 || (x) == 0x18 || \
- (x) == 0x19 || (x) == 0x1a || (x) == 0x05)
-
#define UNIQUE_CONSTANT(x) ((x) == CONSTANT_TRUE || (x) == CONSTANT_FALSE || (x) == CONSTANT_NULL || (x) == CONSTANT_UNDEFINED)
constant_t* constant_new_int(int i)
c->type = CONSTANT_FLOAT;
return c;
}
-constant_t* constant_new_string(char*s)
+constant_t* constant_new_string(const char*s)
{
NEW(constant_t,c);
c->s = string_new4(s);
c->type = CONSTANT_UNDEFINED;
return c;
}
+constant_t* constant_clone(constant_t*other)
+{
+ if(!other) return 0;
+ constant_t*c = malloc(sizeof(constant_t));
+ memcpy(c, other, sizeof(constant_t));
+ if(NS_TYPE(c->type)) {
+ c->ns = namespace_clone(other->ns);
+ } else if(c->type == CONSTANT_STRING) {
+ c->s = string_dup3(other->s);
+ }
+ return c;
+}
constant_t* constant_fromindex(pool_t*pool, int index, int type)
{
if(!index) {
return pool_register_float(pool, c->f);
} else if(c->type == CONSTANT_STRING) {
return pool_register_string2(pool, c->s);
+ } else if(c->type == CONSTANT_UNDEFINED) {
+ /* write undefined with index 0 (and no type). Otherwise, the FlashPlayer
+ seems to throw an "attempt to read out of bounds" exception */
+ return 0;
} else if(!constant_has_index(c)) {
return 1;
} else {
if(m.type==0x07 || m.type==0x0d) {
int namespace_index = swf_GetU30(tag);
m.ns = (namespace_t*)array_getkey(pool->x_namespaces, namespace_index);
+ if(!m.ns) {
+ fprintf(stderr, "Error: Illegal reference to namespace #%d in constant pool.\n", namespace_index);
+ }
int name_index = swf_GetU30(tag);
if(name_index) // 0 = '*' (any)
m.name = pool_lookup_string(pool, name_index);