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.
Files changed (538) hide show
  1. data/lib/libv8/scons/CHANGES.txt +24 -231
  2. data/lib/libv8/scons/LICENSE.txt +1 -1
  3. data/lib/libv8/scons/MANIFEST +0 -1
  4. data/lib/libv8/scons/PKG-INFO +1 -1
  5. data/lib/libv8/scons/README.txt +9 -9
  6. data/lib/libv8/scons/RELEASE.txt +75 -77
  7. data/lib/libv8/scons/engine/SCons/Action.py +6 -22
  8. data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
  9. data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
  10. data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
  11. data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
  12. data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
  13. data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
  14. data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
  15. data/lib/libv8/scons/engine/SCons/Job.py +2 -2
  16. data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
  17. data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
  18. data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
  19. data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
  20. data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
  21. data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
  22. data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
  23. data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
  24. data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
  25. data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
  26. data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
  27. data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
  28. data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
  29. data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
  30. data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
  31. data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
  32. data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
  33. data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
  34. data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
  35. data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
  36. data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
  37. data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
  38. data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
  39. data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
  40. data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
  41. data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
  42. data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
  43. data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
  44. data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
  45. data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
  46. data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
  47. data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
  48. data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
  49. data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
  50. data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
  51. data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
  52. data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
  53. data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
  54. data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
  55. data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
  56. data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
  57. data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
  58. data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
  59. data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
  60. data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
  61. data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
  62. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
  63. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
  64. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
  65. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
  66. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
  67. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
  68. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
  69. data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
  70. data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
  71. data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
  72. data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
  73. data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
  74. data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
  75. data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
  76. data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
  77. data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
  78. data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
  79. data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
  80. data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
  81. data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
  82. data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
  83. data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
  84. data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
  85. data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
  86. data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
  87. data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
  88. data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
  89. data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
  90. data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
  91. data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
  92. data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
  93. data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
  94. data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
  95. data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
  96. data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
  97. data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
  98. data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
  99. data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
  100. data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
  101. data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
  102. data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
  103. data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
  104. data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
  105. data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
  106. data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
  107. data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
  108. data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
  109. data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
  110. data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
  111. data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
  112. data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
  113. data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
  114. data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
  115. data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
  116. data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
  117. data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
  118. data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
  119. data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
  120. data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
  121. data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
  122. data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
  123. data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
  124. data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
  125. data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
  126. data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
  127. data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
  128. data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
  129. data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
  130. data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
  131. data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
  132. data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
  133. data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
  134. data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
  135. data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
  136. data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
  137. data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
  138. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
  139. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
  140. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
  141. data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
  142. data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
  143. data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
  144. data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
  145. data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
  146. data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
  147. data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
  148. data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
  149. data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
  150. data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
  151. data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
  152. data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
  153. data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
  154. data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
  155. data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
  156. data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
  157. data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
  158. data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
  159. data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
  160. data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
  161. data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
  162. data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
  163. data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
  164. data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
  165. data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
  166. data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
  167. data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
  168. data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
  169. data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
  170. data/lib/libv8/scons/engine/SCons/Util.py +3 -3
  171. data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
  172. data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
  173. data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
  174. data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
  175. data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
  176. data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
  177. data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
  178. data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
  179. data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
  180. data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
  181. data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
  182. data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
  183. data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
  184. data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
  185. data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
  186. data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
  187. data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
  188. data/lib/libv8/scons/scons-time.1 +3 -3
  189. data/lib/libv8/scons/scons.1 +1164 -1170
  190. data/lib/libv8/scons/sconsign.1 +3 -3
  191. data/lib/libv8/scons/script/scons +22 -22
  192. data/lib/libv8/scons/script/scons-time +2 -2
  193. data/lib/libv8/scons/script/scons.bat +4 -7
  194. data/lib/libv8/scons/script/sconsign +20 -21
  195. data/lib/libv8/scons/setup.cfg +1 -0
  196. data/lib/libv8/scons/setup.py +40 -38
  197. data/lib/libv8/v8/.gitignore +1 -1
  198. data/lib/libv8/v8/AUTHORS +2 -0
  199. data/lib/libv8/v8/ChangeLog +387 -0
  200. data/lib/libv8/v8/Makefile +171 -0
  201. data/lib/libv8/v8/SConstruct +124 -51
  202. data/lib/libv8/v8/build/README.txt +31 -14
  203. data/lib/libv8/v8/build/all.gyp +11 -4
  204. data/lib/libv8/v8/build/armu.gypi +6 -2
  205. data/lib/libv8/v8/build/common.gypi +240 -94
  206. data/lib/libv8/v8/build/gyp_v8 +32 -4
  207. data/lib/libv8/v8/build/standalone.gypi +200 -0
  208. data/lib/libv8/v8/include/v8-debug.h +0 -0
  209. data/lib/libv8/v8/include/v8-profiler.h +8 -11
  210. data/lib/libv8/v8/include/v8.h +191 -108
  211. data/lib/libv8/v8/preparser/SConscript +2 -2
  212. data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
  213. data/lib/libv8/v8/preparser/preparser.gyp +42 -0
  214. data/lib/libv8/v8/src/SConscript +33 -8
  215. data/lib/libv8/v8/src/accessors.cc +77 -43
  216. data/lib/libv8/v8/src/api.cc +393 -191
  217. data/lib/libv8/v8/src/api.h +4 -8
  218. data/lib/libv8/v8/src/apinatives.js +15 -3
  219. data/lib/libv8/v8/src/arguments.h +8 -0
  220. data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
  221. data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
  222. data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
  223. data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
  224. data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
  225. data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
  226. data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
  227. data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
  228. data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
  229. data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
  230. data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
  231. data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
  232. data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
  233. data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
  234. data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
  235. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
  236. data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
  237. data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
  238. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
  239. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
  240. data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
  241. data/lib/libv8/v8/src/array.js +38 -18
  242. data/lib/libv8/v8/src/assembler.cc +12 -5
  243. data/lib/libv8/v8/src/assembler.h +15 -9
  244. data/lib/libv8/v8/src/ast-inl.h +34 -25
  245. data/lib/libv8/v8/src/ast.cc +141 -72
  246. data/lib/libv8/v8/src/ast.h +255 -181
  247. data/lib/libv8/v8/src/bignum.cc +3 -4
  248. data/lib/libv8/v8/src/bootstrapper.cc +55 -11
  249. data/lib/libv8/v8/src/bootstrapper.h +3 -2
  250. data/lib/libv8/v8/src/builtins.cc +8 -2
  251. data/lib/libv8/v8/src/builtins.h +4 -0
  252. data/lib/libv8/v8/src/cached-powers.cc +8 -4
  253. data/lib/libv8/v8/src/checks.h +3 -3
  254. data/lib/libv8/v8/src/code-stubs.cc +173 -28
  255. data/lib/libv8/v8/src/code-stubs.h +104 -148
  256. data/lib/libv8/v8/src/codegen.cc +8 -8
  257. data/lib/libv8/v8/src/compilation-cache.cc +2 -47
  258. data/lib/libv8/v8/src/compilation-cache.h +0 -10
  259. data/lib/libv8/v8/src/compiler.cc +27 -16
  260. data/lib/libv8/v8/src/compiler.h +13 -18
  261. data/lib/libv8/v8/src/contexts.cc +107 -72
  262. data/lib/libv8/v8/src/contexts.h +70 -34
  263. data/lib/libv8/v8/src/conversions-inl.h +572 -14
  264. data/lib/libv8/v8/src/conversions.cc +9 -707
  265. data/lib/libv8/v8/src/conversions.h +23 -12
  266. data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
  267. data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
  268. data/lib/libv8/v8/src/cpu-profiler.h +8 -17
  269. data/lib/libv8/v8/src/d8-debug.cc +5 -3
  270. data/lib/libv8/v8/src/d8-debug.h +6 -7
  271. data/lib/libv8/v8/src/d8-posix.cc +1 -10
  272. data/lib/libv8/v8/src/d8.cc +721 -219
  273. data/lib/libv8/v8/src/d8.gyp +37 -12
  274. data/lib/libv8/v8/src/d8.h +141 -19
  275. data/lib/libv8/v8/src/d8.js +17 -8
  276. data/lib/libv8/v8/src/date.js +16 -5
  277. data/lib/libv8/v8/src/dateparser-inl.h +242 -39
  278. data/lib/libv8/v8/src/dateparser.cc +38 -4
  279. data/lib/libv8/v8/src/dateparser.h +170 -28
  280. data/lib/libv8/v8/src/debug-agent.cc +5 -3
  281. data/lib/libv8/v8/src/debug-agent.h +11 -7
  282. data/lib/libv8/v8/src/debug-debugger.js +65 -34
  283. data/lib/libv8/v8/src/debug.cc +30 -60
  284. data/lib/libv8/v8/src/debug.h +5 -3
  285. data/lib/libv8/v8/src/deoptimizer.cc +227 -10
  286. data/lib/libv8/v8/src/deoptimizer.h +133 -9
  287. data/lib/libv8/v8/src/disassembler.cc +22 -14
  288. data/lib/libv8/v8/src/diy-fp.cc +4 -3
  289. data/lib/libv8/v8/src/diy-fp.h +3 -3
  290. data/lib/libv8/v8/src/elements.cc +634 -0
  291. data/lib/libv8/v8/src/elements.h +95 -0
  292. data/lib/libv8/v8/src/execution.cc +5 -21
  293. data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
  294. data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
  295. data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
  296. data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
  297. data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
  298. data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
  299. data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
  300. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
  301. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
  302. data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
  303. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
  304. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
  305. data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
  306. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
  307. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
  308. data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
  309. data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
  310. data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
  311. data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
  312. data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
  313. data/lib/libv8/v8/src/factory.cc +89 -18
  314. data/lib/libv8/v8/src/factory.h +36 -8
  315. data/lib/libv8/v8/src/flag-definitions.h +11 -44
  316. data/lib/libv8/v8/src/frames-inl.h +8 -1
  317. data/lib/libv8/v8/src/frames.cc +39 -3
  318. data/lib/libv8/v8/src/frames.h +10 -3
  319. data/lib/libv8/v8/src/full-codegen.cc +311 -293
  320. data/lib/libv8/v8/src/full-codegen.h +183 -143
  321. data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
  322. data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
  323. data/lib/libv8/v8/src/gdb-jit.cc +658 -55
  324. data/lib/libv8/v8/src/gdb-jit.h +6 -2
  325. data/lib/libv8/v8/src/global-handles.cc +368 -312
  326. data/lib/libv8/v8/src/global-handles.h +29 -36
  327. data/lib/libv8/v8/src/globals.h +3 -1
  328. data/lib/libv8/v8/src/handles.cc +43 -69
  329. data/lib/libv8/v8/src/handles.h +21 -16
  330. data/lib/libv8/v8/src/heap-inl.h +11 -13
  331. data/lib/libv8/v8/src/heap-profiler.cc +0 -999
  332. data/lib/libv8/v8/src/heap-profiler.h +0 -303
  333. data/lib/libv8/v8/src/heap.cc +366 -141
  334. data/lib/libv8/v8/src/heap.h +87 -26
  335. data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
  336. data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
  337. data/lib/libv8/v8/src/hydrogen.cc +1146 -629
  338. data/lib/libv8/v8/src/hydrogen.h +100 -64
  339. data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
  340. data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
  341. data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
  342. data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
  343. data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
  344. data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
  345. data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
  346. data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
  347. data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
  348. data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
  349. data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
  350. data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
  351. data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
  352. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
  353. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
  354. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
  355. data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
  356. data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
  357. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
  358. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
  359. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
  360. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
  361. data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
  362. data/lib/libv8/v8/src/ic.cc +198 -234
  363. data/lib/libv8/v8/src/ic.h +32 -30
  364. data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
  365. data/lib/libv8/v8/src/isolate.cc +112 -95
  366. data/lib/libv8/v8/src/isolate.h +55 -71
  367. data/lib/libv8/v8/src/json-parser.h +486 -48
  368. data/lib/libv8/v8/src/json.js +28 -23
  369. data/lib/libv8/v8/src/jsregexp.cc +163 -208
  370. data/lib/libv8/v8/src/jsregexp.h +0 -1
  371. data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
  372. data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
  373. data/lib/libv8/v8/src/lithium-allocator.h +8 -8
  374. data/lib/libv8/v8/src/lithium.cc +16 -11
  375. data/lib/libv8/v8/src/lithium.h +31 -34
  376. data/lib/libv8/v8/src/liveedit.cc +111 -15
  377. data/lib/libv8/v8/src/liveedit.h +3 -4
  378. data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
  379. data/lib/libv8/v8/src/liveobjectlist.h +2 -2
  380. data/lib/libv8/v8/src/log-inl.h +0 -4
  381. data/lib/libv8/v8/src/log-utils.cc +25 -143
  382. data/lib/libv8/v8/src/log-utils.h +13 -92
  383. data/lib/libv8/v8/src/log.cc +26 -249
  384. data/lib/libv8/v8/src/log.h +6 -17
  385. data/lib/libv8/v8/src/macros.py +9 -6
  386. data/lib/libv8/v8/src/mark-compact.cc +276 -56
  387. data/lib/libv8/v8/src/mark-compact.h +20 -0
  388. data/lib/libv8/v8/src/messages.js +93 -39
  389. data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
  390. data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
  391. data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
  392. data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
  393. data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
  394. data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
  395. data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
  396. data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
  397. data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
  398. data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
  399. data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
  400. data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
  401. data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
  402. data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
  403. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
  404. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
  405. data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
  406. data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
  407. data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
  408. data/lib/libv8/v8/src/mirror-debugger.js +55 -8
  409. data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
  410. data/lib/libv8/v8/src/mksnapshot.cc +36 -4
  411. data/lib/libv8/v8/src/natives.h +5 -2
  412. data/lib/libv8/v8/src/objects-debug.cc +73 -6
  413. data/lib/libv8/v8/src/objects-inl.h +529 -164
  414. data/lib/libv8/v8/src/objects-printer.cc +67 -12
  415. data/lib/libv8/v8/src/objects-visiting.cc +13 -2
  416. data/lib/libv8/v8/src/objects-visiting.h +41 -1
  417. data/lib/libv8/v8/src/objects.cc +2200 -1177
  418. data/lib/libv8/v8/src/objects.h +912 -283
  419. data/lib/libv8/v8/src/parser.cc +566 -371
  420. data/lib/libv8/v8/src/parser.h +35 -33
  421. data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
  422. data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
  423. data/lib/libv8/v8/src/platform-linux.cc +60 -57
  424. data/lib/libv8/v8/src/platform-macos.cc +4 -27
  425. data/lib/libv8/v8/src/platform-nullos.cc +3 -16
  426. data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
  427. data/lib/libv8/v8/src/platform-posix.cc +43 -1
  428. data/lib/libv8/v8/src/platform-solaris.cc +151 -112
  429. data/lib/libv8/v8/src/platform-tls.h +1 -1
  430. data/lib/libv8/v8/src/platform-win32.cc +65 -39
  431. data/lib/libv8/v8/src/platform.h +17 -14
  432. data/lib/libv8/v8/src/preparse-data-format.h +2 -2
  433. data/lib/libv8/v8/src/preparse-data.h +8 -2
  434. data/lib/libv8/v8/src/preparser-api.cc +2 -18
  435. data/lib/libv8/v8/src/preparser.cc +106 -65
  436. data/lib/libv8/v8/src/preparser.h +26 -5
  437. data/lib/libv8/v8/src/prettyprinter.cc +25 -43
  438. data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
  439. data/lib/libv8/v8/src/profile-generator.cc +213 -34
  440. data/lib/libv8/v8/src/profile-generator.h +9 -9
  441. data/lib/libv8/v8/src/property.h +1 -0
  442. data/lib/libv8/v8/src/proxy.js +74 -4
  443. data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
  444. data/lib/libv8/v8/src/regexp.js +16 -11
  445. data/lib/libv8/v8/src/rewriter.cc +24 -133
  446. data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
  447. data/lib/libv8/v8/src/runtime-profiler.h +5 -31
  448. data/lib/libv8/v8/src/runtime.cc +1450 -681
  449. data/lib/libv8/v8/src/runtime.h +47 -31
  450. data/lib/libv8/v8/src/runtime.js +2 -1
  451. data/lib/libv8/v8/src/scanner-base.cc +358 -220
  452. data/lib/libv8/v8/src/scanner-base.h +30 -138
  453. data/lib/libv8/v8/src/scanner.cc +0 -18
  454. data/lib/libv8/v8/src/scanner.h +0 -15
  455. data/lib/libv8/v8/src/scopeinfo.cc +3 -1
  456. data/lib/libv8/v8/src/scopeinfo.h +1 -6
  457. data/lib/libv8/v8/src/scopes.cc +243 -253
  458. data/lib/libv8/v8/src/scopes.h +58 -109
  459. data/lib/libv8/v8/src/serialize.cc +12 -54
  460. data/lib/libv8/v8/src/serialize.h +47 -0
  461. data/lib/libv8/v8/src/small-pointer-list.h +25 -0
  462. data/lib/libv8/v8/src/spaces-inl.h +4 -50
  463. data/lib/libv8/v8/src/spaces.cc +64 -131
  464. data/lib/libv8/v8/src/spaces.h +19 -70
  465. data/lib/libv8/v8/src/string-stream.cc +3 -1
  466. data/lib/libv8/v8/src/string.js +10 -6
  467. data/lib/libv8/v8/src/strtod.cc +7 -3
  468. data/lib/libv8/v8/src/stub-cache.cc +59 -129
  469. data/lib/libv8/v8/src/stub-cache.h +42 -54
  470. data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
  471. data/lib/libv8/v8/src/token.cc +4 -4
  472. data/lib/libv8/v8/src/token.h +6 -5
  473. data/lib/libv8/v8/src/type-info.cc +173 -129
  474. data/lib/libv8/v8/src/type-info.h +40 -22
  475. data/lib/libv8/v8/src/utils.cc +25 -304
  476. data/lib/libv8/v8/src/utils.h +118 -3
  477. data/lib/libv8/v8/src/v8-counters.h +3 -6
  478. data/lib/libv8/v8/src/v8.cc +34 -27
  479. data/lib/libv8/v8/src/v8.h +7 -7
  480. data/lib/libv8/v8/src/v8conversions.cc +129 -0
  481. data/lib/libv8/v8/src/v8conversions.h +60 -0
  482. data/lib/libv8/v8/src/v8globals.h +15 -6
  483. data/lib/libv8/v8/src/v8natives.js +300 -78
  484. data/lib/libv8/v8/src/v8threads.cc +14 -6
  485. data/lib/libv8/v8/src/v8threads.h +4 -1
  486. data/lib/libv8/v8/src/v8utils.cc +360 -0
  487. data/lib/libv8/v8/src/v8utils.h +17 -66
  488. data/lib/libv8/v8/src/variables.cc +7 -12
  489. data/lib/libv8/v8/src/variables.h +12 -10
  490. data/lib/libv8/v8/src/version.cc +2 -2
  491. data/lib/libv8/v8/src/vm-state-inl.h +0 -41
  492. data/lib/libv8/v8/src/vm-state.h +0 -11
  493. data/lib/libv8/v8/src/weakmap.js +103 -0
  494. data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
  495. data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
  496. data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
  497. data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
  498. data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
  499. data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
  500. data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
  501. data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
  502. data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
  503. data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
  504. data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
  505. data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
  506. data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
  507. data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
  508. data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
  509. data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
  510. data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
  511. data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
  512. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
  513. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
  514. data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
  515. data/lib/libv8/v8/src/zone.cc +31 -22
  516. data/lib/libv8/v8/src/zone.h +12 -6
  517. data/lib/libv8/v8/tools/codemap.js +8 -0
  518. data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
  519. data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
  520. data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
  521. data/lib/libv8/v8/tools/grokdump.py +44 -35
  522. data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
  523. data/lib/libv8/v8/tools/js2c.py +83 -52
  524. data/lib/libv8/v8/tools/linux-tick-processor +4 -6
  525. data/lib/libv8/v8/tools/ll_prof.py +3 -3
  526. data/lib/libv8/v8/tools/oom_dump/README +3 -1
  527. data/lib/libv8/v8/tools/presubmit.py +11 -4
  528. data/lib/libv8/v8/tools/profile.js +46 -2
  529. data/lib/libv8/v8/tools/splaytree.js +11 -0
  530. data/lib/libv8/v8/tools/stats-viewer.py +15 -11
  531. data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
  532. data/lib/libv8/v8/tools/test.py +28 -8
  533. data/lib/libv8/v8/tools/tickprocessor.js +0 -16
  534. data/lib/libv8/version.rb +1 -1
  535. data/libv8.gemspec +2 -2
  536. metadata +31 -19
  537. data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
  538. 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.createSettingsOrDefault_(settings, {'localeID': 'root'}));
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.__icuLocaleID__ = properties.icuLocaleID;
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.createSettingsOrDefault_(settings, this.options));
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.createLocaleOrDefault_(locale);
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.__icuLocaleID__, type);
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.createLocaleOrDefault_(locale);
127
+ locale = v8Locale.__createLocaleOrDefault(locale);
126
128
  var collator = NativeJSCollator(
127
- locale.__icuLocaleID__, v8Locale.createSettingsOrDefault_(settings, {}));
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 v8BreakIterator object.
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.createSettingsOrDefault_ = function(settings, defaults) {
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 values, like trimming whitespace.
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.createLocaleOrDefault_ = function(locale) {
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 "i18n-utils.h"
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 {
@@ -28,7 +28,7 @@
28
28
  #ifndef V8_EXTENSIONS_EXPERIMENTAL_LANGUAGE_MATCHER_H_
29
29
  #define V8_EXTENSIONS_EXPERIMENTAL_LANGUAGE_MATCHER_H_
30
30
 
31
- #include <v8.h>
31
+ #include "include/v8.h"
32
32
 
33
33
  #include "unicode/uloc.h"
34
34
 
@@ -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", &currency)) {
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