Author: eliot Date: 2011-04-26 12:24:15 -0700 (Tue, 26 Apr 2011) New Revision: 2379 Removed: branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h Modified: branches/Cog/image/VMMaker-Squeak4.1.changes branches/Cog/image/VMMaker-Squeak4.1.image branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c branches/Cog/platforms/unix/vm/sqUnixVMProfile.c branches/Cog/src/vm/cointerp.c branches/Cog/src/vm/cointerp.h branches/Cog/src/vm/gcc3x-cointerp.c Log: OSCogVM as per VMMaker.oscog-eem.55. Implement shallowCopy (primitiveClone) and copyFrom: (primitiveCopyObject) correctly for contexts. Change package name to correct Monticello branch convention. Use trunk linux LocalePlugin source. Modified: branches/Cog/image/VMMaker-Squeak4.1.changes =================================================================== --- branches/Cog/image/VMMaker-Squeak4.1.changes 2011-04-01 20:00:15 UTC (rev 2378) +++ branches/Cog/image/VMMaker-Squeak4.1.changes 2011-04-26 19:24:15 UTC (rev 2379) @@ -178019,4 +178019,224 @@ FFIPlugin ReentrantARMFFIPlugin ReentrantFFIPlugin ReentrantPPCBEFFIPlugin NewsqueakIA32ABIPlugin NewsqueakIA32ABIPluginAttic)! -----QUIT----{1 April 2011 . 12:31:53 pm} VMMaker-Squeak4.1.image priorSource: 7347139! \ No newline at end of file +----QUIT----{1 April 2011 . 12:31:53 pm} VMMaker-Squeak4.1.image priorSource: 7347139! + +----STARTUP----{26 April 2011 . 11:37:37 am} as /Users/eliot/Cog/oscogvm/image/VMMaker-Squeak4.1.image! + + +InterpreterPrimitives removeSelector: #primitiveContextAt! + +InterpreterPrimitives removeSelector: #primitiveContextAtPut! + +InterpreterPrimitives removeSelector: #primitiveContextSize! +!InterpreterPrimitives methodsFor: 'object access primitives' stamp: 'eem 4/25/2011 17:02' prior: 36472637! +primitiveCopyObject + "Primitive. Copy the state of the receiver from the argument. + Fail if receiver and argument are of a different class. + Fail if the receiver or argument are non-pointer objects. + Fail if receiver and argument have different lengths (for indexable objects). + " + | rcvr arg length | + self methodArgumentCount = 1 ifFalse: + [^self primitiveFail]. + arg := self stackObjectValue: 0. + rcvr := self stackObjectValue: 1. + + self failed ifTrue:[^nil]. + (objectMemory isPointers: rcvr) ifFalse: + [^self primitiveFail]. + (objectMemory fetchClassOfNonInt: rcvr) = (objectMemory fetchClassOfNonInt: arg) ifFalse: + [^self primitiveFail]. + length := objectMemory lengthOf: rcvr. + length = (objectMemory lengthOf: arg) ifFalse: + [^self primitiveFail]. + + "Now copy the elements" + 0 to: length-1 do:[:i| + objectMemory storePointer: i ofObject: rcvr withValue: (objectMemory fetchPointer: i ofObject: arg)]. + + "Note: The above could be faster for young receivers but I don't think it'll matter" + self pop: 1. "pop arg; answer receiver" +! ! +!StackInterpreter class methodsFor: 'translation' stamp: 'eem 4/25/2011 19:08'! +prepareToBeAddedToCodeGenerator: aCodeGen + "Override to delete InterpreterPrimitives methods we override." + aCodeGen removeVariable: 'cogit'. + self selectors do: + [:sel| + (superclass whichClassIncludesSelector: sel) ifNotNil: + [aCodeGen removeMethodForSelector: sel]]! ! +!StackInterpreterPrimitives methodsFor: 'primitive support' stamp: 'eem 4/26/2011 10:10'! +cloneContext: aContext + | cloned spouseFP sp | + <var: #spouseFP type: #'char *'> + cloned := objectMemory clone: aContext. + cloned ~= 0 ifTrue: + [0 to: StackPointerIndex do: + [:i| + objectMemory + storePointerUnchecked: i + ofObject: cloned + withValue: (self externalInstVar: i ofContext: aContext)]. + MethodIndex to: ReceiverIndex do: + [:i| + objectMemory + storePointerUnchecked: i + ofObject: cloned + withValue: (self fetchPointer: i ofObject: aContext)]. + (self isStillMarriedContext: aContext) + ifTrue: + [spouseFP := self frameOfMarriedContext: aContext. + sp := (self stackPointerIndexForFrame: spouseFP) - 1. + 0 to: sp do: + [:i| + objectMemory + storePointerUnchecked: i + CtxtTempFrameStart + ofObject: cloned + withValue: (self temporary: i in: spouseFP)]] + ifFalse: + [sp := (self fetchStackPointerOf: aContext) - 1. + 0 to: sp do: + [:i| + objectMemory + storePointerUnchecked: i + CtxtTempFrameStart + ofObject: cloned + withValue: (self fetchPointer: i ofObject: aContext)]]. + sp + CtxtTempFrameStart + 1 to: (objectMemory lengthOf: aContext) - 1 do: + [:i| + objectMemory + storePointerUnchecked: i + ofObject: cloned + withValue: objectMemory nilObject]]. + ^cloned! ! +!StackInterpreterPrimitives methodsFor: 'object access primitives' stamp: 'eem 4/25/2011 17:30'! +primitiveClone + "Return a shallow copy of the receiver. + Special-case non-single contexts (because of context-to-stack mapping). + Can't fail for contexts cuz of image context instantiation code (sigh)." + + | receiver newCopy | + receiver := self stackTop. + (objectMemory isIntegerObject: receiver) + ifTrue: + [newCopy := receiver] + ifFalse: + [(self isContextNonInt: receiver) + ifTrue: + [newCopy := self cloneContext: receiver] + ifFalse: + [newCopy := objectMemory clone: receiver]. + newCopy = 0 ifTrue: + [^self primitiveFailFor: PrimErrNoMemory]]. + self pop: 1 thenPush: newCopy! ! +!StackInterpreterPrimitives methodsFor: 'indexing primitives' stamp: 'eem 6/9/2010 19:16'! +primitiveContextAt + | index value aContext spouseFP hdr fmt totalLength fixedFields stSize | + <var: #spouseFP type: #'char *'> + index := self stackTop. + (objectMemory isIntegerObject: index) ifFalse: + [^self primitiveFail]. + index := objectMemory integerValueOf: index. + aContext := self stackValue: 1. + "Duplicating much of stObject:at:put: here allows stObject:at:put: to omit tests for contexts." + hdr := objectMemory baseHeader: aContext. + (objectMemory isContextHeader: hdr) ifFalse: "might be an instance of a subclass" + [value := self stObject: aContext at: index. + ^self pop: 2 thenPush: value]. + self externalWriteBackHeadFramePointers. + (self isStillMarriedContext: aContext) ifFalse: + [fmt := objectMemory formatOfHeader: hdr. + totalLength := objectMemory lengthOf: aContext baseHeader: hdr format: fmt. + fixedFields := objectMemory fixedFieldsOf: aContext format: fmt length: totalLength. + stSize := self stackPointerForMaybeMarriedContext: aContext. + (index between: 1 and: stSize) ifFalse: + [^self primitiveFail]. + value := self subscript: aContext with: (index + fixedFields) format: fmt. + ^self pop: 2 thenPush: value]. + spouseFP := self frameOfMarriedContext: aContext. + (index between: 1 and: (self stackPointerIndexForFrame: spouseFP)) ifFalse: + [^self primitiveFail]. + value := self temporary: index - 1 in: spouseFP. + self pop: 2 thenPush: value! ! +!StackInterpreterPrimitives methodsFor: 'indexing primitives' stamp: 'eem 6/9/2010 19:16'! +primitiveContextAtPut + | index value aContext spouseFP hdr fmt totalLength fixedFields stSize | + <var: #spouseFP type: #'char *'> + value := self stackTop. + index := self stackValue: 1. + aContext := self stackValue: 2. + (objectMemory isIntegerObject: index) ifFalse: + [^self primitiveFail]. + "Duplicating much of stObject:at:put: here allows stObject:at:put: to omit tests for contexts." + hdr := objectMemory baseHeader: aContext. + index := objectMemory integerValueOf: index. + (objectMemory isContextHeader: hdr) ifFalse: "might be an instance of a subclass" + [self stObject: aContext at: index put: value. + ^self pop: 3 thenPush: value]. + self externalWriteBackHeadFramePointers. + (self isStillMarriedContext: aContext) ifFalse: + [fmt := objectMemory formatOfHeader: hdr. + totalLength := objectMemory lengthOf: aContext baseHeader: hdr format: fmt. + fixedFields := objectMemory fixedFieldsOf: aContext format: fmt length: totalLength. + stSize := self stackPointerForMaybeMarriedContext: aContext. + (index between: 1 and: stSize) ifFalse: + [^self primitiveFail]. + self subscript: aContext with: (index + fixedFields) storing: value format: fmt. + ^self pop: 3 thenPush: value]. + spouseFP := self frameOfMarriedContext: aContext. + (index between: 1 and: (self stackPointerIndexForFrame: spouseFP)) ifFalse: + [^self primitiveFail]. + self temporary: index - 1 in: spouseFP put: value. + ^self pop: 3 thenPush: value! ! +!StackInterpreterPrimitives methodsFor: 'indexing primitives' stamp: 'eem 6/9/2010 19:16'! +primitiveContextSize + | rcvr sz hdr fmt totalLength fixedFields | + rcvr := self stackTop. + hdr := objectMemory baseHeader: rcvr. + fmt := objectMemory formatOfHeader: hdr. + totalLength := objectMemory lengthOf: rcvr baseHeader: hdr format: fmt. + fixedFields := objectMemory fixedFieldsOf: rcvr format: fmt length: totalLength. + (objectMemory isContextHeader: hdr) + ifTrue: + [self externalWriteBackHeadFramePointers. + sz := self stackPointerForMaybeMarriedContext: rcvr] + ifFalse: [sz := totalLength - fixedFields]. + self successful ifTrue: + [self pop: 1 thenPush: (objectMemory integerObjectOf: sz)]! ! +!StackInterpreterPrimitives methodsFor: 'object access primitives' stamp: 'eem 4/25/2011 17:04'! +primitiveCopyObject + "Primitive. Copy the state of the receiver from the argument. + Fail if receiver and argument are of a different class. + Fail if the receiver or argument are non-pointer objects. + Fail if the receiver or argument are contexts (because of context-to-stack mapping). + Fail if receiver and argument have different lengths (for indexable objects). + " + | rcvr arg length | + self methodArgumentCount = 1 ifFalse: + [^self primitiveFail]. + arg := self stackObjectValue: 0. + rcvr := self stackObjectValue: 1. + + self failed ifTrue:[^nil]. + (objectMemory isPointers: rcvr) ifFalse: + [^self primitiveFail]. + ((self isContextNonInt: rcvr) + or: [self isContextNonInt: arg]) ifTrue: + [^self primitiveFail]. + (objectMemory fetchClassOfNonInt: rcvr) = (objectMemory fetchClassOfNonInt: arg) ifFalse: + [^self primitiveFail]. + length := objectMemory lengthOf: rcvr. + length = (objectMemory lengthOf: arg) ifFalse: + [^self primitiveFail]. + + "Now copy the elements" + 0 to: length-1 do:[:i| + objectMemory storePointer: i ofObject: rcvr withValue: (objectMemory fetchPointer: i ofObject: arg)]. + + "Note: The above could be faster for young receivers but I don't think it'll matter" + self pop: 1. "pop arg; answer receiver" +! ! + +"VMMaker"! + +----QUIT----{26 April 2011 . 12:13:26 pm} VMMaker-Squeak4.1.image priorSource: 7348282! \ No newline at end of file Modified: branches/Cog/image/VMMaker-Squeak4.1.image =================================================================== (Binary files differ) Modified: branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c =================================================================== --- branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c 2011-04-01 20:00:15 UTC (rev 2378) +++ branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.c 2011-04-26 19:24:15 UTC (rev 2379) @@ -1,137 +1,751 @@ -/* - * sqUnixLocale.c - * SqueakLocale stubs for Unix, so we can have the timezone. +/* sqUnixLocale.c -- support for POSIX locales + * + * Copyright (C) 1996-2005 by Ian Piumarta and other authors/contributors + * listed elsewhere in this file. + * All rights reserved. + * + * This file is part of Unix Squeak. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ -#include "sqUnixLocale.h" +/* Author: [hidden email] + * + * Last edited: 2008-11-10 13:25:18 by piumarta on ubuntu.piumarta.com + */ -sqInt sqLocInitialize(void) { - return 1; +#include "sq.h" +#include "LocalePlugin.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <sys/time.h> +#include <locale.h> +#include <langinfo.h> + + +#define CODELEN 2 /* 2 for ISO two-letter codes, 3 for UN three-letter codes */ + + +#define DEFAULT_LOCALE "en_US.ISO8859-1" + +#if (CODELEN == 2) +# define DEFAULT_COUNTRY "US" +# define DEFAULT_LANGUAGE "en" +#elif (CODELEN == 3) +# define DEFAULT_COUNTRY "USA" +# define DEFAULT_LANGUAGE "eng" +#else +# error -- CODELEN must be 2 or 3 +#endif + + +static const char *localeString= 0; +static struct lconv *localeConv= 0; + + +/*** SUNDRY STUPIDITY ***/ + + +#if (CODELEN == 3) + +static struct CountryCode +{ + const char *iso, *un; } +countryCodes[] = { + /* ISO UN COUNTRY */ + { "AD", "AND" }, /* Andorra */ + { "AE", "ARE" }, /* United Arab Emirates */ + { "AF", "AFG" }, /* Afghanistan */ + { "AG", "ATG" }, /* Antigua and Barbuda */ + { "AI", "AIA" }, /* Anguilla */ + { "AL", "ALB" }, /* Albania */ + { "AM", "ARM" }, /* Armenia */ + { "AN", "ANT" }, /* Netherlands Antilles */ + { "AO", "AGO" }, /* Angola */ + { "AQ", "ATA" }, /* Antarctica */ + { "AR", "ARG" }, /* Argentina */ + { "AS", "ASM" }, /* American Samoa */ + { "AT", "AUT" }, /* Austria */ + { "AU", "AUS" }, /* Australia */ + { "AW", "ABW" }, /* Aruba */ + { "AX", "ALA" }, /* Aland Islands */ + { "AZ", "AZE" }, /* Azerbaijan */ + { "BA", "BIH" }, /* Bosnia and Herzegovina */ + { "BB", "BRB" }, /* Barbados */ + { "BD", "BGD" }, /* Bangladesh */ + { "BE", "BEL" }, /* Belgium */ + { "BF", "BFA" }, /* Burkina Faso */ + { "BG", "BGR" }, /* Bulgaria */ + { "BH", "BHR" }, /* Bahrain */ + { "BI", "BDI" }, /* Burundi */ + { "BJ", "BEN" }, /* Benin */ + { "BM", "BMU" }, /* Bermuda */ + { "BN", "BRN" }, /* Brunei Darussalam */ + { "BO", "BOL" }, /* Bolivia */ + { "BR", "BRA" }, /* Brazil */ + { "BS", "BHS" }, /* Bahamas */ + { "BT", "BTN" }, /* Bhutan */ + { "BV", "BVT" }, /* Bouvet Island */ + { "BW", "BWA" }, /* Botswana */ + { "BY", "BLR" }, /* Belarus */ + { "BZ", "BLZ" }, /* Belize */ + { "CA", "CAN" }, /* Canada */ + { "CC", "CCK" }, /* Cocos (Keeling) Islands */ + { "CD", "COD" }, /* Congo, Democratic Republic of the */ + { "CF", "CAF" }, /* Central African Republic */ + { "CG", "COG" }, /* Congo, Republic of the */ + { "CH", "CHE" }, /* Switzerland */ + { "CI", "CIV" }, /* Cote D'Ivoire */ + { "CK", "COK" }, /* Cook Islands */ + { "CL", "CHL" }, /* Chile */ + { "CM", "CMR" }, /* Cameroon */ + { "CN", "CHN" }, /* China */ + { "CO", "COL" }, /* Colombia */ + { "CR", "CRI" }, /* Costa Rica */ + { "CS", "SCG" }, /* Serbia and Montenegro */ + { "CU", "CUB" }, /* Cuba */ + { "CV", "CPV" }, /* Cape Verde */ + { "CX", "CXR" }, /* Christmas Island */ + { "CY", "CYP" }, /* Cyprus */ + { "CZ", "CZE" }, /* Czech Republic */ + { "DE", "DEU" }, /* Germany */ + { "DJ", "DJI" }, /* Djibouti */ + { "DK", "DNK" }, /* Denmark */ + { "DM", "DMA" }, /* Dominica */ + { "DO", "DOM" }, /* Dominican Republic */ + { "DZ", "DZA" }, /* Algeria */ + { "EC", "ECU" }, /* Ecuador */ + { "EE", "EST" }, /* Estonia */ + { "EG", "EGY" }, /* Egypt */ + { "EH", "ESH" }, /* Western Sahara */ + { "ER", "ERI" }, /* Eritrea */ + { "ES", "ESP" }, /* Spain */ + { "ET", "ETH" }, /* Ethiopia */ + { "FI", "FIN" }, /* Finland */ + { "FJ", "FJI" }, /* Fiji */ + { "FK", "FLK" }, /* Falkland Islands (Islas Malvinas) */ + { "FM", "FSM" }, /* Micronesia, Federated States of */ + { "FO", "FRO" }, /* Faroe Islands */ + { "FR", "FRA" }, /* France */ + { "FX", "FXX" }, /* France, Metropolitan */ + { "GA", "GAB" }, /* Gabon */ + { "GB", "GBR" }, /* United Kingdom */ + { "GD", "GRD" }, /* Grenada */ + { "GE", "GEO" }, /* Georgia */ + { "GF", "GUF" }, /* French Guiana */ + { "GH", "GHA" }, /* Ghana */ + { "GI", "GIB" }, /* Gibraltar */ + { "GL", "GRL" }, /* Greenland */ + { "GM", "GMB" }, /* Gambia */ + { "GN", "GIN" }, /* Guinea */ + { "GP", "GLP" }, /* Guadeloupe */ + { "GQ", "GNQ" }, /* Equatorial Guinea */ + { "GR", "GRC" }, /* Greece */ + { "GS", "SGS" }, /* South Georgia and the South Sandwich Islands */ + { "GT", "GTM" }, /* Guatemala */ + { "GU", "GUM" }, /* Guam */ + { "GW", "GNB" }, /* Guinea-Bissau */ + { "GY", "GUY" }, /* Guyana */ + { "HK", "HKG" }, /* Hong Kong */ + { "HM", "HMD" }, /* Heard Island and McDonald Islands */ + { "HN", "HND" }, /* Honduras */ + { "HR", "HRV" }, /* Croatia */ + { "HT", "HTI" }, /* Haiti */ + { "HU", "HUN" }, /* Hungary */ + { "ID", "IDN" }, /* Indonesia */ + { "IE", "IRL" }, /* Ireland */ + { "IL", "ISR" }, /* Israel */ + { "IN", "IND" }, /* India */ + { "IO", "IOT" }, /* British Indian Ocean Territory */ + { "IQ", "IRQ" }, /* Iraq */ + { "IR", "IRN" }, /* Iran */ + { "IS", "ISL" }, /* Iceland */ + { "IT", "ITA" }, /* Italy */ + { "JM", "JAM" }, /* Jamaica */ + { "JO", "JOR" }, /* Jordan */ + { "JP", "JPN" }, /* Japan */ + { "KE", "KEN" }, /* Kenya */ + { "KG", "KGZ" }, /* Kyrgyzstan */ + { "KH", "KHM" }, /* Cambodia */ + { "KI", "KIR" }, /* Kiribati */ + { "KM", "COM" }, /* Comoros */ + { "KN", "KNA" }, /* Saint Kitts and Nevis */ + { "KP", "PRK" }, /* North Korea */ + { "KR", "KOR" }, /* South Korea */ + { "KW", "KWT" }, /* Kuwait */ + { "KY", "CYM" }, /* Cayman Islands */ + { "KZ", "KAZ" }, /* Kazakstan */ + { "LA", "LAO" }, /* Lao People's Democratic Republic */ + { "LB", "LBN" }, /* Lebanon */ + { "LC", "LCA" }, /* Saint Lucia */ + { "LI", "LIE" }, /* Liechtenstein */ + { "LK", "LKA" }, /* Sri Lanka */ + { "LR", "LBR" }, /* Liberia */ + { "LS", "LSO" }, /* Lesotho */ + { "LT", "LTU" }, /* Lithuania */ + { "LU", "LUX" }, /* Luxembourg */ + { "LV", "LVA" }, /* Latvia */ + { "LY", "LBY" }, /* Libya */ + { "MA", "MAR" }, /* Morocco */ + { "MC", "MCO" }, /* Monaco */ + { "MD", "MDA" }, /* Moldova */ + { "MG", "MDG" }, /* Madagascar */ + { "MH", "MHL" }, /* Marshall Islands */ + { "MK", "MKD" }, /* Macedonia */ + { "ML", "MLI" }, /* Mali */ + { "MM", "MMR" }, /* Burma */ + { "MN", "MNG" }, /* Mongolia */ + { "MO", "MAC" }, /* Macau */ + { "MP", "MNP" }, /* Northern Mariana Islands */ + { "MQ", "MTQ" }, /* Martinique */ + { "MR", "MRT" }, /* Mauritania */ + { "MS", "MSR" }, /* Montserrat */ + { "MT", "MLT" }, /* Malta */ + { "MU", "MUS" }, /* Mauritius */ + { "MV", "MDV" }, /* Maldives */ + { "MW", "MWI" }, /* Malawi */ + { "MX", "MEX" }, /* Mexico */ + { "MY", "MYS" }, /* Malaysia */ + { "MZ", "MOZ" }, /* Mozambique */ + { "NA", "NAM" }, /* Namibia */ + { "NC", "NCL" }, /* New Caledonia */ + { "NE", "NER" }, /* Niger */ + { "NF", "NFK" }, /* Norfolk Island */ + { "NG", "NGA" }, /* Nigeria */ + { "NI", "NIC" }, /* Nicaragua */ + { "NL", "NLD" }, /* Netherlands */ + { "NO", "NOR" }, /* Norway */ + { "NP", "NPL" }, /* Nepal */ + { "NR", "NRU" }, /* Nauru */ + { "NU", "NIU" }, /* Niue */ + { "NZ", "NZL" }, /* New Zealand */ + { "OM", "OMN" }, /* Oman */ + { "PA", "PAN" }, /* Panama */ + { "PE", "PER" }, /* Peru */ + { "PF", "PYF" }, /* French Polynesia */ + { "PG", "PNG" }, /* Papua New Guinea */ + { "PH", "PHL" }, /* Philippines */ + { "PK", "PAK" }, /* Pakistan */ + { "PL", "POL" }, /* Poland */ + { "PM", "SPM" }, /* Saint Pierre and Miquelon */ + { "PN", "PCN" }, /* Pitcairn Island */ + { "PR", "PRI" }, /* Puerto Rico */ + { "PS", "PSE" }, /* Palestinian Territory, Occupied */ + { "PT", "PRT" }, /* Portugal */ + { "PW", "PLW" }, /* Palau */ + { "PY", "PRY" }, /* Paraguay */ + { "QA", "QAT" }, /* Qatar */ + { "RE", "REU" }, /* Reunion */ + { "RO", "ROU" }, /* Romania */ + { "RU", "RUS" }, /* Russia */ + { "RW", "RWA" }, /* Rwanda */ + { "SA", "SAU" }, /* Saudi Arabia */ + { "SB", "SLB" }, /* Solomon Islands */ + { "SC", "SYC" }, /* Seychelles */ + { "SD", "SDN" }, /* Sudan */ + { "SE", "SWE" }, /* Sweden */ + { "SG", "SGP" }, /* Singapore */ + { "SH", "SHN" }, /* Saint Helena */ + { "SI", "SVN" }, /* Slovenia */ + { "SJ", "SJM" }, /* Svalbard */ + { "SK", "SVK" }, /* Slovakia */ + { "SL", "SLE" }, /* Sierra Leone */ + { "SM", "SMR" }, /* San Marino */ + { "SN", "SEN" }, /* Senegal */ + { "SO", "SOM" }, /* Somalia */ + { "SR", "SUR" }, /* Suriname */ + { "ST", "STP" }, /* Sao Tome and Principe */ + { "SV", "SLV" }, /* El Salvador */ + { "SY", "SYR" }, /* Syria */ + { "SZ", "SWZ" }, /* Swaziland */ + { "TC", "TCA" }, /* Turks and Caicos Islands */ + { "TD", "TCD" }, /* Chad */ + { "TF", "ATF" }, /* French Southern and Antarctic Lands */ + { "TG", "TGO" }, /* Togo */ + { "TH", "THA" }, /* Thailand */ + { "TJ", "TJK" }, /* Tajikistan */ + { "TK", "TKL" }, /* Tokelau */ + { "TM", "TKM" }, /* Turkmenistan */ + { "TN", "TUN" }, /* Tunisia */ + { "TO", "TON" }, /* Tonga */ + { "TL", "TLS" }, /* East Timor */ + { "TR", "TUR" }, /* Turkey */ + { "TT", "TTO" }, /* Trinidad and Tobago */ + { "TV", "TUV" }, /* Tuvalu */ + { "TW", "TWN" }, /* Taiwan */ + { "TZ", "TZA" }, /* Tanzania */ + { "UA", "UKR" }, /* Ukraine */ + { "UG", "UGA" }, /* Uganda */ + { "UM", "UMI" }, /* United States Minor Outlying Islands */ + { "US", "USA" }, /* United States of America */ + { "UY", "URY" }, /* Uruguay */ + { "UZ", "UZB" }, /* Uzbekistan */ + { "VA", "VAT" }, /* Holy See (Vatican City) */ + { "VC", "VCT" }, /* Saint Vincent and the Grenadines */ + { "VE", "VEN" }, /* Venezuela */ + { "VG", "VGB" }, /* British Virgin Islands */ + { "VI", "VIR" }, /* Virgin Islands, U.S. */ + { "VN", "VNM" }, /* Vietnam */ + { "VU", "VUT" }, /* Vanuatu */ + { "WF", "WLF" }, /* Wallis and Futuna */ + { "WS", "WSM" }, /* Samoa */ + { "YE", "YEM" }, /* Yemen */ + { "YT", "MYT" }, /* Mayotte */ + { "ZA", "ZAF" }, /* South Africa */ + { "ZM", "ZMB" }, /* Zambia */ + { "ZW", "ZWE" }, /* Zimbabwe */ + { 0, 0 } +}; -/************** Country and language ******************/ +static struct LanguageCode +{ + const char *iso, *un; +} +languageCodes[] = { + /* ISO UN LANGUAGE */ + { "ab", "abk" }, /* Abkhazian */ + { "aa", "aar" }, /* Afar */ + { "af", "afr" }, /* Afrikaans */ + { "sq", "alb" }, /* Albanian */ + { "sq", "sqi" }, /* Albanian */ + { "am", "amh" }, /* Amharic */ + { "ar", "ara" }, /* Arabic */ + { "hy", "arm" }, /* Armenian */ + { "hy", "hye" }, /* Armenian */ + { "as", "asm" }, /* Assamese */ + { "ay", "aym" }, /* Aymara */ + { "az", "aze" }, /* Azerbaijani */ + { "ba", "bak" }, /* Bashkir */ + { "eu", "baq" }, /* Basque */ + { "eu", "eus" }, /* Basque */ + { "bn", "ben" }, /* Bengali */ + { "bh", "bih" }, /* Bihari */ + { "bi", "bis" }, /* Bislama */ + { "be", "bre" }, /* Breton */ + { "bg", "bul" }, /* Bulgarian */ + { "my", "bur" }, /* Burmese */ + { "my", "mya" }, /* Burmese */ + { "be", "bel" }, /* Byelorussian */ + { "ca", "cat" }, /* Catalan */ + { "zh", "chi" }, /* Chinese */ + { "zh", "zho" }, /* Chinese */ + { "co", "cos" }, /* Corsican */ + { "cs", "ces" }, /* Czech */ + { "cs", "cze" }, /* Czech */ + { "da", "dan" }, /* Danish */ + { "nl", "dut" }, /* Dutch */ + { "nl", "nla" }, /* Dutch */ + { "dz", "dzo" }, /* Dzongkha */ + { "en", "eng" }, /* English */ + { "eo", "epo" }, /* Esperanto */ + { "et", "est" }, /* Estonian */ + { "fo", "fao" }, /* Faroese */ + { "fj", "fij" }, /* Fijian */ + { "fi", "fin" }, /* Finnish */ + { "fr", "fra" }, /* French */ + { "fr", "fre" }, /* French */ + { "fy", "fry" }, /* Frisian */ + { "gl", "glg" }, /* Gallegan */ + { "ka", "geo" }, /* Georgian */ + { "ka", "kat" }, /* Georgian */ + { "de", "deu" }, /* German */ + { "de", "ger" }, /* German */ + { "el", "ell" }, /* Greek, Modern (1453-) */ + { "el", "gre" }, /* Greek, Modern (1453-) */ + { "kl", "kal" }, /* Greenlandic */ + { "gn", "grn" }, /* Guarani */ + { "gu", "guj" }, /* Gujarati */ + { "ha", "hau" }, /* Hausa */ + { "he", "heb" }, /* Hebrew */ + { "hi", "hin" }, /* Hindi */ + { "hu", "hun" }, /* Hungarian */ + { "is", "ice" }, /* Icelandic */ + { "is", "isl" }, /* Icelandic */ + { "id", "ind" }, /* Indonesian */ + { "ia", "ina" }, /* Interlingua (International Auxiliary language Association) */ + { "iu", "iku" }, /* Inuktitut */ + { "ik", "ipk" }, /* Inupiak */ + { "ga", "gai" }, /* Irish */ + { "ga", "iri" }, /* Irish */ + { "it", "ita" }, /* Italian */ + { "ja", "jpn" }, /* Japanese */ + { "jv", "jav" }, /* Javanese */ + { "jw", "jaw" }, /* Javanese */ + { "kn", "kan" }, /* Kannada */ + { "ks", "kas" }, /* Kashmiri */ + { "kk", "kaz" }, /* Kazakh */ + { "km", "khm" }, /* Khmer */ + { "rw", "kin" }, /* Kinyarwanda */ + { "ky", "kir" }, /* Kirghiz */ + { "ko", "kor" }, /* Korean */ + { "ku", "kur" }, /* Kurdish */ + { "oc", "oci" }, /* Langue d'Oc (post 1500) */ + { "lo", "lao" }, /* Lao */ + { "la", "lat" }, /* Latin */ + { "lv", "lav" }, /* Latvian */ + { "ln", "lin" }, /* Lingala */ + { "lt", "lit" }, /* Lithuanian */ + { "mk", "mac" }, /* Macedonian */ + { "mk", "mak" }, /* Macedonian */ + { "mg", "mlg" }, /* Malagasy */ + { "ms", "may" }, /* Malay */ + { "ms", "msa" }, /* Malay */ + { "ml", "mlt" }, /* Maltese */ + { "mi", "mao" }, /* Maori */ + { "mi", "mri" }, /* Maori */ + { "mr", "mar" }, /* Marathi */ + { "mo", "mol" }, /* Moldavian */ + { "mn", "mon" }, /* Mongolian */ + { "na", "nau" }, /* Nauru */ + { "ne", "nep" }, /* Nepali */ + { "no", "nor" }, /* Norwegian */ + { "or", "ori" }, /* Oriya */ + { "om", "orm" }, /* Oromo */ + { "pa", "pan" }, /* Panjabi */ + { "fa", "fas" }, /* Persian */ + { "fa", "per" }, /* Persian */ + { "pl", "pol" }, /* Polish */ + { "pt", "por" }, /* Portuguese */ + { "ps", "pus" }, /* Pushto */ + { "qu", "que" }, /* Quechua */ + { "rm", "roh" }, /* Rhaeto-Romance */ + { "ro", "ron" }, /* Romanian */ + { "ro", "rum" }, /* Romanian */ + { "rn", "run" }, /* Rundi */ + { "ru", "rus" }, /* Russian */ + { "sm", "smo" }, /* Samoan */ + { "sg", "sag" }, /* Sango */ + { "sa", "san" }, /* Sanskrit */ + { "sh", "scr" }, /* Serbo-Croatian */ + { "sn", "sna" }, /* Shona */ + { "sd", "snd" }, /* Sindhi */ + { "si", "sin" }, /* Singhalese */ + { "ss", "ssw" }, /* Siswant */ + { "sk", "slk" }, /* Slovak */ + { "sk", "slo" }, /* Slovak */ + { "sl", "slv" }, /* Slovenian */ + { "so", "som" }, /* Somali */ + { "st", "sot" }, /* Sotho, Southern */ + { "es", "esl" }, /* Spanish */ + { "es", "spa" }, /* Spanish */ + { "su", "sun" }, /* Sudanese */ + { "sw", "swa" }, /* Swahili */ + { "sv", "sve" }, /* Swedish */ + { "sv", "swe" }, /* Swedish */ + { "tl", "tgl" }, /* Tagalog */ + { "tg", "tgk" }, /* Tajik */ + { "ta", "tam" }, /* Tamil */ + { "tt", "tat" }, /* Tatar */ + { "te", "tel" }, /* Telugu */ + { "th", "tha" }, /* Thai */ + { "bo", "bod" }, /* Tibetan */ + { "bo", "tib" }, /* Tibetan */ + { "ti", "tir" }, /* Tigrinya */ + { "to", "tog" }, /* Tonga (Nyasa) */ + { "ts", "tso" }, /* Tsonga */ + { "tn", "tsn" }, /* Tswana */ + { "tr", "tur" }, /* Turkish */ + { "tk", "tuk" }, /* Turkmen */ + { "tw", "twi" }, /* Twi */ + { "ug", "uig" }, /* Uighur */ + { "uk", "ukr" }, /* Ukrainian */ + { "ur", "urd" }, /* Urdu */ + { "uz", "uzb" }, /* Uzbek */ + { "vi", "vie" }, /* Vietnamese */ + { "vo", "vol" }, /* Volap�k */ + { "cy", "cym" }, /* Welsh */ + { "cy", "wel" }, /* Welsh */ + { "wo", "wol" }, /* Wolof */ + { "xh", "xho" }, /* Xhosa */ + { "yi", "yid" }, /* Yiddish */ + { "yo", "yor" }, /* Yoruba */ + { "za", "zha" }, /* Zhuang */ + { "zu", "zul" }, /* Zulu */ + { 0, 0 } +}; + +#endif /* CODELEN == 3 */ -/* write the country code into the string ptr. ISO 3166 is the relevant source - * here; see http://www.unicode.org/onlinedat/countries.html for details. - * Using the 3 character Alpha-3 codes */ -void sqLocGetCountryInto(char * str) { - str[0]=0; - str[1]=0; - str[2]=0; + +/* Answer a canonical, sanitised locale string. + */ +static const char *getlocale(void) +{ + const char *locale= 0; + + /* Use LC_ALL or LANG or current OS locale or some suitable default, + in that order. Convert "C" and POSIX locales to the default, + along with anything else that seems malformed. */ + + if (( !(locale= getenv("LC_ALL"))) + && (!(locale= getenv("LANG"))) + && (!(locale= setlocale(LC_ALL, 0)))) + return DEFAULT_LOCALE; + else if ((!strcmp(locale, "C")) || (!strcmp(locale, "POSIX")) + || strchr(locale, ' ') || strchr(locale, '/')) + return DEFAULT_LOCALE; + + return locale; } -/* write the 3 char string describing the language in use into string ptr. - * ISO 639 is the relevant source here; - * see http://www.w3.org/WAI/ER/IG/ert/iso639.html - * for details */ -void sqLocGetLanguageInto(char * str) { - str[0]=0; - str[1]=0; - str[2]=0; + +/* Answer the 2- or 3-letter country code CC within one of: + * _CC + * _CC.PP + * ll_CC + * ll_CC.PP + */ +static const char *getCountry(void) +{ + static const char *country= 0; + + if (!country) + { + static char buf[4]= { 0, 0, 0, 0 }; + const char *l, *r; + + if ((l= strrchr(localeString, '_'))) + { + ++l; + if (!(r= strchr(l, '.'))) r= strchr(l, '\0'); +# if (CODELEN == 2) + if (r - l == 2) + { + strncpy(buf, l, 2); + country= buf; + } +# else /* CODELEN == 3 */ + if (r - l == 3) + { + strncpy(buf, l, 3); + country= buf; + } + else if (r - l == 2) + { + struct CountryCode *cc= countryCodes; + strncpy(buf, l, 2); + while ((!country) && cc->iso) + if (!strcasecmp(cc->iso, buf)) + country= cc->un; + else + ++cc; + } +# endif /* CODELEN == 3 */ + } + + if (!country) + country= DEFAULT_COUNTRY; + } + + return country; } -/***************** Currency ********************/ -/* return 1 (true) if the currency symbol is to be placed in front of the - *currency amount */ -sqInt sqLocCurrencyNotation(void) { - return 1; +/* Answer the 2- or 3-letter language code ll within one of: + * ll + * ll.PP + * ll_CC + * ll_CC.PP + */ +static const char *getLanguage(void) +{ + static const char *language= 0; + + if (!language) + { + static char buf[4]= { 0, 0, 0, 0 }; + + if (isalpha(localeString[0]) && isalpha(localeString[1]) + && ((localeString[2] == '.') || (localeString[2] == '_') || !localeString[2])) + { + strncpy(buf, localeString, 2); +# if (CODELEN == 2) + language= buf; +# elif (CODELEN == 3) + { + struct LanguageCode *lc= languageCodes; + while ((!language) && lc->iso) + if (!strcasecmp(lc->iso, buf)) + language= lc->un; + else + ++lc; + } +# endif /* CODELEN == 3 */ + } + if (!language) + language= DEFAULT_LANGUAGE; + } + return language; } -/* return the length in chars of the curency symbol string */ -sqInt sqLocCurrencySymbolSize(void) { - return 1; + +/* CURRENCY */ + +/* Answer true if the currency symbol is to be placed in front of the + * currency value */ +sqInt sqLocCurrencyNotation(void) +{ + return localeConv->p_cs_precedes; } -/* write the currency symbol into the string ptr */ -void sqLocGetCurrencySymbolInto(char * str) { - strcpy(str, "$"); + +/* Store the currency symbol into the given string. + */ +void sqLocGetCurrencySymbolInto(char *str) +{ + strcpy(str, localeConv->currency_symbol); } +sqInt sqLocCurrencySymbolSize(void) +{ + return strlen(localeConv->currency_symbol); +} -/***************** Numbers and measurements **************/ -/* return true if the metric measurements system is to be used, false otherwise - * (USA is about it) */ -sqInt sqLocMeasurementMetric(void) { - return 1; + +/* NUMBERS AND MEASUREMENTS */ + + +/* Answer true if the metric measurements system is to be used. + */ +sqInt sqLocMeasurementMetric(void) +{ + return 1; } -/* write the 1 char used for digit grouping into string ptr. - * Usually this is . or , as in 1,000,000 */ -void sqLocGetDigitGroupingSymbolInto(char * str) { - strncpy(str, ",", 1); + +/* Store the seperator for thousands into the given string. + */ +void sqLocGetDigitGroupingSymbolInto(char *str) +{ + strcpy(str, localeConv->thousands_sep); } -/* write the 1 char used for decimal separation into string ptr. - * Usually this is . or , */ -void sqLocGetDecimalSymbolInto(char * str) { - strncpy(str, ".", 1); + +/* Store the decimal point into the given string. + */ +void sqLocGetDecimalSymbolInto(char *str) +{ + strcpy(str, localeConv->decimal_point); } -/****************** time and date *********************/ +/* TIME AND DATE */ -sqInt sqLocGetVMOffsetToUTC(void) { - /* return 0 for now */ - return 0; + +/* Answer the offset between local time and VM time. (Despite the + * function name, this is how it is used.) + */ +sqInt sqLocGetVMOffsetToUTC(void) +{ + return 0; } -sqInt sqLocGetTimezoneOffset(void) { +/* Answer the offset to (number of minutes EAST of) GMT. + */ +sqInt sqLocGetTimezoneOffset(void) +{ + /* Match the behaviour of convertToSqueakTime(). */ +#ifdef HAVE_TM_GMTOFF + time_t now= time(0); + return localtime(&now)->tm_gmtoff / 60; +#else +# ifdef HAVE_TIMEZONE + extern long timezone; + extern int daylight; + return daylight * 60 - timezone / 60; +# else +# error: cannot determine timezone correction +# endif +#endif +} - struct tm * timeBlock; - time_t theTime; - theTime = time((time_t)NULL); - timeBlock = localtime(&theTime); - return timeBlock->tm_gmtoff / 60; +/* Answer true if DST is in use. + */ +sqInt sqLocDaylightSavings(void) +{ + time_t now= time(0); + return localtime(&now)->tm_isdst > 0; } -/* return true if DST is in use, false otherwise */ -sqInt sqLocDaylightSavings(void) { - struct tm * timeBlock; - time_t theTime; - theTime = time((time_t)NULL); - timeBlock = localtime(&theTime); - return timeBlock->tm_isdst; +/* Answer the number of characters in the long date format. + */ +sqInt sqLocLongDateFormatSize(void) +{ + return strlen(nl_langinfo(D_FMT)); } -/* return the size in chars of the long date format string */ -sqInt sqLocLongDateFormatSize(void) { - return 0; +/* Store the long date format into the given string. +*/ +void sqLocGetLongDateFormatInto(char *str) +{ + strcpy(str, nl_langinfo(D_FMT)); } -/*Write the string describing the long date formatting into string ptr. - * Format is made up of - * d day, m month, y year, - * double symbol is null padded, single not padded (m=6, mm=06) - * dddd weekday - * mmmm month name */ -void sqLocGetLongDateFormatInto(char * str) { - strcpy(str, ""); +/* Answer the number of characters in the short date format. + */ +sqInt sqLocShortDateFormatSize(void) +{ + return strlen(nl_langinfo(D_FMT)); } -/* return the size in chars of the short date format string */ -sqInt sqLocShortDateFormatSize(void) { - return 0; +/* Store the short date format into the given string. + */ +void sqLocGetShortDateFormatInto(char *str) +{ + strcpy(str, nl_langinfo(D_FMT)); } -/*Write the string describing the short date formatting into string ptr. - * Format is made up of - * d day, m month, y year, - * double symbol is null padded, single not padded (m=6, mm=06) - * dddd weekday - * mmmm month name */ -void sqLocGetShortDateFormatInto(char * str) { - strcpy(str, ""); +/* Answer the number of characters in the time format. + */ +sqInt sqLocTimeFormatSize(void) +{ + return strlen(nl_langinfo(T_FMT)); } -/* return the size in chars of the time format string */ -sqInt sqLocTimeFormatSize(void) { - return 0; +/* Store the time format into the given string. + */ +void sqLocGetTimeFormatInto(char *str) +{ + strcpy(str, nl_langinfo(T_FMT)); } -/* write the string describing the time formatting into string ptr. - * Format is made up of - * h hour (h 12, H 24), m minute, s seconds, x (am/pm String) - * double symbol is null padded, single not padded (h=6, hh=06) */ -void sqLocGetTimeFormatInto(char * str) { - strcpy(str, ""); + + +sqInt sqLocInitialize(void) +{ + if (!(localeString= setlocale(LC_ALL, ""))) + setlocale(LC_ALL, localeString= getlocale()); + localeConv= localeconv(); + return 1; } + + +void sqLocGetCountryInto(char * str) +{ + strcpy(str, getCountry()); +} + +void sqLocGetLanguageInto(char * str) +{ + strcpy(str, getLanguage()); +} + Deleted: branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h =================================================================== --- branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h 2011-04-01 20:00:15 UTC (rev 2378) +++ branches/Cog/platforms/unix/plugins/LocalePlugin/sqUnixLocale.h 2011-04-26 19:24:15 UTC (rev 2379) @@ -1,10 +0,0 @@ -/* - * sqUnixLocale.h - * SqueakLocale stubs - */ - -#include "sqMemoryAccess.h" -#include <time.h> -#include <locale.h> -#include "sq.h" - Modified: branches/Cog/platforms/unix/vm/sqUnixVMProfile.c =================================================================== --- branches/Cog/platforms/unix/vm/sqUnixVMProfile.c 2011-04-01 20:00:15 UTC (rev 2378) +++ branches/Cog/platforms/unix/vm/sqUnixVMProfile.c 2011-04-26 19:24:15 UTC (rev 2379) @@ -184,12 +184,16 @@ static void histogramSIGPROFhandler(int sig, siginfo_t *info, ucontext_t *uap) { -#if __APPLE__ && __MACH__ && __i386__ +#if __DARWIN_UNIX03 && __APPLE__ && __MACH__ && __i386__ + pctype pc = uap->uc_mcontext->__ss.__eip; +#elif __APPLE__ && __MACH__ && __i386__ pctype pc = uap->uc_mcontext->ss.eip; #elif __APPLE__ && __MACH__ && __ppc__ pctype pc = uap->uc_mcontext->ss.srr0; #elif __linux__ && __i386__ pctype pc = uap->uc_mcontext.gregs[REG_EIP]; +#elif __FreeBSD__ && __i386__ + pctype pc = uap->uc_mcontext.mc_eip; #else # error need to implement extracting pc from a ucontext_t on this system #endif @@ -302,6 +306,8 @@ pctype pc = uap->uc_mcontext->ss.srr0; #elif __linux__ && __i386__ pctype pc = uap->uc_mcontext.gregs[REG_EIP]; +#elif __FreeBSD__ && __i386__ + pctype pc = uap->uc_mcontext.mc_eip; #else # error need to implement extracting pc from a ucontext_t on this system #endif Modified: branches/Cog/src/vm/cointerp.c =================================================================== --- branches/Cog/src/vm/cointerp.c 2011-04-01 20:00:15 UTC (rev 2378) +++ branches/Cog/src/vm/cointerp.c 2011-04-26 19:24:15 UTC (rev 2379) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b from - CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 + CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b */ -static char __buildInfo[] = "CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -746,7 +746,7 @@ EXPORT(sqInt) primitiveCompareBytes(void); static void primitiveConstantFill(void); static void primitiveContextAt(void); -static void primitiveContextAtPut(void); +static sqInt primitiveContextAtPut(void); static void primitiveContextSize(void); static void primitiveContextXray(void); static void primitiveControlVMProfiling(void); @@ -1865,7 +1865,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker-oscog.54]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.55]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; static volatile int sendTrace; @@ -24225,21 +24225,82 @@ } -/* Return a shallow copy of the receiver. */ +/* Return a shallow copy of the receiver. + Special-case non-single contexts (because of context-to-stack mapping). + Can't fail for contexts cuz of image context instantiation code (sigh). */ static void primitiveClone(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt cloned; + sqInt frameNumArgs; + sqInt frameNumArgs1; + sqInt i; sqInt newCopy; + sqInt receiver; char *sp; + sqInt sp1; + char *spouseFP; + sqInt value; + sqInt valuePointer; + sqInt valuePointer1; - newCopy = clone(longAt(GIV(stackPointer))); - if (newCopy == 0) { - /* begin primitiveFail */ - if (GIV(primFailCode) == 0) { - GIV(primFailCode) = 1; + receiver = longAt(GIV(stackPointer)); + if ((receiver & 1)) { + newCopy = receiver; + } + else { + if (((((usqInt) (longAt(receiver))) >> 12) & 31) == ClassMethodContextCompactIndex) { + /* begin cloneContext: */ + VM_LABEL(0cloneContext); + cloned = clone(receiver); + if (cloned != 0) { + for (i = 0; i <= StackPointerIndex; i += 1) { + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer = externalInstVarofContext(i, receiver); + longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer); + } + for (i = MethodIndex; i <= ReceiverIndex; i += 1) { + longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord))); + } + if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) + && (!(isWidowedContext(receiver)))) { + /* begin frameOfMarriedContext: */ + value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord)); + /* begin withoutSmallIntegerTags: */ + assert((value & 1)); + spouseFP = pointerForOop(value - 1); + sp1 = (stackPointerIndexForFrame(spouseFP)) - 1; + for (i = 0; i <= sp1; i += 1) { + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer1 = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase + ? (i < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs))) + ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs - i) * BytesPerWord)) + : longAt(((spouseFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - i) * BytesPerWord))) + : (i < ((frameNumArgs1 = byteAt((spouseFP + FoxIFrameFlags) + 1))) + ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - i) * BytesPerWord)) + : longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - i) * BytesPerWord)))); + longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), valuePointer1); + } + } + else { + sp1 = (fetchStackPointerOf(receiver)) - 1; + for (i = 0; i <= sp1; i += 1) { + longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord))); + } + } + for (i = ((sp1 + CtxtTempFrameStart) + 1); i <= ((lengthOf(receiver)) - 1); i += 1) { + longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), GIV(nilObj)); + } + } + newCopy = cloned; } - return; + else { + newCopy = clone(receiver); + } + if (newCopy == 0) { + GIV(primFailCode) = PrimErrNoMemory; return; + } } /* begin pop:thenPush: */ longAtput(sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord), newCopy); @@ -25333,7 +25394,7 @@ GIV(stackPointer) = sp2; } -static void +static sqInt primitiveContextAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt aContext; @@ -25367,7 +25428,7 @@ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } - return; + return null; } hdr = longAt(aContext); index = (index >> 1); @@ -25376,7 +25437,7 @@ /* begin pop:thenPush: */ longAtput(sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value); GIV(stackPointer) = sp; - return; + return null; } /* begin externalWriteBackHeadFramePointers */ assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize); @@ -25460,7 +25521,7 @@ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } - return; + return null; } /* begin subscript:with:storing:format: */ VM_LABEL(0subscriptwithstoringformat); @@ -25514,7 +25575,7 @@ /* begin pop:thenPush: */ longAtput(sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value); GIV(stackPointer) = sp1; - return; + return null; } /* begin frameOfMarriedContext: */ value1 = longAt((aContext + BaseHeaderSize) + (SenderIndex << ShiftForWord)); @@ -25526,7 +25587,7 @@ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } - return; + return null; } /* begin temporary:in:put: */ VM_LABEL(0temporaryinput); @@ -25549,7 +25610,7 @@ /* begin pop:thenPush: */ longAtput(sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value); GIV(stackPointer) = sp2; - return; + return null; } static void @@ -25775,10 +25836,12 @@ /* Primitive. Copy the state of the receiver from the argument. - Fail if receiver and argument are of a different class. + Fail if receiver and argument are of a different class. Fail if the receiver or argument are non-pointer objects. - Fail if receiver and argument have different lengths (for indexable - objects). */ + Fail if the receiver or argument are contexts (because of context-to-stack + mapping). Fail if receiver and argument have different lengths (for + indexable objects). + */ static void primitiveCopyObject(void) @@ -25834,13 +25897,21 @@ } return; } - if (!((fetchClassOf(rcvr)) == (fetchClassOf(arg)))) { + if ((((((usqInt) (longAt(rcvr))) >> 12) & 31) == ClassMethodContextCompactIndex) + || (((((usqInt) (longAt(arg))) >> 12) & 31) == ClassMethodContextCompactIndex)) { /* begin primitiveFail */ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } return; } + if (!((fetchClassOfNonInt(rcvr)) == (fetchClassOfNonInt(arg)))) { + /* begin primitiveFail */ + if (GIV(primFailCode) == 0) { + GIV(primFailCode) = 1; + } + return; + } /* begin lengthOf: */ header = longAt(rcvr); /* begin lengthOf:baseHeader:format: */ @@ -25863,7 +25934,7 @@ length = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3); goto l3; } -l3: /* end lengthOf:baseHeader:format: */; +l3: /* end lengthOf: */; if (!(length == (lengthOf(arg)))) { /* begin primitiveFail */ if (GIV(primFailCode) == 0) { Modified: branches/Cog/src/vm/cointerp.h =================================================================== --- branches/Cog/src/vm/cointerp.h 2011-04-01 20:00:15 UTC (rev 2378) +++ branches/Cog/src/vm/cointerp.h 2011-04-26 19:24:15 UTC (rev 2379) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b */ Modified: branches/Cog/src/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/src/vm/gcc3x-cointerp.c 2011-04-01 20:00:15 UTC (rev 2378) +++ branches/Cog/src/vm/gcc3x-cointerp.c 2011-04-26 19:24:15 UTC (rev 2379) @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b from - CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 + CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b */ -static char __buildInfo[] = "CoInterpreter VMMaker-oscog.54 uuid: 73c095bd-7fa5-4ef9-b9fc-60378cae64c7 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.55 uuid: 315353fc-7f75-4b5b-8a43-3a636cb1aa0b " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -749,7 +749,7 @@ EXPORT(sqInt) primitiveCompareBytes(void); static void primitiveConstantFill(void); static void primitiveContextAt(void); -static void primitiveContextAtPut(void); +static sqInt primitiveContextAtPut(void); static void primitiveContextSize(void); static void primitiveContextXray(void); static void primitiveControlVMProfiling(void); @@ -1868,7 +1868,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker-oscog.54]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.55]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; static volatile int sendTrace; @@ -24229,21 +24229,82 @@ } -/* Return a shallow copy of the receiver. */ +/* Return a shallow copy of the receiver. + Special-case non-single contexts (because of context-to-stack mapping). + Can't fail for contexts cuz of image context instantiation code (sigh). */ static void primitiveClone(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT + sqInt cloned; + sqInt frameNumArgs; + sqInt frameNumArgs1; + sqInt i; sqInt newCopy; + sqInt receiver; char *sp; + sqInt sp1; + char *spouseFP; + sqInt value; + sqInt valuePointer; + sqInt valuePointer1; - newCopy = clone(longAt(GIV(stackPointer))); - if (newCopy == 0) { - /* begin primitiveFail */ - if (GIV(primFailCode) == 0) { - GIV(primFailCode) = 1; + receiver = longAt(GIV(stackPointer)); + if ((receiver & 1)) { + newCopy = receiver; + } + else { + if (((((usqInt) (longAt(receiver))) >> 12) & 31) == ClassMethodContextCompactIndex) { + /* begin cloneContext: */ + VM_LABEL(0cloneContext); + cloned = clone(receiver); + if (cloned != 0) { + for (i = 0; i <= StackPointerIndex; i += 1) { + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer = externalInstVarofContext(i, receiver); + longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), valuePointer); + } + for (i = MethodIndex; i <= ReceiverIndex; i += 1) { + longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord))); + } + if ((((longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord))) & 1)) + && (!(isWidowedContext(receiver)))) { + /* begin frameOfMarriedContext: */ + value = longAt((receiver + BaseHeaderSize) + (SenderIndex << ShiftForWord)); + /* begin withoutSmallIntegerTags: */ + assert((value & 1)); + spouseFP = pointerForOop(value - 1); + sp1 = (stackPointerIndexForFrame(spouseFP)) - 1; + for (i = 0; i <= sp1; i += 1) { + /* begin storePointerUnchecked:ofObject:withValue: */ + valuePointer1 = ((((usqInt)(longAt(spouseFP + FoxMethod)))) < heapBase + ? (i < ((frameNumArgs = (mframeCogMethod(spouseFP)->cmNumArgs))) + ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs - i) * BytesPerWord)) + : longAt(((spouseFP + FoxMFReceiver) - BytesPerWord) + ((frameNumArgs - i) * BytesPerWord))) + : (i < ((frameNumArgs1 = byteAt((spouseFP + FoxIFrameFlags) + 1))) + ? longAt((spouseFP + FoxCallerSavedIP) + ((frameNumArgs1 - i) * BytesPerWord)) + : longAt(((spouseFP + FoxIFReceiver) - BytesPerWord) + ((frameNumArgs1 - i) * BytesPerWord)))); + longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), valuePointer1); + } + } + else { + sp1 = (fetchStackPointerOf(receiver)) - 1; + for (i = 0; i <= sp1; i += 1) { + longAtput((cloned + BaseHeaderSize) + ((i + CtxtTempFrameStart) << ShiftForWord), longAt((receiver + BaseHeaderSize) + (i << ShiftForWord))); + } + } + for (i = ((sp1 + CtxtTempFrameStart) + 1); i <= ((lengthOf(receiver)) - 1); i += 1) { + longAtput((cloned + BaseHeaderSize) + (i << ShiftForWord), GIV(nilObj)); + } + } + newCopy = cloned; } - return; + else { + newCopy = clone(receiver); + } + if (newCopy == 0) { + GIV(primFailCode) = PrimErrNoMemory; return; + } } /* begin pop:thenPush: */ longAtput(sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord), newCopy); @@ -25337,7 +25398,7 @@ GIV(stackPointer) = sp2; } -static void +static sqInt primitiveContextAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt aContext; @@ -25371,7 +25432,7 @@ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } - return; + return null; } hdr = longAt(aContext); index = (index >> 1); @@ -25380,7 +25441,7 @@ /* begin pop:thenPush: */ longAtput(sp = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value); GIV(stackPointer) = sp; - return; + return null; } /* begin externalWriteBackHeadFramePointers */ assert((GIV(framePointer) - GIV(stackPointer)) < LargeContextSize); @@ -25464,7 +25525,7 @@ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } - return; + return null; } /* begin subscript:with:storing:format: */ VM_LABEL(0subscriptwithstoringformat); @@ -25518,7 +25579,7 @@ /* begin pop:thenPush: */ longAtput(sp1 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value); GIV(stackPointer) = sp1; - return; + return null; } /* begin frameOfMarriedContext: */ value1 = longAt((aContext + BaseHeaderSize) + (SenderIndex << ShiftForWord)); @@ -25530,7 +25591,7 @@ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } - return; + return null; } /* begin temporary:in:put: */ VM_LABEL(0temporaryinput); @@ -25553,7 +25614,7 @@ /* begin pop:thenPush: */ longAtput(sp2 = GIV(stackPointer) + ((3 - 1) * BytesPerWord), value); GIV(stackPointer) = sp2; - return; + return null; } static void @@ -25779,10 +25840,12 @@ /* Primitive. Copy the state of the receiver from the argument. - Fail if receiver and argument are of a different class. + Fail if receiver and argument are of a different class. Fail if the receiver or argument are non-pointer objects. - Fail if receiver and argument have different lengths (for indexable - objects). */ + Fail if the receiver or argument are contexts (because of context-to-stack + mapping). Fail if receiver and argument have different lengths (for + indexable objects). + */ static void primitiveCopyObject(void) @@ -25838,13 +25901,21 @@ } return; } - if (!((fetchClassOf(rcvr)) == (fetchClassOf(arg)))) { + if ((((((usqInt) (longAt(rcvr))) >> 12) & 31) == ClassMethodContextCompactIndex) + || (((((usqInt) (longAt(arg))) >> 12) & 31) == ClassMethodContextCompactIndex)) { /* begin primitiveFail */ if (GIV(primFailCode) == 0) { GIV(primFailCode) = 1; } return; } + if (!((fetchClassOfNonInt(rcvr)) == (fetchClassOfNonInt(arg)))) { + /* begin primitiveFail */ + if (GIV(primFailCode) == 0) { + GIV(primFailCode) = 1; + } + return; + } /* begin lengthOf: */ header = longAt(rcvr); /* begin lengthOf:baseHeader:format: */ @@ -25867,7 +25938,7 @@ length = (sz - BaseHeaderSize) - (((((usqInt) header) >> 8) & 15) & 3); goto l3; } -l3: /* end lengthOf:baseHeader:format: */; +l3: /* end lengthOf: */; if (!(length == (lengthOf(arg)))) { /* begin primitiveFail */ if (GIV(primFailCode) == 0) { |
Free forum by Nabble | Edit this page |