diff -r 000d1c4aa7e6 -r 324edacff5cc ExternalBytes.st --- a/ExternalBytes.st Tue May 17 00:56:14 2016 +0200 +++ b/ExternalBytes.st Tue May 17 02:04:25 2016 +0200 @@ -36,7 +36,7 @@ #endif extern char *__stx_malloc(size_t); - extern char *__stx_calloc(size_t, size_t); + extern char *__stx_calloc(size_t, size_t); extern char *__stx_realloc(char *, size_t); extern void __stx_free(char *); extern void __stx_mallocStatistics(void); @@ -47,9 +47,9 @@ %{ struct mallocList { - char *chunk; - size_t size; - struct mallocList *next; + char *chunk; + size_t size; + struct mallocList *next; }; static struct mallocList *mallocList = (struct mallocList *)0; static INT mallocCount = 0; @@ -63,25 +63,25 @@ if (@global(DebugMalloc) != true) return; if (ptr) { - found = 0; - for (this=mallocList, prev=0; this; this=next) { - next = this->next; - if (this->chunk == ptr) { - if (prev) { - prev->next = next; - } else { - mallocList = next; - } - free(this); - found++; - mallocCount--; - } else { - prev = this; - } - } - if (! found) { - console_printf("ExternalBytes [warning]: **** free: alien %"_lx_" (allocated somewhere else ?))\n", (INT)ptr); - } + found = 0; + for (this=mallocList, prev=0; this; this=next) { + next = this->next; + if (this->chunk == ptr) { + if (prev) { + prev->next = next; + } else { + mallocList = next; + } + free(this); + found++; + mallocCount--; + } else { + prev = this; + } + } + if (! found) { + console_printf("ExternalBytes [warning]: **** free: alien %"_lx_" (allocated somewhere else ?))\n", (INT)ptr); + } } } @@ -95,82 +95,82 @@ if (@global(DebugMalloc) != true) return; if (ptr) { - found = 0; - for (this=mallocList; this; this=this->next) { - if (this->chunk == ptr) { - console_printf("ExternalBytes [warning]: **** %016"_lx_" already allocated (freed somewhere else ?)\n", (INT)ptr); - found++; - } - } - if (! found) { - e = (struct mallocList *) malloc(sizeof(struct mallocList)); - e->next = mallocList; - e->chunk = ptr; - e->size = nBytes; - mallocList = e; - mallocCount++; - } + found = 0; + for (this=mallocList; this; this=this->next) { + if (this->chunk == ptr) { + console_printf("ExternalBytes [warning]: **** %016"_lx_" already allocated (freed somewhere else ?)\n", (INT)ptr); + found++; + } + } + if (! found) { + e = (struct mallocList *) malloc(sizeof(struct mallocList)); + e->next = mallocList; + e->chunk = ptr; + e->size = nBytes; + mallocList = e; + mallocCount++; + } } } char * __stx_malloc(size_t nBytes) { - char *ptr = malloc(nBytes); + char *ptr = malloc(nBytes); - if (@global(TraceMalloc) == true) { - console_printf("ExternalBytes [info]: allocated %d bytes at: %016"_lx_"\n", nBytes, (INT)ptr); - } - addToMallocList(ptr, nBytes); + if (@global(TraceMalloc) == true) { + console_printf("ExternalBytes [info]: allocated %d bytes at: %016"_lx_"\n", nBytes, (INT)ptr); + } + addToMallocList(ptr, nBytes); - return ptr; + return ptr; } char * __stx_calloc(size_t n, size_t size) { - char *ptr = __stx_malloc(n * size); - if (ptr != 0) { - bzero(ptr, (n * size)); - } - return ptr; + char *ptr = __stx_malloc(n * size); + if (ptr != 0) { + bzero(ptr, (n * size)); + } + return ptr; } char * __stx_realloc(char *ptr, size_t nBytes) { - char *newPtr; + char *newPtr; - removeFromMallocList(ptr); - newPtr = realloc(ptr, nBytes); - addToMallocList(newPtr, nBytes); + removeFromMallocList(ptr); + newPtr = realloc(ptr, nBytes); + addToMallocList(newPtr, nBytes); - if (@global(TraceMalloc) == true) { - console_printf("ExternalBytes [info]: realloc %d bytes for %"_lx_" at: %"_lx_"\n", nBytes, (INT)ptr, (INT)newPtr); - } - return newPtr; + if (@global(TraceMalloc) == true) { + console_printf("ExternalBytes [info]: realloc %d bytes for %"_lx_" at: %"_lx_"\n", nBytes, (INT)ptr, (INT)newPtr); + } + return newPtr; } void __stx_free(char *ptr) { - if (@global(TraceMalloc) == true) { - console_printf("ExternalBytes: free bytes at: %"_lx_"\n", (INT)ptr); - } - removeFromMallocList(ptr); + if (@global(TraceMalloc) == true) { + console_printf("ExternalBytes: free bytes at: %"_lx_"\n", (INT)ptr); + } + removeFromMallocList(ptr); - free(ptr); + free(ptr); } void __stx_mallocStatistics() { - struct mallocList *this; - int amount = 0; - int n = 0; + struct mallocList *this; + int amount = 0; + int n = 0; - for (this=mallocList; this; this=this->next) { - n++; - amount += this->size; - } - console_printf("ExternalBytes [info]: allocated %d blocks with %d bytes overall\n", n, amount); + for (this=mallocList; this; this=this->next) { + n++; + amount += this->size; + } + console_printf("ExternalBytes [info]: allocated %d blocks with %d bytes overall\n", n, amount); } %} @@ -393,13 +393,13 @@ address:anAddressInteger "return a new ExternalBytes object to access bytes starting at anAddressInteger. - The memory at anAddressInteger has been allocated elsewhere. + The memory at anAddressInteger has been allocated elsewhere. The size is not known, therefore byte accesses will NOT be checked for valid index. Use this, if you get a pointer from some external source (such as a C-callBack function) and you have to extract bytes from that. DANGER ALERT: this method allows very bad things to be done to the - system - use with GREAT care (better: do not use it)" + system - use with GREAT care (better: do not use it)" ^ self basicNew setAddress:anAddressInteger size:nil @@ -408,13 +408,13 @@ address:anAddressInteger size:size "return a new ExternalBytes object to access bytes starting at anAddressInteger. - The memory at anAddressInteger has been allocated elsewhere. + The memory at anAddressInteger has been allocated elsewhere. The size is known, which allows byte accesses to be checked for valid index. Use this, if you get a pointer to a structure from some external source (such as a C-callBack function) and you have to extract things from that. DANGER ALERT: this method allows very bad things to be done to the - system - use with GREAT care (better: do not use it)" + system - use with GREAT care (better: do not use it)" ^ self basicNew setAddress:anAddressInteger size:size @@ -477,7 +477,7 @@ extBytes := self new:((nChars+1)*2). 1 to:nChars do:[:i | - extBytes unsignedInt16At:(i*2) put:(aString at:i) codePoint. + extBytes unsignedInt16At:(i*2) put:(aString at:i) codePoint. ]. extBytes unsignedInt16At:((nChars+1)*2) put:0. ^ extBytes @@ -688,7 +688,7 @@ If the machine does not support them, return nil." %{ /* NOCONTEXT */ -#if defined(__GNUC__) || defined(WIN32) +#if defined(__GNUC__) || defined(__CLANG__) || defined(__win32__) RETURN (__mkSmallInteger( sizeof(long double))); #endif %}. @@ -885,8 +885,8 @@ idx := 1. s := WriteStream on:Unicode16String new. [(word := self unsignedInt16At:idx) ~~ 0] whileTrue:[ - s nextPut:(Character value:word). - idx := idx + 2. + s nextPut:(Character value:word). + idx := idx + 2. ]. ^ s contents ! @@ -1102,7 +1102,7 @@ "replace elements from aString, and add a 0-byte at the end" |nChars| - + nChars := aString size. self replaceBytesFrom:1 to:nChars with:aString startingAt:1. self at:nChars+1 put:0. @@ -1145,7 +1145,7 @@ %{ /* NOCONTEXT */ char *mem = (char *)__INST(address_); if (mem && (OBJ)mem != nil) { - __stx_free(mem); + __stx_free(mem); } __INST(address_) = __INST(size) = nil; %} @@ -1210,29 +1210,29 @@ "/ what a kludge - Dolphin and Squeak mean: printOn: a stream; "/ ST/X (and some old ST80's) mean: draw-yourself on a GC. (aGCOrStream isStream) ifFalse:[ - ^ super displayOn:aGCOrStream + ^ super displayOn:aGCOrStream ]. aGCOrStream nextPutAll:self className. addr := self address. addr isNil ifTrue:[ - aGCOrStream nextPutAll:'[free]'. + aGCOrStream nextPutAll:'[free]'. ] ifFalse:[ - size notNil ifTrue:[ - aGCOrStream nextPutAll:'[sz:'. - size printOn:aGCOrStream. - aGCOrStream space. - ] ifFalse:[ - aGCOrStream nextPut:$[. - ]. - aGCOrStream nextPutAll:'@'. - addr printOn:aGCOrStream base:16. - aGCOrStream nextPut:$]. + size notNil ifTrue:[ + aGCOrStream nextPutAll:'[sz:'. + size printOn:aGCOrStream. + aGCOrStream space. + ] ifFalse:[ + aGCOrStream nextPut:$[. + ]. + aGCOrStream nextPutAll:'@'. + addr printOn:aGCOrStream base:16. + aGCOrStream nextPut:$]. ]. " - self new printString - (self new:5) displayString + self new printString + (self new:5) displayString " @@ -1301,26 +1301,26 @@ * Fail if already allocated */ if (__INST(address_) == nil && __isSmallInteger(numberOfBytes)) { - INT nBytes = __smallIntegerVal(numberOfBytes); - if (nBytes > 0) { - char *space = __stx_malloc(nBytes); - if (space) { - if (doClear == true) { - bzero(space, nBytes); - } - __INST(address_) = (OBJ)space; - __INST(size) = numberOfBytes; - RETURN(self); - } else { - mallocFailure = true; - } - } + INT nBytes = __smallIntegerVal(numberOfBytes); + if (nBytes > 0) { + char *space = __stx_malloc(nBytes); + if (space) { + if (doClear == true) { + bzero(space, nBytes); + } + __INST(address_) = (OBJ)space; + __INST(size) = numberOfBytes; + RETURN(self); + } else { + mallocFailure = true; + } + } } %}. mallocFailure == true ifTrue:[ - ^ MallocFailure raiseRequestWith:numberOfBytes. + ^ MallocFailure raiseRequestWith:numberOfBytes. ] ifFalse:[ - self primitiveFailed. + self primitiveFailed. ]. ! ! @@ -1445,34 +1445,34 @@ %{ if (__isSmallInteger(numberOfBytes)) { - INT nBytes = __smallIntegerVal(numberOfBytes); - if (nBytes > 0) { - char *space; - char *prevSpace = (char *)__INST(address_); + INT nBytes = __smallIntegerVal(numberOfBytes); + if (nBytes > 0) { + char *space; + char *prevSpace = (char *)__INST(address_); - if (prevSpace == (char *)nil) - prevSpace = 0; /* allocate from scratch */ - space = __stx_realloc(prevSpace, nBytes); - if (space) { - __INST(address_) = (OBJ)space; - __INST(size) = numberOfBytes; - if (space == prevSpace) { - /* same address, no re-registration */ - RETURN(self); - } - mallocStatus = true; - } else { - mallocStatus = false; - } - } + if (prevSpace == (char *)nil) + prevSpace = 0; /* allocate from scratch */ + space = __stx_realloc(prevSpace, nBytes); + if (space) { + __INST(address_) = (OBJ)space; + __INST(size) = numberOfBytes; + if (space == prevSpace) { + /* same address, no re-registration */ + RETURN(self); + } + mallocStatus = true; + } else { + mallocStatus = false; + } + } } %}. mallocStatus == true ifTrue:[ - Lobby registerChange:self. + Lobby registerChange:self. ] ifFalse:[mallocStatus == false ifTrue:[ - ^ MallocFailure raiseRequestWith:numberOfBytes. + ^ MallocFailure raiseRequestWith:numberOfBytes. ] ifFalse:[ - self primitiveFailed. + self primitiveFailed. ]]. ! !