Skip to content

Commit 3ce831d

Browse files
committed
---
yaml --- r: 146032 b: refs/heads/try2 c: 29c58c4 h: refs/heads/master v: v3
1 parent b25f346 commit 3ce831d

File tree

217 files changed

+45118
-2376
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

217 files changed

+45118
-2376
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: a9836e72dd5b86e1248572a84641033fd6eebce7
8+
refs/heads/try2: 29c58c473f086af1c55f4a33ef9e6cbaa19ffdb1
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/Makefile.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ ifneq ($(wildcard $(NON_BUILD_TARGET_TRIPLES)),)
8888
CFG_INFO := $(info cfg: non-build target triples $(NON_BUILD_TARGET_TRIPLES))
8989
endif
9090

91-
CFG_RUSTC_FLAGS := $(RUSTFLAGS) --cfg nofmt
91+
CFG_RUSTC_FLAGS := $(RUSTFLAGS)
9292
CFG_GCCISH_CFLAGS :=
9393
CFG_GCCISH_LINK_FLAGS :=
9494

@@ -440,6 +440,7 @@ CSREQ$(1)_T_$(2)_H_$(3) = \
440440
$$(TSREQ$(1)_T_$(2)_H_$(3)) \
441441
$$(HBIN$(1)_H_$(3))/rustpkg$$(X_$(3)) \
442442
$$(HBIN$(1)_H_$(3))/rustdoc$$(X_$(3)) \
443+
$$(HBIN$(1)_H_$(3))/rusti$$(X_$(3)) \
443444
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTPKG_$(3)) \
444445
$$(HLIB$(1)_H_$(3))/$(CFG_LIBRUSTDOC_$(3)) \
445446
$$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB_$(2)) \

branches/try2/configure

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,7 @@ do
684684
make_dir $t/rt/libuv/src/ares
685685
make_dir $t/rt/libuv/src/eio
686686
make_dir $t/rt/libuv/src/ev
687+
make_dir $t/rt/jemalloc
687688
for i in \
688689
isaac sync test \
689690
arch/i386 arch/x86_64 arch/arm arch/mips \

branches/try2/doc/po/ja/rust.md.po

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1842,7 +1842,7 @@ msgid ""
18421842
"The type parameters can also be explicitly supplied in a trailing [path]"
18431843
"(#paths) component after the function name. This might be necessary if there "
18441844
"is not sufficient context to determine the type parameters. For example, "
1845-
"`mem::size_of::<u32>() == 4`."
1845+
"`sys::size_of::<u32>() == 4`."
18461846
msgstr ""
18471847

18481848
#. type: Plain text

branches/try2/doc/po/ja/tutorial-ffi.md.po

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ msgid ""
327327
"impl<T: Send> Unique<T> {\n"
328328
" pub fn new(value: T) -> Unique<T> {\n"
329329
" unsafe {\n"
330-
" let ptr = malloc(std::mem::size_of::<T>() as size_t) as *mut T;\n"
330+
" let ptr = malloc(std::sys::size_of::<T>() as size_t) as *mut T;\n"
331331
" assert!(!ptr::is_null(ptr));\n"
332332
" // `*ptr` is uninitialized, and `*ptr = value` would attempt to destroy it\n"
333333
" intrinsics::move_val_init(&mut *ptr, value);\n"

branches/try2/doc/po/rust.md.pot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1842,7 +1842,7 @@ msgid ""
18421842
"The type parameters can also be explicitly supplied in a trailing [path]"
18431843
"(#paths) component after the function name. This might be necessary if there "
18441844
"is not sufficient context to determine the type parameters. For example, "
1845-
"`mem::size_of::<u32>() == 4`."
1845+
"`sys::size_of::<u32>() == 4`."
18461846
msgstr ""
18471847

18481848
#. type: Plain text

branches/try2/doc/po/tutorial-ffi.md.pot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ msgid ""
327327
"impl<T: Send> Unique<T> {\n"
328328
" pub fn new(value: T) -> Unique<T> {\n"
329329
" unsafe {\n"
330-
" let ptr = malloc(std::mem::size_of::<T>() as size_t) as *mut T;\n"
330+
" let ptr = malloc(std::sys::size_of::<T>() as size_t) as *mut T;\n"
331331
" assert!(!ptr::is_null(ptr));\n"
332332
" // `*ptr` is uninitialized, and `*ptr = value` would attempt to destroy it\n"
333333
" intrinsics::move_val_init(&mut *ptr, value);\n"

