[Mono-list] SZARRAY custom attr bug (35629) fix

sean kasun skasun@azstarnet.com
Sun, 19 Jan 2003 21:07:31 -0700 (MST)


Index: reflection.c
===================================================================
RCS file: /mono/mono/mono/metadata/reflection.c,v
retrieving revision 1.126
diff -u -r1.126 reflection.c
--- reflection.c	16 Jan 2003 04:09:51 -0000	1.126
+++ reflection.c	20 Jan 2003 03:56:59 -0000
@@ -3762,6 +3762,76 @@
 		g_free (val);
 		return obj;
 	}
+	case MONO_TYPE_SZARRAY:
+	{
+		MonoArray *arr;
+		guint32 i,alen;
+		alen=read32(p);
+		p+=4;
+		arr=mono_array_new(mono_domain_get(),mono_class_from_mono_type(t->data.type),alen);
+		switch (t->data.type->type)
+		{
+			case MONO_TYPE_U1:
+			case MONO_TYPE_I1:
+			case MONO_TYPE_BOOLEAN:
+				for (i=0;i<alen;i++)
+				{
+					MonoBoolean val=*p++;
+					mono_array_set(arr,MonoBoolean,i,val);
+				}
+				break;
+			case MONO_TYPE_CHAR:
+			case MONO_TYPE_U2:
+			case MONO_TYPE_I2:
+				for (i=0;i<alen;i++)
+				{
+					guint16 val=read16(p);
+					mono_array_set(arr,guint16,i,val);
+					p+=2;
+				}
+				break;
+			case MONO_TYPE_R4:
+			case MONO_TYPE_U4:
+			case MONO_TYPE_I4:
+				for (i=0;i<alen;i++)
+				{
+					guint32 val=read32(p);
+					mono_array_set(arr,guint32,i,val);
+					p+=4;
+				}
+				break;
+			case MONO_TYPE_R8:
+			case MONO_TYPE_U8:
+			case MONO_TYPE_I8:
+				for (i=0;i<alen;i++)
+				{
+					guint64 val=read64(p);
+					mono_array_set(arr,guint64,i,val);
+					p+=8;
+				}
+				break;
+			case MONO_TYPE_STRING:
+				for (i=0;i<alen;i++)
+				{
+					if (*p==(char)0xff)
+					{
+						mono_array_set(arr,gpointer,i,NULL);
+						p++;
+					}
+					else
+					{
+						slen=mono_metadata_decode_value(p,&p);
+						mono_array_set(arr,gpointer,i,mono_string_new_len(mono_domain_get(),p,slen));
+						p+=slen;
+					}
+				}
+				break;
+			default:
+				g_error("Type 0x%02x not handled in custom attr array decoding",t->data.type->type);
+		}
+		*end=p;
+		return arr;
+	}
 	default:
 		g_error ("Type 0x%02x not handled in custom attr value decoding", type);
 	}
@@ -4322,8 +4392,32 @@
 	*p++ = 1;
 	*p++ = 0;
 	for (i = 0; i < sig->param_count; ++i) {
-		arg = (MonoObject*)mono_array_get (ctorArgs, gpointer, i);
-		encode_cattr_value (buffer, p, &buffer, &p, &buflen, sig->params [i], arg);
+		if (sig->params[i]->type==MONO_TYPE_SZARRAY)
+		{
+			guint32 alen=mono_array_length(ctorArgs) - i;
+			guint32 j;
+			if ((p-buffer) + 10 >= buflen) {
+				char *newbuf;
+				buflen *= 2;
+				newbuf = g_realloc (buffer, buflen);
+				p = newbuf + (p-buffer);
+				buffer = newbuf;
+			}
+			*p++=alen&0xff;
+			*p++=(alen>>8)&0xff;
+			*p++=(alen>>16)&0xff;
+			*p++=(alen>>24)&0xff;
+			for (j=0;j<alen;j++)
+			{
+				arg=(MonoObject*)mono_array_get(ctorArgs,gpointer,i+j);
+				encode_cattr_value(buffer,p,&buffer,&p,&buflen,sig->params[i]->data.type,arg);
+			}
+		}
+		else
+		{
+			arg = (MonoObject*)mono_array_get (ctorArgs, gpointer, i);
+			encode_cattr_value (buffer, p, &buffer, &p, &buflen, sig->params [i], arg);
+		}
 	}
 	i = 0;
 	if (properties)