libv8 3.3.10.4 → 3.5.10.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/libv8/scons/CHANGES.txt +24 -231
- data/lib/libv8/scons/LICENSE.txt +1 -1
- data/lib/libv8/scons/MANIFEST +0 -1
- data/lib/libv8/scons/PKG-INFO +1 -1
- data/lib/libv8/scons/README.txt +9 -9
- data/lib/libv8/scons/RELEASE.txt +75 -77
- data/lib/libv8/scons/engine/SCons/Action.py +6 -22
- data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
- data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
- data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
- data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
- data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
- data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
- data/lib/libv8/scons/engine/SCons/Job.py +2 -2
- data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
- data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
- data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
- data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
- data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
- data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
- data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
- data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
- data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
- data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
- data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
- data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
- data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
- data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
- data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
- data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
- data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
- data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
- data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
- data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
- data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
- data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
- data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Util.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
- data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
- data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
- data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
- data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
- data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
- data/lib/libv8/scons/scons-time.1 +3 -3
- data/lib/libv8/scons/scons.1 +1164 -1170
- data/lib/libv8/scons/sconsign.1 +3 -3
- data/lib/libv8/scons/script/scons +22 -22
- data/lib/libv8/scons/script/scons-time +2 -2
- data/lib/libv8/scons/script/scons.bat +4 -7
- data/lib/libv8/scons/script/sconsign +20 -21
- data/lib/libv8/scons/setup.cfg +1 -0
- data/lib/libv8/scons/setup.py +40 -38
- data/lib/libv8/v8/.gitignore +1 -1
- data/lib/libv8/v8/AUTHORS +2 -0
- data/lib/libv8/v8/ChangeLog +387 -0
- data/lib/libv8/v8/Makefile +171 -0
- data/lib/libv8/v8/SConstruct +124 -51
- data/lib/libv8/v8/build/README.txt +31 -14
- data/lib/libv8/v8/build/all.gyp +11 -4
- data/lib/libv8/v8/build/armu.gypi +6 -2
- data/lib/libv8/v8/build/common.gypi +240 -94
- data/lib/libv8/v8/build/gyp_v8 +32 -4
- data/lib/libv8/v8/build/standalone.gypi +200 -0
- data/lib/libv8/v8/include/v8-debug.h +0 -0
- data/lib/libv8/v8/include/v8-profiler.h +8 -11
- data/lib/libv8/v8/include/v8.h +191 -108
- data/lib/libv8/v8/preparser/SConscript +2 -2
- data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
- data/lib/libv8/v8/preparser/preparser.gyp +42 -0
- data/lib/libv8/v8/src/SConscript +33 -8
- data/lib/libv8/v8/src/accessors.cc +77 -43
- data/lib/libv8/v8/src/api.cc +393 -191
- data/lib/libv8/v8/src/api.h +4 -8
- data/lib/libv8/v8/src/apinatives.js +15 -3
- data/lib/libv8/v8/src/arguments.h +8 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
- data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
- data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
- data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
- data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
- data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
- data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
- data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
- data/lib/libv8/v8/src/array.js +38 -18
- data/lib/libv8/v8/src/assembler.cc +12 -5
- data/lib/libv8/v8/src/assembler.h +15 -9
- data/lib/libv8/v8/src/ast-inl.h +34 -25
- data/lib/libv8/v8/src/ast.cc +141 -72
- data/lib/libv8/v8/src/ast.h +255 -181
- data/lib/libv8/v8/src/bignum.cc +3 -4
- data/lib/libv8/v8/src/bootstrapper.cc +55 -11
- data/lib/libv8/v8/src/bootstrapper.h +3 -2
- data/lib/libv8/v8/src/builtins.cc +8 -2
- data/lib/libv8/v8/src/builtins.h +4 -0
- data/lib/libv8/v8/src/cached-powers.cc +8 -4
- data/lib/libv8/v8/src/checks.h +3 -3
- data/lib/libv8/v8/src/code-stubs.cc +173 -28
- data/lib/libv8/v8/src/code-stubs.h +104 -148
- data/lib/libv8/v8/src/codegen.cc +8 -8
- data/lib/libv8/v8/src/compilation-cache.cc +2 -47
- data/lib/libv8/v8/src/compilation-cache.h +0 -10
- data/lib/libv8/v8/src/compiler.cc +27 -16
- data/lib/libv8/v8/src/compiler.h +13 -18
- data/lib/libv8/v8/src/contexts.cc +107 -72
- data/lib/libv8/v8/src/contexts.h +70 -34
- data/lib/libv8/v8/src/conversions-inl.h +572 -14
- data/lib/libv8/v8/src/conversions.cc +9 -707
- data/lib/libv8/v8/src/conversions.h +23 -12
- data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
- data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
- data/lib/libv8/v8/src/cpu-profiler.h +8 -17
- data/lib/libv8/v8/src/d8-debug.cc +5 -3
- data/lib/libv8/v8/src/d8-debug.h +6 -7
- data/lib/libv8/v8/src/d8-posix.cc +1 -10
- data/lib/libv8/v8/src/d8.cc +721 -219
- data/lib/libv8/v8/src/d8.gyp +37 -12
- data/lib/libv8/v8/src/d8.h +141 -19
- data/lib/libv8/v8/src/d8.js +17 -8
- data/lib/libv8/v8/src/date.js +16 -5
- data/lib/libv8/v8/src/dateparser-inl.h +242 -39
- data/lib/libv8/v8/src/dateparser.cc +38 -4
- data/lib/libv8/v8/src/dateparser.h +170 -28
- data/lib/libv8/v8/src/debug-agent.cc +5 -3
- data/lib/libv8/v8/src/debug-agent.h +11 -7
- data/lib/libv8/v8/src/debug-debugger.js +65 -34
- data/lib/libv8/v8/src/debug.cc +30 -60
- data/lib/libv8/v8/src/debug.h +5 -3
- data/lib/libv8/v8/src/deoptimizer.cc +227 -10
- data/lib/libv8/v8/src/deoptimizer.h +133 -9
- data/lib/libv8/v8/src/disassembler.cc +22 -14
- data/lib/libv8/v8/src/diy-fp.cc +4 -3
- data/lib/libv8/v8/src/diy-fp.h +3 -3
- data/lib/libv8/v8/src/elements.cc +634 -0
- data/lib/libv8/v8/src/elements.h +95 -0
- data/lib/libv8/v8/src/execution.cc +5 -21
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
- data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
- data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
- data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
- data/lib/libv8/v8/src/factory.cc +89 -18
- data/lib/libv8/v8/src/factory.h +36 -8
- data/lib/libv8/v8/src/flag-definitions.h +11 -44
- data/lib/libv8/v8/src/frames-inl.h +8 -1
- data/lib/libv8/v8/src/frames.cc +39 -3
- data/lib/libv8/v8/src/frames.h +10 -3
- data/lib/libv8/v8/src/full-codegen.cc +311 -293
- data/lib/libv8/v8/src/full-codegen.h +183 -143
- data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
- data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
- data/lib/libv8/v8/src/gdb-jit.cc +658 -55
- data/lib/libv8/v8/src/gdb-jit.h +6 -2
- data/lib/libv8/v8/src/global-handles.cc +368 -312
- data/lib/libv8/v8/src/global-handles.h +29 -36
- data/lib/libv8/v8/src/globals.h +3 -1
- data/lib/libv8/v8/src/handles.cc +43 -69
- data/lib/libv8/v8/src/handles.h +21 -16
- data/lib/libv8/v8/src/heap-inl.h +11 -13
- data/lib/libv8/v8/src/heap-profiler.cc +0 -999
- data/lib/libv8/v8/src/heap-profiler.h +0 -303
- data/lib/libv8/v8/src/heap.cc +366 -141
- data/lib/libv8/v8/src/heap.h +87 -26
- data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
- data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
- data/lib/libv8/v8/src/hydrogen.cc +1146 -629
- data/lib/libv8/v8/src/hydrogen.h +100 -64
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
- data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
- data/lib/libv8/v8/src/ic.cc +198 -234
- data/lib/libv8/v8/src/ic.h +32 -30
- data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
- data/lib/libv8/v8/src/isolate.cc +112 -95
- data/lib/libv8/v8/src/isolate.h +55 -71
- data/lib/libv8/v8/src/json-parser.h +486 -48
- data/lib/libv8/v8/src/json.js +28 -23
- data/lib/libv8/v8/src/jsregexp.cc +163 -208
- data/lib/libv8/v8/src/jsregexp.h +0 -1
- data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
- data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
- data/lib/libv8/v8/src/lithium-allocator.h +8 -8
- data/lib/libv8/v8/src/lithium.cc +16 -11
- data/lib/libv8/v8/src/lithium.h +31 -34
- data/lib/libv8/v8/src/liveedit.cc +111 -15
- data/lib/libv8/v8/src/liveedit.h +3 -4
- data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
- data/lib/libv8/v8/src/liveobjectlist.h +2 -2
- data/lib/libv8/v8/src/log-inl.h +0 -4
- data/lib/libv8/v8/src/log-utils.cc +25 -143
- data/lib/libv8/v8/src/log-utils.h +13 -92
- data/lib/libv8/v8/src/log.cc +26 -249
- data/lib/libv8/v8/src/log.h +6 -17
- data/lib/libv8/v8/src/macros.py +9 -6
- data/lib/libv8/v8/src/mark-compact.cc +276 -56
- data/lib/libv8/v8/src/mark-compact.h +20 -0
- data/lib/libv8/v8/src/messages.js +93 -39
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
- data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
- data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
- data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
- data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
- data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
- data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
- data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
- data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
- data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
- data/lib/libv8/v8/src/mirror-debugger.js +55 -8
- data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
- data/lib/libv8/v8/src/mksnapshot.cc +36 -4
- data/lib/libv8/v8/src/natives.h +5 -2
- data/lib/libv8/v8/src/objects-debug.cc +73 -6
- data/lib/libv8/v8/src/objects-inl.h +529 -164
- data/lib/libv8/v8/src/objects-printer.cc +67 -12
- data/lib/libv8/v8/src/objects-visiting.cc +13 -2
- data/lib/libv8/v8/src/objects-visiting.h +41 -1
- data/lib/libv8/v8/src/objects.cc +2200 -1177
- data/lib/libv8/v8/src/objects.h +912 -283
- data/lib/libv8/v8/src/parser.cc +566 -371
- data/lib/libv8/v8/src/parser.h +35 -33
- data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
- data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
- data/lib/libv8/v8/src/platform-linux.cc +60 -57
- data/lib/libv8/v8/src/platform-macos.cc +4 -27
- data/lib/libv8/v8/src/platform-nullos.cc +3 -16
- data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
- data/lib/libv8/v8/src/platform-posix.cc +43 -1
- data/lib/libv8/v8/src/platform-solaris.cc +151 -112
- data/lib/libv8/v8/src/platform-tls.h +1 -1
- data/lib/libv8/v8/src/platform-win32.cc +65 -39
- data/lib/libv8/v8/src/platform.h +17 -14
- data/lib/libv8/v8/src/preparse-data-format.h +2 -2
- data/lib/libv8/v8/src/preparse-data.h +8 -2
- data/lib/libv8/v8/src/preparser-api.cc +2 -18
- data/lib/libv8/v8/src/preparser.cc +106 -65
- data/lib/libv8/v8/src/preparser.h +26 -5
- data/lib/libv8/v8/src/prettyprinter.cc +25 -43
- data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
- data/lib/libv8/v8/src/profile-generator.cc +213 -34
- data/lib/libv8/v8/src/profile-generator.h +9 -9
- data/lib/libv8/v8/src/property.h +1 -0
- data/lib/libv8/v8/src/proxy.js +74 -4
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
- data/lib/libv8/v8/src/regexp.js +16 -11
- data/lib/libv8/v8/src/rewriter.cc +24 -133
- data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
- data/lib/libv8/v8/src/runtime-profiler.h +5 -31
- data/lib/libv8/v8/src/runtime.cc +1450 -681
- data/lib/libv8/v8/src/runtime.h +47 -31
- data/lib/libv8/v8/src/runtime.js +2 -1
- data/lib/libv8/v8/src/scanner-base.cc +358 -220
- data/lib/libv8/v8/src/scanner-base.h +30 -138
- data/lib/libv8/v8/src/scanner.cc +0 -18
- data/lib/libv8/v8/src/scanner.h +0 -15
- data/lib/libv8/v8/src/scopeinfo.cc +3 -1
- data/lib/libv8/v8/src/scopeinfo.h +1 -6
- data/lib/libv8/v8/src/scopes.cc +243 -253
- data/lib/libv8/v8/src/scopes.h +58 -109
- data/lib/libv8/v8/src/serialize.cc +12 -54
- data/lib/libv8/v8/src/serialize.h +47 -0
- data/lib/libv8/v8/src/small-pointer-list.h +25 -0
- data/lib/libv8/v8/src/spaces-inl.h +4 -50
- data/lib/libv8/v8/src/spaces.cc +64 -131
- data/lib/libv8/v8/src/spaces.h +19 -70
- data/lib/libv8/v8/src/string-stream.cc +3 -1
- data/lib/libv8/v8/src/string.js +10 -6
- data/lib/libv8/v8/src/strtod.cc +7 -3
- data/lib/libv8/v8/src/stub-cache.cc +59 -129
- data/lib/libv8/v8/src/stub-cache.h +42 -54
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
- data/lib/libv8/v8/src/token.cc +4 -4
- data/lib/libv8/v8/src/token.h +6 -5
- data/lib/libv8/v8/src/type-info.cc +173 -129
- data/lib/libv8/v8/src/type-info.h +40 -22
- data/lib/libv8/v8/src/utils.cc +25 -304
- data/lib/libv8/v8/src/utils.h +118 -3
- data/lib/libv8/v8/src/v8-counters.h +3 -6
- data/lib/libv8/v8/src/v8.cc +34 -27
- data/lib/libv8/v8/src/v8.h +7 -7
- data/lib/libv8/v8/src/v8conversions.cc +129 -0
- data/lib/libv8/v8/src/v8conversions.h +60 -0
- data/lib/libv8/v8/src/v8globals.h +15 -6
- data/lib/libv8/v8/src/v8natives.js +300 -78
- data/lib/libv8/v8/src/v8threads.cc +14 -6
- data/lib/libv8/v8/src/v8threads.h +4 -1
- data/lib/libv8/v8/src/v8utils.cc +360 -0
- data/lib/libv8/v8/src/v8utils.h +17 -66
- data/lib/libv8/v8/src/variables.cc +7 -12
- data/lib/libv8/v8/src/variables.h +12 -10
- data/lib/libv8/v8/src/version.cc +2 -2
- data/lib/libv8/v8/src/vm-state-inl.h +0 -41
- data/lib/libv8/v8/src/vm-state.h +0 -11
- data/lib/libv8/v8/src/weakmap.js +103 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
- data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
- data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
- data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
- data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
- data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
- data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
- data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
- data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
- data/lib/libv8/v8/src/zone.cc +31 -22
- data/lib/libv8/v8/src/zone.h +12 -6
- data/lib/libv8/v8/tools/codemap.js +8 -0
- data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
- data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
- data/lib/libv8/v8/tools/grokdump.py +44 -35
- data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
- data/lib/libv8/v8/tools/js2c.py +83 -52
- data/lib/libv8/v8/tools/linux-tick-processor +4 -6
- data/lib/libv8/v8/tools/ll_prof.py +3 -3
- data/lib/libv8/v8/tools/oom_dump/README +3 -1
- data/lib/libv8/v8/tools/presubmit.py +11 -4
- data/lib/libv8/v8/tools/profile.js +46 -2
- data/lib/libv8/v8/tools/splaytree.js +11 -0
- data/lib/libv8/v8/tools/stats-viewer.py +15 -11
- data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
- data/lib/libv8/v8/tools/test.py +28 -8
- data/lib/libv8/v8/tools/tickprocessor.js +0 -16
- data/lib/libv8/version.rb +1 -1
- data/libv8.gemspec +2 -2
- metadata +31 -19
- data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
- data/lib/libv8/v8/src/json-parser.cc +0 -504
|
@@ -28,6 +28,14 @@
|
|
|
28
28
|
#ifndef V8_EXTENSIONS_EXPERIMENTAL_I18N_UTILS_H_
|
|
29
29
|
#define V8_EXTENSIONS_EXPERIMENTAL_I18N_UTILS_H_
|
|
30
30
|
|
|
31
|
+
#include "include/v8.h"
|
|
32
|
+
|
|
33
|
+
#include "unicode/uversion.h"
|
|
34
|
+
|
|
35
|
+
namespace U_ICU_NAMESPACE {
|
|
36
|
+
class UnicodeString;
|
|
37
|
+
}
|
|
38
|
+
|
|
31
39
|
namespace v8 {
|
|
32
40
|
namespace internal {
|
|
33
41
|
|
|
@@ -37,9 +45,21 @@ class I18NUtils {
|
|
|
37
45
|
// (length - 1) bytes.
|
|
38
46
|
// We can't use snprintf since it's not supported on all relevant platforms.
|
|
39
47
|
// We can't use OS::SNPrintF, it's only for internal code.
|
|
40
|
-
// TODO(cira): Find a way to use OS::SNPrintF instead.
|
|
41
48
|
static void StrNCopy(char* dest, int length, const char* src);
|
|
42
49
|
|
|
50
|
+
// Extract a string setting named in |settings| and set it to |result|.
|
|
51
|
+
// Return true if it's specified. Otherwise, return false.
|
|
52
|
+
static bool ExtractStringSetting(const v8::Handle<v8::Object>& settings,
|
|
53
|
+
const char* setting,
|
|
54
|
+
icu::UnicodeString* result);
|
|
55
|
+
|
|
56
|
+
// Converts ASCII array into UChar array.
|
|
57
|
+
// Target is always \0 terminated.
|
|
58
|
+
static void AsciiToUChar(const char* source,
|
|
59
|
+
int32_t source_length,
|
|
60
|
+
UChar* target,
|
|
61
|
+
int32_t target_length);
|
|
62
|
+
|
|
43
63
|
private:
|
|
44
64
|
I18NUtils() {}
|
|
45
65
|
};
|
|
@@ -45,11 +45,11 @@ v8Locale = function(settings) {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
var properties = NativeJSLocale(
|
|
48
|
-
v8Locale.
|
|
48
|
+
v8Locale.__createSettingsOrDefault(settings, {'localeID': 'root'}));
|
|
49
49
|
|
|
50
50
|
// Keep the resolved ICU locale ID around to avoid resolving localeID to
|
|
51
51
|
// ICU locale ID every time BreakIterator, Collator and so forth are called.
|
|
52
|
-
this.
|
|
52
|
+
this.__icuLocaleID = properties.icuLocaleID;
|
|
53
53
|
this.options = {'localeID': properties.localeID,
|
|
54
54
|
'regionID': properties.regionID};
|
|
55
55
|
};
|
|
@@ -61,7 +61,7 @@ v8Locale = function(settings) {
|
|
|
61
61
|
*/
|
|
62
62
|
v8Locale.prototype.derive = function(settings) {
|
|
63
63
|
return new v8Locale(
|
|
64
|
-
v8Locale.
|
|
64
|
+
v8Locale.__createSettingsOrDefault(settings, this.options));
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
/**
|
|
@@ -74,14 +74,15 @@ v8Locale.prototype.derive = function(settings) {
|
|
|
74
74
|
* - word
|
|
75
75
|
* - sentence
|
|
76
76
|
* - line
|
|
77
|
+
* @private
|
|
77
78
|
* @constructor
|
|
78
79
|
*/
|
|
79
80
|
v8Locale.v8BreakIterator = function(locale, type) {
|
|
80
81
|
native function NativeJSBreakIterator();
|
|
81
82
|
|
|
82
|
-
locale = v8Locale.
|
|
83
|
+
locale = v8Locale.__createLocaleOrDefault(locale);
|
|
83
84
|
// BCP47 ID would work in this case, but we use ICU locale for consistency.
|
|
84
|
-
var iterator = NativeJSBreakIterator(locale.
|
|
85
|
+
var iterator = NativeJSBreakIterator(locale.__icuLocaleID, type);
|
|
85
86
|
iterator.type = type;
|
|
86
87
|
return iterator;
|
|
87
88
|
};
|
|
@@ -117,26 +118,217 @@ v8Locale.prototype.v8CreateBreakIterator = function(type) {
|
|
|
117
118
|
* - ignoreCase
|
|
118
119
|
* - ignoreAccents
|
|
119
120
|
* - numeric
|
|
121
|
+
* @private
|
|
120
122
|
* @constructor
|
|
121
123
|
*/
|
|
122
124
|
v8Locale.Collator = function(locale, settings) {
|
|
123
125
|
native function NativeJSCollator();
|
|
124
126
|
|
|
125
|
-
locale = v8Locale.
|
|
127
|
+
locale = v8Locale.__createLocaleOrDefault(locale);
|
|
126
128
|
var collator = NativeJSCollator(
|
|
127
|
-
locale.
|
|
129
|
+
locale.__icuLocaleID, v8Locale.__createSettingsOrDefault(settings, {}));
|
|
128
130
|
return collator;
|
|
129
131
|
};
|
|
130
132
|
|
|
131
133
|
/**
|
|
132
134
|
* Creates new Collator based on current locale.
|
|
133
135
|
* @param {Object} - collation flags. See constructor.
|
|
134
|
-
* @returns {Object} - new
|
|
136
|
+
* @returns {Object} - new Collator object.
|
|
135
137
|
*/
|
|
136
138
|
v8Locale.prototype.createCollator = function(settings) {
|
|
137
139
|
return new v8Locale.Collator(this, settings);
|
|
138
140
|
};
|
|
139
141
|
|
|
142
|
+
/**
|
|
143
|
+
* DateTimeFormat class implements locale-aware date and time formatting.
|
|
144
|
+
* Constructor is not part of public API.
|
|
145
|
+
* @param {Object} locale - locale object to pass to formatter.
|
|
146
|
+
* @param {Object} settings - formatting flags:
|
|
147
|
+
* - skeleton
|
|
148
|
+
* - dateStyle
|
|
149
|
+
* - timeStyle
|
|
150
|
+
* @private
|
|
151
|
+
* @constructor
|
|
152
|
+
*/
|
|
153
|
+
v8Locale.__DateTimeFormat = function(locale, settings) {
|
|
154
|
+
native function NativeJSDateTimeFormat();
|
|
155
|
+
|
|
156
|
+
settings = v8Locale.__createSettingsOrDefault(settings, {});
|
|
157
|
+
|
|
158
|
+
var cleanSettings = {};
|
|
159
|
+
if (settings.hasOwnProperty('skeleton')) {
|
|
160
|
+
cleanSettings['skeleton'] = settings['skeleton'];
|
|
161
|
+
} else {
|
|
162
|
+
cleanSettings = {};
|
|
163
|
+
if (settings.hasOwnProperty('dateStyle')) {
|
|
164
|
+
var ds = settings['dateStyle'];
|
|
165
|
+
if (!/^(short|medium|long|full)$/.test(ds)) ds = 'short';
|
|
166
|
+
cleanSettings['dateStyle'] = ds;
|
|
167
|
+
} else if (settings.hasOwnProperty('dateType')) {
|
|
168
|
+
// Obsolete. New spec requires dateStyle, but we'll keep this around
|
|
169
|
+
// for current users.
|
|
170
|
+
// TODO(cira): Remove when all internal users switch to dateStyle.
|
|
171
|
+
var dt = settings['dateType'];
|
|
172
|
+
if (!/^(short|medium|long|full)$/.test(dt)) dt = 'short';
|
|
173
|
+
cleanSettings['dateStyle'] = dt;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (settings.hasOwnProperty('timeStyle')) {
|
|
177
|
+
var ts = settings['timeStyle'];
|
|
178
|
+
if (!/^(short|medium|long|full)$/.test(ts)) ts = 'short';
|
|
179
|
+
cleanSettings['timeStyle'] = ts;
|
|
180
|
+
} else if (settings.hasOwnProperty('timeType')) {
|
|
181
|
+
// TODO(cira): Remove when all internal users switch to timeStyle.
|
|
182
|
+
var tt = settings['timeType'];
|
|
183
|
+
if (!/^(short|medium|long|full)$/.test(tt)) tt = 'short';
|
|
184
|
+
cleanSettings['timeStyle'] = tt;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Default is to show short date and time.
|
|
189
|
+
if (!cleanSettings.hasOwnProperty('skeleton') &&
|
|
190
|
+
!cleanSettings.hasOwnProperty('dateStyle') &&
|
|
191
|
+
!cleanSettings.hasOwnProperty('timeStyle')) {
|
|
192
|
+
cleanSettings = {'dateStyle': 'short',
|
|
193
|
+
'timeStyle': 'short'};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
locale = v8Locale.__createLocaleOrDefault(locale);
|
|
197
|
+
var formatter = NativeJSDateTimeFormat(locale.__icuLocaleID, cleanSettings);
|
|
198
|
+
|
|
199
|
+
// NativeJSDateTimeFormat creates formatter.options for us, we just need
|
|
200
|
+
// to append actual settings to it.
|
|
201
|
+
for (key in cleanSettings) {
|
|
202
|
+
formatter.options[key] = cleanSettings[key];
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Clones existing date time format with possible overrides for some
|
|
207
|
+
* of the options.
|
|
208
|
+
* @param {!Object} overrideSettings - overrides for current format settings.
|
|
209
|
+
* @returns {Object} - new DateTimeFormat object.
|
|
210
|
+
* @public
|
|
211
|
+
*/
|
|
212
|
+
formatter.derive = function(overrideSettings) {
|
|
213
|
+
// To remove a setting user can specify undefined as its value. We'll remove
|
|
214
|
+
// it from the map in that case.
|
|
215
|
+
for (var prop in overrideSettings) {
|
|
216
|
+
if (settings.hasOwnProperty(prop) && !overrideSettings[prop]) {
|
|
217
|
+
delete settings[prop];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return new v8Locale.__DateTimeFormat(
|
|
221
|
+
locale, v8Locale.__createSettingsOrDefault(overrideSettings, settings));
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
return formatter;
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Creates new DateTimeFormat based on current locale.
|
|
229
|
+
* @param {Object} - formatting flags. See constructor.
|
|
230
|
+
* @returns {Object} - new DateTimeFormat object.
|
|
231
|
+
*/
|
|
232
|
+
v8Locale.prototype.createDateTimeFormat = function(settings) {
|
|
233
|
+
return new v8Locale.__DateTimeFormat(this, settings);
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* NumberFormat class implements locale-aware number formatting.
|
|
238
|
+
* Constructor is not part of public API.
|
|
239
|
+
* @param {Object} locale - locale object to pass to formatter.
|
|
240
|
+
* @param {Object} settings - formatting flags:
|
|
241
|
+
* - skeleton
|
|
242
|
+
* - pattern
|
|
243
|
+
* - style - decimal, currency, percent or scientific
|
|
244
|
+
* - currencyCode - ISO 4217 3-letter currency code
|
|
245
|
+
* @private
|
|
246
|
+
* @constructor
|
|
247
|
+
*/
|
|
248
|
+
v8Locale.__NumberFormat = function(locale, settings) {
|
|
249
|
+
native function NativeJSNumberFormat();
|
|
250
|
+
|
|
251
|
+
settings = v8Locale.__createSettingsOrDefault(settings, {});
|
|
252
|
+
|
|
253
|
+
var cleanSettings = {};
|
|
254
|
+
if (settings.hasOwnProperty('skeleton')) {
|
|
255
|
+
// Assign skeleton to cleanSettings and fix invalid currency pattern
|
|
256
|
+
// if present - 'ooxo' becomes 'o'.
|
|
257
|
+
cleanSettings['skeleton'] =
|
|
258
|
+
settings['skeleton'].replace(/\u00a4+[^\u00a4]+\u00a4+/g, '\u00a4');
|
|
259
|
+
} else if (settings.hasOwnProperty('pattern')) {
|
|
260
|
+
cleanSettings['pattern'] = settings['pattern'];
|
|
261
|
+
} else if (settings.hasOwnProperty('style')) {
|
|
262
|
+
var style = settings['style'];
|
|
263
|
+
if (!/^(decimal|currency|percent|scientific)$/.test(style)) {
|
|
264
|
+
style = 'decimal';
|
|
265
|
+
}
|
|
266
|
+
cleanSettings['style'] = style;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Default is to show decimal style.
|
|
270
|
+
if (!cleanSettings.hasOwnProperty('skeleton') &&
|
|
271
|
+
!cleanSettings.hasOwnProperty('pattern') &&
|
|
272
|
+
!cleanSettings.hasOwnProperty('style')) {
|
|
273
|
+
cleanSettings = {'style': 'decimal'};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Add currency code if available and valid (3-letter ASCII code).
|
|
277
|
+
if (settings.hasOwnProperty('currencyCode') &&
|
|
278
|
+
/^[a-zA-Z]{3}$/.test(settings['currencyCode'])) {
|
|
279
|
+
cleanSettings['currencyCode'] = settings['currencyCode'].toUpperCase();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
locale = v8Locale.__createLocaleOrDefault(locale);
|
|
283
|
+
// Pass in region ID for proper currency detection. Use ZZ if region is empty.
|
|
284
|
+
var region = locale.options.regionID !== '' ? locale.options.regionID : 'ZZ';
|
|
285
|
+
var formatter = NativeJSNumberFormat(
|
|
286
|
+
locale.__icuLocaleID, 'und_' + region, cleanSettings);
|
|
287
|
+
|
|
288
|
+
// ICU doesn't always uppercase the currency code.
|
|
289
|
+
if (formatter.options.hasOwnProperty('currencyCode')) {
|
|
290
|
+
formatter.options['currencyCode'] =
|
|
291
|
+
formatter.options['currencyCode'].toUpperCase();
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
for (key in cleanSettings) {
|
|
295
|
+
// Don't overwrite keys that are alredy in.
|
|
296
|
+
if (formatter.options.hasOwnProperty(key)) continue;
|
|
297
|
+
|
|
298
|
+
formatter.options[key] = cleanSettings[key];
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Clones existing number format with possible overrides for some
|
|
303
|
+
* of the options.
|
|
304
|
+
* @param {!Object} overrideSettings - overrides for current format settings.
|
|
305
|
+
* @returns {Object} - new or cached NumberFormat object.
|
|
306
|
+
* @public
|
|
307
|
+
*/
|
|
308
|
+
formatter.derive = function(overrideSettings) {
|
|
309
|
+
// To remove a setting user can specify undefined as its value. We'll remove
|
|
310
|
+
// it from the map in that case.
|
|
311
|
+
for (var prop in overrideSettings) {
|
|
312
|
+
if (settings.hasOwnProperty(prop) && !overrideSettings[prop]) {
|
|
313
|
+
delete settings[prop];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return new v8Locale.__NumberFormat(
|
|
317
|
+
locale, v8Locale.__createSettingsOrDefault(overrideSettings, settings));
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
return formatter;
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Creates new NumberFormat based on current locale.
|
|
325
|
+
* @param {Object} - formatting flags. See constructor.
|
|
326
|
+
* @returns {Object} - new or cached NumberFormat object.
|
|
327
|
+
*/
|
|
328
|
+
v8Locale.prototype.createNumberFormat = function(settings) {
|
|
329
|
+
return new v8Locale.__NumberFormat(this, settings);
|
|
330
|
+
};
|
|
331
|
+
|
|
140
332
|
/**
|
|
141
333
|
* Merges user settings and defaults.
|
|
142
334
|
* Settings that are not of object type are rejected.
|
|
@@ -145,8 +337,9 @@ v8Locale.prototype.createCollator = function(settings) {
|
|
|
145
337
|
* @param {!Object} settings - user provided settings.
|
|
146
338
|
* @param {!Object} defaults - default values for this type of settings.
|
|
147
339
|
* @returns {Object} - valid settings object.
|
|
340
|
+
* @private
|
|
148
341
|
*/
|
|
149
|
-
v8Locale.
|
|
342
|
+
v8Locale.__createSettingsOrDefault = function(settings, defaults) {
|
|
150
343
|
if (!settings || typeof(settings) !== 'object' ) {
|
|
151
344
|
return defaults;
|
|
152
345
|
}
|
|
@@ -155,11 +348,17 @@ v8Locale.createSettingsOrDefault_ = function(settings, defaults) {
|
|
|
155
348
|
settings[key] = defaults[key];
|
|
156
349
|
}
|
|
157
350
|
}
|
|
158
|
-
// Clean up
|
|
351
|
+
// Clean up settings.
|
|
159
352
|
for (var key in settings) {
|
|
353
|
+
// Trim whitespace.
|
|
160
354
|
if (typeof(settings[key]) === "string") {
|
|
161
355
|
settings[key] = settings[key].trim();
|
|
162
356
|
}
|
|
357
|
+
// Remove all properties that are set to undefined/null. This allows
|
|
358
|
+
// derive method to remove a setting we don't need anymore.
|
|
359
|
+
if (!settings[key]) {
|
|
360
|
+
delete settings[key];
|
|
361
|
+
}
|
|
163
362
|
}
|
|
164
363
|
|
|
165
364
|
return settings;
|
|
@@ -170,8 +369,9 @@ v8Locale.createSettingsOrDefault_ = function(settings, defaults) {
|
|
|
170
369
|
* we create default locale and return it.
|
|
171
370
|
* @param {!Object} locale - user provided locale.
|
|
172
371
|
* @returns {Object} - v8Locale object.
|
|
372
|
+
* @private
|
|
173
373
|
*/
|
|
174
|
-
v8Locale.
|
|
374
|
+
v8Locale.__createLocaleOrDefault = function(locale) {
|
|
175
375
|
if (!locale || !(locale instanceof v8Locale)) {
|
|
176
376
|
return new v8Locale();
|
|
177
377
|
} else {
|
|
@@ -28,13 +28,14 @@
|
|
|
28
28
|
// TODO(cira): Remove LanguageMatcher from v8 when ICU implements
|
|
29
29
|
// language matching API.
|
|
30
30
|
|
|
31
|
-
#include "language-matcher.h"
|
|
31
|
+
#include "src/extensions/experimental/language-matcher.h"
|
|
32
32
|
|
|
33
|
-
#include
|
|
33
|
+
#include <string.h>
|
|
34
|
+
|
|
35
|
+
#include "src/extensions/experimental/i18n-utils.h"
|
|
34
36
|
#include "unicode/datefmt.h" // For getAvailableLocales
|
|
35
37
|
#include "unicode/locid.h"
|
|
36
38
|
#include "unicode/uloc.h"
|
|
37
|
-
#include "utils.h"
|
|
38
39
|
|
|
39
40
|
namespace v8 {
|
|
40
41
|
namespace internal {
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
// Copyright 2011 the V8 project authors. All rights reserved.
|
|
2
|
+
// Redistribution and use in source and binary forms, with or without
|
|
3
|
+
// modification, are permitted provided that the following conditions are
|
|
4
|
+
// met:
|
|
5
|
+
//
|
|
6
|
+
// * Redistributions of source code must retain the above copyright
|
|
7
|
+
// notice, this list of conditions and the following disclaimer.
|
|
8
|
+
// * Redistributions in binary form must reproduce the above
|
|
9
|
+
// copyright notice, this list of conditions and the following
|
|
10
|
+
// disclaimer in the documentation and/or other materials provided
|
|
11
|
+
// with the distribution.
|
|
12
|
+
// * Neither the name of Google Inc. nor the names of its
|
|
13
|
+
// contributors may be used to endorse or promote products derived
|
|
14
|
+
// from this software without specific prior written permission.
|
|
15
|
+
//
|
|
16
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
20
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
21
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
22
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
23
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
24
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
25
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
26
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
|
|
28
|
+
#include "src/extensions/experimental/number-format.h"
|
|
29
|
+
|
|
30
|
+
#include <string.h>
|
|
31
|
+
|
|
32
|
+
#include "src/extensions/experimental/i18n-utils.h"
|
|
33
|
+
#include "unicode/dcfmtsym.h"
|
|
34
|
+
#include "unicode/decimfmt.h"
|
|
35
|
+
#include "unicode/locid.h"
|
|
36
|
+
#include "unicode/numfmt.h"
|
|
37
|
+
#include "unicode/uchar.h"
|
|
38
|
+
#include "unicode/ucurr.h"
|
|
39
|
+
#include "unicode/unum.h"
|
|
40
|
+
#include "unicode/uversion.h"
|
|
41
|
+
|
|
42
|
+
namespace v8 {
|
|
43
|
+
namespace internal {
|
|
44
|
+
|
|
45
|
+
const int NumberFormat::kCurrencyCodeLength = 4;
|
|
46
|
+
|
|
47
|
+
v8::Persistent<v8::FunctionTemplate> NumberFormat::number_format_template_;
|
|
48
|
+
|
|
49
|
+
static icu::DecimalFormat* CreateNumberFormat(v8::Handle<v8::String>,
|
|
50
|
+
v8::Handle<v8::String>,
|
|
51
|
+
v8::Handle<v8::Object>);
|
|
52
|
+
static icu::DecimalFormat* CreateFormatterFromSkeleton(
|
|
53
|
+
const icu::Locale&, const icu::UnicodeString&, UErrorCode*);
|
|
54
|
+
static icu::DecimalFormatSymbols* GetFormatSymbols(const icu::Locale&);
|
|
55
|
+
static bool GetCurrencyCode(const icu::Locale&,
|
|
56
|
+
const char* const,
|
|
57
|
+
v8::Handle<v8::Object>,
|
|
58
|
+
UChar*);
|
|
59
|
+
static v8::Handle<v8::Value> ThrowUnexpectedObjectError();
|
|
60
|
+
|
|
61
|
+
icu::DecimalFormat* NumberFormat::UnpackNumberFormat(
|
|
62
|
+
v8::Handle<v8::Object> obj) {
|
|
63
|
+
if (number_format_template_->HasInstance(obj)) {
|
|
64
|
+
return static_cast<icu::DecimalFormat*>(
|
|
65
|
+
obj->GetPointerFromInternalField(0));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return NULL;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void NumberFormat::DeleteNumberFormat(v8::Persistent<v8::Value> object,
|
|
72
|
+
void* param) {
|
|
73
|
+
v8::Persistent<v8::Object> persistent_object =
|
|
74
|
+
v8::Persistent<v8::Object>::Cast(object);
|
|
75
|
+
|
|
76
|
+
// First delete the hidden C++ object.
|
|
77
|
+
// Unpacking should never return NULL here. That would only happen if
|
|
78
|
+
// this method is used as the weak callback for persistent handles not
|
|
79
|
+
// pointing to a number formatter.
|
|
80
|
+
delete UnpackNumberFormat(persistent_object);
|
|
81
|
+
|
|
82
|
+
// Then dispose of the persistent handle to JS object.
|
|
83
|
+
persistent_object.Dispose();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
v8::Handle<v8::Value> NumberFormat::Format(const v8::Arguments& args) {
|
|
87
|
+
v8::HandleScope handle_scope;
|
|
88
|
+
|
|
89
|
+
if (args.Length() != 1 || !args[0]->IsNumber()) {
|
|
90
|
+
// Just return NaN on invalid input.
|
|
91
|
+
return v8::String::New("NaN");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
icu::DecimalFormat* number_format = UnpackNumberFormat(args.Holder());
|
|
95
|
+
if (!number_format) {
|
|
96
|
+
return ThrowUnexpectedObjectError();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ICU will handle actual NaN value properly and return NaN string.
|
|
100
|
+
icu::UnicodeString result;
|
|
101
|
+
number_format->format(args[0]->NumberValue(), result);
|
|
102
|
+
|
|
103
|
+
return v8::String::New(
|
|
104
|
+
reinterpret_cast<const uint16_t*>(result.getBuffer()), result.length());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
v8::Handle<v8::Value> NumberFormat::JSNumberFormat(const v8::Arguments& args) {
|
|
108
|
+
v8::HandleScope handle_scope;
|
|
109
|
+
|
|
110
|
+
// Expect locale id, region id and settings.
|
|
111
|
+
if (args.Length() != 3 ||
|
|
112
|
+
!args[0]->IsString() || !args[1]->IsString() || !args[2]->IsObject()) {
|
|
113
|
+
return v8::ThrowException(v8::Exception::SyntaxError(
|
|
114
|
+
v8::String::New("Locale, region and number settings are required.")));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
icu::DecimalFormat* number_format = CreateNumberFormat(
|
|
118
|
+
args[0]->ToString(), args[1]->ToString(), args[2]->ToObject());
|
|
119
|
+
|
|
120
|
+
if (number_format_template_.IsEmpty()) {
|
|
121
|
+
v8::Local<v8::FunctionTemplate> raw_template(v8::FunctionTemplate::New());
|
|
122
|
+
|
|
123
|
+
raw_template->SetClassName(v8::String::New("v8Locale.NumberFormat"));
|
|
124
|
+
|
|
125
|
+
// Define internal field count on instance template.
|
|
126
|
+
v8::Local<v8::ObjectTemplate> object_template =
|
|
127
|
+
raw_template->InstanceTemplate();
|
|
128
|
+
|
|
129
|
+
// Set aside internal field for icu number formatter.
|
|
130
|
+
object_template->SetInternalFieldCount(1);
|
|
131
|
+
|
|
132
|
+
// Define all of the prototype methods on prototype template.
|
|
133
|
+
v8::Local<v8::ObjectTemplate> proto = raw_template->PrototypeTemplate();
|
|
134
|
+
proto->Set(v8::String::New("format"),
|
|
135
|
+
v8::FunctionTemplate::New(Format));
|
|
136
|
+
|
|
137
|
+
number_format_template_ =
|
|
138
|
+
v8::Persistent<v8::FunctionTemplate>::New(raw_template);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Create an empty object wrapper.
|
|
142
|
+
v8::Local<v8::Object> local_object =
|
|
143
|
+
number_format_template_->GetFunction()->NewInstance();
|
|
144
|
+
v8::Persistent<v8::Object> wrapper =
|
|
145
|
+
v8::Persistent<v8::Object>::New(local_object);
|
|
146
|
+
|
|
147
|
+
// Set number formatter as internal field of the resulting JS object.
|
|
148
|
+
wrapper->SetPointerInInternalField(0, number_format);
|
|
149
|
+
|
|
150
|
+
// Create options key.
|
|
151
|
+
v8::Local<v8::Object> options = v8::Object::New();
|
|
152
|
+
|
|
153
|
+
// Show what ICU decided to use for easier problem tracking.
|
|
154
|
+
// Keep it as v8 specific extension.
|
|
155
|
+
icu::UnicodeString pattern;
|
|
156
|
+
number_format->toPattern(pattern);
|
|
157
|
+
options->Set(v8::String::New("v8ResolvedPattern"),
|
|
158
|
+
v8::String::New(reinterpret_cast<const uint16_t*>(
|
|
159
|
+
pattern.getBuffer()), pattern.length()));
|
|
160
|
+
|
|
161
|
+
// Set resolved currency code in options.currency if not empty.
|
|
162
|
+
icu::UnicodeString currency(number_format->getCurrency());
|
|
163
|
+
if (!currency.isEmpty()) {
|
|
164
|
+
options->Set(v8::String::New("currencyCode"),
|
|
165
|
+
v8::String::New(reinterpret_cast<const uint16_t*>(
|
|
166
|
+
currency.getBuffer()), currency.length()));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
wrapper->Set(v8::String::New("options"), options);
|
|
170
|
+
|
|
171
|
+
// Make object handle weak so we can delete iterator once GC kicks in.
|
|
172
|
+
wrapper.MakeWeak(NULL, DeleteNumberFormat);
|
|
173
|
+
|
|
174
|
+
return wrapper;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Returns DecimalFormat.
|
|
178
|
+
static icu::DecimalFormat* CreateNumberFormat(v8::Handle<v8::String> locale,
|
|
179
|
+
v8::Handle<v8::String> region,
|
|
180
|
+
v8::Handle<v8::Object> settings) {
|
|
181
|
+
v8::HandleScope handle_scope;
|
|
182
|
+
|
|
183
|
+
v8::String::AsciiValue ascii_locale(locale);
|
|
184
|
+
icu::Locale icu_locale(*ascii_locale);
|
|
185
|
+
|
|
186
|
+
// Make formatter from skeleton.
|
|
187
|
+
icu::DecimalFormat* number_format = NULL;
|
|
188
|
+
UErrorCode status = U_ZERO_ERROR;
|
|
189
|
+
icu::UnicodeString setting;
|
|
190
|
+
|
|
191
|
+
if (I18NUtils::ExtractStringSetting(settings, "skeleton", &setting)) {
|
|
192
|
+
// TODO(cira): Use ICU skeleton once
|
|
193
|
+
// http://bugs.icu-project.org/trac/ticket/8610 is resolved.
|
|
194
|
+
number_format = CreateFormatterFromSkeleton(icu_locale, setting, &status);
|
|
195
|
+
} else if (I18NUtils::ExtractStringSetting(settings, "pattern", &setting)) {
|
|
196
|
+
number_format =
|
|
197
|
+
new icu::DecimalFormat(setting, GetFormatSymbols(icu_locale), status);
|
|
198
|
+
} else if (I18NUtils::ExtractStringSetting(settings, "style", &setting)) {
|
|
199
|
+
if (setting == UNICODE_STRING_SIMPLE("currency")) {
|
|
200
|
+
number_format = static_cast<icu::DecimalFormat*>(
|
|
201
|
+
icu::NumberFormat::createCurrencyInstance(icu_locale, status));
|
|
202
|
+
} else if (setting == UNICODE_STRING_SIMPLE("percent")) {
|
|
203
|
+
number_format = static_cast<icu::DecimalFormat*>(
|
|
204
|
+
icu::NumberFormat::createPercentInstance(icu_locale, status));
|
|
205
|
+
} else if (setting == UNICODE_STRING_SIMPLE("scientific")) {
|
|
206
|
+
number_format = static_cast<icu::DecimalFormat*>(
|
|
207
|
+
icu::NumberFormat::createScientificInstance(icu_locale, status));
|
|
208
|
+
} else {
|
|
209
|
+
// Make it decimal in any other case.
|
|
210
|
+
number_format = static_cast<icu::DecimalFormat*>(
|
|
211
|
+
icu::NumberFormat::createInstance(icu_locale, status));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (U_FAILURE(status)) {
|
|
216
|
+
delete number_format;
|
|
217
|
+
status = U_ZERO_ERROR;
|
|
218
|
+
number_format = static_cast<icu::DecimalFormat*>(
|
|
219
|
+
icu::NumberFormat::createInstance(icu_locale, status));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Attach appropriate currency code to the formatter.
|
|
223
|
+
// It affects currency formatters only.
|
|
224
|
+
// Region is full language identifier in form 'und_' + region id.
|
|
225
|
+
v8::String::AsciiValue ascii_region(region);
|
|
226
|
+
|
|
227
|
+
UChar currency_code[NumberFormat::kCurrencyCodeLength];
|
|
228
|
+
if (GetCurrencyCode(icu_locale, *ascii_region, settings, currency_code)) {
|
|
229
|
+
number_format->setCurrency(currency_code, status);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return number_format;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Generates ICU number format pattern from given skeleton.
|
|
236
|
+
// TODO(cira): Remove once ICU includes equivalent method
|
|
237
|
+
// (see http://bugs.icu-project.org/trac/ticket/8610).
|
|
238
|
+
static icu::DecimalFormat* CreateFormatterFromSkeleton(
|
|
239
|
+
const icu::Locale& icu_locale,
|
|
240
|
+
const icu::UnicodeString& skeleton,
|
|
241
|
+
UErrorCode* status) {
|
|
242
|
+
icu::DecimalFormat skeleton_format(
|
|
243
|
+
skeleton, GetFormatSymbols(icu_locale), *status);
|
|
244
|
+
|
|
245
|
+
// Find out if skeleton contains currency or percent symbol and create
|
|
246
|
+
// proper instance to tweak.
|
|
247
|
+
icu::DecimalFormat* base_format = NULL;
|
|
248
|
+
|
|
249
|
+
// UChar representation of U+00A4 currency symbol.
|
|
250
|
+
const UChar currency_symbol = 0xA4u;
|
|
251
|
+
|
|
252
|
+
int32_t index = skeleton.indexOf(currency_symbol);
|
|
253
|
+
if (index != -1) {
|
|
254
|
+
// Find how many U+00A4 are there. There is at least one.
|
|
255
|
+
// Case of non-consecutive U+00A4 is taken care of in i18n.js.
|
|
256
|
+
int32_t end_index = skeleton.lastIndexOf(currency_symbol, index);
|
|
257
|
+
|
|
258
|
+
#if (U_ICU_VERSION_MAJOR_NUM == 4) && (U_ICU_VERSION_MINOR_NUM <= 6)
|
|
259
|
+
icu::NumberFormat::EStyles style;
|
|
260
|
+
switch (end_index - index) {
|
|
261
|
+
case 0:
|
|
262
|
+
style = icu::NumberFormat::kCurrencyStyle;
|
|
263
|
+
break;
|
|
264
|
+
case 1:
|
|
265
|
+
style = icu::NumberFormat::kIsoCurrencyStyle;
|
|
266
|
+
break;
|
|
267
|
+
default:
|
|
268
|
+
style = icu::NumberFormat::kPluralCurrencyStyle;
|
|
269
|
+
}
|
|
270
|
+
#else // ICU version is 4.8 or above (we ignore versions below 4.0).
|
|
271
|
+
UNumberFormatStyle style;
|
|
272
|
+
switch (end_index - index) {
|
|
273
|
+
case 0:
|
|
274
|
+
style = UNUM_CURRENCY;
|
|
275
|
+
break;
|
|
276
|
+
case 1:
|
|
277
|
+
style = UNUM_CURRENCY_ISO;
|
|
278
|
+
break;
|
|
279
|
+
default:
|
|
280
|
+
style = UNUM_CURRENCY_PLURAL;
|
|
281
|
+
}
|
|
282
|
+
#endif
|
|
283
|
+
|
|
284
|
+
base_format = static_cast<icu::DecimalFormat*>(
|
|
285
|
+
icu::NumberFormat::createInstance(icu_locale, style, *status));
|
|
286
|
+
} else if (skeleton.indexOf('%') != -1) {
|
|
287
|
+
base_format = static_cast<icu::DecimalFormat*>(
|
|
288
|
+
icu::NumberFormat::createPercentInstance(icu_locale, *status));
|
|
289
|
+
} else {
|
|
290
|
+
// TODO(cira): Handle scientific skeleton.
|
|
291
|
+
base_format = static_cast<icu::DecimalFormat*>(
|
|
292
|
+
icu::NumberFormat::createInstance(icu_locale, *status));
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (U_FAILURE(*status)) {
|
|
296
|
+
delete base_format;
|
|
297
|
+
return NULL;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Copy important information from skeleton to the new formatter.
|
|
301
|
+
// TODO(cira): copy rounding information from skeleton?
|
|
302
|
+
base_format->setGroupingUsed(skeleton_format.isGroupingUsed());
|
|
303
|
+
|
|
304
|
+
base_format->setMinimumIntegerDigits(
|
|
305
|
+
skeleton_format.getMinimumIntegerDigits());
|
|
306
|
+
|
|
307
|
+
base_format->setMinimumFractionDigits(
|
|
308
|
+
skeleton_format.getMinimumFractionDigits());
|
|
309
|
+
|
|
310
|
+
base_format->setMaximumFractionDigits(
|
|
311
|
+
skeleton_format.getMaximumFractionDigits());
|
|
312
|
+
|
|
313
|
+
return base_format;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Gets decimal symbols for a locale.
|
|
317
|
+
static icu::DecimalFormatSymbols* GetFormatSymbols(
|
|
318
|
+
const icu::Locale& icu_locale) {
|
|
319
|
+
UErrorCode status = U_ZERO_ERROR;
|
|
320
|
+
icu::DecimalFormatSymbols* symbols =
|
|
321
|
+
new icu::DecimalFormatSymbols(icu_locale, status);
|
|
322
|
+
|
|
323
|
+
if (U_FAILURE(status)) {
|
|
324
|
+
delete symbols;
|
|
325
|
+
// Use symbols from default locale.
|
|
326
|
+
symbols = new icu::DecimalFormatSymbols(status);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return symbols;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Gets currency ISO 4217 3-letter code.
|
|
333
|
+
// Check currencyCode setting first, then @currency=code and in the end
|
|
334
|
+
// try to infer currency code from locale in the form 'und_' + region id.
|
|
335
|
+
// Returns false in case of error.
|
|
336
|
+
static bool GetCurrencyCode(const icu::Locale& icu_locale,
|
|
337
|
+
const char* const und_region_locale,
|
|
338
|
+
v8::Handle<v8::Object> settings,
|
|
339
|
+
UChar* code) {
|
|
340
|
+
UErrorCode status = U_ZERO_ERROR;
|
|
341
|
+
|
|
342
|
+
// If there is user specified currency code, use it.
|
|
343
|
+
icu::UnicodeString currency;
|
|
344
|
+
if (I18NUtils::ExtractStringSetting(settings, "currencyCode", ¤cy)) {
|
|
345
|
+
currency.extract(code, NumberFormat::kCurrencyCodeLength, status);
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// If ICU locale has -cu- currency code use it.
|
|
350
|
+
char currency_code[NumberFormat::kCurrencyCodeLength];
|
|
351
|
+
int32_t length = icu_locale.getKeywordValue(
|
|
352
|
+
"currency", currency_code, NumberFormat::kCurrencyCodeLength, status);
|
|
353
|
+
if (length != 0) {
|
|
354
|
+
I18NUtils::AsciiToUChar(currency_code, length + 1,
|
|
355
|
+
code, NumberFormat::kCurrencyCodeLength);
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Otherwise infer currency code from the region id.
|
|
360
|
+
ucurr_forLocale(
|
|
361
|
+
und_region_locale, code, NumberFormat::kCurrencyCodeLength, &status);
|
|
362
|
+
|
|
363
|
+
return !!U_SUCCESS(status);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Throws a JavaScript exception.
|
|
367
|
+
static v8::Handle<v8::Value> ThrowUnexpectedObjectError() {
|
|
368
|
+
// Returns undefined, and schedules an exception to be thrown.
|
|
369
|
+
return v8::ThrowException(v8::Exception::Error(
|
|
370
|
+
v8::String::New("NumberFormat method called on an object "
|
|
371
|
+
"that is not a NumberFormat.")));
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
} } // namespace v8::internal
|