branches/try2/doc/rust.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -975,7 +975,7 @@ with `int`, and require the closure parameter to have type
975975
The type parameters can also be explicitly supplied in a trailing
976976
[path](#paths) component after the function name. This might be necessary
977977
if there is not sufficient context to determine the type parameters. For
978-
example, `mem::size_of::<u32>() == 4`.
978+
example, `sys::size_of::<u32>() == 4`.
979979

980980
Since a parameter type is opaque to the generic function, the set of
981981
operations that can be performed on it is limited. Values of parameter
@@ -1589,7 +1589,7 @@ explain, here's a few use cases and what they would entail.
15891589
* A crate needs a global available "helper module" to itself, but it doesn't
15901590
want to expose the helper module as a public API. To accomplish this, the root
15911591
of the crate's hierarchy would have a private module which then internally has
1592-
a "public api". Because the entire crate is a descendant of the root, then the
1592+
a "public api". Because the entire crate is an ancestor of the root, then the
15931593
entire local crate can access this private module through the second case.
15941594

15951595
* When writing unit tests for a module, it's often a common idiom to have an
@@ -1602,10 +1602,7 @@ In the second case, it mentions that a private item "can be accessed" by the
16021602
current module and its descendants, but the exact meaning of accessing an item
16031603
depends on what the item is. Accessing a module, for example, would mean looking
16041604
inside of it (to import more items). On the other hand, accessing a function
1605-
would mean that it is invoked. Additionally, path expressions and import
1606-
statements are considered to access an item in the sense that the
1607-
import/expression is only valid if the destination is in the current visibility
1608-
scope.
1605+
would mean that it is invoked.
16091606

16101607
Here's an example of a program which exemplifies the three cases outlined above.
16111608

branches/try2/doc/tutorial-ffi.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ impl<T: Send> Unique<T> {
300300
#[inline(never)];
301301
302302
unsafe {
303-
let ptr = malloc(std::mem::size_of::<T>() as size_t) as *mut T;
303+
let ptr = malloc(std::sys::size_of::<T>() as size_t) as *mut T;
304304
assert!(!ptr::is_null(ptr));
305305
// `*ptr` is uninitialized, and `*ptr = value` would attempt to destroy it
306306
intrinsics::move_val_init(&mut *ptr, value);

branches/try2/mk/rt.mk

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,10 @@ $$(RT_BUILD_DIR_$(1)_$(2))/arch/$$(HOST_$(1))/libmorestack.a: $$(MORESTACK_OBJ_$
145145
$$(Q)$(AR_$(1)) rcs $$@ $$<
146146

147147
$$(RT_BUILD_DIR_$(1)_$(2))/$(CFG_RUNTIME_$(1)): $$(RUNTIME_OBJS_$(1)_$(2)) $$(MKFILE_DEPS) \
148-
$$(RUNTIME_DEF_$(1)_$(2)) $$(LIBUV_LIB_$(1))
148+
$$(RUNTIME_DEF_$(1)_$(2)) $$(LIBUV_LIB_$(1)) $$(JEMALLOC_LIB_$(1))
149149
@$$(call E, link: $$@)
150150
$$(Q)$$(call CFG_LINK_CXX_$(1),$$@, $$(RUNTIME_OBJS_$(1)_$(2)) \
151-
$$(LIBUV_LIB_$(1)) \
151+
$$(JEMALLOC_LIB_$(1)) $$(CFG_GCCISH_POST_LIB_FLAGS_$(1)) $$(LIBUV_LIB_$(1)) \
152152
$$(CFG_LIBUV_LINK_FLAGS_$(1)),$$(RUNTIME_DEF_$(1)_$(2)),$$(CFG_RUNTIME_$(1)))
153153

154154
# These could go in rt.mk or rustllvm.mk, they're needed for both.
@@ -197,22 +197,27 @@ define DEF_THIRD_PARTY_TARGETS
197197
# $(1) is the target triple
198198

199199
RT_OUTPUT_DIR_$(1) := $(1)/rt
200+
JEMALLOC_TARGET_$(1) := jemalloc_pic
200201

201202
ifeq ($$(CFG_WINDOWSY_$(1)), 1)
202203
LIBUV_OSTYPE_$(1) := win
204+
JEMALLOC_TARGET_$(1) := jemalloc
203205
else ifeq ($(OSTYPE_$(1)), apple-darwin)
204206
LIBUV_OSTYPE_$(1) := mac
205207
else ifeq ($(OSTYPE_$(1)), unknown-freebsd)
206208
LIBUV_OSTYPE_$(1) := freebsd
207209
else ifeq ($(OSTYPE_$(1)), linux-androideabi)
208210
LIBUV_OSTYPE_$(1) := android
211+
JEMALLOC_ARGS_$(1) := --disable-tls
209212
LIBUV_ARGS_$(1) := PLATFORM=android host=android OS=linux
210213
else
211214
LIBUV_OSTYPE_$(1) := linux
212215
endif
213216

214217
LIBUV_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),uv)
215218
LIBUV_LIB_$(1) := $$(RT_OUTPUT_DIR_$(1))/libuv/$$(LIBUV_NAME_$(1))
219+
JEMALLOC_NAME_$(1) := $$(call CFG_STATIC_LIB_NAME_$(1),$$(JEMALLOC_TARGET_$(1)))
220+
JEMALLOC_LIB_$(1) := $$(RT_OUTPUT_DIR_$(1))/jemalloc/lib/$$(JEMALLOC_NAME_$(1))
216221

217222
LIBUV_MAKEFILE_$(1) := $$(CFG_BUILD_DIR)$$(RT_OUTPUT_DIR_$(1))/libuv/Makefile
218223

@@ -248,6 +253,16 @@ $$(LIBUV_LIB_$(1)): $$(LIBUV_DEPS) $$(LIBUV_MAKEFILE_$(1))
248253
V=$$(VERBOSE)
249254
endif
250255

256+
$$(JEMALLOC_LIB_$(1)):
257+
cd $$(RT_OUTPUT_DIR_$(1))/jemalloc; $(S)src/rt/jemalloc/configure \
258+
$$(JEMALLOC_ARGS_$(1)) \
259+
--disable-experimental --build=$(CFG_BUILD_TRIPLE) --host=$(1) \
260+
EXTRA_CFLAGS="$$(CFG_GCCISH_CFLAGS) $$(LIBUV_FLAGS_$$(HOST_$(1)))" \
261+
CC="$$(CC_$(1))" \
262+
CXX="$$(CXX_$(1))" \
263+
AR="$$(AR_$(1))"
264+
$$(Q)$$(MAKE) -C $$(RT_OUTPUT_DIR_$(1))/jemalloc build_lib_static
265+
251266
endef
252267

253268
# Instantiate template for all stages/targets

branches/try2/mk/tests.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ tidy:
265265
| grep '^$(S)src/libuv' -v \
266266
| grep '^$(S)src/gyp' -v \
267267
| grep '^$(S)src/etc' -v \
268+
| grep '^$(S)src/rt/jemalloc' -v \
268269
| xargs $(CFG_PYTHON) $(S)src/etc/check-binaries.py
269270

270271
endif

branches/try2/src/etc/gedit/share/gtksourceview-3.0/language-specs/rust.lang

Lines changed: 22 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
<keyword>u64</keyword>
8686
<keyword>f32</keyword>
8787
<keyword>f64</keyword>
88+
<keyword>float</keyword>
8889
<keyword>char</keyword>
8990
<keyword>str</keyword>
9091
<keyword>Either</keyword>
@@ -204,36 +205,16 @@
204205
</include>
205206
</context>
206207

207-
<define-regex id="int_suffix" extended="true">
208-
(i8|i16|i32|i64|i|u8|u16|u32|u64|u)
209-
</define-regex>
210-
211-
<define-regex id="exponent" extended="true">
212-
([eE][+-]?[0-9_]+)
213-
</define-regex>
214-
215-
<define-regex id="float_suffix" extended="true">
216-
(\%{exponent}?(f32|f64)?)|(\.[0-9][0-9_]*\%{exponent}?)?(f32|f64)?|\.
217-
</define-regex>
218-
219-
<define-regex id="num_suffix" extended="true">
220-
\%{int_suffix}|\%{float_suffix}
221-
</define-regex>
222-
223-
<define-regex id="hex_digit" extended="true">
224-
[0-9a-fA-F]
225-
</define-regex>
226-
227208
<context id="number" style-ref="number">
228209
<match extended="true">
229-
((?&lt;=\.\.)|(?&lt;![\w\.]))
210+
(?&lt;![\w\.])
230211
(
231-
[1-9][0-9_]*\%{num_suffix}?|
232-
0[0-9_]*\%{num_suffix}?|
233-
0b[01_]+\%{int_suffix}?|
234-
0x(\%{hex_digit}|_)+\%{int_suffix}?
212+
0x[0-9a-fA-F_]+(u8|u16|u32|u64|i8|i16|i32|i64|u|i)?|
213+
0b[0-1_]+(u8|u16|u32|u64|i8|i16|i32|i64|u|i)?|
214+
[0-9][0-9_]*\.[0-9_]*([eE][+-]?[0-9_]+)?(f32|f64|f)?|
215+
[0-9][0-9_]*(u8|u16|u32|u64|i8|i16|i32|i64|u|i)?
235216
)
236-
((?![\w\.].)|(?=\.\.))
217+
(?![\w\.])
237218
</match>
238219
</context>
239220

@@ -253,37 +234,32 @@
253234
</match>
254235
</context>
255236

256-
<define-regex id="common_escape" extended="true">
257-
'|"|
258-
\\|n|r|t|
259-
x\%{hex_digit}{2}|
260-
u\%{hex_digit}{4}|
261-
U\%{hex_digit}{8}
262-
</define-regex>
263-
264-
<context id="string_escape" style-ref="def:special-char">
265-
<match>\\\%{common_escape}</match>
266-
</context>
267-
268237
<context id="string" style-ref="string" class="string" class-disabled="no-spell-check">
269238
<start>"</start>
270239
<end>"</end>
271240
<include>
272-
<context ref="string_escape"/>
241+
<context ref="def:escape"/>
273242
<context ref="def:line-continue"/>
274243
</include>
275244
</context>
276245

277-
<context id="char" style-ref="char">
278-
<match extended="true">'([^\\']|\\\%{common_escape})'</match>
246+
<define-regex id="hex_digit" extended="true">
247+
[0-9a-fA-F]
248+
</define-regex>
249+
250+
<define-regex id="common_escape" extended="true">
251+
(n|r|t)|
252+
x\%{hex_digit}{2}|
253+
u\%{hex_digit}{4}|
254+
U\%{hex_digit}{8}
255+
</define-regex>
256+
257+
<context id="char" style-ref="char" class="char">
258+
<match extended="true">'([^\\]|\\\%{common_escape})'</match>
279259
</context>
280260

