From 48f5f77713db6cb9d13495f0b780a62dbad2a9a7 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 25 Mar 2010 09:53:58 -0700 Subject: [PATCH] Update to V8 2.1.9.1 --- deps/v8/ChangeLog | 17 + deps/v8/SConstruct | 25 +- deps/v8/include/v8-debug.h | 15 +- deps/v8/include/v8.h | 76 +- deps/v8/src/SConscript | 18 +- deps/v8/src/api.cc | 97 +- deps/v8/src/api.h | 12 +- deps/v8/src/apinatives.js | 2 +- deps/v8/src/arm/assembler-arm.cc | 245 +- deps/v8/src/arm/assembler-arm.h | 33 +- deps/v8/src/arm/codegen-arm.cc | 285 +- deps/v8/src/arm/codegen-arm.h | 44 +- deps/v8/src/arm/constants-arm.cc | 24 +- deps/v8/src/arm/constants-arm.h | 20 +- deps/v8/src/arm/cpu-arm.cc | 2 +- deps/v8/src/arm/disasm-arm.cc | 242 +- deps/v8/src/arm/full-codegen-arm.cc | 8 +- deps/v8/src/arm/ic-arm.cc | 724 ++++- deps/v8/src/arm/jump-target-arm.cc | 31 +- deps/v8/src/arm/macro-assembler-arm.cc | 54 +- deps/v8/src/arm/macro-assembler-arm.h | 12 + deps/v8/src/arm/simulator-arm.cc | 346 ++- deps/v8/src/arm/simulator-arm.h | 5 + deps/v8/src/arm/virtual-frame-arm.cc | 21 +- deps/v8/src/arm/virtual-frame-arm.h | 67 +- deps/v8/src/assembler.cc | 10 + deps/v8/src/assembler.h | 3 + deps/v8/src/ast.cc | 661 ++++- deps/v8/src/ast.h | 209 +- deps/v8/src/bootstrapper.cc | 669 ++--- deps/v8/src/bootstrapper.h | 32 +- deps/v8/src/builtins.cc | 44 +- deps/v8/src/circular-queue-inl.h | 9 +- deps/v8/src/circular-queue.cc | 86 +- deps/v8/src/circular-queue.h | 15 +- deps/v8/src/codegen.cc | 36 +- deps/v8/src/codegen.h | 31 +- deps/v8/src/compilation-cache.cc | 136 +- deps/v8/src/compilation-cache.h | 18 +- deps/v8/src/compiler.cc | 198 +- deps/v8/src/compiler.h | 41 +- deps/v8/src/contexts.h | 2 - deps/v8/src/conversions-inl.h | 18 - deps/v8/src/conversions.h | 7 +- deps/v8/src/cpu-profiler.cc | 2 - deps/v8/src/cpu-profiler.h | 3 - deps/v8/src/d8.cc | 9 +- deps/v8/src/data-flow.cc | 289 +- deps/v8/src/data-flow.h | 168 +- deps/v8/src/date.js | 1090 ++++++++ deps/v8/src/debug-debugger.js | 2132 +++++++++++++++ deps/v8/src/debug.cc | 60 +- deps/v8/src/factory.cc | 67 +- deps/v8/src/factory.h | 22 +- deps/v8/src/fast-codegen.cc | 10 +- deps/v8/src/flag-definitions.h | 8 +- deps/v8/src/frame-element.h | 44 +- deps/v8/src/frames.cc | 2 + deps/v8/src/full-codegen.cc | 14 +- deps/v8/src/globals.h | 16 +- deps/v8/src/handles.cc | 100 +- deps/v8/src/handles.h | 14 +- deps/v8/src/heap-inl.h | 4 +- deps/v8/src/heap.cc | 73 +- deps/v8/src/heap.h | 42 +- deps/v8/src/ia32/codegen-ia32.cc | 859 ++++-- deps/v8/src/ia32/codegen-ia32.h | 19 +- deps/v8/src/ia32/fast-codegen-ia32.cc | 10 +- deps/v8/src/ia32/full-codegen-ia32.cc | 12 +- deps/v8/src/ia32/ic-ia32.cc | 24 - deps/v8/src/ia32/register-allocator-ia32.cc | 4 +- deps/v8/src/ia32/virtual-frame-ia32.cc | 47 +- deps/v8/src/ia32/virtual-frame-ia32.h | 22 +- deps/v8/src/ic.cc | 17 +- deps/v8/src/json.js | 268 ++ deps/v8/src/jsregexp.cc | 20 +- deps/v8/src/jump-target-heavy-inl.h | 51 + deps/v8/src/jump-target-heavy.cc | 363 +++ deps/v8/src/jump-target-inl.h | 19 +- deps/v8/src/jump-target-light-inl.h | 42 + deps/v8/src/jump-target-light.cc | 99 + deps/v8/src/jump-target.cc | 268 -- deps/v8/src/jump-target.h | 5 + deps/v8/src/liveedit-debugger.js | 431 +++ deps/v8/src/liveedit.h | 2 +- deps/v8/src/macros.py | 7 +- deps/v8/src/messages.js | 18 +- deps/v8/src/mips/builtins-mips.cc | 95 +- deps/v8/src/mips/codegen-mips-inl.h | 26 +- deps/v8/src/mips/codegen-mips.cc | 953 ++++++- deps/v8/src/mips/codegen-mips.h | 119 +- deps/v8/src/mips/frames-mips.cc | 3 +- deps/v8/src/mips/frames-mips.h | 2 +- deps/v8/src/mips/ic-mips.cc | 41 + deps/v8/src/mips/jump-target-mips.cc | 92 +- deps/v8/src/mips/macro-assembler-mips.cc | 465 +++- deps/v8/src/mips/macro-assembler-mips.h | 95 +- deps/v8/src/mips/stub-cache-mips.cc | 47 +- deps/v8/src/mips/virtual-frame-mips.cc | 122 +- deps/v8/src/mips/virtual-frame-mips.h | 89 +- deps/v8/src/mirror-debugger.js | 2362 +++++++++++++++++ deps/v8/src/mksnapshot.cc | 101 +- deps/v8/src/natives.h | 12 +- deps/v8/src/objects-debug.cc | 3 - deps/v8/src/objects-inl.h | 9 +- deps/v8/src/objects.cc | 68 +- deps/v8/src/objects.h | 41 +- deps/v8/src/parser.cc | 53 +- deps/v8/src/platform-freebsd.cc | 3 +- deps/v8/src/platform-linux.cc | 3 +- deps/v8/src/platform-openbsd.cc | 3 +- deps/v8/src/platform-win32.cc | 2 +- deps/v8/src/prettyprinter.cc | 31 +- deps/v8/src/prettyprinter.h | 3 +- deps/v8/src/property.h | 9 - deps/v8/src/regexp.js | 528 ++++ deps/v8/src/register-allocator-inl.h | 26 +- deps/v8/src/register-allocator.cc | 4 +- deps/v8/src/register-allocator.h | 20 +- deps/v8/src/rewriter.cc | 8 +- deps/v8/src/runtime.cc | 720 ++++- deps/v8/src/runtime.h | 1 + deps/v8/src/serialize.cc | 40 +- deps/v8/src/serialize.h | 58 +- deps/v8/src/snapshot-common.cc | 20 + deps/v8/src/snapshot-empty.cc | 12 +- deps/v8/src/snapshot.h | 14 +- deps/v8/src/spaces.cc | 3 + deps/v8/src/string.js | 170 +- deps/v8/src/stub-cache.h | 16 + deps/v8/src/top.cc | 2 +- deps/v8/src/type-info-inl.h | 55 + deps/v8/src/type-info.h | 239 ++ deps/v8/src/v8-counters.h | 7 +- deps/v8/src/v8.cc | 12 +- deps/v8/src/v8natives.js | 28 +- deps/v8/src/variables.h | 2 - deps/v8/src/version.cc | 4 +- deps/v8/src/virtual-frame-heavy-inl.h | 136 + deps/v8/src/virtual-frame-heavy.cc | 298 +++ deps/v8/src/virtual-frame-inl.h | 89 +- deps/v8/src/virtual-frame-light-inl.h | 95 + deps/v8/src/virtual-frame-light.cc | 52 + deps/v8/src/virtual-frame.cc | 278 -- deps/v8/src/x64/codegen-x64.cc | 175 +- deps/v8/src/x64/codegen-x64.h | 10 +- deps/v8/src/x64/full-codegen-x64.cc | 8 +- deps/v8/src/x64/ic-x64.cc | 22 - deps/v8/src/x64/register-allocator-x64.cc | 4 +- deps/v8/src/x64/virtual-frame-x64.cc | 39 +- deps/v8/src/x64/virtual-frame-x64.h | 24 +- deps/v8/test/cctest/SConscript | 2 +- deps/v8/test/cctest/cctest.status | 2 +- deps/v8/test/cctest/test-api.cc | 140 +- deps/v8/test/cctest/test-assembler-arm.cc | 3 - deps/v8/test/cctest/test-assembler-mips.cc | 4 +- deps/v8/test/cctest/test-circular-queue.cc | 102 +- deps/v8/test/cctest/test-compiler.cc | 6 +- deps/v8/test/cctest/test-cpu-profiler.cc | 6 - deps/v8/test/cctest/test-debug.cc | 8 +- .../test/cctest/test-func-name-inference.cc | 12 +- deps/v8/test/cctest/test-heap.cc | 43 + deps/v8/test/cctest/test-log-stack-tracer.cc | 66 +- deps/v8/test/cctest/test-mips.cc | 52 + deps/v8/test/cctest/test-serialize.cc | 212 +- deps/v8/test/mjsunit/codegen-coverage.js | 13 + deps/v8/test/mjsunit/date.js | 6 + deps/v8/test/mjsunit/debug-script.js | 2 +- deps/v8/test/mjsunit/div-mod.js | 21 + .../mjsunit/regress/regress-crbug-39160.js | 41 + deps/v8/tools/gyp/v8.gyp | 29 +- deps/v8/tools/js2c.py | 44 +- deps/v8/tools/v8.xcodeproj/project.pbxproj | 20 + deps/v8/tools/visual_studio/js2c.cmd | 2 +- deps/v8/tools/visual_studio/v8.vcproj | 16 +- deps/v8/tools/visual_studio/v8_arm.vcproj | 16 +- deps/v8/tools/visual_studio/v8_base.vcproj | 52 +- .../v8/tools/visual_studio/v8_base_arm.vcproj | 32 +- .../v8/tools/visual_studio/v8_base_x64.vcproj | 28 +- deps/v8/tools/visual_studio/v8_x64.vcproj | 16 +- 180 files changed, 16938 insertions(+), 3555 deletions(-) create mode 100644 deps/v8/src/date.js create mode 100644 deps/v8/src/debug-debugger.js create mode 100644 deps/v8/src/json.js create mode 100644 deps/v8/src/jump-target-heavy-inl.h create mode 100644 deps/v8/src/jump-target-heavy.cc create mode 100644 deps/v8/src/jump-target-light-inl.h create mode 100644 deps/v8/src/jump-target-light.cc create mode 100644 deps/v8/src/liveedit-debugger.js create mode 100644 deps/v8/src/mirror-debugger.js create mode 100644 deps/v8/src/regexp.js create mode 100644 deps/v8/src/type-info-inl.h create mode 100644 deps/v8/src/type-info.h create mode 100644 deps/v8/src/virtual-frame-heavy-inl.h create mode 100644 deps/v8/src/virtual-frame-heavy.cc create mode 100644 deps/v8/src/virtual-frame-light-inl.h create mode 100644 deps/v8/src/virtual-frame-light.cc create mode 100644 deps/v8/test/cctest/test-mips.cc create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-39160.js diff --git a/deps/v8/ChangeLog b/deps/v8/ChangeLog index 0786ed9296..5b1240df8b 100644 --- a/deps/v8/ChangeLog +++ b/deps/v8/ChangeLog @@ -1,3 +1,20 @@ +2010-03-25: Version 2.1.9 + + Added API support for reattaching a global object to a context. + + Extended debugger API with access to the internal debugger context. + + Fixed Chromium crashes (issues http://crbug.com/39128 and + http://crbug.com/39160) + + +2010-03-24: Version 2.1.8 + + Added fine-grained garbage collection callbacks to the API. + + Performance improvements on all platforms. + + 2010-03-22: Version 2.1.7 Fixed issue 650. diff --git a/deps/v8/SConstruct b/deps/v8/SConstruct index dd26cb4147..bef64eb2d4 100644 --- a/deps/v8/SConstruct +++ b/deps/v8/SConstruct @@ -90,7 +90,7 @@ ANDROID_LINKFLAGS = ['-nostdlib', '-Wl,-z,nocopyreloc', '-Wl,-rpath-link=' + ANDROID_TOP + '/out/target/product/generic/obj/lib', ANDROID_TOP + '/out/target/product/generic/obj/lib/crtbegin_dynamic.o', - ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a', + ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork/libgcc.a', ANDROID_TOP + '/out/target/product/generic/obj/lib/crtend_android.o']; LIBRARY_FLAGS = { @@ -275,6 +275,7 @@ V8_EXTRA_FLAGS = { 'gcc': { 'all': { 'WARNINGFLAGS': ['-Wall', + '-Werror', '-W', '-Wno-unused-parameter', '-Wnon-virtual-dtor'] @@ -370,7 +371,6 @@ DTOA_EXTRA_FLAGS = { CCTEST_EXTRA_FLAGS = { 'all': { 'CPPPATH': [join(root_dir, 'src')], - 'LIBS': ['$LIBRARY'] }, 'gcc': { 'all': { @@ -400,9 +400,10 @@ CCTEST_EXTRA_FLAGS = { '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'], 'CCFLAGS': ANDROID_FLAGS, 'CPPPATH': ANDROID_INCLUDES, - 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib'], + 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib', + ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'], 'LINKFLAGS': ANDROID_LINKFLAGS, - 'LIBS': ['log', 'c', 'stdc++', 'm'], + 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'], 'mode:release': { 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG'] } @@ -430,7 +431,6 @@ CCTEST_EXTRA_FLAGS = { SAMPLE_FLAGS = { 'all': { 'CPPPATH': [join(abspath('.'), 'include')], - 'LIBS': ['$LIBRARY'], }, 'gcc': { 'all': { @@ -464,9 +464,10 @@ SAMPLE_FLAGS = { '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'], 'CCFLAGS': ANDROID_FLAGS, 'CPPPATH': ANDROID_INCLUDES, - 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib'], + 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib', + ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'], 'LINKFLAGS': ANDROID_LINKFLAGS, - 'LIBS': ['log', 'c', 'stdc++', 'm'], + 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'], 'mode:release': { 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG'] } @@ -589,9 +590,10 @@ D8_FLAGS = { 'LIBS': ['pthread'], }, 'os:android': { - 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib'], + 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib', + ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'], 'LINKFLAGS': ANDROID_LINKFLAGS, - 'LIBS': ['log', 'c', 'stdc++', 'm'], + 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'], }, 'os:win32': { 'LIBS': ['winmm', 'ws2_32'], @@ -987,7 +989,6 @@ def BuildSpecific(env, mode, env_overrides): if context.options['soname'] == 'on': # When building shared object with SONAME version the library name. library_name += '-' + version - env['LIBRARY'] = library_name # Generate library SONAME if required by the build. if context.options['soname'] == 'on': @@ -1008,6 +1009,7 @@ def BuildSpecific(env, mode, env_overrides): # Link the object files into a library. env.Replace(**context.flags['v8']) + env.Prepend(LIBS=[library_name]) context.ApplyEnvOverrides(env) if context.options['library'] == 'static': @@ -1027,8 +1029,9 @@ def BuildSpecific(env, mode, env_overrides): context.d8_targets.append(shell) for sample in context.samples: - sample_env = Environment(LIBRARY=library_name) + sample_env = Environment() sample_env.Replace(**context.flags['sample']) + sample_env.Prepend(LIBS=[library_name]) context.ApplyEnvOverrides(sample_env) sample_object = sample_env.SConscript( join('samples', 'SConscript'), diff --git a/deps/v8/include/v8-debug.h b/deps/v8/include/v8-debug.h index 2e5fb3fde9..f7b4fa12e3 100644 --- a/deps/v8/include/v8-debug.h +++ b/deps/v8/include/v8-debug.h @@ -237,9 +237,10 @@ class EXPORT Debug { * With this call the debugger is entered and the function specified is called * with the execution state as the first argument. This makes it possible to * get access to information otherwise not available during normal JavaScript - * execution e.g. details on stack frames. The following example show a - * JavaScript function which when passed to v8::Debug::Call will return the - * current line of JavaScript execution. + * execution e.g. details on stack frames. Receiver of the function call will + * be the debugger context global object, however this is a subject to change. + * The following example show a JavaScript function which when passed to + * v8::Debug::Call will return the current line of JavaScript execution. * * \code * function frame_source_line(exec_state) { @@ -302,6 +303,14 @@ class EXPORT Debug { * of this method. */ static void ProcessDebugMessages(); + + /** + * Debugger is running in it's own context which is entered while debugger + * messages are being dispatched. This is an explicit getter for this + * debugger context. Note that the content of the debugger context is subject + * to change. + */ + static Local GetDebugContext(); }; diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index bed86cabd0..7b42178782 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -2158,12 +2158,26 @@ typedef void (*FailedAccessCheckCallback)(Local target, // --- G a r b a g e C o l l e c t i o n C a l l b a c k s /** - * Applications can register a callback function which is called - * before and after a major garbage collection. Allocations are not - * allowed in the callback function, you therefore cannot manipulate + * Applications can register callback functions which will be called + * before and after a garbage collection. Allocations are not + * allowed in the callback functions, you therefore cannot manipulate * objects (set or delete properties for example) since it is possible * such operations will result in the allocation of objects. */ +enum GCType { + kGCTypeScavenge = 1 << 0, + kGCTypeMarkSweepCompact = 1 << 1, + kGCTypeAll = kGCTypeScavenge | kGCTypeMarkSweepCompact +}; + +enum GCCallbackFlags { + kNoGCCallbackFlags = 0, + kGCCallbackFlagCompacted = 1 << 0 +}; + +typedef void (*GCPrologueCallback)(GCType type, GCCallbackFlags flags); +typedef void (*GCEpilogueCallback)(GCType type, GCCallbackFlags flags); + typedef void (*GCCallback)(); @@ -2299,7 +2313,27 @@ class V8EXPORT V8 { /** * Enables the host application to receive a notification before a - * major garbage colletion. Allocations are not allowed in the + * garbage collection. Allocations are not allowed in the + * callback function, you therefore cannot manipulate objects (set + * or delete properties for example) since it is possible such + * operations will result in the allocation of objects. It is possible + * to specify the GCType filter for your callback. But it is not possible to + * register the same callback function two times with different + * GCType filters. + */ + static void AddGCPrologueCallback( + GCPrologueCallback callback, GCType gc_type_filter = kGCTypeAll); + + /** + * This function removes callback which was installed by + * AddGCPrologueCallback function. + */ + static void RemoveGCPrologueCallback(GCPrologueCallback callback); + + /** + * The function is deprecated. Please use AddGCPrologueCallback instead. + * Enables the host application to receive a notification before a + * garbage collection. Allocations are not allowed in the * callback function, you therefore cannot manipulate objects (set * or delete properties for example) since it is possible such * operations will result in the allocation of objects. @@ -2307,6 +2341,26 @@ class V8EXPORT V8 { static void SetGlobalGCPrologueCallback(GCCallback); /** + * Enables the host application to receive a notification after a + * garbage collection. Allocations are not allowed in the + * callback function, you therefore cannot manipulate objects (set + * or delete properties for example) since it is possible such + * operations will result in the allocation of objects. It is possible + * to specify the GCType filter for your callback. But it is not possible to + * register the same callback function two times with different + * GCType filters. + */ + static void AddGCEpilogueCallback( + GCEpilogueCallback callback, GCType gc_type_filter = kGCTypeAll); + + /** + * This function removes callback which was installed by + * AddGCEpilogueCallback function. + */ + static void RemoveGCEpilogueCallback(GCEpilogueCallback callback); + + /** + * The function is deprecated. Please use AddGCEpilogueCallback instead. * Enables the host application to receive a notification after a * major garbage collection. Allocations are not allowed in the * callback function, you therefore cannot manipulate objects (set @@ -2681,9 +2735,21 @@ class V8EXPORT Context { */ void DetachGlobal(); + /** + * Reattaches a global object to a context. This can be used to + * restore the connection between a global object and a context + * after DetachGlobal has been called. + * + * \param global_object The global object to reattach to the + * context. For this to work, the global object must be the global + * object that was associated with this context before a call to + * DetachGlobal. + */ + void ReattachGlobal(Handle global_object); + /** Creates a new context. */ static Persistent New( - ExtensionConfiguration* extensions = 0, + ExtensionConfiguration* extensions = NULL, Handle global_template = Handle(), Handle global_object = Handle()); diff --git a/deps/v8/src/SConscript b/deps/v8/src/SConscript index bf42fd4e61..e7f6efd143 100755 --- a/deps/v8/src/SConscript +++ b/deps/v8/src/SConscript @@ -113,6 +113,8 @@ SOURCES = { """), 'arch:arm': Split(""" fast-codegen.cc + jump-target-light.cc + virtual-frame-light.cc arm/builtins-arm.cc arm/codegen-arm.cc arm/constants-arm.cc @@ -156,6 +158,8 @@ SOURCES = { mips/virtual-frame-mips.cc """), 'arch:ia32': Split(""" + jump-target-heavy.cc + virtual-frame-heavy.cc ia32/assembler-ia32.cc ia32/builtins-ia32.cc ia32/codegen-ia32.cc @@ -175,6 +179,8 @@ SOURCES = { """), 'arch:x64': Split(""" fast-codegen.cc + jump-target-heavy.cc + virtual-frame-heavy.cc x64/assembler-x64.cc x64/builtins-x64.cc x64/codegen-x64.cc @@ -252,12 +258,12 @@ uri.js math.js messages.js apinatives.js -debug-delay.js -liveedit-delay.js -mirror-delay.js -date-delay.js -regexp-delay.js -json-delay.js +date.js +regexp.js +json.js +liveedit-debugger.js +mirror-debugger.js +debug-debugger.js '''.split() diff --git a/deps/v8/src/api.cc b/deps/v8/src/api.cc index b2f0e03406..2100480e85 100644 --- a/deps/v8/src/api.cc +++ b/deps/v8/src/api.cc @@ -537,10 +537,17 @@ i::Object** v8::HandleScope::RawClose(i::Object** value) { LOG_API("CloseHandleScope"); // Read the result before popping the handle block. - i::Object* result = *value; + i::Object* result = NULL; + if (value != NULL) { + result = *value; + } is_closed_ = true; i::HandleScope::Leave(&previous_); + if (value == NULL) { + return NULL; + } + // Allocate a new handle on the previous handle block. i::Handle handle(result); return handle.location(); @@ -1136,7 +1143,7 @@ Local