|
17 | 17 | #include "ecma-alloc.h"
|
18 | 18 | #include "ecma-builtin-helpers.h"
|
19 | 19 | #include "ecma-conversion.h"
|
| 20 | +#include "ecma-gc.h" |
20 | 21 | #include "ecma-globals.h"
|
21 | 22 | #include "ecma-helpers.h"
|
22 | 23 | #include "ecma-try-catch-macro.h"
|
@@ -324,25 +325,118 @@ ecma_builtin_date_now (ecma_value_t this_arg) /**< this argument */
|
324 | 325 | /**
|
325 | 326 | * Handle calling [[Call]] of built-in Date object
|
326 | 327 | *
|
| 328 | + * See also: |
| 329 | + * ECMA-262 v5, 15.9.2.1 |
| 330 | + * |
327 | 331 | * @return completion-value
|
328 | 332 | */
|
329 | 333 | ecma_completion_value_t
|
330 |
| -ecma_builtin_date_dispatch_call (const ecma_value_t *arguments_list_p, /**< arguments list */ |
331 |
| - ecma_length_t arguments_list_len) /**< number of arguments */ |
| 334 | +ecma_builtin_date_dispatch_call (const ecma_value_t *args_list_p, /**< arguments list */ |
| 335 | + ecma_length_t args_len) /**< number of arguments */ |
332 | 336 | {
|
333 |
| - ECMA_BUILTIN_CP_UNIMPLEMENTED (arguments_list_p, arguments_list_len); |
| 337 | + /* FIXME: |
| 338 | + * Fix this, after Date.prototype.toString is finished. |
| 339 | + */ |
| 340 | + return ecma_builtin_date_dispatch_construct (args_list_p, args_len); |
334 | 341 | } /* ecma_builtin_date_dispatch_call */
|
335 | 342 |
|
336 | 343 | /**
|
337 | 344 | * Handle calling [[Construct]] of built-in Date object
|
338 | 345 | *
|
| 346 | + * See also: |
| 347 | + * ECMA-262 v5, 15.9.3.1 |
| 348 | + * |
339 | 349 | * @return completion-value
|
340 | 350 | */
|
341 | 351 | ecma_completion_value_t
|
342 |
| -ecma_builtin_date_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ |
343 |
| - ecma_length_t arguments_list_len) /**< number of arguments */ |
| 352 | +ecma_builtin_date_dispatch_construct (const ecma_value_t *args_list_p, /**< arguments list */ |
| 353 | + ecma_length_t args_len) /**< number of arguments */ |
344 | 354 | {
|
345 |
| - ECMA_BUILTIN_CP_UNIMPLEMENTED (arguments_list_p, arguments_list_len); |
| 355 | + ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); |
| 356 | + ecma_number_t *prim_value_num_p; |
| 357 | + |
| 358 | + ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_DATE_PROTOTYPE); |
| 359 | + ecma_object_t *obj_p = ecma_create_object (prototype_obj_p, |
| 360 | + true, |
| 361 | + ECMA_OBJECT_TYPE_GENERAL); |
| 362 | + ecma_deref_object (prototype_obj_p); |
| 363 | + |
| 364 | + if (args_len == 0) |
| 365 | + { |
| 366 | + ECMA_TRY_CATCH (parse_res_value, |
| 367 | + ecma_builtin_date_now (ecma_make_object_value (obj_p)), |
| 368 | + ret_value); |
| 369 | + |
| 370 | + prim_value_num_p= ecma_alloc_number (); |
| 371 | + *prim_value_num_p = *ecma_get_number_from_completion_value (parse_res_value); |
| 372 | + |
| 373 | + ECMA_FINALIZE (parse_res_value) |
| 374 | + } |
| 375 | + else if (args_len == 1) |
| 376 | + { |
| 377 | + ECMA_TRY_CATCH (prim_comp_value, |
| 378 | + ecma_op_to_primitive (args_list_p[0], ECMA_PREFERRED_TYPE_NUMBER), |
| 379 | + ret_value); |
| 380 | + |
| 381 | + if (ecma_is_value_string (prim_comp_value)) |
| 382 | + { |
| 383 | + ECMA_TRY_CATCH (parse_res_value, |
| 384 | + ecma_builtin_date_parse (ecma_make_object_value (obj_p), prim_comp_value), |
| 385 | + ret_value); |
| 386 | + |
| 387 | + prim_value_num_p= ecma_alloc_number (); |
| 388 | + *prim_value_num_p = *ecma_get_number_from_completion_value (parse_res_value); |
| 389 | + |
| 390 | + ECMA_FINALIZE (parse_res_value); |
| 391 | + } |
| 392 | + else |
| 393 | + { |
| 394 | + ECMA_TRY_CATCH (prim_value, ecma_op_to_number (args_list_p[0]), ret_value); |
| 395 | + |
| 396 | + prim_value_num_p= ecma_alloc_number (); |
| 397 | + *prim_value_num_p = *ecma_get_number_from_value (prim_value); |
| 398 | + |
| 399 | + ECMA_FINALIZE (prim_value); |
| 400 | + } |
| 401 | + |
| 402 | + ECMA_FINALIZE (prim_comp_value); |
| 403 | + } |
| 404 | + else if (args_len >= 2) |
| 405 | + { |
| 406 | + ECMA_TRY_CATCH (time_value, |
| 407 | + ecma_date_construct_helper (args_list_p, args_len), |
| 408 | + ret_value); |
| 409 | + |
| 410 | + ecma_number_t *time_p = ecma_get_number_from_completion_value (time_value); |
| 411 | + prim_value_num_p= ecma_alloc_number (); |
| 412 | + *prim_value_num_p = ecma_date_time_clip (ecma_date_utc (*time_p)); |
| 413 | + |
| 414 | + ECMA_FINALIZE (time_value); |
| 415 | + } |
| 416 | + else |
| 417 | + { |
| 418 | + prim_value_num_p= ecma_alloc_number (); |
| 419 | + *prim_value_num_p = ECMA_NUMBER_ZERO; |
| 420 | + } |
| 421 | + |
| 422 | + if (ecma_is_completion_value_empty (ret_value)) |
| 423 | + { |
| 424 | + ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, |
| 425 | + ECMA_INTERNAL_PROPERTY_CLASS); |
| 426 | + class_prop_p->u.internal_property.value = LIT_MAGIC_STRING_DATE_UL; |
| 427 | + |
| 428 | + ecma_property_t *prim_value_prop_p = ecma_create_internal_property (obj_p, |
| 429 | + ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE); |
| 430 | + ECMA_SET_POINTER (prim_value_prop_p->u.internal_property.value, prim_value_num_p); |
| 431 | + |
| 432 | + ret_value = ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); |
| 433 | + } |
| 434 | + else if (ecma_is_completion_value_throw (ret_value)) |
| 435 | + { |
| 436 | + ecma_deref_object (obj_p); |
| 437 | + } |
| 438 | + |
| 439 | + return ret_value; |
346 | 440 | } /* ecma_builtin_date_dispatch_construct */
|
347 | 441 |
|
348 | 442 | /**
|
|
0 commit comments