281261
<context id="attribute" style-ref="attribute" class="attribute">
282-
<start extended="true">\#\[</start>
283-
<end>\]</end>
284-
<include>
285-
<context ref="def:in-comment"/>
286-
</include>
262+
<match extended="true">\#\[[^\]]+\]</match>
287263
</context>
288264

289265
<context id="rust" class="no-spell-check">

branches/try2/src/etc/vim/syntax/rust.vim

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
" Maintainer: Patrick Walton <[email protected]>
44
" Maintainer: Ben Blum <[email protected]>
55
" Maintainer: Chris Morgan <[email protected]>
6-
" Last Change: 2013 Oct 19
6+
" Last Change: 2013 Sep 4
77

88
if version < 600
99
syntax clear
@@ -61,7 +61,6 @@ syn keyword rustEnumVariant Ok Err
6161
" Functions {{{3
6262
"syn keyword rustFunction print println
6363
"syn keyword rustFunction range
64-
"syn keyword rustFunction from_str
6564

6665
" Types and traits {{{3
6766
syn keyword rustTrait ToCStr
@@ -80,23 +79,22 @@ syn keyword rustTrait Orderable Signed Unsigned Round
8079
syn keyword rustTrait Algebraic Trigonometric Exponential Hyperbolic
8180
syn keyword rustTrait Integer Fractional Real RealExt
8281
syn keyword rustTrait Bitwise BitCount Bounded
83-
syn keyword rustTrait Primitive Int Float ToStrRadix ToPrimitive FromPrimitive
82+
syn keyword rustTrait Primitive Int Float ToStrRadix
8483
syn keyword rustTrait GenericPath
8584
syn keyword rustTrait Path
8685
syn keyword rustTrait PosixPath
8786
syn keyword rustTrait WindowsPath
8887
syn keyword rustTrait RawPtr
8988
syn keyword rustTrait Ascii AsciiCast OwnedAsciiCast AsciiStr ToBytesConsume
90-
syn keyword rustTrait SendStr SendStrOwned SendStrStatic IntoSendStr
9189
syn keyword rustTrait Str StrVector StrSlice OwnedStr
9290
syn keyword rustTrait FromStr
9391
syn keyword rustTrait IterBytes
9492
syn keyword rustTrait ToStr ToStrConsume
9593
syn keyword rustTrait CopyableTuple ImmutableTuple
96-
syn keyword rustTrait Tuple1 ImmutableTuple1
97-
syn keyword rustTrait Tuple2 Tuple3 Tuple4 Tuple5
98-
syn keyword rustTrait Tuple6 Tuple7 Tuple8 Tuple9
99-
syn keyword rustTrait Tuple10 Tuple11 Tuple12
94+
syn keyword rustTrait CloneableTuple1 ImmutableTuple1
95+
syn keyword rustTrait CloneableTuple2 CloneableTuple3 CloneableTuple4 CloneableTuple5
96+
syn keyword rustTrait CloneableTuple6 CloneableTuple7 CloneableTuple8 CloneableTuple9
97+
syn keyword rustTrait CloneableTuple10 CloneableTuple11 CloneableTuple12
10098
syn keyword rustTrait ImmutableTuple2 ImmutableTuple3 ImmutableTuple4 ImmutableTuple5
10199
syn keyword rustTrait ImmutableTuple6 ImmutableTuple7 ImmutableTuple8 ImmutableTuple9
102100
syn keyword rustTrait ImmutableTuple10 ImmutableTuple11 ImmutableTuple12
@@ -147,7 +145,7 @@ syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustFail
147145

