Skip to content

Commit f90d2a6

Browse files
committed
CogVM source as per VMMaker.oscog-eem.3647
Fix stupid slip in previous commit. Add wordSize and MULTIPLEBYTECODESETS to primitiveCogStaticSymbols.
1 parent fac98d3 commit f90d2a6

25 files changed

+473
-465
lines changed

src/spur32.cog.lowcode/cointerp.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/* Automatically generated by
2-
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
2+
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
33
(Cog-eem.496, * Compiler-ct.519)
44
from
5-
CoInterpreter VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
5+
CoInterpreter VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
66
*/
7-
static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9 " __DATE__ ;
7+
static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a " __DATE__ ;
88
char *__interpBuildInfo = __buildInfo;
99

1010

@@ -1246,7 +1246,7 @@ extern sqInt numBytesOf(sqInt objOop);
12461246
static NoDbgRegParms usqInt numPointerSlotsOf(sqInt objOop);
12471247
static NoDbgRegParms sqInt numSlotsForBytes(sqInt numBytes);
12481248
static NoDbgRegParms usqInt numSlotsOfAny(sqInt objOop);
1249-
static NoDbgRegParms usqInt numSlotsOfIndexablePointerObj(sqInt objOop);
1249+
static NoDbgRegParms sqInt numSlotsOfIndexablePointerObj(sqInt objOop);
12501250
extern usqInt numSlotsOf(sqInt objOop);
12511251
static NoDbgRegParms sqInt numStrongSlotsOfInephemeral(sqInt objOop);
12521252
static NoDbgRegParms sqInt numStrongSlotsOfWeakling(sqInt objOop);
@@ -2708,7 +2708,7 @@ sqInt debugCallbackReturns;
27082708
sqInt suppressHeartbeatFlag;
27092709
sqInt cannotDeferDisplayUpdates;
27102710
sqInt checkedPluginName;
2711-
const char *interpreterVersion = "Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.3646]";
2711+
const char *interpreterVersion = "Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.3647]";
27122712
const char * leakCheckFlagsMeanings[] = {
27132713
"1: check full GC", "2: check new space GC", "4: check incremental GC", "8: check become",
27142714
"16: check image segment", "32: check free space", "64: check shorten", "128: check prim call",
@@ -37758,7 +37758,7 @@ primitiveCogStaticSymbols(void)
3775837758
&& (!(isForwarded(symbols))));
3775937759
assert(validStorePointerUncheckedArgs(5, symbols, valuePointer));
3776037760
longAtput((void *)((symbols + BaseHeaderSize) + (5U << (shiftForWord()))),valuePointer);
37761-
valuePointer = stringForCString("varBaseAddress");
37761+
valuePointer = stringForCString("MULTIPLEBYTECODESETS");
3776237762

3776337763
/* begin storePointerUnchecked:ofObject:withValue: */
3776437764
assert((isNonImmediate(symbols))
@@ -56862,9 +56862,9 @@ allWeakSurvivorsOnWeakList(void)
5686256862
/* begin nextCorpseOrNil: */
5686356863
assert(isYoung(corpse));
5686456864
listOffset = ((((usqInt)(((long32At((void *)(corpse + 4))) & (identityHashHalfWordMask()))) << (formatFieldWidthShift())))) + ((byteAt((void *)(corpse + (formatFieldByteOffset())))) & (formatMask()));
56865-
corpse = (listOffset
56866-
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
56867-
: 0);
56865+
corpse = ((sqInt) ((listOffset
56866+
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
56867+
: 0)));
5686856868
}
5686956869
return 0;
5687056870
return 0;
@@ -57703,9 +57703,9 @@ processEphemerons(void)
5770357703
/* begin nextCorpseOrNil: */
5770457704
assert(isYoung(ephemeronCorpse));
5770557705
listOffset = ((((usqInt)(((long32At((void *)(ephemeronCorpse + 4))) & (identityHashHalfWordMask()))) << (formatFieldWidthShift())))) + ((byteAt((void *)(ephemeronCorpse + (formatFieldByteOffset())))) & (formatMask()));
57706-
ephemeronCorpse = (listOffset
57707-
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57708-
: 0);
57706+
ephemeronCorpse = ((sqInt) ((listOffset
57707+
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57708+
: 0)));
5770957709
}
5771057710
/* end fireEphemeronsOnEphemeronList */
5771157711
l1:;
@@ -57777,9 +57777,9 @@ processWeaklings(void)
5777757777
/* begin nextCorpseOrNil: */
5777857778
assert(isYoung(weakCorpse));
5777957779
listOffset = ((((usqInt)(((long32At((void *)(weakCorpse + 4))) & (identityHashHalfWordMask()))) << (formatFieldWidthShift())))) + ((byteAt((void *)(weakCorpse + (formatFieldByteOffset())))) & (formatMask()));
57780-
weakCorpse = (listOffset
57781-
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57782-
: 0);
57780+
weakCorpse = ((sqInt) ((listOffset
57781+
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57782+
: 0)));
5778357783
}
5778457784
GIV(weakList) = null;
5778557785
}
@@ -70035,7 +70035,7 @@ numSlotsOfAny(sqInt objOop)
7003570035
*/
7003670036

