OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 static const int kSize_ = 8; | 538 static const int kSize_ = 8; |
539 | 539 |
540 friend class JSArrayBasedStruct<FunctionInfoWrapper>; | 540 friend class JSArrayBasedStruct<FunctionInfoWrapper>; |
541 }; | 541 }; |
542 | 542 |
543 // Wraps SharedFunctionInfo along with some of its fields for passing it | 543 // Wraps SharedFunctionInfo along with some of its fields for passing it |
544 // back to JavaScript. SharedFunctionInfo object itself is additionally | 544 // back to JavaScript. SharedFunctionInfo object itself is additionally |
545 // wrapped into BlindReference for sanitizing reasons. | 545 // wrapped into BlindReference for sanitizing reasons. |
546 class SharedInfoWrapper : public JSArrayBasedStruct<SharedInfoWrapper> { | 546 class SharedInfoWrapper : public JSArrayBasedStruct<SharedInfoWrapper> { |
547 public: | 547 public: |
| 548 static bool IsInstance(Handle<JSArray> array) { |
| 549 return array->length() == Smi::FromInt(kSize_) && |
| 550 array->GetElement(kSharedInfoOffset_)->IsJSValue(); |
| 551 } |
| 552 |
548 explicit SharedInfoWrapper(Handle<JSArray> array) | 553 explicit SharedInfoWrapper(Handle<JSArray> array) |
549 : JSArrayBasedStruct<SharedInfoWrapper>(array) { | 554 : JSArrayBasedStruct<SharedInfoWrapper>(array) { |
550 } | 555 } |
551 | 556 |
552 void SetProperties(Handle<String> name, int start_position, int end_position, | 557 void SetProperties(Handle<String> name, int start_position, int end_position, |
553 Handle<SharedFunctionInfo> info) { | 558 Handle<SharedFunctionInfo> info) { |
554 HandleScope scope; | 559 HandleScope scope; |
555 this->SetField(kFunctionNameOffset_, name); | 560 this->SetField(kFunctionNameOffset_, name); |
556 Handle<JSValue> info_holder = WrapInJSValue(*info); | 561 Handle<JSValue> info_holder = WrapInJSValue(*info); |
557 this->SetField(kSharedInfoOffset_, info_holder); | 562 this->SetField(kSharedInfoOffset_, info_holder); |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 } | 832 } |
828 | 833 |
829 | 834 |
830 // Check whether the code is natural function code (not a lazy-compile stub | 835 // Check whether the code is natural function code (not a lazy-compile stub |
831 // code). | 836 // code). |
832 static bool IsJSFunctionCode(Code* code) { | 837 static bool IsJSFunctionCode(Code* code) { |
833 return code->kind() == Code::FUNCTION; | 838 return code->kind() == Code::FUNCTION; |
834 } | 839 } |
835 | 840 |
836 | 841 |
837 void LiveEdit::ReplaceFunctionCode(Handle<JSArray> new_compile_info_array, | 842 Object* LiveEdit::ReplaceFunctionCode(Handle<JSArray> new_compile_info_array, |
838 Handle<JSArray> shared_info_array) { | 843 Handle<JSArray> shared_info_array) { |
839 HandleScope scope; | 844 HandleScope scope; |
840 | 845 |
| 846 if (!SharedInfoWrapper::IsInstance(shared_info_array)) { |
| 847 return Top::ThrowIllegalOperation(); |
| 848 } |
| 849 |
841 FunctionInfoWrapper compile_info_wrapper(new_compile_info_array); | 850 FunctionInfoWrapper compile_info_wrapper(new_compile_info_array); |
842 SharedInfoWrapper shared_info_wrapper(shared_info_array); | 851 SharedInfoWrapper shared_info_wrapper(shared_info_array); |
843 | 852 |
844 Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo(); | 853 Handle<SharedFunctionInfo> shared_info = shared_info_wrapper.GetInfo(); |
845 | 854 |
846 if (IsJSFunctionCode(shared_info->code())) { | 855 if (IsJSFunctionCode(shared_info->code())) { |
847 ReplaceCodeObject(shared_info->code(), | 856 ReplaceCodeObject(shared_info->code(), |
848 *(compile_info_wrapper.GetFunctionCode())); | 857 *(compile_info_wrapper.GetFunctionCode())); |
849 } | 858 } |
850 | 859 |
851 if (shared_info->debug_info()->IsDebugInfo()) { | 860 if (shared_info->debug_info()->IsDebugInfo()) { |
852 Handle<DebugInfo> debug_info(DebugInfo::cast(shared_info->debug_info())); | 861 Handle<DebugInfo> debug_info(DebugInfo::cast(shared_info->debug_info())); |
853 Handle<Code> new_original_code = | 862 Handle<Code> new_original_code = |
854 Factory::CopyCode(compile_info_wrapper.GetFunctionCode()); | 863 Factory::CopyCode(compile_info_wrapper.GetFunctionCode()); |
855 debug_info->set_original_code(*new_original_code); | 864 debug_info->set_original_code(*new_original_code); |
856 } | 865 } |
857 | 866 |
858 shared_info->set_start_position(compile_info_wrapper.GetStartPosition()); | 867 shared_info->set_start_position(compile_info_wrapper.GetStartPosition()); |
859 shared_info->set_end_position(compile_info_wrapper.GetEndPosition()); | 868 shared_info->set_end_position(compile_info_wrapper.GetEndPosition()); |
860 | 869 |
861 shared_info->set_construct_stub( | 870 shared_info->set_construct_stub( |
862 Builtins::builtin(Builtins::JSConstructStubGeneric)); | 871 Builtins::builtin(Builtins::JSConstructStubGeneric)); |
863 // update breakpoints | 872 |
| 873 return Heap::undefined_value(); |
864 } | 874 } |
865 | 875 |
866 | 876 |
867 // TODO(635): Eval caches its scripts (same text -- same compiled info). | 877 // TODO(635): Eval caches its scripts (same text -- same compiled info). |
868 // Make sure we clear such caches. | 878 // Make sure we clear such caches. |
869 void LiveEdit::SetFunctionScript(Handle<JSValue> function_wrapper, | 879 void LiveEdit::SetFunctionScript(Handle<JSValue> function_wrapper, |
870 Handle<Object> script_handle) { | 880 Handle<Object> script_handle) { |
871 Handle<SharedFunctionInfo> shared_info = | 881 Handle<SharedFunctionInfo> shared_info = |
872 Handle<SharedFunctionInfo>::cast(UnwrapJSValue(function_wrapper)); | 882 Handle<SharedFunctionInfo>::cast(UnwrapJSValue(function_wrapper)); |
873 shared_info->set_script(*script_handle); | 883 shared_info->set_script(*script_handle); |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 } else { | 1027 } else { |
1018 // Relocation info section now has different size. We cannot simply | 1028 // Relocation info section now has different size. We cannot simply |
1019 // rewrite it inside code object. Instead we have to create a new | 1029 // rewrite it inside code object. Instead we have to create a new |
1020 // code object. | 1030 // code object. |
1021 Handle<Code> result(Factory::CopyCode(code, buffer)); | 1031 Handle<Code> result(Factory::CopyCode(code, buffer)); |
1022 return result; | 1032 return result; |
1023 } | 1033 } |
1024 } | 1034 } |
1025 | 1035 |
1026 | 1036 |
1027 void LiveEdit::PatchFunctionPositions( | 1037 Object* LiveEdit::PatchFunctionPositions( |
1028 Handle<JSArray> shared_info_array, Handle<JSArray> position_change_array) { | 1038 Handle<JSArray> shared_info_array, Handle<JSArray> position_change_array) { |
| 1039 |
| 1040 if (!SharedInfoWrapper::IsInstance(shared_info_array)) { |
| 1041 return Top::ThrowIllegalOperation(); |
| 1042 } |
| 1043 |
1029 SharedInfoWrapper shared_info_wrapper(shared_info_array); | 1044 SharedInfoWrapper shared_info_wrapper(shared_info_array); |
1030 Handle<SharedFunctionInfo> info = shared_info_wrapper.GetInfo(); | 1045 Handle<SharedFunctionInfo> info = shared_info_wrapper.GetInfo(); |
1031 | 1046 |
1032 int old_function_start = info->start_position(); | 1047 int old_function_start = info->start_position(); |
1033 int new_function_start = TranslatePosition(old_function_start, | 1048 int new_function_start = TranslatePosition(old_function_start, |
1034 position_change_array); | 1049 position_change_array); |
1035 info->set_start_position(new_function_start); | 1050 info->set_start_position(new_function_start); |
1036 info->set_end_position(TranslatePosition(info->end_position(), | 1051 info->set_end_position(TranslatePosition(info->end_position(), |
1037 position_change_array)); | 1052 position_change_array)); |
1038 | 1053 |
1039 info->set_function_token_position( | 1054 info->set_function_token_position( |
1040 TranslatePosition(info->function_token_position(), | 1055 TranslatePosition(info->function_token_position(), |
1041 position_change_array)); | 1056 position_change_array)); |
1042 | 1057 |
1043 if (IsJSFunctionCode(info->code())) { | 1058 if (IsJSFunctionCode(info->code())) { |
1044 // Patch relocation info section of the code. | 1059 // Patch relocation info section of the code. |
1045 Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()), | 1060 Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()), |
1046 position_change_array); | 1061 position_change_array); |
1047 if (*patched_code != info->code()) { | 1062 if (*patched_code != info->code()) { |
1048 // Replace all references to the code across the heap. In particular, | 1063 // Replace all references to the code across the heap. In particular, |
1049 // some stubs may refer to this code and this code may be being executed | 1064 // some stubs may refer to this code and this code may be being executed |
1050 // on stack (it is safe to substitute the code object on stack, because | 1065 // on stack (it is safe to substitute the code object on stack, because |
1051 // we only change the structure of rinfo and leave instructions | 1066 // we only change the structure of rinfo and leave instructions |
1052 // untouched). | 1067 // untouched). |
1053 ReplaceCodeObject(info->code(), *patched_code); | 1068 ReplaceCodeObject(info->code(), *patched_code); |
1054 } | 1069 } |
1055 } | 1070 } |
| 1071 |
| 1072 return Heap::undefined_value(); |
1056 } | 1073 } |
1057 | 1074 |
1058 | 1075 |
1059 static Handle<Script> CreateScriptCopy(Handle<Script> original) { | 1076 static Handle<Script> CreateScriptCopy(Handle<Script> original) { |
1060 Handle<String> original_source(String::cast(original->source())); | 1077 Handle<String> original_source(String::cast(original->source())); |
1061 | 1078 |
1062 Handle<Script> copy = Factory::NewScript(original_source); | 1079 Handle<Script> copy = Factory::NewScript(original_source); |
1063 | 1080 |
1064 copy->set_name(original->name()); | 1081 copy->set_name(original->name()); |
1065 copy->set_line_offset(original->line_offset()); | 1082 copy->set_line_offset(original->line_offset()); |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1442 | 1459 |
1443 bool LiveEditFunctionTracker::IsActive() { | 1460 bool LiveEditFunctionTracker::IsActive() { |
1444 return false; | 1461 return false; |
1445 } | 1462 } |
1446 | 1463 |
1447 #endif // ENABLE_DEBUGGER_SUPPORT | 1464 #endif // ENABLE_DEBUGGER_SUPPORT |
1448 | 1465 |
1449 | 1466 |
1450 | 1467 |
1451 } } // namespace v8::internal | 1468 } } // namespace v8::internal |
OLD | NEW |