148146
syn match rustFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlLjzt]\|ll\|hh\)\=\([aAbdiuoxXDOUfFeEgGcCsSpn?]\|\[\^\=.[^]]*\]\)" contained
149147
syn match rustFormat display "%%" contained
150-
syn match rustSpecial display contained /\\\([nrt0\\'"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)/
148+
syn match rustSpecial display contained /\\\([nrt\\'"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)/
151149
syn match rustStringContinuation display contained /\\\n\s*/
152150
syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustTodo,rustFormat,rustSpecial,rustStringContinuation
153151
syn region rustString start='r\z(#*\)"' end='"\z1'
@@ -176,13 +174,13 @@ syn match rustFloat display "\<[0-9][0-9_]*\.[0-9_]\+\%([eE][+-]\=[0-9
176174
syn match rustFloat display "\<[0-9][0-9_]*\.[0-9_]\+\%([eE][+-]\=[0-9_]\+\)\(f\|f32\|f64\)\>"
177175

178176
" For the benefit of delimitMate
179-
syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
177+
syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
180178
syn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
181179
syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
182180

183181
"rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting
184182
syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
185-
syn match rustCharacter /'\([^'\\]\|\\\([nrt0\\'"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustSpecial
183+
syn match rustCharacter /'\([^'\\]\|\\\([nrt\\'"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustSpecial
186184

187185
syn region rustCommentML start="/\*" end="\*/" contains=rustTodo
188186
syn region rustComment start="//" end="$" contains=rustTodo keepend

branches/try2/src/libextra/arc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@ mod tests {
823823
do 5.times {
824824
let arc3 = arc.clone();
825825
let mut builder = task::task();
826-
children.push(builder.future_result());
826+
builder.future_result(|r| children.push(r));
827827
do builder.spawn {
828828
do arc3.read |num| {
829829
assert!(*num >= 0);

0 commit comments

Comments
 (0)