7003770037
/* SpurMemoryManager>>#numSlotsOfIndexablePointerObj: */
70038-
static NoDbgRegParms usqInt
70038+
static NoDbgRegParms sqInt
7003970039
numSlotsOfIndexablePointerObj(sqInt objOop)
7004070040
{
7004170041
usqInt numSlots;
@@ -77580,7 +77580,7 @@ updatePointersInsavedFirstFieldPointer(sqInt obj, sqInt firstFieldPtr)
7758077580
contextSize = (sp >> 1);
7758177581
/* end fetchStackPointerOf: */
7758277582
l2:
77583-
numPointerSlots = CtxtTempFrameStart + contextSize;
77583+
numPointerSlots = ((usqInt) (CtxtTempFrameStart + contextSize));
7758477584
goto l3;
7758577585
}
7758677586

@@ -77943,7 +77943,7 @@ bridgeFor(SpurSegmentInfo *aSegment)
7794377943
static NoDbgRegParms void
7794477944
bridgeFromto(SpurSegmentInfo *aSegment, SpurSegmentInfo *nextSegmentOrNil)
7794577945
{
77946-
sqInt bridgeSpan;
77946+
int bridgeSpan;
7794777947
sqInt clifton;
7794877948
usqInt segEnd;
7794977949

@@ -78126,7 +78126,7 @@ prepareForSnapshot(void)
7812678126
sqInt largeChild;
7812778127
sqInt newEndOfMemory;
7812878128
sqInt next;
78129-
sqInt node;
78129+
usqInt node;
7813078130
SpurSegmentInfo *seg;
7813178131
sqInt smallChild;
7813278132
sqInt treeNode;

src/spur32.cog.lowcode/cointerp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* Automatically generated by
2-
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
2+
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
33
(Cog-eem.496, * Compiler-ct.519)
44
*/
55

src/spur32.cog.lowcode/gcc3x-cointerp.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33

44
/* Automatically generated by
5-
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
5+
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
66
(Cog-eem.496, * Compiler-ct.519)
77
from
8-
CoInterpreter VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
8+
CoInterpreter VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
99
*/
10-
static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9 " __DATE__ ;
10+
static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a " __DATE__ ;
1111
char *__interpBuildInfo = __buildInfo;
1212

1313

@@ -1249,7 +1249,7 @@ extern sqInt numBytesOf(sqInt objOop);
12491249
static NoDbgRegParms usqInt numPointerSlotsOf(sqInt objOop);
12501250
static NoDbgRegParms sqInt numSlotsForBytes(sqInt numBytes);
12511251
static NoDbgRegParms usqInt numSlotsOfAny(sqInt objOop);
1252-
static NoDbgRegParms usqInt numSlotsOfIndexablePointerObj(sqInt objOop);
1252+
static NoDbgRegParms sqInt numSlotsOfIndexablePointerObj(sqInt objOop);
12531253
extern usqInt numSlotsOf(sqInt objOop);
12541254
static NoDbgRegParms sqInt numStrongSlotsOfInephemeral(sqInt objOop);
12551255
static NoDbgRegParms sqInt numStrongSlotsOfWeakling(sqInt objOop);
@@ -2711,7 +2711,7 @@ sqInt debugCallbackReturns;
27112711
sqInt suppressHeartbeatFlag;
27122712
sqInt cannotDeferDisplayUpdates;
27132713
sqInt checkedPluginName;
2714-
const char *interpreterVersion = "Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.3646]";
2714+
const char *interpreterVersion = "Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.3647]";
27152715
const char * leakCheckFlagsMeanings[] = {
27162716
"1: check full GC", "2: check new space GC", "4: check incremental GC", "8: check become",
27172717
"16: check image segment", "32: check free space", "64: check shorten", "128: check prim call",
@@ -37765,7 +37765,7 @@ primitiveCogStaticSymbols(void)
3776537765
&& (!(isForwarded(symbols))));
3776637766
assert(validStorePointerUncheckedArgs(5, symbols, valuePointer));
3776737767
longAtput((void *)((symbols + BaseHeaderSize) + (5U << (shiftForWord()))),valuePointer);
37768-
valuePointer = stringForCString("varBaseAddress");
37768+
valuePointer = stringForCString("MULTIPLEBYTECODESETS");
3776937769

3777037770
/* begin storePointerUnchecked:ofObject:withValue: */
3777137771
assert((isNonImmediate(symbols))
@@ -56869,9 +56869,9 @@ allWeakSurvivorsOnWeakList(void)
5686956869
/* begin nextCorpseOrNil: */
5687056870
assert(isYoung(corpse));
5687156871
listOffset = ((((usqInt)(((long32At((void *)(corpse + 4))) & (identityHashHalfWordMask()))) << (formatFieldWidthShift())))) + ((byteAt((void *)(corpse + (formatFieldByteOffset())))) & (formatMask()));
56872-
corpse = (listOffset
56873-
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
56874-
: 0);
56872+
corpse = ((sqInt) ((listOffset
56873+
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
56874+
: 0)));
5687556875
}
5687656876
return 0;
5687756877
return 0;
@@ -57710,9 +57710,9 @@ processEphemerons(void)
5771057710
/* begin nextCorpseOrNil: */
5771157711
assert(isYoung(ephemeronCorpse));
5771257712
listOffset = ((((usqInt)(((long32At((void *)(ephemeronCorpse + 4))) & (identityHashHalfWordMask()))) << (formatFieldWidthShift())))) + ((byteAt((void *)(ephemeronCorpse + (formatFieldByteOffset())))) & (formatMask()));
57713-
ephemeronCorpse = (listOffset
57714-
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57715-
: 0);
57713+
ephemeronCorpse = ((sqInt) ((listOffset
57714+
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57715+
: 0)));
5771657716
}
5771757717
/* end fireEphemeronsOnEphemeronList */
5771857718
l1:;
@@ -57784,9 +57784,9 @@ processWeaklings(void)
5778457784
/* begin nextCorpseOrNil: */
5778557785
assert(isYoung(weakCorpse));
5778657786
listOffset = ((((usqInt)(((long32At((void *)(weakCorpse + 4))) & (identityHashHalfWordMask()))) << (formatFieldWidthShift())))) + ((byteAt((void *)(weakCorpse + (formatFieldByteOffset())))) & (formatMask()));
57787-
weakCorpse = (listOffset
57788-
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57789-
: 0);
57787+
weakCorpse = ((sqInt) ((listOffset
57788+
? ((((usqInt)((listOffset - 1)) << 3 /* shiftForAllocationUnit */))) + GIV(newSpaceStart)
57789+
: 0)));
5779057790
}
5779157791
GIV(weakList) = null;
5779257792
}
@@ -70042,7 +70042,7 @@ numSlotsOfAny(sqInt objOop)
7004270042
*/
7004370043

