OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 7027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7038 isolate, result, isolate->factory()->NewConsString(str1, str2)); | 7038 isolate, result, isolate->factory()->NewConsString(str1, str2)); |
7039 return *result; | 7039 return *result; |
7040 } | 7040 } |
7041 | 7041 |
7042 | 7042 |
7043 template <typename sinkchar> | 7043 template <typename sinkchar> |
7044 static inline void StringBuilderConcatHelper(String* special, | 7044 static inline void StringBuilderConcatHelper(String* special, |
7045 sinkchar* sink, | 7045 sinkchar* sink, |
7046 FixedArray* fixed_array, | 7046 FixedArray* fixed_array, |
7047 int array_length) { | 7047 int array_length) { |
| 7048 DisallowHeapAllocation no_gc; |
7048 int position = 0; | 7049 int position = 0; |
7049 for (int i = 0; i < array_length; i++) { | 7050 for (int i = 0; i < array_length; i++) { |
7050 Object* element = fixed_array->get(i); | 7051 Object* element = fixed_array->get(i); |
7051 if (element->IsSmi()) { | 7052 if (element->IsSmi()) { |
7052 // Smi encoding of position and length. | 7053 // Smi encoding of position and length. |
7053 int encoded_slice = Smi::cast(element)->value(); | 7054 int encoded_slice = Smi::cast(element)->value(); |
7054 int pos; | 7055 int pos; |
7055 int len; | 7056 int len; |
7056 if (encoded_slice > 0) { | 7057 if (encoded_slice > 0) { |
7057 // Position and length encoded in one smi. | 7058 // Position and length encoded in one smi. |
(...skipping 14 matching lines...) Expand all Loading... |
7072 } else { | 7073 } else { |
7073 String* string = String::cast(element); | 7074 String* string = String::cast(element); |
7074 int element_length = string->length(); | 7075 int element_length = string->length(); |
7075 String::WriteToFlat(string, sink + position, 0, element_length); | 7076 String::WriteToFlat(string, sink + position, 0, element_length); |
7076 position += element_length; | 7077 position += element_length; |
7077 } | 7078 } |
7078 } | 7079 } |
7079 } | 7080 } |
7080 | 7081 |
7081 | 7082 |
7082 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) { | 7083 // Returns the result length of the concatenation. |
7083 HandleScope scope(isolate); | 7084 // On illegal argument, -1 is returned. |
7084 ASSERT(args.length() == 3); | 7085 static inline int StringBuilderConcatLength(int special_length, |
7085 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); | 7086 FixedArray* fixed_array, |
7086 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); | 7087 int array_length, |
7087 int array_length = args.smi_at(1); | 7088 bool* one_byte) { |
7088 CONVERT_ARG_HANDLE_CHECKED(String, special, 2); | 7089 DisallowHeapAllocation no_gc; |
7089 | |
7090 // This assumption is used by the slice encoding in one or two smis. | |
7091 ASSERT(Smi::kMaxValue >= String::kMaxLength); | |
7092 | |
7093 JSObject::EnsureCanContainHeapObjectElements(array); | |
7094 | |
7095 int special_length = special->length(); | |
7096 if (!array->HasFastObjectElements()) { | |
7097 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
7098 } | |
7099 FixedArray* fixed_array = FixedArray::cast(array->elements()); | |
7100 if (fixed_array->length() < array_length) { | |
7101 array_length = fixed_array->length(); | |
7102 } | |
7103 | |
7104 if (array_length == 0) { | |
7105 return isolate->heap()->empty_string(); | |
7106 } else if (array_length == 1) { | |
7107 Object* first = fixed_array->get(0); | |
7108 if (first->IsString()) return first; | |
7109 } | |
7110 | |
7111 bool one_byte = special->HasOnlyOneByteChars(); | |
7112 int position = 0; | 7090 int position = 0; |
7113 for (int i = 0; i < array_length; i++) { | 7091 for (int i = 0; i < array_length; i++) { |
7114 int increment = 0; | 7092 int increment = 0; |
7115 Object* elt = fixed_array->get(i); | 7093 Object* elt = fixed_array->get(i); |
7116 if (elt->IsSmi()) { | 7094 if (elt->IsSmi()) { |
7117 // Smi encoding of position and length. | 7095 // Smi encoding of position and length. |
7118 int smi_value = Smi::cast(elt)->value(); | 7096 int smi_value = Smi::cast(elt)->value(); |
7119 int pos; | 7097 int pos; |
7120 int len; | 7098 int len; |
7121 if (smi_value > 0) { | 7099 if (smi_value > 0) { |
7122 // Position and length encoded in one smi. | 7100 // Position and length encoded in one smi. |
7123 pos = StringBuilderSubstringPosition::decode(smi_value); | 7101 pos = StringBuilderSubstringPosition::decode(smi_value); |
7124 len = StringBuilderSubstringLength::decode(smi_value); | 7102 len = StringBuilderSubstringLength::decode(smi_value); |
7125 } else { | 7103 } else { |
7126 // Position and length encoded in two smis. | 7104 // Position and length encoded in two smis. |
7127 len = -smi_value; | 7105 len = -smi_value; |
7128 // Get the position and check that it is a positive smi. | 7106 // Get the position and check that it is a positive smi. |
7129 i++; | 7107 i++; |
7130 if (i >= array_length) { | 7108 if (i >= array_length) return -1; |
7131 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
7132 } | |
7133 Object* next_smi = fixed_array->get(i); | 7109 Object* next_smi = fixed_array->get(i); |
7134 if (!next_smi->IsSmi()) { | 7110 if (!next_smi->IsSmi()) return -1; |
7135 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
7136 } | |
7137 pos = Smi::cast(next_smi)->value(); | 7111 pos = Smi::cast(next_smi)->value(); |
7138 if (pos < 0) { | 7112 if (pos < 0) return -1; |
7139 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
7140 } | |
7141 } | 7113 } |
7142 ASSERT(pos >= 0); | 7114 ASSERT(pos >= 0); |
7143 ASSERT(len >= 0); | 7115 ASSERT(len >= 0); |
7144 if (pos > special_length || len > special_length - pos) { | 7116 if (pos > special_length || len > special_length - pos) return -1; |
7145 return isolate->Throw(isolate->heap()->illegal_argument_string()); | |
7146 } | |
7147 increment = len; | 7117 increment = len; |
7148 } else if (elt->IsString()) { | 7118 } else if (elt->IsString()) { |
7149 String* element = String::cast(elt); | 7119 String* element = String::cast(elt); |
7150 int element_length = element->length(); | 7120 int element_length = element->length(); |
7151 increment = element_length; | 7121 increment = element_length; |
7152 if (one_byte && !element->HasOnlyOneByteChars()) { | 7122 if (*one_byte && !element->HasOnlyOneByteChars()) { |
7153 one_byte = false; | 7123 *one_byte = false; |
7154 } | 7124 } |
7155 } else { | 7125 } else { |
7156 ASSERT(!elt->IsTheHole()); | 7126 ASSERT(!elt->IsTheHole()); |
7157 return isolate->Throw(isolate->heap()->illegal_argument_string()); | 7127 return -1; |
7158 } | 7128 } |
7159 if (increment > String::kMaxLength - position) { | 7129 if (increment > String::kMaxLength - position) { |
7160 return isolate->ThrowInvalidStringLength(); | 7130 return kMaxInt; // Provoke throw on allocation. |
7161 } | 7131 } |
7162 position += increment; | 7132 position += increment; |
7163 } | 7133 } |
| 7134 return position; |
| 7135 } |
7164 | 7136 |
7165 int length = position; | 7137 |
7166 Object* object; | 7138 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) { |
| 7139 HandleScope scope(isolate); |
| 7140 ASSERT(args.length() == 3); |
| 7141 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); |
| 7142 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); |
| 7143 int array_length = args.smi_at(1); |
| 7144 CONVERT_ARG_HANDLE_CHECKED(String, special, 2); |
| 7145 |
| 7146 // This assumption is used by the slice encoding in one or two smis. |
| 7147 ASSERT(Smi::kMaxValue >= String::kMaxLength); |
| 7148 |
| 7149 JSObject::EnsureCanContainHeapObjectElements(array); |
| 7150 |
| 7151 int special_length = special->length(); |
| 7152 if (!array->HasFastObjectElements()) { |
| 7153 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
| 7154 } |
| 7155 |
| 7156 int length; |
| 7157 bool one_byte = special->HasOnlyOneByteChars(); |
| 7158 |
| 7159 { DisallowHeapAllocation no_gc; |
| 7160 FixedArray* fixed_array = FixedArray::cast(array->elements()); |
| 7161 if (fixed_array->length() < array_length) { |
| 7162 array_length = fixed_array->length(); |
| 7163 } |
| 7164 |
| 7165 if (array_length == 0) { |
| 7166 return isolate->heap()->empty_string(); |
| 7167 } else if (array_length == 1) { |
| 7168 Object* first = fixed_array->get(0); |
| 7169 if (first->IsString()) return first; |
| 7170 } |
| 7171 length = StringBuilderConcatLength( |
| 7172 special_length, fixed_array, array_length, &one_byte); |
| 7173 } |
| 7174 |
| 7175 if (length == -1) { |
| 7176 return isolate->Throw(isolate->heap()->illegal_argument_string()); |
| 7177 } |
7167 | 7178 |
7168 if (one_byte) { | 7179 if (one_byte) { |
7169 { MaybeObject* maybe_object = | 7180 Handle<SeqOneByteString> answer; |
7170 isolate->heap()->AllocateRawOneByteString(length); | 7181 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
7171 if (!maybe_object->ToObject(&object)) return maybe_object; | 7182 isolate, answer, |
7172 } | 7183 isolate->factory()->NewRawOneByteString(length)); |
7173 SeqOneByteString* answer = SeqOneByteString::cast(object); | |
7174 StringBuilderConcatHelper(*special, | 7184 StringBuilderConcatHelper(*special, |
7175 answer->GetChars(), | 7185 answer->GetChars(), |
7176 fixed_array, | 7186 FixedArray::cast(array->elements()), |
7177 array_length); | 7187 array_length); |
7178 return answer; | 7188 return *answer; |
7179 } else { | 7189 } else { |
7180 { MaybeObject* maybe_object = | 7190 Handle<SeqTwoByteString> answer; |
7181 isolate->heap()->AllocateRawTwoByteString(length); | 7191 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
7182 if (!maybe_object->ToObject(&object)) return maybe_object; | 7192 isolate, answer, |
7183 } | 7193 isolate->factory()->NewRawTwoByteString(length)); |
7184 SeqTwoByteString* answer = SeqTwoByteString::cast(object); | |
7185 StringBuilderConcatHelper(*special, | 7194 StringBuilderConcatHelper(*special, |
7186 answer->GetChars(), | 7195 answer->GetChars(), |
7187 fixed_array, | 7196 FixedArray::cast(array->elements()), |
7188 array_length); | 7197 array_length); |
7189 return answer; | 7198 return *answer; |
7190 } | 7199 } |
7191 } | 7200 } |
7192 | 7201 |
7193 | 7202 |
7194 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) { | 7203 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) { |
7195 HandleScope scope(isolate); | 7204 HandleScope scope(isolate); |
7196 ASSERT(args.length() == 3); | 7205 ASSERT(args.length() == 3); |
7197 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); | 7206 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); |
7198 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); | 7207 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); |
7199 int array_length = args.smi_at(1); | 7208 int array_length = args.smi_at(1); |
(...skipping 1607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8807 Handle<Object> argv_small_buffer[argv_small_size]; | 8816 Handle<Object> argv_small_buffer[argv_small_size]; |
8808 SmartArrayPointer<Handle<Object> > argv_large_buffer; | 8817 SmartArrayPointer<Handle<Object> > argv_large_buffer; |
8809 Handle<Object>* argv = argv_small_buffer; | 8818 Handle<Object>* argv = argv_small_buffer; |
8810 if (argc > argv_small_size) { | 8819 if (argc > argv_small_size) { |
8811 argv = new Handle<Object>[argc]; | 8820 argv = new Handle<Object>[argc]; |
8812 if (argv == NULL) return isolate->StackOverflow(); | 8821 if (argv == NULL) return isolate->StackOverflow(); |
8813 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); | 8822 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); |
8814 } | 8823 } |
8815 | 8824 |
8816 for (int i = 0; i < argc; ++i) { | 8825 for (int i = 0; i < argc; ++i) { |
8817 MaybeObject* maybe = args[1 + i]; | 8826 argv[i] = Handle<Object>(args[1 + i], isolate); |
8818 Object* object; | |
8819 if (!maybe->To<Object>(&object)) return maybe; | |
8820 argv[i] = Handle<Object>(object, isolate); | |
8821 } | 8827 } |
8822 | 8828 |
8823 Handle<JSReceiver> hfun(fun); | 8829 Handle<JSReceiver> hfun(fun); |
8824 Handle<Object> hreceiver(receiver, isolate); | 8830 Handle<Object> hreceiver(receiver, isolate); |
8825 Handle<Object> result; | 8831 Handle<Object> result; |
8826 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 8832 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
8827 isolate, result, | 8833 isolate, result, |
8828 Execution::Call(isolate, hfun, hreceiver, argc, argv, true)); | 8834 Execution::Call(isolate, hfun, hreceiver, argc, argv, true)); |
8829 return *result; | 8835 return *result; |
8830 } | 8836 } |
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9709 !CodeGenerationFromStringsAllowed(isolate, context)) { | 9715 !CodeGenerationFromStringsAllowed(isolate, context)) { |
9710 Handle<Object> error_message = | 9716 Handle<Object> error_message = |
9711 context->ErrorMessageForCodeGenerationFromStrings(); | 9717 context->ErrorMessageForCodeGenerationFromStrings(); |
9712 return isolate->Throw(*isolate->factory()->NewEvalError( | 9718 return isolate->Throw(*isolate->factory()->NewEvalError( |
9713 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); | 9719 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); |
9714 } | 9720 } |
9715 | 9721 |
9716 // Compile source string in the native context. | 9722 // Compile source string in the native context. |
9717 ParseRestriction restriction = function_literal_only | 9723 ParseRestriction restriction = function_literal_only |
9718 ? ONLY_SINGLE_FUNCTION_LITERAL : NO_PARSE_RESTRICTION; | 9724 ? ONLY_SINGLE_FUNCTION_LITERAL : NO_PARSE_RESTRICTION; |
9719 Handle<JSFunction> fun = Compiler::GetFunctionFromEval( | 9725 Handle<JSFunction> fun; |
9720 source, context, SLOPPY, restriction, RelocInfo::kNoPosition); | 9726 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
9721 RETURN_IF_EMPTY_HANDLE(isolate, fun); | 9727 isolate, fun, |
| 9728 Compiler::GetFunctionFromEval( |
| 9729 source, context, SLOPPY, restriction, RelocInfo::kNoPosition)); |
9722 return *fun; | 9730 return *fun; |
9723 } | 9731 } |
9724 | 9732 |
9725 | 9733 |
9726 static ObjectPair CompileGlobalEval(Isolate* isolate, | 9734 static ObjectPair CompileGlobalEval(Isolate* isolate, |
9727 Handle<String> source, | 9735 Handle<String> source, |
9728 Handle<Object> receiver, | 9736 Handle<Object> receiver, |
9729 StrictMode strict_mode, | 9737 StrictMode strict_mode, |
9730 int scope_position) { | 9738 int scope_position) { |
9731 Handle<Context> context = Handle<Context>(isolate->context()); | 9739 Handle<Context> context = Handle<Context>(isolate->context()); |
9732 Handle<Context> native_context = Handle<Context>(context->native_context()); | 9740 Handle<Context> native_context = Handle<Context>(context->native_context()); |
9733 | 9741 |
9734 // Check if native context allows code generation from | 9742 // Check if native context allows code generation from |
9735 // strings. Throw an exception if it doesn't. | 9743 // strings. Throw an exception if it doesn't. |
9736 if (native_context->allow_code_gen_from_strings()->IsFalse() && | 9744 if (native_context->allow_code_gen_from_strings()->IsFalse() && |
9737 !CodeGenerationFromStringsAllowed(isolate, native_context)) { | 9745 !CodeGenerationFromStringsAllowed(isolate, native_context)) { |
9738 Handle<Object> error_message = | 9746 Handle<Object> error_message = |
9739 native_context->ErrorMessageForCodeGenerationFromStrings(); | 9747 native_context->ErrorMessageForCodeGenerationFromStrings(); |
9740 isolate->Throw(*isolate->factory()->NewEvalError( | 9748 isolate->Throw(*isolate->factory()->NewEvalError( |
9741 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); | 9749 "code_gen_from_strings", HandleVector<Object>(&error_message, 1))); |
9742 return MakePair(Failure::Exception(), NULL); | 9750 return MakePair(Failure::Exception(), NULL); |
9743 } | 9751 } |
9744 | 9752 |
9745 // Deal with a normal eval call with a string argument. Compile it | 9753 // Deal with a normal eval call with a string argument. Compile it |
9746 // and return the compiled function bound in the local context. | 9754 // and return the compiled function bound in the local context. |
9747 static const ParseRestriction restriction = NO_PARSE_RESTRICTION; | 9755 static const ParseRestriction restriction = NO_PARSE_RESTRICTION; |
9748 Handle<JSFunction> compiled = Compiler::GetFunctionFromEval( | 9756 Handle<JSFunction> compiled; |
9749 source, context, strict_mode, restriction, scope_position); | 9757 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
9750 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, compiled, | 9758 isolate, compiled, |
9751 MakePair(Failure::Exception(), NULL)); | 9759 Compiler::GetFunctionFromEval( |
| 9760 source, context, strict_mode, restriction, scope_position), |
| 9761 MakePair(Failure::Exception(), NULL)); |
9752 return MakePair(*compiled, *receiver); | 9762 return MakePair(*compiled, *receiver); |
9753 } | 9763 } |
9754 | 9764 |
9755 | 9765 |
9756 RUNTIME_FUNCTION(ObjectPair, RuntimeHidden_ResolvePossiblyDirectEval) { | 9766 RUNTIME_FUNCTION(ObjectPair, RuntimeHidden_ResolvePossiblyDirectEval) { |
9757 HandleScope scope(isolate); | 9767 HandleScope scope(isolate); |
9758 ASSERT(args.length() == 5); | 9768 ASSERT(args.length() == 5); |
9759 | 9769 |
9760 Handle<Object> callee = args.at<Object>(0); | 9770 Handle<Object> callee = args.at<Object>(0); |
9761 | 9771 |
(...skipping 3002 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12764 RETURN_ON_EXCEPTION( | 12774 RETURN_ON_EXCEPTION( |
12765 isolate, | 12775 isolate, |
12766 Runtime::SetObjectProperty( | 12776 Runtime::SetObjectProperty( |
12767 isolate, target, arguments_str, arguments, ::NONE, SLOPPY), | 12777 isolate, target, arguments_str, arguments, ::NONE, SLOPPY), |
12768 JSObject); | 12778 JSObject); |
12769 return target; | 12779 return target; |
12770 } | 12780 } |
12771 | 12781 |
12772 | 12782 |
12773 // Compile and evaluate source for the given context. | 12783 // Compile and evaluate source for the given context. |
12774 static MaybeObject* DebugEvaluate(Isolate* isolate, | 12784 static MaybeHandle<Object> DebugEvaluate(Isolate* isolate, |
12775 Handle<Context> context, | 12785 Handle<Context> context, |
12776 Handle<Object> context_extension, | 12786 Handle<Object> context_extension, |
12777 Handle<Object> receiver, | 12787 Handle<Object> receiver, |
12778 Handle<String> source) { | 12788 Handle<String> source) { |
12779 if (context_extension->IsJSObject()) { | 12789 if (context_extension->IsJSObject()) { |
12780 Handle<JSObject> extension = Handle<JSObject>::cast(context_extension); | 12790 Handle<JSObject> extension = Handle<JSObject>::cast(context_extension); |
12781 Handle<JSFunction> closure(context->closure(), isolate); | 12791 Handle<JSFunction> closure(context->closure(), isolate); |
12782 context = isolate->factory()->NewWithContext(closure, context, extension); | 12792 context = isolate->factory()->NewWithContext(closure, context, extension); |
12783 } | 12793 } |
12784 | 12794 |
12785 Handle<JSFunction> eval_fun = | 12795 Handle<JSFunction> eval_fun; |
| 12796 ASSIGN_RETURN_ON_EXCEPTION( |
| 12797 isolate, eval_fun, |
12786 Compiler::GetFunctionFromEval(source, | 12798 Compiler::GetFunctionFromEval(source, |
12787 context, | 12799 context, |
12788 SLOPPY, | 12800 SLOPPY, |
12789 NO_PARSE_RESTRICTION, | 12801 NO_PARSE_RESTRICTION, |
12790 RelocInfo::kNoPosition); | 12802 RelocInfo::kNoPosition), |
12791 RETURN_IF_EMPTY_HANDLE(isolate, eval_fun); | 12803 Object); |
12792 | 12804 |
12793 Handle<Object> result; | 12805 Handle<Object> result; |
12794 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 12806 ASSIGN_RETURN_ON_EXCEPTION( |
12795 isolate, result, | 12807 isolate, result, |
12796 Execution::Call(isolate, eval_fun, receiver, 0, NULL)); | 12808 Execution::Call(isolate, eval_fun, receiver, 0, NULL), |
| 12809 Object); |
12797 | 12810 |
12798 // Skip the global proxy as it has no properties and always delegates to the | 12811 // Skip the global proxy as it has no properties and always delegates to the |
12799 // real global object. | 12812 // real global object. |
12800 if (result->IsJSGlobalProxy()) { | 12813 if (result->IsJSGlobalProxy()) { |
12801 result = Handle<JSObject>(JSObject::cast(result->GetPrototype(isolate))); | 12814 result = Handle<JSObject>(JSObject::cast(result->GetPrototype(isolate))); |
12802 } | 12815 } |
12803 | 12816 |
12804 // Clear the oneshot breakpoints so that the debugger does not step further. | 12817 // Clear the oneshot breakpoints so that the debugger does not step further. |
12805 isolate->debug()->ClearStepping(); | 12818 isolate->debug()->ClearStepping(); |
12806 return *result; | 12819 return result; |
12807 } | 12820 } |
12808 | 12821 |
12809 | 12822 |
12810 // Evaluate a piece of JavaScript in the context of a stack frame for | 12823 // Evaluate a piece of JavaScript in the context of a stack frame for |
12811 // debugging. Things that need special attention are: | 12824 // debugging. Things that need special attention are: |
12812 // - Parameters and stack-allocated locals need to be materialized. Altered | 12825 // - Parameters and stack-allocated locals need to be materialized. Altered |
12813 // values need to be written back to the stack afterwards. | 12826 // values need to be written back to the stack afterwards. |
12814 // - The arguments object needs to materialized. | 12827 // - The arguments object needs to materialized. |
12815 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) { | 12828 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluate) { |
12816 HandleScope scope(isolate); | 12829 HandleScope scope(isolate); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12860 isolate, materialized, function, &frame_inspector)); | 12873 isolate, materialized, function, &frame_inspector)); |
12861 | 12874 |
12862 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 12875 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
12863 isolate, materialized, | 12876 isolate, materialized, |
12864 MaterializeArgumentsObject(isolate, materialized, function)); | 12877 MaterializeArgumentsObject(isolate, materialized, function)); |
12865 | 12878 |
12866 // Add the materialized object in a with-scope to shadow the stack locals. | 12879 // Add the materialized object in a with-scope to shadow the stack locals. |
12867 context = isolate->factory()->NewWithContext(function, context, materialized); | 12880 context = isolate->factory()->NewWithContext(function, context, materialized); |
12868 | 12881 |
12869 Handle<Object> receiver(frame->receiver(), isolate); | 12882 Handle<Object> receiver(frame->receiver(), isolate); |
12870 Object* evaluate_result_object; | 12883 Handle<Object> result; |
12871 { MaybeObject* maybe_result = | 12884 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
12872 DebugEvaluate(isolate, context, context_extension, receiver, source); | 12885 isolate, result, |
12873 if (!maybe_result->ToObject(&evaluate_result_object)) return maybe_result; | 12886 DebugEvaluate(isolate, context, context_extension, receiver, source)); |
12874 } | |
12875 | |
12876 Handle<Object> result(evaluate_result_object, isolate); | |
12877 | 12887 |
12878 // Write back potential changes to materialized stack locals to the stack. | 12888 // Write back potential changes to materialized stack locals to the stack. |
12879 UpdateStackLocalsFromMaterializedObject( | 12889 UpdateStackLocalsFromMaterializedObject( |
12880 isolate, materialized, function, frame, inlined_jsframe_index); | 12890 isolate, materialized, function, frame, inlined_jsframe_index); |
12881 | 12891 |
12882 return *result; | 12892 return *result; |
12883 } | 12893 } |
12884 | 12894 |
12885 | 12895 |
12886 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluateGlobal) { | 12896 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugEvaluateGlobal) { |
(...skipping 21 matching lines...) Expand all Loading... |
12908 top = top->prev(); | 12918 top = top->prev(); |
12909 } | 12919 } |
12910 if (top != NULL) { | 12920 if (top != NULL) { |
12911 isolate->set_context(*top->context()); | 12921 isolate->set_context(*top->context()); |
12912 } | 12922 } |
12913 | 12923 |
12914 // Get the native context now set to the top context from before the | 12924 // Get the native context now set to the top context from before the |
12915 // debugger was invoked. | 12925 // debugger was invoked. |
12916 Handle<Context> context = isolate->native_context(); | 12926 Handle<Context> context = isolate->native_context(); |
12917 Handle<Object> receiver = isolate->global_object(); | 12927 Handle<Object> receiver = isolate->global_object(); |
12918 return DebugEvaluate(isolate, context, context_extension, receiver, source); | 12928 Handle<Object> result; |
| 12929 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 12930 isolate, result, |
| 12931 DebugEvaluate(isolate, context, context_extension, receiver, source)); |
| 12932 return *result; |
12919 } | 12933 } |
12920 | 12934 |
12921 | 12935 |
12922 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetLoadedScripts) { | 12936 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetLoadedScripts) { |
12923 HandleScope scope(isolate); | 12937 HandleScope scope(isolate); |
12924 ASSERT(args.length() == 0); | 12938 ASSERT(args.length() == 0); |
12925 | 12939 |
12926 // Fill the script objects. | 12940 // Fill the script objects. |
12927 Handle<FixedArray> instances = isolate->debug()->GetLoadedScripts(); | 12941 Handle<FixedArray> instances = isolate->debug()->GetLoadedScripts(); |
12928 | 12942 |
(...skipping 2152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15081 } | 15095 } |
15082 } | 15096 } |
15083 | 15097 |
15084 | 15098 |
15085 void Runtime::OutOfMemory() { | 15099 void Runtime::OutOfMemory() { |
15086 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); | 15100 Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); |
15087 UNREACHABLE(); | 15101 UNREACHABLE(); |
15088 } | 15102 } |
15089 | 15103 |
15090 } } // namespace v8::internal | 15104 } } // namespace v8::internal |
OLD | NEW |