| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 } | 424 } |
| 425 | 425 |
| 426 | 426 |
| 427 // --- C a l l s t o n a t i v e s --- | 427 // --- C a l l s t o n a t i v e s --- |
| 428 | 428 |
| 429 #define RETURN_NATIVE_CALL(name, argc, argv, has_pending_exception) \ | 429 #define RETURN_NATIVE_CALL(name, argc, argv, has_pending_exception) \ |
| 430 do { \ | 430 do { \ |
| 431 Object** args[argc] = argv; \ | 431 Object** args[argc] = argv; \ |
| 432 ASSERT(has_pending_exception != NULL); \ | 432 ASSERT(has_pending_exception != NULL); \ |
| 433 return Call(Isolate::Current()->name##_fun(), \ | 433 return Call(Isolate::Current()->name##_fun(), \ |
| 434 Isolate::Current()->builtins(), argc, args, \ | 434 Isolate::Current()->js_builtins_object(), argc, args, \ |
| 435 has_pending_exception); \ | 435 has_pending_exception); \ |
| 436 } while (false) | 436 } while (false) |
| 437 | 437 |
| 438 | 438 |
| 439 Handle<Object> Execution::ToBoolean(Handle<Object> obj) { | 439 Handle<Object> Execution::ToBoolean(Handle<Object> obj) { |
| 440 // See the similar code in runtime.js:ToBoolean. | 440 // See the similar code in runtime.js:ToBoolean. |
| 441 if (obj->IsBoolean()) return obj; | 441 if (obj->IsBoolean()) return obj; |
| 442 bool result = true; | 442 bool result = true; |
| 443 if (obj->IsString()) { | 443 if (obj->IsString()) { |
| 444 result = Handle<String>::cast(obj)->length() != 0; | 444 result = Handle<String>::cast(obj)->length() != 0; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 #undef RETURN_NATIVE_CALL | 497 #undef RETURN_NATIVE_CALL |
| 498 | 498 |
| 499 | 499 |
| 500 Handle<Object> Execution::CharAt(Handle<String> string, uint32_t index) { | 500 Handle<Object> Execution::CharAt(Handle<String> string, uint32_t index) { |
| 501 int int_index = static_cast<int>(index); | 501 int int_index = static_cast<int>(index); |
| 502 if (int_index < 0 || int_index >= string->length()) { | 502 if (int_index < 0 || int_index >= string->length()) { |
| 503 return Factory::undefined_value(); | 503 return Factory::undefined_value(); |
| 504 } | 504 } |
| 505 | 505 |
| 506 Handle<Object> char_at = | 506 Handle<Object> char_at = |
| 507 GetProperty(Isolate::Current()->builtins(), Factory::char_at_symbol()); | 507 GetProperty(Isolate::Current()->js_builtins_object(), |
| 508 Factory::char_at_symbol()); |
| 508 if (!char_at->IsJSFunction()) { | 509 if (!char_at->IsJSFunction()) { |
| 509 return Factory::undefined_value(); | 510 return Factory::undefined_value(); |
| 510 } | 511 } |
| 511 | 512 |
| 512 bool caught_exception; | 513 bool caught_exception; |
| 513 Handle<Object> index_object = Factory::NewNumberFromInt(int_index); | 514 Handle<Object> index_object = Factory::NewNumberFromInt(int_index); |
| 514 Object** index_arg[] = { index_object.location() }; | 515 Object** index_arg[] = { index_object.location() }; |
| 515 Handle<Object> result = TryCall(Handle<JSFunction>::cast(char_at), | 516 Handle<Object> result = TryCall(Handle<JSFunction>::cast(char_at), |
| 516 string, | 517 string, |
| 517 ARRAY_SIZE(index_arg), | 518 ARRAY_SIZE(index_arg), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 529 // Fast case: see if the function has already been instantiated | 530 // Fast case: see if the function has already been instantiated |
| 530 int serial_number = Smi::cast(data->serial_number())->value(); | 531 int serial_number = Smi::cast(data->serial_number())->value(); |
| 531 Object* elm = | 532 Object* elm = |
| 532 Isolate::Current()->global_context()->function_cache()-> | 533 Isolate::Current()->global_context()->function_cache()-> |
| 533 GetElement(serial_number); | 534 GetElement(serial_number); |
| 534 if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm)); | 535 if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm)); |
| 535 // The function has not yet been instantiated in this context; do it. | 536 // The function has not yet been instantiated in this context; do it. |
| 536 Object** args[1] = { Handle<Object>::cast(data).location() }; | 537 Object** args[1] = { Handle<Object>::cast(data).location() }; |
| 537 Handle<Object> result = | 538 Handle<Object> result = |
| 538 Call(Isolate::Current()->instantiate_fun(), | 539 Call(Isolate::Current()->instantiate_fun(), |
| 539 Isolate::Current()->builtins(), 1, args, exc); | 540 Isolate::Current()->js_builtins_object(), 1, args, exc); |
| 540 if (*exc) return Handle<JSFunction>::null(); | 541 if (*exc) return Handle<JSFunction>::null(); |
| 541 return Handle<JSFunction>::cast(result); | 542 return Handle<JSFunction>::cast(result); |
| 542 } | 543 } |
| 543 | 544 |
| 544 | 545 |
| 545 Handle<JSObject> Execution::InstantiateObject(Handle<ObjectTemplateInfo> data, | 546 Handle<JSObject> Execution::InstantiateObject(Handle<ObjectTemplateInfo> data, |
| 546 bool* exc) { | 547 bool* exc) { |
| 547 if (data->property_list()->IsUndefined() && | 548 if (data->property_list()->IsUndefined() && |
| 548 !data->constructor()->IsUndefined()) { | 549 !data->constructor()->IsUndefined()) { |
| 549 // Initialization to make gcc happy. | 550 // Initialization to make gcc happy. |
| 550 Object* result = NULL; | 551 Object* result = NULL; |
| 551 { | 552 { |
| 552 HandleScope scope; | 553 HandleScope scope; |
| 553 Handle<FunctionTemplateInfo> cons_template = | 554 Handle<FunctionTemplateInfo> cons_template = |
| 554 Handle<FunctionTemplateInfo>( | 555 Handle<FunctionTemplateInfo>( |
| 555 FunctionTemplateInfo::cast(data->constructor())); | 556 FunctionTemplateInfo::cast(data->constructor())); |
| 556 Handle<JSFunction> cons = InstantiateFunction(cons_template, exc); | 557 Handle<JSFunction> cons = InstantiateFunction(cons_template, exc); |
| 557 if (*exc) return Handle<JSObject>::null(); | 558 if (*exc) return Handle<JSObject>::null(); |
| 558 Handle<Object> value = New(cons, 0, NULL, exc); | 559 Handle<Object> value = New(cons, 0, NULL, exc); |
| 559 if (*exc) return Handle<JSObject>::null(); | 560 if (*exc) return Handle<JSObject>::null(); |
| 560 result = *value; | 561 result = *value; |
| 561 } | 562 } |
| 562 ASSERT(!*exc); | 563 ASSERT(!*exc); |
| 563 return Handle<JSObject>(JSObject::cast(result)); | 564 return Handle<JSObject>(JSObject::cast(result)); |
| 564 } else { | 565 } else { |
| 565 Object** args[1] = { Handle<Object>::cast(data).location() }; | 566 Object** args[1] = { Handle<Object>::cast(data).location() }; |
| 566 Handle<Object> result = | 567 Handle<Object> result = |
| 567 Call(Isolate::Current()->instantiate_fun(), | 568 Call(Isolate::Current()->instantiate_fun(), |
| 568 Isolate::Current()->builtins(), 1, args, exc); | 569 Isolate::Current()->js_builtins_object(), 1, args, exc); |
| 569 if (*exc) return Handle<JSObject>::null(); | 570 if (*exc) return Handle<JSObject>::null(); |
| 570 return Handle<JSObject>::cast(result); | 571 return Handle<JSObject>::cast(result); |
| 571 } | 572 } |
| 572 } | 573 } |
| 573 | 574 |
| 574 | 575 |
| 575 void Execution::ConfigureInstance(Handle<Object> instance, | 576 void Execution::ConfigureInstance(Handle<Object> instance, |
| 576 Handle<Object> instance_template, | 577 Handle<Object> instance_template, |
| 577 bool* exc) { | 578 bool* exc) { |
| 578 Object** args[2] = { instance.location(), instance_template.location() }; | 579 Object** args[2] = { instance.location(), instance_template.location() }; |
| 579 Execution::Call(Isolate::Current()->configure_instance_fun(), | 580 Execution::Call(Isolate::Current()->configure_instance_fun(), |
| 580 Isolate::Current()->builtins(), 2, args, exc); | 581 Isolate::Current()->js_builtins_object(), 2, args, exc); |
| 581 } | 582 } |
| 582 | 583 |
| 583 | 584 |
| 584 Handle<String> Execution::GetStackTraceLine(Handle<Object> recv, | 585 Handle<String> Execution::GetStackTraceLine(Handle<Object> recv, |
| 585 Handle<JSFunction> fun, | 586 Handle<JSFunction> fun, |
| 586 Handle<Object> pos, | 587 Handle<Object> pos, |
| 587 Handle<Object> is_global) { | 588 Handle<Object> is_global) { |
| 588 const int argc = 4; | 589 const int argc = 4; |
| 589 Object** args[argc] = { recv.location(), | 590 Object** args[argc] = { recv.location(), |
| 590 Handle<Object>::cast(fun).location(), | 591 Handle<Object>::cast(fun).location(), |
| 591 pos.location(), | 592 pos.location(), |
| 592 is_global.location() }; | 593 is_global.location() }; |
| 593 bool caught_exception = false; | 594 bool caught_exception = false; |
| 594 Handle<Object> result = | 595 Handle<Object> result = |
| 595 TryCall(Isolate::Current()->get_stack_trace_line_fun(), | 596 TryCall(Isolate::Current()->get_stack_trace_line_fun(), |
| 596 Isolate::Current()->builtins(), argc, args, &caught_exception); | 597 Isolate::Current()->js_builtins_object(), argc, args, |
| 598 &caught_exception); |
| 597 if (caught_exception || !result->IsString()) return Factory::empty_symbol(); | 599 if (caught_exception || !result->IsString()) return Factory::empty_symbol(); |
| 598 return Handle<String>::cast(result); | 600 return Handle<String>::cast(result); |
| 599 } | 601 } |
| 600 | 602 |
| 601 | 603 |
| 602 static Object* RuntimePreempt() { | 604 static Object* RuntimePreempt() { |
| 603 Isolate* isolate = Isolate::Current(); | 605 Isolate* isolate = Isolate::Current(); |
| 604 | 606 |
| 605 // Clear the preempt request flag. | 607 // Clear the preempt request flag. |
| 606 isolate->stack_guard()->Continue(PREEMPT); | 608 isolate->stack_guard()->Continue(PREEMPT); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 // All allocation spaces other than NEW_SPACE have the same effect. | 732 // All allocation spaces other than NEW_SPACE have the same effect. |
| 731 HEAP->CollectAllGarbage(false); | 733 HEAP->CollectAllGarbage(false); |
| 732 return v8::Undefined(); | 734 return v8::Undefined(); |
| 733 } | 735 } |
| 734 | 736 |
| 735 | 737 |
| 736 static GCExtension kGCExtension; | 738 static GCExtension kGCExtension; |
| 737 v8::DeclareExtension kGCExtensionDeclaration(&kGCExtension); | 739 v8::DeclareExtension kGCExtensionDeclaration(&kGCExtension); |
| 738 | 740 |
| 739 } } // namespace v8::internal | 741 } } // namespace v8::internal |
| OLD | NEW |