| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 context->IsScriptContext() || | 260 context->IsScriptContext() || |
| 261 (context->IsBlockContext() && context->has_extension())); | 261 (context->IsBlockContext() && context->has_extension())); |
| 262 | 262 |
| 263 bool is_function = value->IsJSFunction(); | 263 bool is_function = value->IsJSFunction(); |
| 264 bool is_var = !is_function; | 264 bool is_var = !is_function; |
| 265 DCHECK(!is_var || value->IsUndefined(isolate)); | 265 DCHECK(!is_var || value->IsUndefined(isolate)); |
| 266 | 266 |
| 267 int index; | 267 int index; |
| 268 PropertyAttributes attributes; | 268 PropertyAttributes attributes; |
| 269 BindingFlags binding_flags; | 269 BindingFlags binding_flags; |
| 270 VariableMode mode; |
| 270 | 271 |
| 271 // Check for a conflict with a lexically scoped variable | 272 // Check for a conflict with a lexically scoped variable |
| 272 context_arg->Lookup(name, LEXICAL_TEST, &index, &attributes, &binding_flags); | 273 context_arg->Lookup(name, LEXICAL_TEST, &index, &attributes, &binding_flags, |
| 273 if (attributes != ABSENT && binding_flags == BINDING_CHECK_INITIALIZED) { | 274 &mode); |
| 275 if (attributes != ABSENT && IsLexicalVariableMode(mode)) { |
| 274 // ES#sec-evaldeclarationinstantiation 5.a.i.1: | 276 // ES#sec-evaldeclarationinstantiation 5.a.i.1: |
| 275 // If varEnvRec.HasLexicalDeclaration(name) is true, throw a SyntaxError | 277 // If varEnvRec.HasLexicalDeclaration(name) is true, throw a SyntaxError |
| 276 // exception. | 278 // exception. |
| 277 // ES#sec-evaldeclarationinstantiation 5.d.ii.2.a.i: | 279 // ES#sec-evaldeclarationinstantiation 5.d.ii.2.a.i: |
| 278 // Throw a SyntaxError exception. | 280 // Throw a SyntaxError exception. |
| 279 return ThrowRedeclarationError(isolate, name, | 281 return ThrowRedeclarationError(isolate, name, |
| 280 RedeclarationType::kSyntaxError); | 282 RedeclarationType::kSyntaxError); |
| 281 } | 283 } |
| 282 | 284 |
| 283 Handle<Object> holder = context->Lookup(name, DONT_FOLLOW_CHAINS, &index, | 285 Handle<Object> holder = context->Lookup(name, DONT_FOLLOW_CHAINS, &index, |
| 284 &attributes, &binding_flags); | 286 &attributes, &binding_flags, &mode); |
| 285 DCHECK(!isolate->has_pending_exception()); | 287 DCHECK(!isolate->has_pending_exception()); |
| 286 | 288 |
| 287 Handle<JSObject> object; | 289 Handle<JSObject> object; |
| 288 | 290 |
| 289 if (attributes != ABSENT && holder->IsJSGlobalObject()) { | 291 if (attributes != ABSENT && holder->IsJSGlobalObject()) { |
| 290 // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b: | 292 // ES#sec-evaldeclarationinstantiation 8.a.iv.1.b: |
| 291 // If fnDefinable is false, throw a TypeError exception. | 293 // If fnDefinable is false, throw a TypeError exception. |
| 292 return DeclareGlobal(isolate, Handle<JSGlobalObject>::cast(holder), name, | 294 return DeclareGlobal(isolate, Handle<JSGlobalObject>::cast(holder), name, |
| 293 value, NONE, is_var, is_function, | 295 value, NONE, is_var, is_function, |
| 294 RedeclarationType::kTypeError); | 296 RedeclarationType::kTypeError); |
| (...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 | 766 |
| 765 | 767 |
| 766 RUNTIME_FUNCTION(Runtime_DeleteLookupSlot) { | 768 RUNTIME_FUNCTION(Runtime_DeleteLookupSlot) { |
| 767 HandleScope scope(isolate); | 769 HandleScope scope(isolate); |
| 768 DCHECK_EQ(1, args.length()); | 770 DCHECK_EQ(1, args.length()); |
| 769 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); | 771 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
| 770 | 772 |
| 771 int index; | 773 int index; |
| 772 PropertyAttributes attributes; | 774 PropertyAttributes attributes; |
| 773 BindingFlags flags; | 775 BindingFlags flags; |
| 776 VariableMode mode; |
| 774 Handle<Object> holder = isolate->context()->Lookup( | 777 Handle<Object> holder = isolate->context()->Lookup( |
| 775 name, FOLLOW_CHAINS, &index, &attributes, &flags); | 778 name, FOLLOW_CHAINS, &index, &attributes, &flags, &mode); |
| 776 | 779 |
| 777 // If the slot was not found the result is true. | 780 // If the slot was not found the result is true. |
| 778 if (holder.is_null()) { | 781 if (holder.is_null()) { |
| 779 // In case of JSProxy, an exception might have been thrown. | 782 // In case of JSProxy, an exception might have been thrown. |
| 780 if (isolate->has_pending_exception()) return isolate->heap()->exception(); | 783 if (isolate->has_pending_exception()) return isolate->heap()->exception(); |
| 781 return isolate->heap()->true_value(); | 784 return isolate->heap()->true_value(); |
| 782 } | 785 } |
| 783 | 786 |
| 784 // If the slot was found in a context, it should be DONT_DELETE. | 787 // If the slot was found in a context, it should be DONT_DELETE. |
| 785 if (holder->IsContext()) { | 788 if (holder->IsContext()) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 799 namespace { | 802 namespace { |
| 800 | 803 |
| 801 MaybeHandle<Object> LoadLookupSlot(Handle<String> name, | 804 MaybeHandle<Object> LoadLookupSlot(Handle<String> name, |
| 802 Object::ShouldThrow should_throw, | 805 Object::ShouldThrow should_throw, |
| 803 Handle<Object>* receiver_return = nullptr) { | 806 Handle<Object>* receiver_return = nullptr) { |
| 804 Isolate* const isolate = name->GetIsolate(); | 807 Isolate* const isolate = name->GetIsolate(); |
| 805 | 808 |
| 806 int index; | 809 int index; |
| 807 PropertyAttributes attributes; | 810 PropertyAttributes attributes; |
| 808 BindingFlags flags; | 811 BindingFlags flags; |
| 812 VariableMode mode; |
| 809 Handle<Object> holder = isolate->context()->Lookup( | 813 Handle<Object> holder = isolate->context()->Lookup( |
| 810 name, FOLLOW_CHAINS, &index, &attributes, &flags); | 814 name, FOLLOW_CHAINS, &index, &attributes, &flags, &mode); |
| 811 if (isolate->has_pending_exception()) return MaybeHandle<Object>(); | 815 if (isolate->has_pending_exception()) return MaybeHandle<Object>(); |
| 812 | 816 |
| 813 if (index != Context::kNotFound) { | 817 if (index != Context::kNotFound) { |
| 814 DCHECK(holder->IsContext()); | 818 DCHECK(holder->IsContext()); |
| 815 // If the "property" we were looking for is a local variable, the | 819 // If the "property" we were looking for is a local variable, the |
| 816 // receiver is the global object; see ECMA-262, 3rd., 10.1.6 and 10.2.3. | 820 // receiver is the global object; see ECMA-262, 3rd., 10.1.6 and 10.2.3. |
| 817 Handle<Object> receiver = isolate->factory()->undefined_value(); | 821 Handle<Object> receiver = isolate->factory()->undefined_value(); |
| 818 Handle<Object> value = handle(Context::cast(*holder)->get(index), isolate); | 822 Handle<Object> value = handle(Context::cast(*holder)->get(index), isolate); |
| 819 // Check for uninitialized bindings. | 823 // Check for uninitialized bindings. |
| 820 switch (flags) { | 824 switch (flags) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 902 namespace { | 906 namespace { |
| 903 | 907 |
| 904 MaybeHandle<Object> StoreLookupSlot(Handle<String> name, Handle<Object> value, | 908 MaybeHandle<Object> StoreLookupSlot(Handle<String> name, Handle<Object> value, |
| 905 LanguageMode language_mode) { | 909 LanguageMode language_mode) { |
| 906 Isolate* const isolate = name->GetIsolate(); | 910 Isolate* const isolate = name->GetIsolate(); |
| 907 Handle<Context> context(isolate->context(), isolate); | 911 Handle<Context> context(isolate->context(), isolate); |
| 908 | 912 |
| 909 int index; | 913 int index; |
| 910 PropertyAttributes attributes; | 914 PropertyAttributes attributes; |
| 911 BindingFlags flags; | 915 BindingFlags flags; |
| 916 VariableMode mode; |
| 912 Handle<Object> holder = | 917 Handle<Object> holder = |
| 913 context->Lookup(name, FOLLOW_CHAINS, &index, &attributes, &flags); | 918 context->Lookup(name, FOLLOW_CHAINS, &index, &attributes, &flags, &mode); |
| 914 if (holder.is_null()) { | 919 if (holder.is_null()) { |
| 915 // In case of JSProxy, an exception might have been thrown. | 920 // In case of JSProxy, an exception might have been thrown. |
| 916 if (isolate->has_pending_exception()) return MaybeHandle<Object>(); | 921 if (isolate->has_pending_exception()) return MaybeHandle<Object>(); |
| 917 } | 922 } |
| 918 | 923 |
| 919 // The property was found in a context slot. | 924 // The property was found in a context slot. |
| 920 if (index != Context::kNotFound) { | 925 if (index != Context::kNotFound) { |
| 921 if (flags == BINDING_CHECK_INITIALIZED && | 926 if (flags == BINDING_CHECK_INITIALIZED && |
| 922 Handle<Context>::cast(holder)->is_the_hole(index)) { | 927 Handle<Context>::cast(holder)->is_the_hole(index)) { |
| 923 THROW_NEW_ERROR(isolate, | 928 THROW_NEW_ERROR(isolate, |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 972 RUNTIME_FUNCTION(Runtime_StoreLookupSlot_Strict) { | 977 RUNTIME_FUNCTION(Runtime_StoreLookupSlot_Strict) { |
| 973 HandleScope scope(isolate); | 978 HandleScope scope(isolate); |
| 974 DCHECK_EQ(2, args.length()); | 979 DCHECK_EQ(2, args.length()); |
| 975 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); | 980 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
| 976 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); | 981 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); |
| 977 RETURN_RESULT_OR_FAILURE(isolate, StoreLookupSlot(name, value, STRICT)); | 982 RETURN_RESULT_OR_FAILURE(isolate, StoreLookupSlot(name, value, STRICT)); |
| 978 } | 983 } |
| 979 | 984 |
| 980 } // namespace internal | 985 } // namespace internal |
| 981 } // namespace v8 | 986 } // namespace v8 |
| OLD | NEW |