[Vm-dev] VM Maker: VMMaker.oscog-eem.159.mcz

commits at source.squeak.org commits at source.squeak.org
Wed May 2 18:44:06 UTC 2012


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.159.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.159
Author: eem
Time: 2 May 2012, 11:42:18.255 am
UUID: cbf7f95a-6fe2-4578-898e-47afb8524be4
Ancestors: VMMaker.oscog-eem.158

Plugins:
Fix ThreadedFFIPlugin's preambleCCode for Pharo's mingw config.
Merge fix for JPEGReadWriter2Plugin (http://bugs.squeak.org/view.php?id=7691)
Merge with VMMaker version s of plugins
	JPEGReaderPlugin,
	KlattSynthesizerPlugin
	Matrix2x3Plugin
	Mpeg3Plugin

=============== Diff against VMMaker.oscog-eem.157 ===============

Item was changed:
  VMClass subclass: #CogMemoryManager
(excessive size, no diff calculated)

Item was changed:
  ----- Method: CogVMSimulator>>ensureMultiThreadingOverridesAreUpToDate (in category 'initialization') -----
  ensureMultiThreadingOverridesAreUpToDate
  	"Make sure the CoInterpreterMT switch methods are implemented.  These methods select
  	 between CoInterpreterMT's implementation or CoInterpreter's implementation depending
  	 on cogThreadManager being non-nil or nil respectively.  i.e. they allow us to use this one
  	 simulator class to simulate for both CoInterpreterMT and CoInterpreter."
  	| thisClass me mtInterpreterClass |
  	thisClass := thisContext methodClass.
  	mtInterpreterClass := thisClass superclass.
  	me := thisClass name, '>>', thisContext method selector.
  	"We want override switches for everything implemented by CoInterpreter
  	 and CoInterpreterMT that is either not implemented by CogVMSimulator
  	 or already implemented by CogVMSimulator as an override switch."
  	(mtInterpreterClass selectors select:
  		[:sel|
  		(mtInterpreterClass superclass whichClassIncludesSelector: sel) notNil
  		and: [(thisClass organization categoryOfElement: sel)
  				ifNil: [true]
  				ifNotNil: [:cat| cat == #'multi-threading simulation switch']]])
  		do: [:sel| | argNames desiredSource |
  			argNames := Parser new
  							initPattern: (mtInterpreterClass sourceCodeAt: sel)
  							notifying: nil
  							return: [:pattern| pattern second].
  			desiredSource := String streamContents:
  								[:str|
  								argNames isEmpty
  									ifTrue: [str nextPutAll: sel]
  									ifFalse:
  										[sel keywords with: argNames do:
  											[:kw :arg| str nextPutAll: kw; space; nextPutAll: arg; space].
  										 str skip: -1].
  								str
  									crtab;
  									nextPutAll: '"This method includes or excludes ', mtInterpreterClass name, ' methods as required.';
  									crtab;
  									nextPutAll: ' Auto-generated by ', me, '"';
  									cr;
  									crtab;
  									nextPutAll: '^self perform: ';
  									store: sel;
  									crtab: 2;
  									nextPutAll: 'withArguments: {'.
  								argNames
  									do: [:arg| str nextPutAll: arg]
  									separatedBy: [str nextPut: $.; space].
  								str
  									nextPut: $};
  									crtab: 2;
  									nextPutAll: 'inSuperclass: (cogThreadManager ifNil: [';
  									print: mtInterpreterClass superclass;
  									nextPutAll: '] ifNotNil: [';
  									print: mtInterpreterClass;
  									nextPutAll: '])'].
  			desiredSource ~= (thisClass sourceCodeAt: sel ifAbsent: ['']) asString ifTrue:
  				[((thisClass includesSelector: sel)
  				  and: [(thisClass compiledMethodAt: sel) messages includesAnyOf: #(halt halt:)])
+ 					ifTrue: [self transcript cr; nextPutAll: 'WARNING, because of halts, not generating '; nextPutAll: desiredSource; cr; flush]
- 					ifTrue: [Transcript cr; nextPutAll: 'WARNING, because of halts, not generating '; nextPutAll: desiredSource; cr; flush]
  					ifFalse: [thisClass compile: desiredSource classified: #'multi-threading simulation switch']]].
  	"Make sure obsolete CoInterpreterMT switch methods are deleted."
  	((thisContext methodClass organization listAtCategoryNamed: #'multi-threading simulation switch') select:
  		[:sel| (mtInterpreterClass whichClassIncludesSelector: sel) isNil]) do:
  			[:sel| thisClass removeSelector: sel]!

Item was changed:
  ----- Method: Cogit>>simulateCogCodeAt: (in category 'simulation only') -----
  simulateCogCodeAt: address "<Integer>"
  	<doNotGenerate>
  	| stackZoneBase |
  	stackZoneBase := coInterpreter stackZoneBase.
  	processor eip: address.
  	[[[singleStep ifTrue:
  		[[processor sp < stackZoneBase ifTrue: [self halt].
  		  self recordRegisters.
  		  printRegisters ifTrue:
  			[processor printRegistersOn: coInterpreter transcript].
  		  self recordLastInstruction.
  		  printInstructions ifTrue:
+ 			[coInterpreter transcript nextPutAll: lastNInstructions last; cr; flush].
- 			[Transcript nextPutAll: lastNInstructions last; cr; flush].
  		  (breakPC isInteger
  			ifTrue:
  				[processor pc = breakPC
  				 and: [breakBlock value: self]]
  			ifFalse:
  				[breakBlock value: self]) ifTrue:
  			["printRegisters := printInstructions := true"
  			 "self reportLastNInstructions"
  			 "coInterpreter printExternalHeadFrame"
  			 "coInterpreter printFrameAndCallers: coInterpreter framePointer SP: coInterpreter stackPointer"
  			 "coInterpreter shortPrintFrameAndCallers: coInterpreter framePointer"
  			 "coInterpreter printFrame: processor fp WithSP: processor sp"
  			 "coInterpreter printFrameAndCallers: processor fp SP: processor sp"
  			 "coInterpreter shortPrintFrameAndCallers: processor fp"
  			"self disassembleMethodFor: processor pc"
  			 coInterpreter changed: #byteCountText.
  			 self halt: 'machine code breakpoint at ',
  						(breakPC isInteger
  							ifTrue: [breakPC hex]
  							ifFalse: [String streamContents: [:s| breakBlock decompile printOn: s indent: 0]])]] value]. "So that the Debugger's Over steps over all this"
  	   singleStep
  		ifTrue: [processor
  					singleStepIn: coInterpreter memory
  					minimumAddress: guardPageSize
  					readOnlyBelow: coInterpreter cogCodeSize]
  		ifFalse: [processor
  					runInMemory: coInterpreter memory
  					minimumAddress: guardPageSize
  					readOnlyBelow: coInterpreter cogCodeSize].
  	   ((printRegisters or: [printInstructions]) and: [clickConfirm]) ifTrue:
  	 	[(self confirm: 'continue?') ifFalse:
  			[self halt]].
  	   true] whileTrue]
  		on: ProcessorSimulationTrap
  		do: [:ex| self handleSimulationTrap: ex].
  	 true] whileTrue!

Item was changed:
  ----- Method: FilePluginSimulator>>sqFileStdioHandlesInto: (in category 'simulation') -----
  sqFileStdioHandlesInto: anArray
+ 	interpreterProxy transcript clear.
- 	Transcript clear.
  	"See FilePluginSimulator>>initialiseModule"
  	anArray
  		at: 1 put: 0;
  		at: 2 put: 1;
  		at: 3 put: 2.
  	^7!

Item was changed:
  ----- Method: JPEGReadWriter2Plugin>>primJPEGReadImage:fromByteArray:onForm:doDithering:errorMgr: (in category 'primitives') -----
  primJPEGReadImage: aJPEGDecompressStruct fromByteArray: source onForm: form doDithering: ditherFlag errorMgr: aJPEGErrorMgr2Struct
  
+ 	| pcinfo pjerr buffer rowStride formBits formDepth i j formPix ok rOff gOff bOff rOff2 gOff2 bOff2 formWidth formHeight pixPerWord formPitch formBitsSize sourceSize r1 r2 g1 g2 b1 b2 formBitsOops dmv1 dmv2 di dmi dmo |
- 	| pcinfo pjerr buffer rowStride formBits formDepth i j formPix ok rOff gOff bOff rOff2 gOff2 bOff2 formWidth formHeight pixPerWord formPitch formBitsSize sourceSize r1 r2 g1 g2 b1 b2 formBitsAsInt dmv1 dmv2 di dmi dmo |
  	<export: true>
  	<var: #pcinfo type: 'j_decompress_ptr '>
  	<var: #pjerr type: 'error_ptr2 '>
  	<var: #buffer type: 'JSAMPARRAY '>
  	<var: #formBits type: 'unsigned * '>
  
  	self
  		primitive: 'primJPEGReadImagefromByteArrayonFormdoDitheringerrorMgr'
  		parameters: #(ByteArray ByteArray Form Boolean ByteArray).
  
  	"Avoid warnings when saving method"
  	 pcinfo := nil. pjerr := nil. buffer := nil. rowStride := nil.
  		formDepth := nil. formBits := nil. i := nil. j := nil. formPix := nil.
  		ok := nil. rOff := nil. gOff := nil. bOff := nil. rOff2 := nil. gOff2 := nil. bOff2 := nil. sourceSize := nil.
  		r1 := nil. r2 := nil. g1 := nil. g2 := nil. b1 := nil. b2 := nil.
  		dmv1 := nil. dmv2 := nil. di := nil. dmi := nil. dmo := nil.
  		pcinfo. pjerr. buffer. rowStride. formBits. formDepth. i. j. formPix. ok.
  		rOff. gOff. bOff. rOff2. gOff2. bOff2. sourceSize.
  		r1. r2. g1.g2. b1. b2. dmv1. dmv2. di. dmi. dmo.
  
+ 	formBitsOops := interpreterProxy fetchPointer: 0 ofObject: form.
- 	formBits :=self cCoerce: (interpreterProxy fetchPointer: 0 ofObject: form)  to: 'unsigned *'.
- 	formBitsAsInt := interpreterProxy fetchPointer: 0 ofObject: form.
  	formDepth := interpreterProxy fetchInteger: 3 ofObject: form.
  
  	"Various parameter checks"
  	self cCode: '
  		interpreterProxy->success
  			((interpreterProxy->stSizeOf(interpreterProxy->stackValue(4))) >= (sizeof(struct jpeg_decompress_struct)));
  		interpreterProxy->success
  			((interpreterProxy->stSizeOf(interpreterProxy->stackValue(0))) >= (sizeof(struct error_mgr2))); 
  		if (interpreterProxy->failed()) return null;
  	' inSmalltalk: [].
  	formWidth := (self cCode: '((j_decompress_ptr)aJPEGDecompressStruct)->image_width' inSmalltalk: [0]).
  	formHeight := (self cCode: '((j_decompress_ptr)aJPEGDecompressStruct)->image_height' inSmalltalk: [0]).
  	pixPerWord := 32 // formDepth.
  	formPitch := formWidth + (pixPerWord-1) // pixPerWord * 4.
+ 	formBitsSize := interpreterProxy byteSizeOf: formBitsOops.
- 	formBitsSize := interpreterProxy byteSizeOf: formBitsAsInt.
  	interpreterProxy success: 
+ 		((interpreterProxy isWordsOrBytes: formBitsOops)
- 		((interpreterProxy isWordsOrBytes: formBitsAsInt)
  			and: [formBitsSize = (formPitch * formHeight)]).
  	interpreterProxy failed ifTrue: [^ nil].
+ 	formBits := interpreterProxy firstIndexableField: formBitsOops.
  
  	self cCode: '
  		sourceSize = interpreterProxy->stSizeOf(interpreterProxy->stackValue(3));
  		if (sourceSize == 0) {
  			interpreterProxy->success(false);
  			return null;
  		}
  		pcinfo = (j_decompress_ptr)aJPEGDecompressStruct;
  		pjerr = (error_ptr2)aJPEGErrorMgr2Struct;
  		pcinfo->err = jpeg_std_error(&pjerr->pub);
  		pjerr->pub.error_exit = error_exit;
  		ok = 1;
  		if (setjmp(pjerr->setjmp_buffer)) {
  			jpeg_destroy_decompress(pcinfo);
  			ok = 0;
  		}
  		if (ok) {
  			ok = jpeg_mem_src_newLocationOfData(pcinfo, source, sourceSize);
  			if (ok) {
  				/* Dither Matrix taken from Form>>orderedDither32To16, but rewritten for this method. */
  				int ditherMatrix1[] = { 2, 0, 14, 12, 1, 3, 13, 15 };
  				int ditherMatrix2[] = { 10, 8, 6, 4, 9, 11, 5, 7 };
   				jpeg_start_decompress(pcinfo);
  				rowStride = pcinfo->output_width * pcinfo->output_components;
  				if (pcinfo->out_color_components == 3) {
  					rOff = 0; gOff = 1; bOff = 2;
  					rOff2 = 3; gOff2 = 4; bOff2 = 5;
  				} else {
  					rOff = 0; gOff = 0; bOff = 0;
  					rOff2 = 1; gOff2 = 1; bOff2 = 1;
  				}
  				/* Make a one-row-high sample array that will go away when done with image */
  				buffer = (*(pcinfo->mem)->alloc_sarray)
  					((j_common_ptr) pcinfo, JPOOL_IMAGE, rowStride, 1);
  
  				/* Step 6: while (scan lines remain to be read) */
  				/*           jpeg_read_scanlines(...); */
  
  				/* Here we use the library state variable cinfo.output_scanline as the
  				 * loop counter, so that we dont have to keep track ourselves.
  				 */
  				while (pcinfo->output_scanline < pcinfo->output_height) {
  					/* jpeg_read_scanlines expects an array of pointers to scanlines.
  					 * Here the array is only one element long, but you could ask for
  					 * more than one scanline at a time if thats more convenient.
  					 */
  					(void) jpeg_read_scanlines(pcinfo, buffer, 1);
  
  					switch (formDepth) {
  						case 32:
+ 							for(i = 0, j = 0; i < rowStride; i +=(pcinfo->out_color_components), j++) {
- 							for(i = 0, j = 1; i < rowStride; i +=(pcinfo->out_color_components), j++) {
  								formPix = (255 << 24) | (buffer[0][i+rOff] << 16) | (buffer[0][i+gOff] << 8) | buffer[0][i+bOff];
  								if (formPix == 0) formPix = 1;
  								formBits [ ((pcinfo->output_scanline - 1) * (pcinfo->image_width)) + j ] = formPix;
  							}
  							break;
  
  						case 16:
+ 							for(i = 0, j = 0; i < rowStride; i +=(pcinfo->out_color_components*2), j++) {
- 							for(i = 0, j = 1; i < rowStride; i +=(pcinfo->out_color_components*2), j++) {
  								r1 = buffer[0][i+rOff];
  								r2 = buffer[0][i+rOff2];
  								g1 = buffer[0][i+gOff];
  								g2 = buffer[0][i+gOff2];
  								b1 = buffer[0][i+bOff];
  								b2 = buffer[0][i+bOff2];
  
  								if (!!ditherFlag) {
  									r1 = r1 >> 3;
  									r2 = r2 >> 3;
  									g1 = g1 >> 3;
  									g2 = g2 >> 3;
  									b1 = b1 >> 3;
  									b2 = b2 >> 3;
  								} else {
  									/* Do 4x4 ordered dithering. Taken from Form>>orderedDither32To16 */
  									dmv1 = ditherMatrix1[ ((pcinfo->output_scanline & 3 )<< 1) | (j&1) ];
  									dmv2 = ditherMatrix2[ ((pcinfo->output_scanline & 3 )<< 1) | (j&1) ];
  
  									di = (r1 * 496) >> 8; dmi = di & 15; dmo = di >> 4;
  									if(dmv1 < dmi) { r1 = dmo+1; } else { r1 = dmo; };
  									di = (g1 * 496) >> 8; dmi = di & 15; dmo = di >> 4;
  									if(dmv1 < dmi) { g1 = dmo+1; } else { g1 = dmo; };
  									di = (b1 * 496) >> 8; dmi = di & 15; dmo = di >> 4;
  									if(dmv1 < dmi) { b1 = dmo+1; } else { b1 = dmo; };
  
  									di = (r2 * 496) >> 8; dmi = di & 15; dmo = di >> 4;
  									if(dmv2 < dmi) { r2 = dmo+1; } else { r2 = dmo; };
  									di = (g2 * 496) >> 8; dmi = di & 15; dmo = di >> 4;
  									if(dmv2 < dmi) { g2 = dmo+1; } else { g2 = dmo; };
  									di = (b2 * 496) >> 8; dmi = di & 15; dmo = di >> 4;
  									if(dmv2 < dmi) { b2 = dmo+1; } else { b2 = dmo; };
  								}
  
  								formPix = (r1 << 10) | (g1 << 5) | b1;
  								if (!!formPix) formPix = 1;
  								formPix = (formPix << 16) | (r2 << 10) | (g2 << 5) | b2;
  								if (!!(formPix & 65535)) formPix = formPix | 1;
  								formBits [ ((pcinfo->output_scanline - 1) * (pcinfo->image_width)) / 2 + j ] = formPix;
  							}
  							break;
  					}
  				}
  				jpeg_finish_decompress(pcinfo);
  			}
  			jpeg_destroy_decompress(pcinfo);
  		}
  	' inSmalltalk: [].!

Item was changed:
  ----- Method: JPEGReadWriter2Plugin>>primJPEGWriteImage:onByteArray:form:quality:progressiveJPEG:errorMgr: (in category 'primitives') -----
  primJPEGWriteImage: aJPEGCompressStruct onByteArray: destination form: form quality: quality progressiveJPEG: progressiveFlag errorMgr: aJPEGErrorMgr2Struct
  
+ 	| pcinfo pjerr buffer rowStride formBits formWidth formHeight formDepth i j formPix destinationSize pixPerWord formPitch formBitsSize formBitsOops |
- 	| pcinfo pjerr buffer rowStride formBits formWidth formHeight formDepth i j formPix destinationSize pixPerWord formPitch formBitsSize formBitsAsInt |
  	<export: true>
  	<var: #pcinfo type: 'j_compress_ptr '>
  	<var: #pjerr type: 'error_ptr2 '>
  	<var: #buffer type: 'JSAMPARRAY '>
  	<var: #formBits type: 'unsigned * '>
  	<var: #destinationSize type: 'unsigned int'>
  
  	self
  		primitive: 'primJPEGWriteImageonByteArrayformqualityprogressiveJPEGerrorMgr'
  		parameters: #(ByteArray ByteArray Form SmallInteger Boolean ByteArray).
  
  	pcinfo := nil. pjerr := nil. buffer :=nil. rowStride := nil. formBits := nil. 
  	formWidth := nil. formHeight := nil. formDepth := nil. i := nil. j := nil. formPix := nil. destinationSize := nil.
  	pcinfo. pjerr. buffer. rowStride. formBits. formWidth. formHeight. formDepth. i. j. formPix. destinationSize.
  
+ 	formBitsOops := interpreterProxy fetchPointer: 0 ofObject: form.
- 	formBits :=self cCoerce: (interpreterProxy fetchPointer: 0 ofObject: form)  to: 'unsigned *'.
- 	formBitsAsInt := interpreterProxy fetchPointer: 0 ofObject: form.
  	formWidth := interpreterProxy fetchInteger: 1 ofObject: form.
  	formHeight := interpreterProxy fetchInteger: 2 ofObject: form.
  	formDepth := interpreterProxy fetchInteger: 3 ofObject: form.
  
  	"Various parameter checks"
  	self cCode: '
  		interpreterProxy->success
  			((interpreterProxy->stSizeOf(interpreterProxy->stackValue(5))) >= (sizeof(struct jpeg_compress_struct)));
  		interpreterProxy->success
  			((interpreterProxy->stSizeOf(interpreterProxy->stackValue(0))) >= (sizeof(struct error_mgr2))); 
  		if (interpreterProxy->failed()) return null;
  	' inSmalltalk: [].
  	pixPerWord := 32 // formDepth.
  	formPitch := formWidth + (pixPerWord-1) // pixPerWord * 4.
+ 	formBitsSize := interpreterProxy byteSizeOf: formBitsOops.
- 	formBitsSize := interpreterProxy byteSizeOf: formBitsAsInt.
  	interpreterProxy success: 
+ 		((interpreterProxy isWordsOrBytes: formBitsOops)
- 		((interpreterProxy isWordsOrBytes: formBitsAsInt)
  			and: [formBitsSize = (formPitch * formHeight)]).
  	interpreterProxy failed ifTrue: [^ nil].
+ 	formBits := interpreterProxy firstIndexableField: formBitsOops.
- 
  	self cCode: '
  		destinationSize = interpreterProxy->stSizeOf(interpreterProxy->stackValue(4));
  		pcinfo = (j_compress_ptr)aJPEGCompressStruct;
  		pjerr = (error_ptr2)aJPEGErrorMgr2Struct;
  		if (destinationSize) {
  			pcinfo->err = jpeg_std_error(&pjerr->pub);
  			pjerr->pub.error_exit = error_exit;
  			if (setjmp(pjerr->setjmp_buffer)) {
  				jpeg_destroy_compress(pcinfo);
  				destinationSize = 0;
  			}
  			if (destinationSize) {
  				jpeg_create_compress(pcinfo);
  				jpeg_mem_dest(pcinfo, destination, &destinationSize);
  				pcinfo->image_width = formWidth;
  				pcinfo->image_height = formHeight;
  				pcinfo->input_components = 3;
  				pcinfo->in_color_space = JCS_RGB;
  				jpeg_set_defaults(pcinfo);
  				if (quality > 0)
  					jpeg_set_quality (pcinfo, quality, 1);
  				if (progressiveFlag)
  					jpeg_simple_progression(pcinfo);
  				jpeg_start_compress(pcinfo, TRUE);
  				rowStride = formWidth * 3;
  
  				/* Make a one-row-high sample array that will go away 
  				  when done with image */
  				buffer = (*(pcinfo->mem)->alloc_sarray)
  					((j_common_ptr) pcinfo, JPOOL_IMAGE, rowStride, 1);
  
  				while (pcinfo->next_scanline < pcinfo->image_height) {
  					switch (formDepth) {
  						case 32:
+ 							for(i = 0, j = 0; i < rowStride; i +=3, j++) {
- 							for(i = 0, j = 1; i < rowStride; i +=3, j++) {
  								formPix = formBits [ ((pcinfo->next_scanline) * formWidth) + j ];
  								buffer[0][i] = (formPix >> 16) & 255;
  								buffer[0][i+1] = (formPix >> 8) & 255;
  								buffer[0][i+2] = formPix & 255;
  							}
  							break;
  						case 16:
+ 							for(i = 0, j = 0; i < rowStride; i +=6, j++) {
- 							for(i = 0, j = 1; i < rowStride; i +=6, j++) {
  								formPix = formBits [ ((pcinfo->next_scanline) * formWidth) / 2 + j ];
  								buffer[0][i] = (formPix >> 23) & 248;
  								buffer[0][i+1] = (formPix >> 18) & 248;
  								buffer[0][i+2] = (formPix >> 13) & 248;
  								buffer[0][i+3] = (formPix >> 7) & 248;
  								buffer[0][i+4] = (formPix >> 2) & 248;
  								buffer[0][i+5] = (formPix << 3) & 248;
  							}
  							break;
  					}
  					(void) jpeg_write_scanlines(pcinfo, buffer, 1);
  
  				}
  				jpeg_finish_compress(pcinfo);
  				jpeg_destroy_compress(pcinfo);
  			}
  		}
  	' inSmalltalk: [].
  	^(self cCode: 'destinationSize' inSmalltalk: [0])
  		asOop: SmallInteger!

Item was changed:
  ----- Method: JPEGReaderPlugin>>idctBlockInt:qt: (in category 'decoding') -----
  idctBlockInt: anArray qt: qt
  	| ws anACTerm dcval z2 z3 z1 t2 t3 t0 t1 t10 t13 t11 t12 z4 z5 v |
+ 	<var: #anArray type: 'int *'>
+ 	<var: #qt type: 'int *'>
+ 	<var: #ws declareC: 'int ws[64]'>
- 	<var: #anArray type:'int *'>
- 	<var: #qt type:'int *'>
- 	<var: #ws declareC:'int ws[64]'>
  	self cCode:'' inSmalltalk:[ws := CArrayAccessor on: (IntegerArray new: 64)].
  	"Pass 1: process columns from anArray, store into work array"
  	0 to: DCTSize-1 do:[:i |
  		anACTerm := -1.
  		1 to: DCTSize-1 do:[:row|
  			anACTerm = -1 ifTrue:[
  				(anArray at: row * DCTSize + i) = 0 ifFalse:[anACTerm := row]]].
  		anACTerm = -1 ifTrue:[
  			dcval := (anArray at: i) * (qt at: 0) bitShift: Pass1Bits.
  			0 to: DCTSize-1 do: [:j | ws at: (j * DCTSize + i) put: dcval]
  		] ifFalse:[
  			z2 := (anArray at: (DCTSize * 2 + i)) * (qt at: (DCTSize * 2 + i)).
  			z3 := (anArray at: (DCTSize * 6 + i)) * (qt at: (DCTSize * 6 + i)).
  			z1 := (z2 + z3) * FIXn0n541196100.
  			t2 := z1 + (z3 * (0 - FIXn1n847759065)).
  			t3 := z1 + (z2 * FIXn0n765366865).
  			z2 := (anArray at: i) * (qt at: i).
  			z3 := (anArray at: (DCTSize * 4 + i)) * (qt at: (DCTSize * 4 + i)).
  			t0 := (z2 + z3) bitShift: ConstBits.
  			t1 := (z2 - z3) bitShift: ConstBits.
  			t10 := t0 + t3.
  			t13 := t0 - t3.
  			t11 := t1 + t2.
  			t12 := t1 - t2.
  			t0 := (anArray at: (DCTSize * 7 + i)) * (qt at: (DCTSize * 7 + i)).
  			t1 := (anArray at: (DCTSize * 5 + i)) * (qt at: (DCTSize * 5 + i)).
  			t2 := (anArray at: (DCTSize * 3 + i)) * (qt at: (DCTSize * 3 + i)).
  			t3 := (anArray at: (DCTSize + i)) * (qt at: (DCTSize + i)).
  			z1 := t0 + t3.
  			z2 := t1 + t2.
  			z3 := t0 + t2.
  			z4 := t1 + t3.
  			z5 := (z3 + z4) * FIXn1n175875602.
  			t0 := t0 * FIXn0n298631336.
  			t1 := t1 * FIXn2n053119869.
  			t2 := t2 * FIXn3n072711026.
  			t3 := t3 * FIXn1n501321110.
  			z1 := z1 * (0 - FIXn0n899976223).
  			z2 := z2 * (0 - FIXn2n562915447).
  			z3 := z3 * (0 - FIXn1n961570560).
  			z4 := z4 * (0 - FIXn0n390180644).
  			z3 := z3 + z5.
  			z4 := z4 + z5.
  			t0 := t0 + z1 + z3.
  			t1 := t1 +z2 +z4.
  			t2 := t2 + z2 + z3.
  			t3 := t3 + z1 + z4.
  			ws at: i put: (t10 + t3) // Pass1Div.
  			ws at: (DCTSize * 7 + i) put: (t10 - t3) // Pass1Div.
  			ws at: (DCTSize * 1 + i) put: (t11 + t2) // Pass1Div.
  			ws at: (DCTSize * 6 + i) put: (t11 - t2) // Pass1Div.
  			ws at: (DCTSize * 2 + i) put: (t12 + t1) // Pass1Div.
  			ws at: (DCTSize * 5 + i) put: (t12 - t1) // Pass1Div.
  			ws at: (DCTSize * 3 + i) put: (t13 + t0) // Pass1Div.
  			ws at: (DCTSize * 4 + i) put: (t13 - t0) // Pass1Div]].
  
  	"Pass 2: process rows from work array, store back into anArray"
  	0 to: DCTSize2-DCTSize by: DCTSize do:[:i |
  		z2 := ws at: i + 2.
  		z3 := ws at: i + 6.
  		z1 := (z2 + z3) * FIXn0n541196100.
  		t2 := z1 + (z3 * (0-FIXn1n847759065)).
  		t3 := z1 + (z2 * FIXn0n765366865).
  		t0 := (ws at: i) + (ws at: (i + 4)) bitShift: ConstBits.
  		t1 := (ws at: i) - (ws at: (i + 4)) bitShift: ConstBits.
  		t10 := t0 + t3.
  		t13 := t0 - t3.
  		t11 := t1 + t2.
  		t12 := t1 -t2.
  		t0 := ws at: (i + 7).
  		t1 := ws at: (i + 5).
  		t2 := ws at: (i + 3).
  		t3 := ws at: (i + 1).
  		z1 := t0 + t3.
  		z2 := t1 + t2.
  		z3 := t0 + t2.
  		z4 := t1 + t3.
  		z5 := (z3 + z4) * FIXn1n175875602.
  		t0 := t0 * FIXn0n298631336.
  		t1 := t1 * FIXn2n053119869.
  		t2 := t2 * FIXn3n072711026.
  		t3 := t3 * FIXn1n501321110.
  		z1 := z1 * (0-FIXn0n899976223).
  		z2 := z2 * (0-FIXn2n562915447).
  		z3 := z3 * (0-FIXn1n961570560).
  		z4 := z4 * (0-FIXn0n390180644).
  		z3 := z3 + z5.
  		z4 := z4 + z5.
  		t0 := t0 + z1 + z3.
  		t1 := t1 + z2 + z4.
  		t2 := t2 + z2 + z3.
  		t3 := t3 + z1 + z4.
  		v := (t10 + t3) // Pass2Div + SampleOffset.
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: i put: v.
  		v := (t10 - t3) // Pass2Div + SampleOffset.
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: (i + 7) put: v.
  		v := (t11 + t2) // Pass2Div + SampleOffset. 
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: (i + 1) put: v.
  		v := (t11 - t2) // Pass2Div + SampleOffset.
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: (i + 6) put: v.
  		v :=  (t12 + t1) // Pass2Div + SampleOffset.
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: (i + 2) put: v.
  		v :=  (t12 - t1) // Pass2Div + SampleOffset.
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: (i + 5) put: v.
  		v := (t13 + t0) // Pass2Div + SampleOffset.
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: (i + 3) put: v.
  		v := (t13 - t0) // Pass2Div + SampleOffset.
  		v := v min: MaxSample. v := v max: 0.
  		anArray at: (i + 4) put: v].!

Item was changed:
  ----- Method: JPEGReaderPlugin>>jpegDecodeValueFrom:size: (in category 'stream support') -----
  jpegDecodeValueFrom: table size: tableSize
  	"Decode the next value in the receiver using the given huffman table."
  	| bits bitsNeeded tableIndex value index |
+ 	<var: #table type: 'int *'>
- 	<var: #table type:'int *'>
  	bitsNeeded := (table at: 0) >> 24.	"Initial bits needed"
  	bitsNeeded > MaxBits ifTrue:[^-1].
  	tableIndex := 2.							"First real table"
  	[true] whileTrue:[
  		bits := self getBits: bitsNeeded.		"Get bits"
  		bits < 0 ifTrue:[^-1].
  		index := tableIndex + bits - 1.
  		index >= tableSize ifTrue:[^-1].
  		value := table at: index.					"Lookup entry in table"
  		(value bitAnd: 16r3F000000) = 0 ifTrue:[^value]. "Check if it is a leaf node"
  		"Fetch sub table"
  		tableIndex := value bitAnd: 16rFFFF.	"Table offset in low 16 bit"
  		bitsNeeded := (value >> 24) bitAnd: 255. "Additional bits in high 8 bit"
  		bitsNeeded > MaxBits ifTrue:[^-1]].
  	^-1!

Item was changed:
  ----- Method: KlattSynthesizerPlugin>>checkedFloatPtrOf: (in category 'private') -----
  checkedFloatPtrOf: oop
  	"Return the first indexable word of oop which is assumed to be variableWordSubclass"
+ 	<returnTypeC: 'float *'>
- 	<returnTypeC:'float *'>
  	interpreterProxy success: (interpreterProxy isWords: oop).
  	interpreterProxy failed ifTrue:[^0].
  	^self cCoerce: (interpreterProxy firstIndexableField: oop) to:'float *'!

Item was changed:
  ----- Method: KlattSynthesizerPlugin>>checkedShortPtrOf: (in category 'private') -----
  checkedShortPtrOf: oop
  	"Return the first indexable word of oop which is assumed to be variableWordSubclass"
+ 	<returnTypeC: 'short *'>
- 	<returnTypeC:'short *'>
  	interpreterProxy success: (interpreterProxy isWords: oop).
  	interpreterProxy failed ifTrue:[^0].
  	^self cCoerce: (interpreterProxy firstIndexableField: oop) to:'short *'!

Item was changed:
  ----- Method: Matrix2x3Plugin>>loadArgumentMatrix: (in category 'private') -----
  loadArgumentMatrix: matrix
  	"Load the argument matrix"
+ 	<returnTypeC: 'float *'>
- 	<returnTypeC:'float *'>
  	interpreterProxy failed ifTrue:[^nil].
  	((interpreterProxy isWords: matrix) and:[(interpreterProxy slotSizeOf: matrix) = 6]) 
  		ifFalse:[interpreterProxy primitiveFail.
  				^nil].
  	^self cCoerce: (interpreterProxy firstIndexableField: matrix) to:'float *'.!

Item was changed:
  ----- Method: Matrix2x3Plugin>>matrix2x3ComposeMatrix:with:into: (in category 'transforming') -----
  matrix2x3ComposeMatrix: m1 with: m2 into: m3
  	"Multiply matrix m1 with m2 and store the result into m3."
  	| a11 a12 a13 a21 a22 a23 |
+ 	<var: #m1 type: 'const float *'>
+ 	<var: #m2 type: 'const float *'>
+ 	<var: #m3 type: 'float *'>
+ 	<var: #a11 type: 'double '>
+ 	<var: #a12 type: 'double '>
+ 	<var: #a13 type: 'double '>
+ 	<var: #a21 type: 'double '>
+ 	<var: #a22 type: 'double '>
+ 	<var: #a23 type: 'double '>
- 	<var: #m1 type:'const float *'>
- 	<var: #m2 type:'const float *'>
- 	<var: #m3 type:'float *'>
- 	<var: #a11 type:'double '>
- 	<var: #a12 type:'double '>
- 	<var: #a13 type:'double '>
- 	<var: #a21 type:'double '>
- 	<var: #a22 type:'double '>
- 	<var: #a23 type:'double '>
  
  	a11 := ((m1 at: 0) * (m2 at: 0)) + ((m1 at: 1) * (m2 at: 3)).
  	a12 := ((m1 at: 0) * (m2 at: 1)) + ((m1 at: 1) * (m2 at: 4)).
  	a13 := ((m1 at: 0) * (m2 at: 2)) + ((m1 at: 1) * (m2 at: 5)) + (m1 at: 2).
  	a21 := ((m1 at: 3) * (m2 at: 0)) + ((m1 at: 4) * (m2 at: 3)).
  	a22 := ((m1 at: 3) * (m2 at: 1)) + ((m1 at: 4) * (m2 at: 4)).
  	a23 := ((m1 at: 3) * (m2 at: 2)) + ((m1 at: 4) * (m2 at: 5)) + (m1 at: 5).
  
  	m3 at: 0 put: (self cCoerce: a11 to: 'float').
  	m3 at: 1 put: (self cCoerce: a12 to: 'float').
  	m3 at: 2 put: (self cCoerce: a13 to: 'float').
  	m3 at: 3 put: (self cCoerce: a21 to: 'float').
  	m3 at: 4 put: (self cCoerce: a22 to: 'float').
  	m3 at: 5 put: (self cCoerce: a23 to: 'float').
  !

Item was changed:
  ----- Method: Matrix2x3Plugin>>matrix2x3InvertPoint: (in category 'transforming') -----
  matrix2x3InvertPoint: m
  	"Invert the pre-loaded argument point by the given matrix"
  	| x y det detX detY |
+ 	<var: #m type: 'float *'>
+ 	<var: #x type: 'double '>
+ 	<var: #y type: 'double '>
+ 	<var: #det type: 'double '>
+ 	<var: #detX type: 'double '>
+ 	<var: #detY type: 'double '>
- 	<var: #m type:'float *'>
- 	<var: #x type:'double '>
- 	<var: #y type:'double '>
- 	<var: #det type:'double '>
- 	<var: #detX type:'double '>
- 	<var: #detY type:'double '>
  
  	x := m23ArgX - (m at: 2).
  	y := m23ArgY - (m at: 5).
  	det := ((m at: 0) * (m at: 4)) - ((m at: 1) * (m at: 3)).
  	det = 0.0 ifTrue:[^interpreterProxy primitiveFail]."Matrix is singular."
  	det := 1.0 / det.
  	detX := (x * (m at: 4)) - ((m at: 1) * y).
  	detY := ((m at: 0) * y) - (x * (m at: 3)).
  	m23ResultX := detX * det.
  	m23ResultY := detY * det.!

Item was changed:
  ----- Method: Matrix2x3Plugin>>matrix2x3TransformPoint: (in category 'transforming') -----
  matrix2x3TransformPoint: m
  	"Transform the pre-loaded argument point by the given matrix"
+ 	<var: #m type: 'float *'>
- 	<var: #m type:'float *'>
  	m23ResultX := (m23ArgX * (m at: 0)) + (m23ArgY * (m at: 1)) + (m at: 2).
  	m23ResultY := (m23ArgX * (m at: 3)) + (m23ArgY * (m at: 4)) + (m at: 5).!

Item was changed:
  ----- Method: Matrix2x3Plugin>>primitiveComposeMatrix (in category 'primitives') -----
  primitiveComposeMatrix
- 	<export: true>
  	| m1 m2 m3 result |
+ 	<export: true>
  	<inline: false>
  	<var: #m1 type: #'float *'>
  	<var: #m2 type: #'float *'>
  	<var: #m3 type: #'float *'>
  	self cCode: ''  "Make this fail in simulation"
  		inSmalltalk: [interpreterProxy success: false. ^ nil].
  	m3 := self loadArgumentMatrix: (result := interpreterProxy stackObjectValue: 0).
  	m2 := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 1).
  	m1 := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 2).
  	interpreterProxy failed ifTrue:[^nil].
  	self matrix2x3ComposeMatrix: m1 with: m2 into: m3.
  	interpreterProxy pop: 3 thenPush: result!

Item was changed:
  ----- Method: Matrix2x3Plugin>>primitiveInvertPoint (in category 'primitives') -----
  primitiveInvertPoint
  	| matrix |
  	<export: true>
  	<inline: false>
+ 	<var: #matrix type: 'float *'>
- 	<var: #matrix type:'float *'>
  	self loadArgumentPoint: (interpreterProxy stackObjectValue: 0).
  	matrix := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 1).
  	interpreterProxy failed ifTrue:[^nil].
  	self matrix2x3InvertPoint: matrix.
  	interpreterProxy failed ifFalse:[self roundAndStoreResultPoint: 2].!

Item was changed:
  ----- Method: Matrix2x3Plugin>>primitiveInvertRectInto (in category 'primitives') -----
  primitiveInvertRectInto
  	| matrix srcOop dstOop originX originY cornerX cornerY minX maxX minY maxY |
  	<export: true>
  	<inline: false>
+ 	<var: #matrix type: 'float *'>
+ 	<var: #originX type: 'double '>
+ 	<var: #originY type: 'double '>
+ 	<var: #cornerX type: 'double '>
+ 	<var: #cornerY type: 'double '>
+ 	<var: #minX type: 'double '>
+ 	<var: #maxX type: 'double '>
+ 	<var: #minY type: 'double '>
+ 	<var: #maxY type: 'double '>
- 	<var: #matrix type:'float *'>
- 	<var: #originX type:'double '>
- 	<var: #originY type:'double '>
- 	<var: #cornerX type:'double '>
- 	<var: #cornerY type:'double '>
- 	<var: #minX type:'double '>
- 	<var: #maxX type:'double '>
- 	<var: #minY type:'double '>
- 	<var: #maxY type:'double '>
  
  	dstOop := interpreterProxy stackObjectValue: 0.
  	srcOop := interpreterProxy stackObjectValue: 1.
  	matrix := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 2).
  	interpreterProxy failed ifTrue:[^nil].
  
  	(interpreterProxy fetchClassOf: srcOop) = (interpreterProxy fetchClassOf: dstOop)
  		ifFalse:[^interpreterProxy primitiveFail].
  	(interpreterProxy isPointers: srcOop)
  		ifFalse:[^interpreterProxy primitiveFail].
  	(interpreterProxy slotSizeOf: srcOop) = 2
  		ifFalse:[^interpreterProxy primitiveFail].
  
  	"Load top-left point"
  	self loadArgumentPoint: (interpreterProxy fetchPointer: 0 ofObject: srcOop).
  	interpreterProxy failed ifTrue:[^nil].
  	originX := m23ArgX.
  	originY := m23ArgY.
  	self matrix2x3InvertPoint: matrix.
  	minX := maxX := m23ResultX.
  	minY := maxY := m23ResultY.
  
  	"Load bottom-right point"
  	self loadArgumentPoint:(interpreterProxy fetchPointer: 1 ofObject: srcOop).
  	interpreterProxy failed ifTrue:[^nil].
  	cornerX := m23ArgX.
  	cornerY := m23ArgY.
  	self matrix2x3InvertPoint: matrix.
  	minX := minX min: m23ResultX.
  	maxX := maxX max: m23ResultX.
  	minY := minY min: m23ResultY.
  	maxY := maxY max: m23ResultY.
  
  	"Load top-right point"
  	m23ArgX := cornerX.
  	m23ArgY := originY.
  	self matrix2x3InvertPoint: matrix.
  	minX := minX min: m23ResultX.
  	maxX := maxX max: m23ResultX.
  	minY := minY min: m23ResultY.
  	maxY := maxY max: m23ResultY.
  
  	"Load bottom-left point"
  	m23ArgX := originX.
  	m23ArgY := cornerY.
  	self matrix2x3InvertPoint: matrix.
  	minX := minX min: m23ResultX.
  	maxX := maxX max: m23ResultX.
  	minY := minY min: m23ResultY.
  	maxY := maxY max: m23ResultY.
  
  	interpreterProxy failed ifFalse:[
  		dstOop := self roundAndStoreResultRect: dstOop x0: minX y0: minY x1: maxX y1: maxY].
  	interpreterProxy failed ifFalse:[
  		interpreterProxy pop: 3 thenPush: dstOop
+ 	]
+ !
- 	]!

Item was changed:
  ----- Method: Matrix2x3Plugin>>primitiveIsIdentity (in category 'primitives') -----
  primitiveIsIdentity
  	| matrix |
  	<export: true>
  	<inline: false>
+ 	<var: #matrix type: 'float *'>
- 	<var: #matrix type:'float *'>
  	matrix := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 0).
  	interpreterProxy failed ifTrue:[^nil].
  	interpreterProxy pop: 1.
  	interpreterProxy pushBool:(
  		((matrix at: 0) = (self cCoerce: 1.0 to: 'float')) &
  		((matrix at: 1) = (self cCoerce: 0.0 to: 'float')) &
  		((matrix at: 2) = (self cCoerce: 0.0 to: 'float')) &
  		((matrix at: 3) = (self cCoerce: 0.0 to: 'float')) &
  		((matrix at: 4) = (self cCoerce: 1.0 to: 'float')) &
  		((matrix at: 5) = (self cCoerce: 0.0 to: 'float'))).!

Item was changed:
  ----- Method: Matrix2x3Plugin>>primitiveIsPureTranslation (in category 'primitives') -----
  primitiveIsPureTranslation
  	| matrix |
  	<export: true>
  	<inline: false>
+ 	<var: #matrix type: 'float *'>
- 	<var: #matrix type:'float *'>
  	matrix := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 0).
  	interpreterProxy failed ifTrue:[^nil].
  	interpreterProxy pop: 1.
  	interpreterProxy pushBool:(
  		((matrix at: 0) = (self cCoerce: 1.0 to: 'float')) &
  		((matrix at: 1) = (self cCoerce: 0.0 to: 'float')) &
  		((matrix at: 3) = (self cCoerce: 0.0 to: 'float')) &
  		((matrix at: 4) = (self cCoerce: 1.0 to: 'float'))).!

Item was changed:
  ----- Method: Matrix2x3Plugin>>primitiveTransformPoint (in category 'primitives') -----
  primitiveTransformPoint
  	| matrix |
  	<export: true>
  	<inline: false>
+ 	<var: #matrix type: 'float *'>
- 	<var: #matrix type:'float *'>
  	self loadArgumentPoint: (interpreterProxy stackObjectValue: 0).
  	matrix := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 1).
  	interpreterProxy failed ifTrue:[^nil].
  	self matrix2x3TransformPoint: matrix.
  	self roundAndStoreResultPoint: 2.!

Item was changed:
  ----- Method: Matrix2x3Plugin>>primitiveTransformRectInto (in category 'primitives') -----
  primitiveTransformRectInto
  	| matrix srcOop dstOop originX originY cornerX cornerY minX maxX minY maxY |
  	<export: true>
  	<inline: false>
+ 	<var: #matrix type: 'float *'>
+ 	<var: #originX type: 'double '>
+ 	<var: #originY type: 'double '>
+ 	<var: #cornerX type: 'double '>
+ 	<var: #cornerY type: 'double '>
+ 	<var: #minX type: 'double '>
+ 	<var: #maxX type: 'double '>
+ 	<var: #minY type: 'double '>
+ 	<var: #maxY type: 'double '>
- 	<var: #matrix type:'float *'>
- 	<var: #originX type:'double '>
- 	<var: #originY type:'double '>
- 	<var: #cornerX type:'double '>
- 	<var: #cornerY type:'double '>
- 	<var: #minX type:'double '>
- 	<var: #maxX type:'double '>
- 	<var: #minY type:'double '>
- 	<var: #maxY type:'double '>
  
  	dstOop := interpreterProxy stackObjectValue: 0.
  	srcOop := interpreterProxy stackObjectValue: 1.
  	matrix := self loadArgumentMatrix: (interpreterProxy stackObjectValue: 2).
  	interpreterProxy failed ifTrue:[^nil].
  
  	(interpreterProxy fetchClassOf: srcOop) = (interpreterProxy fetchClassOf: dstOop)
  		ifFalse:[^interpreterProxy primitiveFail].
  	(interpreterProxy isPointers: srcOop)
  		ifFalse:[^interpreterProxy primitiveFail].
  	(interpreterProxy slotSizeOf: srcOop) = 2
  		ifFalse:[^interpreterProxy primitiveFail].
  
  	"Load top-left point"
  	self loadArgumentPoint: (interpreterProxy fetchPointer: 0 ofObject: srcOop).
  	interpreterProxy failed ifTrue:[^nil].
  	originX := m23ArgX.
  	originY := m23ArgY.
  	self matrix2x3TransformPoint: matrix.
  	minX := maxX := m23ResultX.
  	minY := maxY := m23ResultY.
  
  	"Load bottom-right point"
  	self loadArgumentPoint:(interpreterProxy fetchPointer: 1 ofObject: srcOop).
  	interpreterProxy failed ifTrue:[^nil].
  	cornerX := m23ArgX.
  	cornerY := m23ArgY.
  	self matrix2x3TransformPoint: matrix.
  	minX := minX min: m23ResultX.
  	maxX := maxX max: m23ResultX.
  	minY := minY min: m23ResultY.
  	maxY := maxY max: m23ResultY.
  
  	"Load top-right point"
  	m23ArgX := cornerX.
  	m23ArgY := originY.
  	self matrix2x3TransformPoint: matrix.
  	minX := minX min: m23ResultX.
  	maxX := maxX max: m23ResultX.
  	minY := minY min: m23ResultY.
  	maxY := maxY max: m23ResultY.
  
  	"Load bottom-left point"
  	m23ArgX := originX.
  	m23ArgY := cornerY.
  	self matrix2x3TransformPoint: matrix.
  	minX := minX min: m23ResultX.
  	maxX := maxX max: m23ResultX.
  	minY := minY min: m23ResultY.
  	maxY := maxY max: m23ResultY.
  
  	dstOop := self roundAndStoreResultRect: dstOop x0: minX y0: minY x1: maxX y1: maxY.
  	interpreterProxy failed ifFalse:[
  		interpreterProxy pop: 3 thenPush: dstOop
+ 	]
+ !
- 	]!

Item was changed:
  ----- Method: Matrix2x3Plugin>>roundAndStoreResultRect:x0:y0:x1:y1: (in category 'private') -----
  roundAndStoreResultRect: dstOop x0: x0 y0: y0 x1: x1 y1: y1
  	"Check, round and store the result of a rectangle operation"
  	| minX maxX minY maxY originOop cornerOop rectOop |
+ 	<var: #x0 type: 'double '>
+ 	<var: #y0 type: 'double '>
+ 	<var: #x1 type: 'double '>
+ 	<var: #y1 type: 'double '>
+ 	<var: #minX type: 'double '>
+ 	<var: #maxX type: 'double '>
+ 	<var: #minY type: 'double '>
+ 	<var: #maxY type: 'double '>
- 	<var: #x0 type:'double '>
- 	<var: #y0 type:'double '>
- 	<var: #x1 type:'double '>
- 	<var: #y1 type:'double '>
- 	<var: #minX type:'double '>
- 	<var: #maxX type:'double '>
- 	<var: #minY type:'double '>
- 	<var: #maxY type:'double '>
  
  	minX := x0 + 0.5.
  	(self okayIntValue: minX) ifFalse:[^interpreterProxy primitiveFail].
  	maxX := x1 + 0.5.
  	(self okayIntValue: maxX) ifFalse:[^interpreterProxy primitiveFail].
  	minY := y0 + 0.5.
  	(self okayIntValue: minY) ifFalse:[^interpreterProxy primitiveFail].
  	maxY := y1 + 0.5.
  	(self okayIntValue: maxY) ifFalse:[^interpreterProxy primitiveFail].
  
  	interpreterProxy pushRemappableOop: dstOop.
  	originOop := interpreterProxy makePointwithxValue: minX asInteger yValue: minY asInteger.
  	interpreterProxy pushRemappableOop: originOop.
  	cornerOop := interpreterProxy makePointwithxValue: maxX asInteger yValue: maxY asInteger.
  	originOop := interpreterProxy popRemappableOop.
  	rectOop := interpreterProxy popRemappableOop.
  	interpreterProxy storePointer: 0 ofObject: rectOop withValue: originOop.
  	interpreterProxy storePointer: 1 ofObject: rectOop withValue: cornerOop.
  	^rectOop!

Item was changed:
  ----- Method: Mpeg3Plugin>>primitiveMPEG3CheckSig: (in category 'primitives') -----
  primitiveMPEG3CheckSig: path
  	| result sz storage |
  
  	"int mpeg3_check_sig(char *path)"
  	<var: #storage declareC: 'char storage[1024] '>
  	self primitive: 'primitiveMPEG3CheckSig'
  		parameters: #(String).
  	sz := interpreterProxy byteSizeOf: path cPtrAsOop.
+ 	interpreterProxy ioFilename: storage fromString: path ofLength: sz resolveAliases: true.
- 	self cCode: 'sqFilenameFromStringOpen(storage, path, sz)'.
  	self cCode: 'result = mpeg3_check_sig(storage)'.
  	^result asOop: Boolean
  !

Item was changed:
  ----- Method: Mpeg3Plugin>>primitiveMPEG3EndOfVideo:stream: (in category 'primitives') -----
  primitiveMPEG3EndOfVideo: fileHandle stream: aNumber
  	| file result |
  
  	"int mpeg3_end_of_video(mpeg3_t *file, int stream)"
+ 	<var: #file type: 'mpeg3_t * '>
- 	<var: #file type: 'mpeg3_t *'>
  	self primitive: 'primitiveMPEG3EndOfVideo'
  		parameters: #(Oop SmallInteger).
  
  	file := self mpeg3tValueOf: fileHandle.
  	file = nil ifTrue: [^0].
  	aNumber < 0 ifTrue: [interpreterProxy success: false. ^nil].
  	aNumber >= (self cCode: 'result = mpeg3_total_vstreams(file)') ifTrue: [
  		interpreterProxy success: false.  ^0 ].
  
  
  	self cCode: 'result = mpeg3_end_of_video(file,aNumber)'.
  	^result asOop: Boolean
  !

Item was changed:
  ----- Method: Mpeg3Plugin>>primitiveMPEG3GetTime: (in category 'primitives') -----
  primitiveMPEG3GetTime: fileHandle 
  	| file result |
  
  	"double mpeg3_get_time(mpeg3_t *file)"
+ 	<var: #result type: 'double '>
- 	<var: # result type: 'double '>
  	<var: #file type: 'mpeg3_t * '>
  	self primitive: 'primitiveMPEG3GetTime'
  		parameters: #(Oop).
  	file := self mpeg3tValueOf: fileHandle.
  	file = nil ifTrue: [^nil].
  	self cCode: 'result = mpeg3_get_time(file)'.
  	^result asOop: Float.
  !

Item was changed:
  ----- Method: Mpeg3Plugin>>primitiveMPEG3Open: (in category 'primitives') -----
  primitiveMPEG3Open: path
  	| mpeg3Oop index sz storage |
  
  	"mpeg3_t* mpeg3_open(char *path)"
  	<var: #index declareC: 'mpeg3_t ** index'>
  	<var: #storage declareC: 'char storage[1024]'>
  	self primitive: 'primitiveMPEG3Open'
  		parameters: #(String).
  	sz := interpreterProxy byteSizeOf: path cPtrAsOop.
+ 	interpreterProxy ioFilename: storage fromString: path ofLength: sz resolveAliases: true.
- 	self cCode: 'sqFilenameFromStringOpen(storage, path, sz)'.
  	mpeg3Oop := interpreterProxy instantiateClass: interpreterProxy classByteArray
  					indexableSize: 4.
  	index := self cCoerce: (interpreterProxy firstIndexableField: mpeg3Oop)
  						to: 'mpeg3_t **'.
  	self cCode: '*index = mpeg3_open(storage,0); makeFileEntry(*index)'.
  	^mpeg3Oop.
  !

Item was changed:
  ----- Method: Mpeg3Plugin>>primitiveMPEG3ReadFrame:buffer:bufferOffset:x:y:w:h:ow:oh:colorModel:stream:bytesPerRow: (in category 'primitives') -----
  primitiveMPEG3ReadFrame: fileHandle buffer: aBuffer bufferOffset: aBufferOffset x: xNumber y: yNumber w: width h: height ow: outWidth oh: outHeight colorModel: model stream: aNumber bytesPerRow: aByteNumber 
  	| file result outputRowsPtr bufferBaseAddr |
+ 	<var: #file declareC: 'mpeg3_t * file'>
+ 	<var: #bufferBaseAddr declareC: 'unsigned char *bufferBaseAddr'>
+ 	<var: #outputRowsPtr declareC: 'unsigned char  ** outputRowsPtr'>
  
  	"int mpeg3_read_frame(mpeg3_t *file, 
  		unsigned char **output_rows, 
  		int in_x, 
  		int in_y, 
  		int in_w, 
  		int in_h, 
  		int out_w, 
  		int out_h, 
  		int color_model,
  		int stream)"
  
- 	<var: #file declareC: 'mpeg3_t * file'>
- 	<var: #bufferBaseAddr declareC: 'unsigned char *bufferBaseAddr'>
- 	<var: #outputRowsPtr declareC: 'unsigned char  ** outputRowsPtr'>
  	self primitive: 'primitiveMPEG3ReadFrameBufferOffset'
  		parameters: #(Oop WordArray  SmallInteger SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger SmallInteger).
  
  	file := self mpeg3tValueOf: fileHandle.
  	file = nil ifTrue: [^0].
  	aNumber < 0 ifTrue: [ interpreterProxy success: false.  ^nil ].
  	aNumber >= (self cCode: 'result = mpeg3_total_vstreams(file)') ifTrue: [
  		interpreterProxy success: false.  ^0 ].
  
  	bufferBaseAddr := self cCoerce: aBuffer to: 'unsigned char *'.
  	self cCode: 'outputRowsPtr = (unsigned char **) memoryAllocate(1,sizeof(unsigned char*) * outHeight)'.
  
  	0 to: outHeight-1 do: [:i | outputRowsPtr at: i put: (bufferBaseAddr + aBufferOffset + (aByteNumber*i))].
  		
  	self cCode: 'result = mpeg3_read_frame(file,outputRowsPtr,xNumber,yNumber,width,height,outWidth,outHeight,model,aNumber)'.
  	self cCode: 'memoryFree(outputRowsPtr)'.
  	^result asSmallIntegerObj
  !

Item was changed:
  ----- Method: Mpeg3Plugin>>primitiveMPEG3ReadFrame:buffer:x:y:w:h:ow:oh:colorModel:stream:bytesPerRow: (in category 'primitives') -----
  primitiveMPEG3ReadFrame: fileHandle buffer: aBuffer x: xNumber y: yNumber w: width h: height ow: outWidth oh: outHeight colorModel: model stream: aNumber bytesPerRow: aByteNumber 
  	| file result outputRowsPtr bufferBaseAddr |
+ 	<var: #file type: 'mpeg3_t * '>
+ 	<var: #bufferBaseAddr type: 'unsigned char *'>
+ 	<var: #outputRowsPtr type: 'unsigned char  ** '>
  
  	"int mpeg3_read_frame(mpeg3_t *file, 
  		unsigned char **output_rows, 
  		int in_x, 
  		int in_y, 
  		int in_w, 
  		int in_h, 
  		int out_w, 
  		int out_h, 
  		int color_model,
  		int stream)"
  
- 	<var: #file type: 'mpeg3_t * '>
- 	<var: #bufferBaseAddr type: 'unsigned char *'>
- 	<var: #outputRowsPtr type: 'unsigned char  ** '>
  	self primitive: 'primitiveMPEG3ReadFrame'
  		parameters: #(Oop WordArray  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger  SmallInteger SmallInteger).
  
  	file := self mpeg3tValueOf: fileHandle.
  	file = nil ifTrue: [^0].
  	aNumber < 0 ifTrue: [ interpreterProxy success: false.  ^nil ].
  	aNumber >= (self cCode: 'result = mpeg3_total_vstreams(file)') ifTrue: [
  		interpreterProxy success: false.  ^0 ].
  
  	bufferBaseAddr := self cCoerce: aBuffer to: 'unsigned char *'.
  	self cCode: 'outputRowsPtr = (unsigned char **) memoryAllocate(1,sizeof(unsigned char*) * outHeight)'.
  
  	0 to: outHeight-1 do: [:i | outputRowsPtr at: i put: (bufferBaseAddr + (aByteNumber*i))].
  		
  	self cCode: 'result = mpeg3_read_frame(file,outputRowsPtr,xNumber,yNumber,width,height,outWidth,outHeight,model,aNumber)'.
  	self cCode: 'memoryFree(outputRowsPtr)'.
  	^result asSmallIntegerObj
  !

Item was changed:
  ----- Method: Mpeg3Plugin>>primitiveMPEG3TellPercentage: (in category 'primitives') -----
  primitiveMPEG3TellPercentage: fileHandle
  	| file result |
  
  	"double mpeg3_tell_percentage(mpeg3_t *file)"
+ 	<var: #result type: 'double '>
- 	<var: # result type: 'double '>
  	<var: #file type: 'mpeg3_t * '>
  	self primitive: 'primitiveMPEG3TellPercentage'
  		parameters: #(Oop).
  	file := self mpeg3tValueOf: fileHandle.
  	file = nil ifTrue: [^nil].
  	self cCode: 'result = mpeg3_tell_percentage(file)'.
  	^result asOop: Float.
  !

Item was added:
+ ----- Method: NewCoObjectMemorySimulator>>transcript (in category 'simulation only') -----
+ transcript
+ 	"hack around the CoInterpreter/ObjectMemory split refactoring"
+ 	^coInterpreter transcript!

Item was added:
+ ----- Method: StackInterpreter>>headerIndicatesAlternateBytecodeSet: (in category 'internal interpreter access') -----
+ headerIndicatesAlternateBytecodeSet: methodHeader
+ 	"A negative header selects the alternate bytecode set."
+ 	^(objectMemory integerValueOf: methodHeader) < 0!

Item was changed:
  ----- Method: StackInterpreter>>methodUsesAlternateBytecodeSet: (in category 'internal interpreter access') -----
  methodUsesAlternateBytecodeSet: aMethodObj
  	<api>
  	<inline: true>
  	"A negative header selects the alternate bytecode set."
+ 	^self headerIndicatesAlternateBytecodeSet: (self headerOf: aMethodObj)!
- 	^(objectMemory integerValueOf: (self headerOf: aMethodObj)) < 0!

Item was changed:
  ----- Method: TMethod>>inlineCaseStatementBranchesIn:localizingVars: (in category 'inlining') -----
  inlineCaseStatementBranchesIn: aCodeGen localizingVars: varsList
  
+ 	| stmt sel newStatements maxTemp usedVars exitLabel v |
- 	| stmt sel meth newStatements maxTemp usedVars exitLabel v |
  	maxTemp := 0.
  	parseTree nodesDo: [ :n |
  		n isCaseStmt ifTrue: [
  			n cases do: [ :stmtNode |
  				stmt := stmtNode statements first.
  				stmt isSend ifTrue: [
  					sel := stmt selector.
+ 					(aCodeGen methodNamed: sel) ifNotNil:
+ 						[:meth|
+ 						(meth hasUnrenamableCCode
+ 						or: [meth args notEmpty]) ifFalse: [
+ 							meth := meth copy.
+ 							meth hasReturn ifTrue: [
+ 								exitLabel := meth unusedLabelForInliningInto: self.
+ 								meth exitVar: nil label: exitLabel.
+ 								labels add: exitLabel.
+ 							] ifFalse: [ exitLabel := nil ].
- 					meth := aCodeGen methodNamed: sel.
- 					(meth notNil
- 					 and: [meth hasUnrenamableCCode
- 						or: [meth args notEmpty]]) ifFalse: [
- 						meth := meth copy.
- 						meth hasReturn ifTrue: [
- 							exitLabel := meth unusedLabelForInliningInto: self.
- 							meth exitVar: nil label: exitLabel.
- 							labels add: exitLabel.
- 						] ifFalse: [ exitLabel := nil ].
  
+ 							meth renameLabelsForInliningInto: self.
+ 							meth labels do: [ :label | labels add: label ].
+ 							newStatements := stmtNode statements asOrderedCollection.
+ 							newStatements removeFirst.
- 						meth renameLabelsForInliningInto: self.
- 						meth labels do: [ :label | labels add: label ].
- 						newStatements := stmtNode statements asOrderedCollection.
- 						newStatements removeFirst.
  
+ 							exitLabel ~= nil ifTrue: [
+ 								newStatements addFirst:
+ 									(TLabeledCommentNode new
+ 										setLabel: exitLabel comment: 'end case').
+ 							].
+ 
+ 							newStatements addFirst: meth asInlineNode.
- 						exitLabel ~= nil ifTrue: [
  							newStatements addFirst:
+ 								(TLabeledCommentNode new setComment: meth selector).
+ 							stmtNode setStatements: newStatements.
- 								(TLabeledCommentNode new
- 									setLabel: exitLabel comment: 'end case').
  						].
- 
- 						newStatements addFirst: meth asInlineNode.
- 						newStatements addFirst:
- 							(TLabeledCommentNode new setComment: meth selector).
- 						stmtNode setStatements: newStatements.
  					].
  				].
  			].
  		].
  	].
  	usedVars := (locals, args) asSet.
  	1 to: maxTemp do: [ :i |
  		v := ('t', i printString).
  		(usedVars includes: v) ifTrue: [ self error: 'temp variable name conflicts with an existing local or arg' ].
  		locals addLast: v.
  	].
  
  	"make local versions of the given globals"
  	varsList do: [ :var |
  		(usedVars includes: var) ifFalse: [ locals addFirst: var asString ].
+ 	].!
- 	].
- !

Item was changed:
  ----- Method: ThreadedFFIPlugin class>>preambleCCode (in category 'translation') -----
  preambleCCode
  	"For a source of builtin defines grep for builtin_define in a gcc release config directory."
  	^'
  #include "sqAssert.h" /* for assert */
  
  #ifdef _MSC_VER
  # define alloca _alloca
  #endif
  #if defined(__GNUC__) && (defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__))
  # define setsp(sp) asm volatile ("movl %0,%%esp" : : "m"(sp))
  # define getsp() ({ void *esp; asm volatile ("movl %%esp,%0" : "=r"(esp) : ); esp;})
  #endif
  #if !!defined(getsp)
  # define getsp() 0
  #endif 
  #if !!defined(setsp)
  # define setsp(ignored) 0
  #endif 
  
  #if !!defined(STACK_ALIGN_BYTES)
  # if __APPLE__ && __MACH__ && __i386__
  #  define STACK_ALIGN_BYTES 16
  # elif __linux__ && __i386__
  #  define STACK_ALIGN_BYTES 16
  # elif defined(__amd64__) || defined(__x86_64__) ||  defined(__amd64) || defined(__x86_64)
  #  define STACK_ALIGN_BYTES 16
  # elif defined(powerpc) || defined(__powerpc__) || defined(_POWER) || defined(__POWERPC__) || defined(__PPC__)
  #  define STACK_ALIGN_BYTES 16
  # elif defined(__sparc64__) || defined(__sparcv9__) || defined(__sparc_v9__) /* must preceed 32-bit sparc defs */
  #  define STACK_ALIGN_BYTES 16
  # elif defined(sparc) || defined(__sparc__) || defined(__sparclite__)
  #  define STACK_ALIGN_BYTES 8
  # else
  #  define STACK_ALIGN_BYTES 0
  # endif
  #endif /* !!defined(STACK_ALIGN_BYTES) */
  
  #if !!defined(STACK_OFFSET_BYTES)
  # define STACK_OFFSET_BYTES 0
  #endif
  
  #if defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__)
  /* Both Mac OS X x86 and Win32 x86 return structs of a power of two in size
   * less than or equal to eight bytes in length in registers. Linux never does so.
   */
  # if __linux__
  #	define WIN32_X86_STRUCT_RETURN 0
  # else
  #	define WIN32_X86_STRUCT_RETURN 1
  # endif
  # if WIN32
  #	define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 1
  # else
  #	define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 0
  # endif
+ #endif /* defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__) */
+ 
+ #if !!defined(ALLOCA_LIES_SO_USE_GETSP)
  # if defined(__MINGW32__) && (__GNUC__ >= 3)
      /*
       * cygwin -mno-cygwin (MinGW) gcc 3.4.x''s alloca is a library routine that answers
       * %esp + 4, so the outgoing stack is offset by one word if uncorrected.
       * Grab the actual stack pointer to correct.
       */
  #	define ALLOCA_LIES_SO_USE_GETSP 1
+ # else
+ #	define ALLOCA_LIES_SO_USE_GETSP 0
  # endif
+ #endif /* !!defined(ALLOCA_LIES_SO_USE_GETSP) */
- #endif /* defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__) */
  
- #if !!defined(ALLOCA_LIES_SO_USE_GETSP)
- # define ALLOCA_LIES_SO_USE_GETSP 0
- #endif
- 
  /* The dispatchOn:in:with:with: generates an unwanted call on error.  Just squash it. */
  #define error(foo) 0
  
  /* but print assert failures. */
  void
  warning(char *s) { /* Print an error message but don''t exit. */
  	printf("\n%s\n", s);
  }
  '!



More information about the Vm-dev mailing list