Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 | 59 |
| 60 | 60 |
| 61 void StackGuard::reset_limits(const ExecutionAccess& lock) { | 61 void StackGuard::reset_limits(const ExecutionAccess& lock) { |
| 62 ASSERT(isolate_ != NULL); | 62 ASSERT(isolate_ != NULL); |
| 63 thread_local_.jslimit_ = thread_local_.real_jslimit_; | 63 thread_local_.jslimit_ = thread_local_.real_jslimit_; |
| 64 thread_local_.climit_ = thread_local_.real_climit_; | 64 thread_local_.climit_ = thread_local_.real_climit_; |
| 65 isolate_->heap()->SetStackLimits(); | 65 isolate_->heap()->SetStackLimits(); |
| 66 } | 66 } |
| 67 | 67 |
| 68 | 68 |
| 69 static Handle<Object> Invoke(bool construct, | 69 static Handle<Object> Invoke(bool is_construct, |
| 70 Handle<JSFunction> func, | 70 Handle<JSFunction> function, |
| 71 Handle<Object> receiver, | 71 Handle<Object> receiver, |
| 72 int argc, | 72 int argc, |
| 73 Object*** args, | 73 Handle<Object> args[], |
| 74 bool* has_pending_exception) { | 74 bool* has_pending_exception) { |
| 75 Isolate* isolate = func->GetIsolate(); | 75 Isolate* isolate = function->GetIsolate(); |
| 76 | 76 |
| 77 // Entering JavaScript. | 77 // Entering JavaScript. |
| 78 VMState state(isolate, JS); | 78 VMState state(isolate, JS); |
| 79 | 79 |
| 80 // Placeholder for return value. | 80 // Placeholder for return value. |
| 81 MaybeObject* value = reinterpret_cast<Object*>(kZapValue); | 81 MaybeObject* value = reinterpret_cast<Object*>(kZapValue); |
| 82 | 82 |
| 83 typedef Object* (*JSEntryFunction)( | 83 typedef Object* (*JSEntryFunction)(byte* entry, |
| 84 byte* entry, | 84 Object* function, |
| 85 Object* function, | 85 Object* receiver, |
| 86 Object* receiver, | 86 int argc, |
| 87 int argc, | 87 Object*** args); |
| 88 Object*** args); | |
| 89 | 88 |
| 90 Handle<Code> code; | 89 Handle<Code> code = is_construct |
| 91 if (construct) { | 90 ? isolate->factory()->js_construct_entry_code() |
| 92 code = isolate->factory()->js_construct_entry_code(); | 91 : isolate->factory()->js_entry_code(); |
| 93 } else { | |
| 94 code = isolate->factory()->js_entry_code(); | |
| 95 } | |
| 96 | 92 |
| 97 // Convert calls on global objects to be calls on the global | 93 // Convert calls on global objects to be calls on the global |
| 98 // receiver instead to avoid having a 'this' pointer which refers | 94 // receiver instead to avoid having a 'this' pointer which refers |
| 99 // directly to a global object. | 95 // directly to a global object. |
| 100 if (receiver->IsGlobalObject()) { | 96 if (receiver->IsGlobalObject()) { |
| 101 Handle<GlobalObject> global = Handle<GlobalObject>::cast(receiver); | 97 Handle<GlobalObject> global = Handle<GlobalObject>::cast(receiver); |
| 102 receiver = Handle<JSObject>(global->global_receiver()); | 98 receiver = Handle<JSObject>(global->global_receiver()); |
| 103 } | 99 } |
| 104 | 100 |
| 105 // Make sure that the global object of the context we're about to | 101 // Make sure that the global object of the context we're about to |
| 106 // make the current one is indeed a global object. | 102 // make the current one is indeed a global object. |
| 107 ASSERT(func->context()->global()->IsGlobalObject()); | 103 ASSERT(function->context()->global()->IsGlobalObject()); |
| 108 | 104 |
| 109 { | 105 { |
| 110 // Save and restore context around invocation and block the | 106 // Save and restore context around invocation and block the |
| 111 // allocation of handles without explicit handle scopes. | 107 // allocation of handles without explicit handle scopes. |
| 112 SaveContext save(isolate); | 108 SaveContext save(isolate); |
| 113 NoHandleAllocation na; | 109 NoHandleAllocation na; |
| 114 JSEntryFunction entry = FUNCTION_CAST<JSEntryFunction>(code->entry()); | 110 JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry()); |
| 115 | 111 |
| 116 // Call the function through the right JS entry stub. | 112 // Call the function through the right JS entry stub. |
| 117 byte* entry_address = func->code()->entry(); | 113 byte* function_entry = function->code()->entry(); |
| 118 JSFunction* function = *func; | 114 JSFunction* func = *function; |
| 119 Object* receiver_pointer = *receiver; | 115 Object* recv = *receiver; |
| 120 value = CALL_GENERATED_CODE(entry, entry_address, function, | 116 Object*** argv = reinterpret_cast<Object***>(args); |
| 121 receiver_pointer, argc, args); | 117 value = |
| 118 CALL_GENERATED_CODE(stub_entry, function_entry, func, recv, argc, argv); | |
| 122 } | 119 } |
| 123 | 120 |
| 124 #ifdef DEBUG | 121 #ifdef DEBUG |
| 125 value->Verify(); | 122 value->Verify(); |
| 126 #endif | 123 #endif |
| 127 | 124 |
| 128 // Update the pending exception flag and return the value. | 125 // Update the pending exception flag and return the value. |
| 129 *has_pending_exception = value->IsException(); | 126 *has_pending_exception = value->IsException(); |
| 130 ASSERT(*has_pending_exception == Isolate::Current()->has_pending_exception()); | 127 ASSERT(*has_pending_exception == Isolate::Current()->has_pending_exception()); |
| 131 if (*has_pending_exception) { | 128 if (*has_pending_exception) { |
| 132 isolate->ReportPendingMessages(); | 129 isolate->ReportPendingMessages(); |
| 133 if (isolate->pending_exception() == Failure::OutOfMemoryException()) { | 130 if (isolate->pending_exception() == Failure::OutOfMemoryException()) { |
| 134 if (!isolate->ignore_out_of_memory()) { | 131 if (!isolate->ignore_out_of_memory()) { |
| 135 V8::FatalProcessOutOfMemory("JS", true); | 132 V8::FatalProcessOutOfMemory("JS", true); |
| 136 } | 133 } |
| 137 } | 134 } |
| 138 return Handle<Object>(); | 135 return Handle<Object>(); |
| 139 } else { | 136 } else { |
| 140 isolate->clear_pending_message(); | 137 isolate->clear_pending_message(); |
| 141 } | 138 } |
| 142 | 139 |
| 143 return Handle<Object>(value->ToObjectUnchecked(), isolate); | 140 return Handle<Object>(value->ToObjectUnchecked(), isolate); |
| 144 } | 141 } |
| 145 | 142 |
| 146 | 143 |
| 147 Handle<Object> Execution::Call(Handle<Object> callable, | 144 Handle<Object> Execution::Call(Handle<Object> callable, |
| 148 Handle<Object> receiver, | 145 Handle<Object> receiver, |
| 149 int argc, | 146 int argc, |
| 150 Object*** args, | 147 Handle<Object> argv[], |
| 151 bool* pending_exception, | 148 bool* pending_exception, |
| 152 bool convert_receiver) { | 149 bool convert_receiver) { |
| 153 *pending_exception = false; | 150 *pending_exception = false; |
| 154 | 151 |
| 155 if (!callable->IsJSFunction()) { | 152 if (!callable->IsJSFunction()) { |
| 156 callable = TryGetFunctionDelegate(callable, pending_exception); | 153 callable = TryGetFunctionDelegate(callable, pending_exception); |
| 157 if (*pending_exception) return callable; | 154 if (*pending_exception) return callable; |
| 158 } | 155 } |
| 159 Handle<JSFunction> func = Handle<JSFunction>::cast(callable); | 156 Handle<JSFunction> func = Handle<JSFunction>::cast(callable); |
| 160 | 157 |
| 161 // In non-strict mode, convert receiver. | 158 // In non-strict mode, convert receiver. |
| 162 if (convert_receiver && !receiver->IsJSReceiver() && | 159 if (convert_receiver && !receiver->IsJSReceiver() && |
| 163 !func->shared()->native() && !func->shared()->strict_mode()) { | 160 !func->shared()->native() && !func->shared()->strict_mode()) { |
| 164 if (receiver->IsUndefined() || receiver->IsNull()) { | 161 if (receiver->IsUndefined() || receiver->IsNull()) { |
| 165 Object* global = func->context()->global()->global_receiver(); | 162 Object* global = func->context()->global()->global_receiver(); |
| 166 // Under some circumstances, 'global' can be the JSBuiltinsObject | 163 // Under some circumstances, 'global' can be the JSBuiltinsObject |
| 167 // In that case, don't rewrite. | 164 // In that case, don't rewrite. |
| 168 // (FWIW, the same holds for GetIsolate()->global()->global_receiver().) | 165 // (FWIW, the same holds for GetIsolate()->global()->global_receiver().) |
| 169 if (!global->IsJSBuiltinsObject()) receiver = Handle<Object>(global); | 166 if (!global->IsJSBuiltinsObject()) receiver = Handle<Object>(global); |
| 170 } else { | 167 } else { |
| 171 receiver = ToObject(receiver, pending_exception); | 168 receiver = ToObject(receiver, pending_exception); |
| 172 } | 169 } |
| 173 if (*pending_exception) return callable; | 170 if (*pending_exception) return callable; |
| 174 } | 171 } |
| 175 | 172 |
| 176 return Invoke(false, func, receiver, argc, args, pending_exception); | 173 return Invoke(false, func, receiver, argc, argv, pending_exception); |
| 177 } | 174 } |
| 178 | 175 |
| 179 | 176 |
| 180 Handle<Object> Execution::New(Handle<JSFunction> func, int argc, | 177 Handle<Object> Execution::New(Handle<JSFunction> func, |
| 181 Object*** args, bool* pending_exception) { | 178 int argc, |
| 182 return Invoke(true, func, Isolate::Current()->global(), argc, args, | 179 Handle<Object> argv[], |
| 180 bool* pending_exception) { | |
| 181 return Invoke(true, func, Isolate::Current()->global(), argc, argv, | |
| 183 pending_exception); | 182 pending_exception); |
| 184 } | 183 } |
| 185 | 184 |
| 186 | 185 |
| 187 Handle<Object> Execution::TryCall(Handle<JSFunction> func, | 186 Handle<Object> Execution::TryCall(Handle<JSFunction> func, |
| 188 Handle<Object> receiver, | 187 Handle<Object> receiver, |
| 189 int argc, | 188 int argc, |
| 190 Object*** args, | 189 Handle<Object> args[], |
| 191 bool* caught_exception) { | 190 bool* caught_exception) { |
| 192 // Enter a try-block while executing the JavaScript code. To avoid | 191 // Enter a try-block while executing the JavaScript code. To avoid |
| 193 // duplicate error printing it must be non-verbose. Also, to avoid | 192 // duplicate error printing it must be non-verbose. Also, to avoid |
| 194 // creating message objects during stack overflow we shouldn't | 193 // creating message objects during stack overflow we shouldn't |
| 195 // capture messages. | 194 // capture messages. |
| 196 v8::TryCatch catcher; | 195 v8::TryCatch catcher; |
| 197 catcher.SetVerbose(false); | 196 catcher.SetVerbose(false); |
| 198 catcher.SetCaptureMessage(false); | 197 catcher.SetCaptureMessage(false); |
| 199 *caught_exception = false; | 198 *caught_exception = false; |
| 200 | 199 |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 566 uintptr_t stored_limit = per_thread->stack_limit(); | 565 uintptr_t stored_limit = per_thread->stack_limit(); |
| 567 // You should hold the ExecutionAccess lock when you call this. | 566 // You should hold the ExecutionAccess lock when you call this. |
| 568 if (stored_limit != 0) { | 567 if (stored_limit != 0) { |
| 569 SetStackLimit(stored_limit); | 568 SetStackLimit(stored_limit); |
| 570 } | 569 } |
| 571 } | 570 } |
| 572 | 571 |
| 573 | 572 |
| 574 // --- C a l l s t o n a t i v e s --- | 573 // --- C a l l s t o n a t i v e s --- |
| 575 | 574 |
| 576 #define RETURN_NATIVE_CALL(name, argc, argv, has_pending_exception) \ | 575 #define RETURN_NATIVE_CALL(name, args, has_pending_exception) \ |
| 577 do { \ | 576 do { \ |
| 578 Isolate* isolate = Isolate::Current(); \ | 577 Isolate* isolate = Isolate::Current(); \ |
| 579 Object** args[argc] = argv; \ | 578 Handle<Object> argv[] = args; \ |
| 580 ASSERT(has_pending_exception != NULL); \ | 579 ASSERT(has_pending_exception != NULL); \ |
| 581 return Call(isolate->name##_fun(), \ | 580 return Call(isolate->name##_fun(), \ |
| 582 isolate->js_builtins_object(), argc, args, \ | 581 isolate->js_builtins_object(), \ |
| 583 has_pending_exception); \ | 582 ARRAY_SIZE(argv), argv, \ |
|
rossberg
2011/10/05 13:10:17
I guess it doesn't matter much, because the macro
Kevin Millikin (Chromium)
2011/10/05 13:47:26
Yeah, it's a bit dangerous and the programmer has
| |
| 583 has_pending_exception); \ | |
| 584 } while (false) | 584 } while (false) |
| 585 | 585 |
| 586 | 586 |
| 587 Handle<Object> Execution::ToBoolean(Handle<Object> obj) { | 587 Handle<Object> Execution::ToBoolean(Handle<Object> obj) { |
| 588 // See the similar code in runtime.js:ToBoolean. | 588 // See the similar code in runtime.js:ToBoolean. |
| 589 if (obj->IsBoolean()) return obj; | 589 if (obj->IsBoolean()) return obj; |
| 590 bool result = true; | 590 bool result = true; |
| 591 if (obj->IsString()) { | 591 if (obj->IsString()) { |
| 592 result = Handle<String>::cast(obj)->length() != 0; | 592 result = Handle<String>::cast(obj)->length() != 0; |
| 593 } else if (obj->IsNull() || obj->IsUndefined()) { | 593 } else if (obj->IsNull() || obj->IsUndefined()) { |
| 594 result = false; | 594 result = false; |
| 595 } else if (obj->IsNumber()) { | 595 } else if (obj->IsNumber()) { |
| 596 double value = obj->Number(); | 596 double value = obj->Number(); |
| 597 result = !((value == 0) || isnan(value)); | 597 result = !((value == 0) || isnan(value)); |
| 598 } | 598 } |
| 599 return Handle<Object>(HEAP->ToBoolean(result)); | 599 return Handle<Object>(HEAP->ToBoolean(result)); |
| 600 } | 600 } |
| 601 | 601 |
| 602 | 602 |
| 603 Handle<Object> Execution::ToNumber(Handle<Object> obj, bool* exc) { | 603 Handle<Object> Execution::ToNumber(Handle<Object> obj, bool* exc) { |
| 604 RETURN_NATIVE_CALL(to_number, 1, { obj.location() }, exc); | 604 RETURN_NATIVE_CALL(to_number, { obj }, exc); |
| 605 } | 605 } |
| 606 | 606 |
| 607 | 607 |
| 608 Handle<Object> Execution::ToString(Handle<Object> obj, bool* exc) { | 608 Handle<Object> Execution::ToString(Handle<Object> obj, bool* exc) { |
| 609 RETURN_NATIVE_CALL(to_string, 1, { obj.location() }, exc); | 609 RETURN_NATIVE_CALL(to_string, { obj }, exc); |
| 610 } | 610 } |
| 611 | 611 |
| 612 | 612 |
| 613 Handle<Object> Execution::ToDetailString(Handle<Object> obj, bool* exc) { | 613 Handle<Object> Execution::ToDetailString(Handle<Object> obj, bool* exc) { |
| 614 RETURN_NATIVE_CALL(to_detail_string, 1, { obj.location() }, exc); | 614 RETURN_NATIVE_CALL(to_detail_string, { obj }, exc); |
| 615 } | 615 } |
| 616 | 616 |
| 617 | 617 |
| 618 Handle<Object> Execution::ToObject(Handle<Object> obj, bool* exc) { | 618 Handle<Object> Execution::ToObject(Handle<Object> obj, bool* exc) { |
| 619 if (obj->IsSpecObject()) return obj; | 619 if (obj->IsSpecObject()) return obj; |
| 620 RETURN_NATIVE_CALL(to_object, 1, { obj.location() }, exc); | 620 RETURN_NATIVE_CALL(to_object, { obj }, exc); |
| 621 } | 621 } |
| 622 | 622 |
| 623 | 623 |
| 624 Handle<Object> Execution::ToInteger(Handle<Object> obj, bool* exc) { | 624 Handle<Object> Execution::ToInteger(Handle<Object> obj, bool* exc) { |
| 625 RETURN_NATIVE_CALL(to_integer, 1, { obj.location() }, exc); | 625 RETURN_NATIVE_CALL(to_integer, { obj }, exc); |
| 626 } | 626 } |
| 627 | 627 |
| 628 | 628 |
| 629 Handle<Object> Execution::ToUint32(Handle<Object> obj, bool* exc) { | 629 Handle<Object> Execution::ToUint32(Handle<Object> obj, bool* exc) { |
| 630 RETURN_NATIVE_CALL(to_uint32, 1, { obj.location() }, exc); | 630 RETURN_NATIVE_CALL(to_uint32, { obj }, exc); |
| 631 } | 631 } |
| 632 | 632 |
| 633 | 633 |
| 634 Handle<Object> Execution::ToInt32(Handle<Object> obj, bool* exc) { | 634 Handle<Object> Execution::ToInt32(Handle<Object> obj, bool* exc) { |
| 635 RETURN_NATIVE_CALL(to_int32, 1, { obj.location() }, exc); | 635 RETURN_NATIVE_CALL(to_int32, { obj }, exc); |
| 636 } | 636 } |
| 637 | 637 |
| 638 | 638 |
| 639 Handle<Object> Execution::NewDate(double time, bool* exc) { | 639 Handle<Object> Execution::NewDate(double time, bool* exc) { |
| 640 Handle<Object> time_obj = FACTORY->NewNumber(time); | 640 Handle<Object> time_obj = FACTORY->NewNumber(time); |
| 641 RETURN_NATIVE_CALL(create_date, 1, { time_obj.location() }, exc); | 641 RETURN_NATIVE_CALL(create_date, { time_obj }, exc); |
| 642 } | 642 } |
| 643 | 643 |
| 644 | 644 |
| 645 #undef RETURN_NATIVE_CALL | 645 #undef RETURN_NATIVE_CALL |
| 646 | 646 |
| 647 | 647 |
| 648 Handle<JSRegExp> Execution::NewJSRegExp(Handle<String> pattern, | 648 Handle<JSRegExp> Execution::NewJSRegExp(Handle<String> pattern, |
| 649 Handle<String> flags, | 649 Handle<String> flags, |
| 650 bool* exc) { | 650 bool* exc) { |
| 651 Handle<JSFunction> function = Handle<JSFunction>( | 651 Handle<JSFunction> function = Handle<JSFunction>( |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 668 | 668 |
| 669 Handle<Object> char_at = | 669 Handle<Object> char_at = |
| 670 GetProperty(isolate->js_builtins_object(), | 670 GetProperty(isolate->js_builtins_object(), |
| 671 factory->char_at_symbol()); | 671 factory->char_at_symbol()); |
| 672 if (!char_at->IsJSFunction()) { | 672 if (!char_at->IsJSFunction()) { |
| 673 return factory->undefined_value(); | 673 return factory->undefined_value(); |
| 674 } | 674 } |
| 675 | 675 |
| 676 bool caught_exception; | 676 bool caught_exception; |
| 677 Handle<Object> index_object = factory->NewNumberFromInt(int_index); | 677 Handle<Object> index_object = factory->NewNumberFromInt(int_index); |
| 678 Object** index_arg[] = { index_object.location() }; | 678 Handle<Object> index_arg[] = { index_object }; |
| 679 Handle<Object> result = TryCall(Handle<JSFunction>::cast(char_at), | 679 Handle<Object> result = TryCall(Handle<JSFunction>::cast(char_at), |
| 680 string, | 680 string, |
| 681 ARRAY_SIZE(index_arg), | 681 ARRAY_SIZE(index_arg), |
| 682 index_arg, | 682 index_arg, |
| 683 &caught_exception); | 683 &caught_exception); |
| 684 if (caught_exception) { | 684 if (caught_exception) { |
| 685 return factory->undefined_value(); | 685 return factory->undefined_value(); |
| 686 } | 686 } |
| 687 return result; | 687 return result; |
| 688 } | 688 } |
| 689 | 689 |
| 690 | 690 |
| 691 Handle<JSFunction> Execution::InstantiateFunction( | 691 Handle<JSFunction> Execution::InstantiateFunction( |
| 692 Handle<FunctionTemplateInfo> data, bool* exc) { | 692 Handle<FunctionTemplateInfo> data, |
| 693 bool* exc) { | |
| 693 Isolate* isolate = data->GetIsolate(); | 694 Isolate* isolate = data->GetIsolate(); |
| 694 // Fast case: see if the function has already been instantiated | 695 // Fast case: see if the function has already been instantiated |
| 695 int serial_number = Smi::cast(data->serial_number())->value(); | 696 int serial_number = Smi::cast(data->serial_number())->value(); |
| 696 Object* elm = | 697 Object* elm = |
| 697 isolate->global_context()->function_cache()-> | 698 isolate->global_context()->function_cache()-> |
| 698 GetElementNoExceptionThrown(serial_number); | 699 GetElementNoExceptionThrown(serial_number); |
| 699 if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm)); | 700 if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm)); |
| 700 // The function has not yet been instantiated in this context; do it. | 701 // The function has not yet been instantiated in this context; do it. |
| 701 Object** args[1] = { Handle<Object>::cast(data).location() }; | 702 Handle<Object> args[] = { data }; |
| 702 Handle<Object> result = | 703 Handle<Object> result = Call(isolate->instantiate_fun(), |
| 703 Call(isolate->instantiate_fun(), | 704 isolate->js_builtins_object(), |
| 704 isolate->js_builtins_object(), 1, args, exc); | 705 ARRAY_SIZE(args), |
| 706 args, | |
| 707 exc); | |
| 705 if (*exc) return Handle<JSFunction>::null(); | 708 if (*exc) return Handle<JSFunction>::null(); |
| 706 return Handle<JSFunction>::cast(result); | 709 return Handle<JSFunction>::cast(result); |
| 707 } | 710 } |
| 708 | 711 |
| 709 | 712 |
| 710 Handle<JSObject> Execution::InstantiateObject(Handle<ObjectTemplateInfo> data, | 713 Handle<JSObject> Execution::InstantiateObject(Handle<ObjectTemplateInfo> data, |
| 711 bool* exc) { | 714 bool* exc) { |
| 712 Isolate* isolate = data->GetIsolate(); | 715 Isolate* isolate = data->GetIsolate(); |
| 713 if (data->property_list()->IsUndefined() && | 716 if (data->property_list()->IsUndefined() && |
| 714 !data->constructor()->IsUndefined()) { | 717 !data->constructor()->IsUndefined()) { |
| 715 // Initialization to make gcc happy. | 718 // Initialization to make gcc happy. |
| 716 Object* result = NULL; | 719 Object* result = NULL; |
| 717 { | 720 { |
| 718 HandleScope scope(isolate); | 721 HandleScope scope(isolate); |
| 719 Handle<FunctionTemplateInfo> cons_template = | 722 Handle<FunctionTemplateInfo> cons_template = |
| 720 Handle<FunctionTemplateInfo>( | 723 Handle<FunctionTemplateInfo>( |
| 721 FunctionTemplateInfo::cast(data->constructor())); | 724 FunctionTemplateInfo::cast(data->constructor())); |
| 722 Handle<JSFunction> cons = InstantiateFunction(cons_template, exc); | 725 Handle<JSFunction> cons = InstantiateFunction(cons_template, exc); |
| 723 if (*exc) return Handle<JSObject>::null(); | 726 if (*exc) return Handle<JSObject>::null(); |
| 724 Handle<Object> value = New(cons, 0, NULL, exc); | 727 Handle<Object> value = New(cons, 0, NULL, exc); |
| 725 if (*exc) return Handle<JSObject>::null(); | 728 if (*exc) return Handle<JSObject>::null(); |
| 726 result = *value; | 729 result = *value; |
| 727 } | 730 } |
| 728 ASSERT(!*exc); | 731 ASSERT(!*exc); |
| 729 return Handle<JSObject>(JSObject::cast(result)); | 732 return Handle<JSObject>(JSObject::cast(result)); |
| 730 } else { | 733 } else { |
| 731 Object** args[1] = { Handle<Object>::cast(data).location() }; | 734 Handle<Object> args[] = { data }; |
| 732 Handle<Object> result = | 735 Handle<Object> result = Call(isolate->instantiate_fun(), |
| 733 Call(isolate->instantiate_fun(), | 736 isolate->js_builtins_object(), |
| 734 isolate->js_builtins_object(), 1, args, exc); | 737 ARRAY_SIZE(args), |
| 738 args, | |
| 739 exc); | |
| 735 if (*exc) return Handle<JSObject>::null(); | 740 if (*exc) return Handle<JSObject>::null(); |
| 736 return Handle<JSObject>::cast(result); | 741 return Handle<JSObject>::cast(result); |
| 737 } | 742 } |
| 738 } | 743 } |
| 739 | 744 |
| 740 | 745 |
| 741 void Execution::ConfigureInstance(Handle<Object> instance, | 746 void Execution::ConfigureInstance(Handle<Object> instance, |
| 742 Handle<Object> instance_template, | 747 Handle<Object> instance_template, |
| 743 bool* exc) { | 748 bool* exc) { |
| 744 Isolate* isolate = Isolate::Current(); | 749 Isolate* isolate = Isolate::Current(); |
| 745 Object** args[2] = { instance.location(), instance_template.location() }; | 750 Handle<Object> args[] = { instance, instance_template }; |
| 746 Execution::Call(isolate->configure_instance_fun(), | 751 Execution::Call(isolate->configure_instance_fun(), |
| 747 isolate->js_builtins_object(), 2, args, exc); | 752 isolate->js_builtins_object(), |
| 753 ARRAY_SIZE(args), | |
| 754 args, | |
| 755 exc); | |
| 748 } | 756 } |
| 749 | 757 |
| 750 | 758 |
| 751 Handle<String> Execution::GetStackTraceLine(Handle<Object> recv, | 759 Handle<String> Execution::GetStackTraceLine(Handle<Object> recv, |
| 752 Handle<JSFunction> fun, | 760 Handle<JSFunction> fun, |
| 753 Handle<Object> pos, | 761 Handle<Object> pos, |
| 754 Handle<Object> is_global) { | 762 Handle<Object> is_global) { |
| 755 Isolate* isolate = fun->GetIsolate(); | 763 Isolate* isolate = fun->GetIsolate(); |
| 756 const int argc = 4; | 764 Handle<Object> args[] = { recv, fun, pos, is_global }; |
| 757 Object** args[argc] = { recv.location(), | |
| 758 Handle<Object>::cast(fun).location(), | |
| 759 pos.location(), | |
| 760 is_global.location() }; | |
| 761 bool caught_exception; | 765 bool caught_exception; |
| 762 Handle<Object> result = | 766 Handle<Object> result = TryCall(isolate->get_stack_trace_line_fun(), |
| 763 TryCall(isolate->get_stack_trace_line_fun(), | 767 isolate->js_builtins_object(), |
| 764 isolate->js_builtins_object(), argc, args, | 768 ARRAY_SIZE(args), |
| 765 &caught_exception); | 769 args, |
| 770 &caught_exception); | |
| 766 if (caught_exception || !result->IsString()) { | 771 if (caught_exception || !result->IsString()) { |
| 767 return isolate->factory()->empty_symbol(); | 772 return isolate->factory()->empty_symbol(); |
| 768 } | 773 } |
| 769 | 774 |
| 770 return Handle<String>::cast(result); | 775 return Handle<String>::cast(result); |
| 771 } | 776 } |
| 772 | 777 |
| 773 | 778 |
| 774 static Object* RuntimePreempt() { | 779 static Object* RuntimePreempt() { |
| 775 Isolate* isolate = Isolate::Current(); | 780 Isolate* isolate = Isolate::Current(); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 893 return isolate->TerminateExecution(); | 898 return isolate->TerminateExecution(); |
| 894 } | 899 } |
| 895 if (stack_guard->IsInterrupted()) { | 900 if (stack_guard->IsInterrupted()) { |
| 896 stack_guard->Continue(INTERRUPT); | 901 stack_guard->Continue(INTERRUPT); |
| 897 return isolate->StackOverflow(); | 902 return isolate->StackOverflow(); |
| 898 } | 903 } |
| 899 return isolate->heap()->undefined_value(); | 904 return isolate->heap()->undefined_value(); |
| 900 } | 905 } |
| 901 | 906 |
| 902 } } // namespace v8::internal | 907 } } // namespace v8::internal |
| OLD | NEW |