You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by Mark Hindess <ma...@googlemail.com> on 2008/09/11 17:03:00 UTC

Re: svn commit: r693878 - /harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/shared/additional/GB18030.c

This broke my linux build because nio_char.so now needs to link against the 
vmi.so.  Fixed in r694287.

-Mark

In message <20...@eris.apache.org>, odeakin@apache.org wr
ites:
>
> Author: odeakin
> Date: Wed Sep 10 09:08:02 2008
> New Revision: 693878
> 
> URL: http://svn.apache.org/viewvc?rev=693878&view=rev
> Log:
> Fix errors from HARMONY-5976 ([classlib] Results of static analysis):
>  - resultChar must be signed (jint) to handle error return code from getUnico
> deFromBytes()
>  - Fix unLinear() function so it does not return a pointer to deallocated sta
> ck memory.
> 
> Modified:
>     harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/
> shared/additional/GB18030.c
> 
> Modified: harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/ni
> ochar/shared/additional/GB18030.c
> URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio
> _char/src/main/native/niochar/shared/additional/GB18030.c?rev=693878&r1=69387
> 7&r2=693878&view=diff
> =============================================================================
> =
> --- harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/
> shared/additional/GB18030.c (original)
> +++ harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/
> shared/additional/GB18030.c Wed Sep 10 09:08:02 2008
> @@ -17,11 +17,12 @@
>  
>  #include "GB18030.h"
>  #include "hycomp.h"
> +#include "vmi.h"
>  
>  #define linear(b1, b2, b3, b4) ((((b1)*10+(b2))*126L+(b3))*10L+(b4))
> -static jbyte * unLinear(jint lin) {
> -                jbyte arr[] = {0, 0, 0, 0};
> -	        jbyte *result = arr;
> +static jbyte* unLinear(JNIEnv *env, jint lin) {
> +            PORT_ACCESS_FROM_ENV(env);
> +	        jbyte *result = hymem_allocate_memory(sizeof(jbyte)*4);
>  	        lin-=linear((jbyte)0x81, (jbyte)0x30, (jbyte)0x81, (jbyte)0x30)
> ; 
>  	        result[3]=(jbyte)(0x30+lin%10);  lin/=10;
>  	        result[2]=(jbyte)(0x81+lin%126); lin/=126;
> @@ -1158,14 +1159,14 @@
>  	        return -1;
>  }
>  
> -static jbyte * getBytesFromUnicode(jint charValue) {
> +static jbyte* getBytesFromUnicode(JNIEnv *env, jint charValue) {
>  	        int rangeCounter = 0;
>  	        while(rangeCounter < sizeof(ranges)){
>  	        	int startBytes = ranges[rangeCounter++];
>  	        	int length = ranges[rangeCounter++];
>  	        	int startChar = charValues[rangeCounter/2-1];
>  	            if(startChar<=charValue && charValue<=startChar+length) {
> -	                return unLinear(startBytes+(charValue-startChar));
> +	                return unLinear(env, startBytes+(charValue-startChar));
>  	            }
>  	        }
>  	        return NULL;
> @@ -1182,9 +1183,9 @@
>     jchar *out = (*env)->GetCharArrayElements(env, outArr, NULL);
>  
>     jint *res = (*env)->GetIntArrayElements(env, result, NULL);
> -   jint position = absolutePos;	
> +   jint resultChar, position = absolutePos;	
>     int i, variable; 
> -   jchar input,  resultChar; 
> +   jchar input; 
>     jbyte b1, b2, b3, b4;
>     for(i=0; i < bbremaining; i++) {
>          if(res[1]==0) {
> @@ -1245,7 +1246,7 @@
>                 break;
>              }
>              if (resultChar != 0) {
> -                out[arrPosition++] = resultChar; res[1] -= 1;
> +                out[arrPosition++] = (jchar)resultChar; res[1] -= 1;
>              } else {
>                 	if(!( (126 >= b2 && b2 >= 64) || (-2 >= b2 && b2 >= -12
> 8) || (57 >= b2 && b2 >= 48)) ) {
>                 	       res[0] = res[0]+2; 
> @@ -1280,7 +1281,7 @@
>                          resultChar = getUnicodeFromBytes(b1, b2, b3, b4);
>                  	if(resultChar != -1) {
>                  	        res[0] -=4;
> -                                out[arrPosition++] = resultChar; res[1] -= 1
> ;
> +                                out[arrPosition++] = (jchar)resultChar; res[
> 1] -= 1;
>                  	} else {
>                          	res[2] = 4; res[3] = -1;
>                                  (*env)->ReleaseCharArrayElements(env, outArr
> , out, 0); 
> @@ -1324,7 +1325,7 @@
>               index = (int)input >> 8;
>               index = encodeIndex[index];
>               while(index < 0) {
> -               jbyte *arr = getBytesFromUnicode(in[arrayOffset+i]);
> +               jbyte *arr = getBytesFromUnicode(env, in[arrayOffset+i]);
>                 if(arr!= NULL) {
>                 	if(res[0]>=4) {
>                      *(jlong2addr(jbyte, outAddr) + position++) = (jbyte)arr[
> 0];
> @@ -1391,7 +1392,7 @@
>                   }
>                   *(jlong2addr(jbyte, outAddr) + position++) = (jbyte)(result
> Char & 0xFF);  res[0] -= 1;
>               } else {
> -               jbyte *arr = getBytesFromUnicode(in[arrayOffset+i]);
> +               jbyte *arr = getBytesFromUnicode(env, in[arrayOffset+i]);
>                 if(arr!= NULL) {
>                 	if(res[0]>=4) {
>                      *(jlong2addr(jbyte, outAddr) + position++) = arr[0];
> 



Re: svn commit: r693878 - /harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/shared/additional/GB18030.c

Posted by Oliver Deakin <ol...@googlemail.com>.
Thanks Mark - it was fine on Windows and I didn't see failures in the 
build-test alerts for Linux so I thought it was ok there also. I wonder 
why we did not see a build break there?

Regards,
Oliver

Mark Hindess wrote:
> This broke my linux build because nio_char.so now needs to link against the 
> vmi.so.  Fixed in r694287.
>
> -Mark
>
> In message <20...@eris.apache.org>, odeakin@apache.org wr
> ites:
>   
>> Author: odeakin
>> Date: Wed Sep 10 09:08:02 2008
>> New Revision: 693878
>>
>> URL: http://svn.apache.org/viewvc?rev=693878&view=rev
>> Log:
>> Fix errors from HARMONY-5976 ([classlib] Results of static analysis):
>>  - resultChar must be signed (jint) to handle error return code from getUnico
>> deFromBytes()
>>  - Fix unLinear() function so it does not return a pointer to deallocated sta
>> ck memory.
>>
>> Modified:
>>     harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/
>> shared/additional/GB18030.c
>>
>> Modified: harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/ni
>> ochar/shared/additional/GB18030.c
>> URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/nio
>> _char/src/main/native/niochar/shared/additional/GB18030.c?rev=693878&r1=69387
>> 7&r2=693878&view=diff
>> =============================================================================
>> =
>> --- harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/
>> shared/additional/GB18030.c (original)
>> +++ harmony/enhanced/classlib/trunk/modules/nio_char/src/main/native/niochar/
>> shared/additional/GB18030.c Wed Sep 10 09:08:02 2008
>> @@ -17,11 +17,12 @@
>>  
>>  #include "GB18030.h"
>>  #include "hycomp.h"
>> +#include "vmi.h"
>>  
>>  #define linear(b1, b2, b3, b4) ((((b1)*10+(b2))*126L+(b3))*10L+(b4))
>> -static jbyte * unLinear(jint lin) {
>> -                jbyte arr[] = {0, 0, 0, 0};
>> -	        jbyte *result = arr;
>> +static jbyte* unLinear(JNIEnv *env, jint lin) {
>> +            PORT_ACCESS_FROM_ENV(env);
>> +	        jbyte *result = hymem_allocate_memory(sizeof(jbyte)*4);
>>  	        lin-=linear((jbyte)0x81, (jbyte)0x30, (jbyte)0x81, (jbyte)0x30)
>> ; 
>>  	        result[3]=(jbyte)(0x30+lin%10);  lin/=10;
>>  	        result[2]=(jbyte)(0x81+lin%126); lin/=126;
>> @@ -1158,14 +1159,14 @@
>>  	        return -1;
>>  }
>>  
>> -static jbyte * getBytesFromUnicode(jint charValue) {
>> +static jbyte* getBytesFromUnicode(JNIEnv *env, jint charValue) {
>>  	        int rangeCounter = 0;
>>  	        while(rangeCounter < sizeof(ranges)){
>>  	        	int startBytes = ranges[rangeCounter++];
>>  	        	int length = ranges[rangeCounter++];
>>  	        	int startChar = charValues[rangeCounter/2-1];
>>  	            if(startChar<=charValue && charValue<=startChar+length) {
>> -	                return unLinear(startBytes+(charValue-startChar));
>> +	                return unLinear(env, startBytes+(charValue-startChar));
>>  	            }
>>  	        }
>>  	        return NULL;
>> @@ -1182,9 +1183,9 @@
>>     jchar *out = (*env)->GetCharArrayElements(env, outArr, NULL);
>>  
>>     jint *res = (*env)->GetIntArrayElements(env, result, NULL);
>> -   jint position = absolutePos;	
>> +   jint resultChar, position = absolutePos;	
>>     int i, variable; 
>> -   jchar input,  resultChar; 
>> +   jchar input; 
>>     jbyte b1, b2, b3, b4;
>>     for(i=0; i < bbremaining; i++) {
>>          if(res[1]==0) {
>> @@ -1245,7 +1246,7 @@
>>                 break;
>>              }
>>              if (resultChar != 0) {
>> -                out[arrPosition++] = resultChar; res[1] -= 1;
>> +                out[arrPosition++] = (jchar)resultChar; res[1] -= 1;
>>              } else {
>>                 	if(!( (126 >= b2 && b2 >= 64) || (-2 >= b2 && b2 >= -12
>> 8) || (57 >= b2 && b2 >= 48)) ) {
>>                 	       res[0] = res[0]+2; 
>> @@ -1280,7 +1281,7 @@
>>                          resultChar = getUnicodeFromBytes(b1, b2, b3, b4);
>>                  	if(resultChar != -1) {
>>                  	        res[0] -=4;
>> -                                out[arrPosition++] = resultChar; res[1] -= 1
>> ;
>> +                                out[arrPosition++] = (jchar)resultChar; res[
>> 1] -= 1;
>>                  	} else {
>>                          	res[2] = 4; res[3] = -1;
>>                                  (*env)->ReleaseCharArrayElements(env, outArr
>> , out, 0); 
>> @@ -1324,7 +1325,7 @@
>>               index = (int)input >> 8;
>>               index = encodeIndex[index];
>>               while(index < 0) {
>> -               jbyte *arr = getBytesFromUnicode(in[arrayOffset+i]);
>> +               jbyte *arr = getBytesFromUnicode(env, in[arrayOffset+i]);
>>                 if(arr!= NULL) {
>>                 	if(res[0]>=4) {
>>                      *(jlong2addr(jbyte, outAddr) + position++) = (jbyte)arr[
>> 0];
>> @@ -1391,7 +1392,7 @@
>>                   }
>>                   *(jlong2addr(jbyte, outAddr) + position++) = (jbyte)(result
>> Char & 0xFF);  res[0] -= 1;
>>               } else {
>> -               jbyte *arr = getBytesFromUnicode(in[arrayOffset+i]);
>> +               jbyte *arr = getBytesFromUnicode(env, in[arrayOffset+i]);
>>                 if(arr!= NULL) {
>>                 	if(res[0]>=4) {
>>                      *(jlong2addr(jbyte, outAddr) + position++) = arr[0];
>>
>>     
>
>
>
>   

-- 
Oliver Deakin
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU