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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
9 #include "src/frames-inl.h" | 9 #include "src/frames-inl.h" |
10 #include "src/runtime/runtime-utils.h" | 10 #include "src/runtime/runtime-utils.h" |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 HandleScope scope(isolate); | 146 HandleScope scope(isolate); |
147 // args[0] == name | 147 // args[0] == name |
148 // args[1] == language_mode | 148 // args[1] == language_mode |
149 // args[2] == value (optional) | 149 // args[2] == value (optional) |
150 | 150 |
151 // Determine if we need to assign to the variable if it already | 151 // Determine if we need to assign to the variable if it already |
152 // exists (based on the number of arguments). | 152 // exists (based on the number of arguments). |
153 RUNTIME_ASSERT(args.length() == 3); | 153 RUNTIME_ASSERT(args.length() == 3); |
154 | 154 |
155 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); | 155 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
156 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 1); | 156 CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 1); |
157 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 157 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
158 | 158 |
159 Handle<GlobalObject> global(isolate->context()->global_object()); | 159 Handle<GlobalObject> global(isolate->context()->global_object()); |
160 Handle<Object> result; | 160 Handle<Object> result; |
161 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 161 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
162 isolate, result, Object::SetProperty(global, name, value, strict_mode)); | 162 isolate, result, Object::SetProperty(global, name, value, language_mode)); |
163 return *result; | 163 return *result; |
164 } | 164 } |
165 | 165 |
166 | 166 |
167 RUNTIME_FUNCTION(Runtime_InitializeConstGlobal) { | 167 RUNTIME_FUNCTION(Runtime_InitializeConstGlobal) { |
168 HandleScope handle_scope(isolate); | 168 HandleScope handle_scope(isolate); |
169 // All constants are declared with an initial value. The name | 169 // All constants are declared with an initial value. The name |
170 // of the constant is the first argument and the initial value | 170 // of the constant is the first argument and the initial value |
171 // is the second. | 171 // is the second. |
172 RUNTIME_ASSERT(args.length() == 2); | 172 RUNTIME_ASSERT(args.length() == 2); |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); | 470 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); |
471 JavaScriptFrameIterator it(isolate); | 471 JavaScriptFrameIterator it(isolate); |
472 | 472 |
473 // Find the frame that holds the actual arguments passed to the function. | 473 // Find the frame that holds the actual arguments passed to the function. |
474 it.AdvanceToArgumentsFrame(); | 474 it.AdvanceToArgumentsFrame(); |
475 JavaScriptFrame* frame = it.frame(); | 475 JavaScriptFrame* frame = it.frame(); |
476 | 476 |
477 // Determine parameter location on the stack and dispatch on language mode. | 477 // Determine parameter location on the stack and dispatch on language mode. |
478 int argument_count = frame->GetArgumentsLength(); | 478 int argument_count = frame->GetArgumentsLength(); |
479 Object** parameters = reinterpret_cast<Object**>(frame->GetParameterSlot(-1)); | 479 Object** parameters = reinterpret_cast<Object**>(frame->GetParameterSlot(-1)); |
480 return callee->shared()->strict_mode() == STRICT | 480 return is_strict(callee->shared()->language_mode()) |
481 ? *NewStrictArguments(isolate, callee, parameters, argument_count) | 481 ? *NewStrictArguments(isolate, callee, parameters, argument_count) |
482 : *NewSloppyArguments(isolate, callee, parameters, argument_count); | 482 : *NewSloppyArguments(isolate, callee, parameters, argument_count); |
483 } | 483 } |
484 | 484 |
485 | 485 |
486 RUNTIME_FUNCTION(Runtime_NewSloppyArguments) { | 486 RUNTIME_FUNCTION(Runtime_NewSloppyArguments) { |
487 HandleScope scope(isolate); | 487 HandleScope scope(isolate); |
488 DCHECK(args.length() == 3); | 488 DCHECK(args.length() == 3); |
489 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); | 489 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); |
490 Object** parameters = reinterpret_cast<Object**>(args[1]); | 490 Object** parameters = reinterpret_cast<Object**>(args[1]); |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 } | 942 } |
943 | 943 |
944 | 944 |
945 RUNTIME_FUNCTION(Runtime_StoreLookupSlot) { | 945 RUNTIME_FUNCTION(Runtime_StoreLookupSlot) { |
946 HandleScope scope(isolate); | 946 HandleScope scope(isolate); |
947 DCHECK(args.length() == 4); | 947 DCHECK(args.length() == 4); |
948 | 948 |
949 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); | 949 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); |
950 CONVERT_ARG_HANDLE_CHECKED(Context, context, 1); | 950 CONVERT_ARG_HANDLE_CHECKED(Context, context, 1); |
951 CONVERT_ARG_HANDLE_CHECKED(String, name, 2); | 951 CONVERT_ARG_HANDLE_CHECKED(String, name, 2); |
952 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 3); | 952 CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 3); |
953 | 953 |
954 int index; | 954 int index; |
955 PropertyAttributes attributes; | 955 PropertyAttributes attributes; |
956 ContextLookupFlags flags = FOLLOW_CHAINS; | 956 ContextLookupFlags flags = FOLLOW_CHAINS; |
957 BindingFlags binding_flags; | 957 BindingFlags binding_flags; |
958 Handle<Object> holder = | 958 Handle<Object> holder = |
959 context->Lookup(name, flags, &index, &attributes, &binding_flags); | 959 context->Lookup(name, flags, &index, &attributes, &binding_flags); |
960 // In case of JSProxy, an exception might have been thrown. | 960 // In case of JSProxy, an exception might have been thrown. |
961 if (isolate->has_pending_exception()) return isolate->heap()->exception(); | 961 if (isolate->has_pending_exception()) return isolate->heap()->exception(); |
962 | 962 |
963 // The property was found in a context slot. | 963 // The property was found in a context slot. |
964 if (index >= 0) { | 964 if (index >= 0) { |
965 if ((attributes & READ_ONLY) == 0) { | 965 if ((attributes & READ_ONLY) == 0) { |
966 Handle<Context>::cast(holder)->set(index, *value); | 966 Handle<Context>::cast(holder)->set(index, *value); |
967 } else if (strict_mode == STRICT) { | 967 } else if (is_strict(language_mode)) { |
968 // Setting read only property in strict mode. | 968 // Setting read only property in strict mode. |
969 THROW_NEW_ERROR_RETURN_FAILURE( | 969 THROW_NEW_ERROR_RETURN_FAILURE( |
970 isolate, | 970 isolate, |
971 NewTypeError("strict_cannot_assign", HandleVector(&name, 1))); | 971 NewTypeError("strict_cannot_assign", HandleVector(&name, 1))); |
972 } | 972 } |
973 return *value; | 973 return *value; |
974 } | 974 } |
975 | 975 |
976 // Slow case: The property is not in a context slot. It is either in a | 976 // Slow case: The property is not in a context slot. It is either in a |
977 // context extension object, a property of the subject of a with, or a | 977 // context extension object, a property of the subject of a with, or a |
978 // property of the global object. | 978 // property of the global object. |
979 Handle<JSReceiver> object; | 979 Handle<JSReceiver> object; |
980 if (attributes != ABSENT) { | 980 if (attributes != ABSENT) { |
981 // The property exists on the holder. | 981 // The property exists on the holder. |
982 object = Handle<JSReceiver>::cast(holder); | 982 object = Handle<JSReceiver>::cast(holder); |
983 } else if (strict_mode == STRICT) { | 983 } else if (is_strict(language_mode)) { |
984 // If absent in strict mode: throw. | 984 // If absent in strict mode: throw. |
985 THROW_NEW_ERROR_RETURN_FAILURE( | 985 THROW_NEW_ERROR_RETURN_FAILURE( |
986 isolate, NewReferenceError("not_defined", HandleVector(&name, 1))); | 986 isolate, NewReferenceError("not_defined", HandleVector(&name, 1))); |
987 } else { | 987 } else { |
988 // If absent in sloppy mode: add the property to the global object. | 988 // If absent in sloppy mode: add the property to the global object. |
989 object = Handle<JSReceiver>(context->global_object()); | 989 object = Handle<JSReceiver>(context->global_object()); |
990 } | 990 } |
991 | 991 |
992 RETURN_FAILURE_ON_EXCEPTION( | 992 RETURN_FAILURE_ON_EXCEPTION( |
993 isolate, Object::SetProperty(object, name, value, strict_mode)); | 993 isolate, Object::SetProperty(object, name, value, language_mode)); |
994 | 994 |
995 return *value; | 995 return *value; |
996 } | 996 } |
997 | 997 |
998 | 998 |
999 RUNTIME_FUNCTION(Runtime_GetArgumentsProperty) { | 999 RUNTIME_FUNCTION(Runtime_GetArgumentsProperty) { |
1000 SealHandleScope shs(isolate); | 1000 SealHandleScope shs(isolate); |
1001 DCHECK(args.length() == 1); | 1001 DCHECK(args.length() == 1); |
1002 CONVERT_ARG_HANDLE_CHECKED(Object, raw_key, 0); | 1002 CONVERT_ARG_HANDLE_CHECKED(Object, raw_key, 0); |
1003 | 1003 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 return *result; | 1050 return *result; |
1051 } | 1051 } |
1052 } | 1052 } |
1053 | 1053 |
1054 // Handle special arguments properties. | 1054 // Handle special arguments properties. |
1055 if (String::Equals(isolate->factory()->length_string(), key)) { | 1055 if (String::Equals(isolate->factory()->length_string(), key)) { |
1056 return Smi::FromInt(n); | 1056 return Smi::FromInt(n); |
1057 } | 1057 } |
1058 if (String::Equals(isolate->factory()->callee_string(), key)) { | 1058 if (String::Equals(isolate->factory()->callee_string(), key)) { |
1059 JSFunction* function = frame->function(); | 1059 JSFunction* function = frame->function(); |
1060 if (function->shared()->strict_mode() == STRICT) { | 1060 if (is_strict(function->shared()->language_mode())) { |
1061 THROW_NEW_ERROR_RETURN_FAILURE( | 1061 THROW_NEW_ERROR_RETURN_FAILURE( |
1062 isolate, NewTypeError("strict_arguments_callee", | 1062 isolate, NewTypeError("strict_arguments_callee", |
1063 HandleVector<Object>(NULL, 0))); | 1063 HandleVector<Object>(NULL, 0))); |
1064 } | 1064 } |
1065 return function; | 1065 return function; |
1066 } | 1066 } |
1067 | 1067 |
1068 // Lookup in the initial Object.prototype object. | 1068 // Lookup in the initial Object.prototype object. |
1069 Handle<Object> result; | 1069 Handle<Object> result; |
1070 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1070 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
(...skipping 11 matching lines...) Expand all Loading... |
1082 return Smi::FromInt(frame->GetArgumentsLength()); | 1082 return Smi::FromInt(frame->GetArgumentsLength()); |
1083 } | 1083 } |
1084 | 1084 |
1085 | 1085 |
1086 RUNTIME_FUNCTION(RuntimeReference_Arguments) { | 1086 RUNTIME_FUNCTION(RuntimeReference_Arguments) { |
1087 SealHandleScope shs(isolate); | 1087 SealHandleScope shs(isolate); |
1088 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate); | 1088 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate); |
1089 } | 1089 } |
1090 } | 1090 } |
1091 } // namespace v8::internal | 1091 } // namespace v8::internal |
OLD | NEW |