7004470044
/* SpurMemoryManager>>#numSlotsOfIndexablePointerObj: */
70045-
static NoDbgRegParms usqInt
70045+
static NoDbgRegParms sqInt
7004670046
numSlotsOfIndexablePointerObj(sqInt objOop)
7004770047
{
7004870048
usqInt numSlots;
@@ -77587,7 +77587,7 @@ updatePointersInsavedFirstFieldPointer(sqInt obj, sqInt firstFieldPtr)
7758777587
contextSize = (sp >> 1);
7758877588
/* end fetchStackPointerOf: */
7758977589
l2:
77590-
numPointerSlots = CtxtTempFrameStart + contextSize;
77590+
numPointerSlots = ((usqInt) (CtxtTempFrameStart + contextSize));
7759177591
goto l3;
7759277592
}
7759377593

@@ -77950,7 +77950,7 @@ bridgeFor(SpurSegmentInfo *aSegment)
7795077950
static NoDbgRegParms void
7795177951
bridgeFromto(SpurSegmentInfo *aSegment, SpurSegmentInfo *nextSegmentOrNil)
7795277952
{
77953-
sqInt bridgeSpan;
77953+
int bridgeSpan;
7795477954
sqInt clifton;
7795577955
usqInt segEnd;
7795677956

@@ -78133,7 +78133,7 @@ prepareForSnapshot(void)
7813378133
sqInt largeChild;
7813478134
sqInt newEndOfMemory;
7813578135
sqInt next;
78136-
sqInt node;
78136+
usqInt node;
7813778137
SpurSegmentInfo *seg;
7813878138
sqInt smallChild;
7813978139
sqInt treeNode;

src/spur32.cog/cointerp.c

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/* Automatically generated by
2-
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
2+
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
33
(Cog-eem.496, * Compiler-ct.519)
44
from
5-
CoInterpreter VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
5+
CoInterpreter VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
66
*/
7-
static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9 " __DATE__ ;
7+
static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a " __DATE__ ;
88
char *__interpBuildInfo = __buildInfo;
99

1010

@@ -1238,7 +1238,7 @@ extern sqInt numBytesOf(sqInt objOop);
12381238
static NoDbgRegParms usqInt numPointerSlotsOf(sqInt objOop);
12391239
static NoDbgRegParms sqInt numSlotsForBytes(sqInt numBytes);
12401240
static NoDbgRegParms usqInt numSlotsOfAny(sqInt objOop);
1241-
static NoDbgRegParms usqInt numSlotsOfIndexablePointerObj(sqInt objOop);
1241+
static NoDbgRegParms sqInt numSlotsOfIndexablePointerObj(sqInt objOop);
12421242
extern usqInt numSlotsOf(sqInt objOop);
12431243
static NoDbgRegParms sqInt numStrongSlotsOfInephemeral(sqInt objOop);
12441244
static NoDbgRegParms sqInt numStrongSlotsOfWeakling(sqInt objOop);
@@ -2693,7 +2693,7 @@ sqInt debugCallbackReturns;
26932693
sqInt suppressHeartbeatFlag;
26942694
sqInt cannotDeferDisplayUpdates;
26952695
sqInt checkedPluginName;
2696-
const char *interpreterVersion = "Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.3646]";
2696+
const char *interpreterVersion = "Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.3647]";
26972697
const char * leakCheckFlagsMeanings[] = {
26982698
"1: check full GC", "2: check new space GC", "4: check incremental GC", "8: check become",
26992699
"16: check image segment", "32: check free space", "64: check shorten", "128: check prim call",
@@ -22665,7 +22665,7 @@ primitiveCogStaticSymbols(void)
2266522665
&& (!(isForwarded(symbols))));
2266622666
assert(validStorePointerUncheckedArgs(5, symbols, valuePointer));
2266722667
longAtput((void *)((symbols + BaseHeaderSize) + (5U << (shiftForWord()))),valuePointer);
22668-
valuePointer = stringForCString("varBaseAddress");
22668+
valuePointer = stringForCString("MULTIPLEBYTECODESETS");
2266922669

2267022670
/* begin storePointerUnchecked:ofObject:withValue: */
2267122671
assert((isNonImmediate(symbols))
@@ -33710,7 +33710,7 @@ primitiveInvokeObjectAsMethod(void)
3371033710
sqInt lookupClassTag;
3371133711
usqInt newObj;
3371233712
usqInt numBytes;
33713-
usqInt runArgs;
33713+
sqInt runArgs;
3371433714
sqInt runReceiver;
3371533715
char *sp;
3371633716
sqInt tagBits;
@@ -54942,7 +54942,7 @@ numSlotsOfAny(sqInt objOop)
5494254942
*/
5494354943

5494454944
/* SpurMemoryManager>>#numSlotsOfIndexablePointerObj: */
54945-
static NoDbgRegParms usqInt
54945+
static NoDbgRegParms sqInt
5494654946
numSlotsOfIndexablePointerObj(sqInt objOop)
5494754947
{
5494854948
usqInt numSlots;
@@ -63033,7 +63033,7 @@ prepareForSnapshot(void)
6303363033
sqInt largeChild;
6303463034
sqInt newEndOfMemory;
6303563035
sqInt next;
63036-
usqInt node;
63036+
sqInt node;
6303763037
SpurSegmentInfo *seg;
6303863038
sqInt smallChild;
6303963039
sqInt treeNode;
@@ -67401,14 +67401,13 @@ static sqInt
6740167401
getErrorObjectFromPrimFailCode(void)
6740267402
{ DECL_MAYBE_SQ_GLOBAL_STRUCT
6740367403
sqInt classIndex;
67404-
usqInt clone;
67405-
usqInt errObj;
67404+
sqInt clone;
67405+
sqInt errObj;
6740667406
sqInt i;
6740767407
usqInt newObj;
6740867408
usqInt numBytes;
6740967409
usqInt numSlots;
6741067410
usqInt numSlotsUsqInt;
67411-
sqInt objOop;
6741267411
sqInt table;
6741367412
sqInt valuePointer;
6741467413

@@ -67420,13 +67419,12 @@ getErrorObjectFromPrimFailCode(void)
6742067419
? longAt((void *)(table - BaseHeaderSize))
6742167420
: numSlots)))) {
6742267421
/* begin followField:ofObject: */
67423-
objOop = longAt((void *)((table + BaseHeaderSize) + ((((usqInt)((GIV(primFailCode) - 1)) << (shiftForWord()))))));
67422+
errObj = longAt((void *)((table + BaseHeaderSize) + ((((usqInt)((GIV(primFailCode) - 1)) << (shiftForWord()))))));
6742467423
if (/* isOopForwarded: */
67425-
((!(objOop & (tagMask()))))
67426-
&& ((!((longAt((void *)(objOop))) & ((classIndexMask()) - (isForwardedObjectClassIndexPun())))))) {
67427-
objOop = fixFollowedFieldofObjectwithInitialValue(GIV(primFailCode) - 1, table, objOop);
67424+
((!(errObj & (tagMask()))))
67425+
&& ((!((longAt((void *)(errObj))) & ((classIndexMask()) - (isForwardedObjectClassIndexPun())))))) {
67426+
errObj = fixFollowedFieldofObjectwithInitialValue(GIV(primFailCode) - 1, table, errObj);
6742867427
}
67429-
errObj = objOop;
6743067428

6743167429
/* If there's a clonable object in the table at that index,
6743267430
answer a clone of the error object with the second slot set to the value of secondaryErrorCode. */

src/spur32.cog/cointerp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* Automatically generated by
2-
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3646 uuid: 4edfc800-17e2-439a-8c01-7bd165d5b1d9
2+
CCodeGeneratorGlobalStructure VMMaker.oscog-eem.3647 uuid: 80d76071-fc00-4d0a-8377-d9148cde761a
33
(Cog-eem.496, * Compiler-ct.519)
44
*/
55

0 commit comments

Comments
 (0)