Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/runtime.cc

Issue 390833003: Remove PropertyAttributes from SetProperty (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.h ('k') | src/stub-cache.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 <stdlib.h> 5 #include <stdlib.h>
6 #include <limits> 6 #include <limits>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 Handle<Object> privates; 634 Handle<Object> privates;
635 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 635 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
636 isolate, privates, Object::GetPropertyOrElement(registry, part)); 636 isolate, privates, Object::GetPropertyOrElement(registry, part));
637 Handle<Object> symbol; 637 Handle<Object> symbol;
638 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 638 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
639 isolate, symbol, Object::GetPropertyOrElement(privates, name)); 639 isolate, symbol, Object::GetPropertyOrElement(privates, name));
640 if (!symbol->IsSymbol()) { 640 if (!symbol->IsSymbol()) {
641 ASSERT(symbol->IsUndefined()); 641 ASSERT(symbol->IsUndefined());
642 symbol = isolate->factory()->NewPrivateSymbol(); 642 symbol = isolate->factory()->NewPrivateSymbol();
643 Handle<Symbol>::cast(symbol)->set_name(*name); 643 Handle<Symbol>::cast(symbol)->set_name(*name);
644 JSObject::SetProperty(Handle<JSObject>::cast(privates), name, symbol, NONE, 644 JSObject::SetProperty(Handle<JSObject>::cast(privates), name, symbol,
645 STRICT).Assert(); 645 STRICT).Assert();
646 } 646 }
647 return *symbol; 647 return *symbol;
648 } 648 }
649 649
650 650
651 RUNTIME_FUNCTION(Runtime_NewSymbolWrapper) { 651 RUNTIME_FUNCTION(Runtime_NewSymbolWrapper) {
652 HandleScope scope(isolate); 652 HandleScope scope(isolate);
653 ASSERT(args.length() == 1); 653 ASSERT(args.length() == 1);
654 CONVERT_ARG_HANDLE_CHECKED(Symbol, symbol, 0); 654 CONVERT_ARG_HANDLE_CHECKED(Symbol, symbol, 0);
(...skipping 1566 matching lines...) Expand 10 before | Expand all | Expand 10 after
2221 RUNTIME_ASSERT(args.length() == 3); 2221 RUNTIME_ASSERT(args.length() == 3);
2222 2222
2223 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); 2223 CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
2224 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 1); 2224 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 1);
2225 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 2225 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
2226 2226
2227 Handle<GlobalObject> global(isolate->context()->global_object()); 2227 Handle<GlobalObject> global(isolate->context()->global_object());
2228 Handle<Object> result; 2228 Handle<Object> result;
2229 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2229 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2230 isolate, result, 2230 isolate, result,
2231 JSReceiver::SetProperty(global, name, value, NONE, strict_mode)); 2231 JSReceiver::SetProperty(global, name, value, strict_mode));
2232 return *result; 2232 return *result;
2233 } 2233 }
2234 2234
2235 2235
2236 RUNTIME_FUNCTION(Runtime_InitializeConstGlobal) { 2236 RUNTIME_FUNCTION(Runtime_InitializeConstGlobal) {
2237 HandleScope handle_scope(isolate); 2237 HandleScope handle_scope(isolate);
2238 // All constants are declared with an initial value. The name 2238 // All constants are declared with an initial value. The name
2239 // of the constant is the first argument and the initial value 2239 // of the constant is the first argument and the initial value
2240 // is the second. 2240 // is the second.
2241 RUNTIME_ASSERT(args.length() == 2); 2241 RUNTIME_ASSERT(args.length() == 2);
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
2543 2543
2544 static void InstallBuiltin(Isolate* isolate, 2544 static void InstallBuiltin(Isolate* isolate,
2545 Handle<JSObject> holder, 2545 Handle<JSObject> holder,
2546 const char* name, 2546 const char* name,
2547 Builtins::Name builtin_name) { 2547 Builtins::Name builtin_name) {
2548 Handle<String> key = isolate->factory()->InternalizeUtf8String(name); 2548 Handle<String> key = isolate->factory()->InternalizeUtf8String(name);
2549 Handle<Code> code(isolate->builtins()->builtin(builtin_name)); 2549 Handle<Code> code(isolate->builtins()->builtin(builtin_name));
2550 Handle<JSFunction> optimized = 2550 Handle<JSFunction> optimized =
2551 isolate->factory()->NewFunctionWithoutPrototype(key, code); 2551 isolate->factory()->NewFunctionWithoutPrototype(key, code);
2552 optimized->shared()->DontAdaptArguments(); 2552 optimized->shared()->DontAdaptArguments();
2553 JSReceiver::SetProperty(holder, key, optimized, NONE, STRICT).Assert(); 2553 JSObject::AddProperty(holder, key, optimized, NONE);
2554 } 2554 }
2555 2555
2556 2556
2557 RUNTIME_FUNCTION(Runtime_SpecialArrayFunctions) { 2557 RUNTIME_FUNCTION(Runtime_SpecialArrayFunctions) {
2558 HandleScope scope(isolate); 2558 HandleScope scope(isolate);
2559 ASSERT(args.length() == 0); 2559 ASSERT(args.length() == 0);
2560 Handle<JSObject> holder = 2560 Handle<JSObject> holder =
2561 isolate->factory()->NewJSObject(isolate->object_function()); 2561 isolate->factory()->NewJSObject(isolate->object_function());
2562 2562
2563 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop); 2563 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop);
(...skipping 2374 matching lines...) Expand 10 before | Expand all | Expand 10 after
4938 !isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) { 4938 !isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) {
4939 return isolate->heap()->undefined_value(); 4939 return isolate->heap()->undefined_value();
4940 } 4940 }
4941 4941
4942 LookupResult lookup(isolate); 4942 LookupResult lookup(isolate);
4943 js_object->LookupOwnRealNamedProperty(name, &lookup); 4943 js_object->LookupOwnRealNamedProperty(name, &lookup);
4944 4944
4945 // Take special care when attributes are different and there is already 4945 // Take special care when attributes are different and there is already
4946 // a property. For simplicity we normalize the property which enables us 4946 // a property. For simplicity we normalize the property which enables us
4947 // to not worry about changing the instance_descriptor and creating a new 4947 // to not worry about changing the instance_descriptor and creating a new
4948 // map. The current version of SetObjectProperty does not handle attributes 4948 // map.
4949 // correctly in the case where a property is a field and is reset with
4950 // new attributes.
4951 if (lookup.IsFound() && 4949 if (lookup.IsFound() &&
4952 (attr != lookup.GetAttributes() || lookup.IsPropertyCallbacks())) { 4950 (attr != lookup.GetAttributes() || lookup.IsPropertyCallbacks())) {
4953 // New attributes - normalize to avoid writing to instance descriptor 4951 // New attributes - normalize to avoid writing to instance descriptor
4954 if (js_object->IsJSGlobalProxy()) { 4952 if (js_object->IsJSGlobalProxy()) {
4955 // Since the result is a property, the prototype will exist so 4953 // Since the result is a property, the prototype will exist so
4956 // we don't have to check for null. 4954 // we don't have to check for null.
4957 js_object = Handle<JSObject>(JSObject::cast(js_object->GetPrototype())); 4955 js_object = Handle<JSObject>(JSObject::cast(js_object->GetPrototype()));
4958 } 4956 }
4959 4957
4960 if (attr != lookup.GetAttributes() || 4958 if (attr != lookup.GetAttributes() ||
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4994 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 4992 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
4995 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 4993 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
4996 return *JSObject::GetDataProperty(object, key); 4994 return *JSObject::GetDataProperty(object, key);
4997 } 4995 }
4998 4996
4999 4997
5000 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, 4998 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate,
5001 Handle<Object> object, 4999 Handle<Object> object,
5002 Handle<Object> key, 5000 Handle<Object> key,
5003 Handle<Object> value, 5001 Handle<Object> value,
5004 StrictMode strict_mode, 5002 StrictMode strict_mode) {
5005 PropertyAttributes attrs) {
5006 if (object->IsUndefined() || object->IsNull()) { 5003 if (object->IsUndefined() || object->IsNull()) {
5007 Handle<Object> args[2] = { key, object }; 5004 Handle<Object> args[2] = { key, object };
5008 Handle<Object> error = 5005 Handle<Object> error =
5009 isolate->factory()->NewTypeError("non_object_property_store", 5006 isolate->factory()->NewTypeError("non_object_property_store",
5010 HandleVector(args, 2)); 5007 HandleVector(args, 2));
5011 return isolate->Throw<Object>(error); 5008 return isolate->Throw<Object>(error);
5012 } 5009 }
5013 5010
5014 if (object->IsJSProxy()) { 5011 if (object->IsJSProxy()) {
5015 Handle<Object> name_object; 5012 Handle<Object> name_object;
5016 if (key->IsSymbol()) { 5013 if (key->IsSymbol()) {
5017 name_object = key; 5014 name_object = key;
5018 } else { 5015 } else {
5019 ASSIGN_RETURN_ON_EXCEPTION( 5016 ASSIGN_RETURN_ON_EXCEPTION(
5020 isolate, name_object, Execution::ToString(isolate, key), Object); 5017 isolate, name_object, Execution::ToString(isolate, key), Object);
5021 } 5018 }
5022 Handle<Name> name = Handle<Name>::cast(name_object); 5019 Handle<Name> name = Handle<Name>::cast(name_object);
5023 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value, 5020 return JSReceiver::SetProperty(Handle<JSProxy>::cast(object), name, value,
5024 attrs, strict_mode); 5021 strict_mode);
5025 } 5022 }
5026 5023
5027 // If the object isn't a JavaScript object, we ignore the store. 5024 // If the object isn't a JavaScript object, we ignore the store.
5028 if (!object->IsJSObject()) return value; 5025 if (!object->IsJSObject()) return value;
5029 5026
5030 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 5027 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
5031 5028
5032 // Check if the given key is an array index. 5029 // Check if the given key is an array index.
5033 uint32_t index; 5030 uint32_t index;
5034 if (key->ToArrayIndex(&index)) { 5031 if (key->ToArrayIndex(&index)) {
(...skipping 11 matching lines...) Expand all
5046 JSObject::ValidateElements(js_object); 5043 JSObject::ValidateElements(js_object);
5047 if (js_object->HasExternalArrayElements() || 5044 if (js_object->HasExternalArrayElements() ||
5048 js_object->HasFixedTypedArrayElements()) { 5045 js_object->HasFixedTypedArrayElements()) {
5049 if (!value->IsNumber() && !value->IsUndefined()) { 5046 if (!value->IsNumber() && !value->IsUndefined()) {
5050 ASSIGN_RETURN_ON_EXCEPTION( 5047 ASSIGN_RETURN_ON_EXCEPTION(
5051 isolate, value, Execution::ToNumber(isolate, value), Object); 5048 isolate, value, Execution::ToNumber(isolate, value), Object);
5052 } 5049 }
5053 } 5050 }
5054 5051
5055 MaybeHandle<Object> result = JSObject::SetElement( 5052 MaybeHandle<Object> result = JSObject::SetElement(
5056 js_object, index, value, attrs, strict_mode, true, SET_PROPERTY); 5053 js_object, index, value, NONE, strict_mode, true, SET_PROPERTY);
5057 JSObject::ValidateElements(js_object); 5054 JSObject::ValidateElements(js_object);
5058 5055
5059 return result.is_null() ? result : value; 5056 return result.is_null() ? result : value;
5060 } 5057 }
5061 5058
5062 if (key->IsName()) { 5059 if (key->IsName()) {
5063 Handle<Name> name = Handle<Name>::cast(key); 5060 Handle<Name> name = Handle<Name>::cast(key);
5064 if (name->AsArrayIndex(&index)) { 5061 if (name->AsArrayIndex(&index)) {
5065 if (js_object->HasExternalArrayElements()) { 5062 if (js_object->HasExternalArrayElements()) {
5066 if (!value->IsNumber() && !value->IsUndefined()) { 5063 if (!value->IsNumber() && !value->IsUndefined()) {
5067 ASSIGN_RETURN_ON_EXCEPTION( 5064 ASSIGN_RETURN_ON_EXCEPTION(
5068 isolate, value, Execution::ToNumber(isolate, value), Object); 5065 isolate, value, Execution::ToNumber(isolate, value), Object);
5069 } 5066 }
5070 } 5067 }
5071 return JSObject::SetElement(js_object, index, value, attrs, 5068 return JSObject::SetElement(js_object, index, value, NONE, strict_mode,
5072 strict_mode, true, SET_PROPERTY); 5069 true, SET_PROPERTY);
5073 } else { 5070 } else {
5074 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); 5071 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name));
5075 return JSReceiver::SetProperty( 5072 return JSReceiver::SetProperty(js_object, name, value, strict_mode);
5076 js_object, name, value, attrs, strict_mode);
5077 } 5073 }
5078 } 5074 }
5079 5075
5080 // Call-back into JavaScript to convert the key to a string. 5076 // Call-back into JavaScript to convert the key to a string.
5081 Handle<Object> converted; 5077 Handle<Object> converted;
5082 ASSIGN_RETURN_ON_EXCEPTION( 5078 ASSIGN_RETURN_ON_EXCEPTION(
5083 isolate, converted, Execution::ToString(isolate, key), Object); 5079 isolate, converted, Execution::ToString(isolate, key), Object);
5084 Handle<String> name = Handle<String>::cast(converted); 5080 Handle<String> name = Handle<String>::cast(converted);
5085 5081
5086 if (name->AsArrayIndex(&index)) { 5082 if (name->AsArrayIndex(&index)) {
5087 return JSObject::SetElement(js_object, index, value, attrs, 5083 return JSObject::SetElement(js_object, index, value, NONE, strict_mode,
5088 strict_mode, true, SET_PROPERTY); 5084 true, SET_PROPERTY);
5089 } else { 5085 } else {
5090 return JSReceiver::SetProperty(js_object, name, value, attrs, strict_mode); 5086 return JSReceiver::SetProperty(js_object, name, value, strict_mode);
5091 } 5087 }
5092 } 5088 }
5093 5089
5094 5090
5095 MaybeHandle<Object> Runtime::DefineObjectProperty( 5091 MaybeHandle<Object> Runtime::DefineObjectProperty(
5096 Handle<JSObject> js_object, 5092 Handle<JSObject> js_object,
5097 Handle<Object> key, 5093 Handle<Object> key,
5098 Handle<Object> value, 5094 Handle<Object> value,
5099 PropertyAttributes attr, 5095 PropertyAttributes attr,
5100 JSReceiver::StoreFromKeyed store_from_keyed) { 5096 JSReceiver::StoreFromKeyed store_from_keyed) {
(...skipping 3853 matching lines...) Expand 10 before | Expand all | Expand 10 after
8954 Accessors::MakeModuleExport(name, index, attr); 8950 Accessors::MakeModuleExport(name, index, attr);
8955 Handle<Object> result = 8951 Handle<Object> result =
8956 JSObject::SetAccessor(module, info).ToHandleChecked(); 8952 JSObject::SetAccessor(module, info).ToHandleChecked();
8957 ASSERT(!result->IsUndefined()); 8953 ASSERT(!result->IsUndefined());
8958 USE(result); 8954 USE(result);
8959 break; 8955 break;
8960 } 8956 }
8961 case MODULE: { 8957 case MODULE: {
8962 Object* referenced_context = Context::cast(host_context)->get(index); 8958 Object* referenced_context = Context::cast(host_context)->get(index);
8963 Handle<JSModule> value(Context::cast(referenced_context)->module()); 8959 Handle<JSModule> value(Context::cast(referenced_context)->module());
8964 JSReceiver::SetProperty(module, name, value, FROZEN, STRICT).Assert(); 8960 JSObject::SetOwnPropertyIgnoreAttributes(module, name, value, FROZEN)
8961 .Assert();
8965 break; 8962 break;
8966 } 8963 }
8967 case INTERNAL: 8964 case INTERNAL:
8968 case TEMPORARY: 8965 case TEMPORARY:
8969 case DYNAMIC: 8966 case DYNAMIC:
8970 case DYNAMIC_GLOBAL: 8967 case DYNAMIC_GLOBAL:
8971 case DYNAMIC_LOCAL: 8968 case DYNAMIC_LOCAL:
8972 UNREACHABLE(); 8969 UNREACHABLE();
8973 } 8970 }
8974 } 8971 }
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
9248 // If absent in strict mode: throw. 9245 // If absent in strict mode: throw.
9249 Handle<Object> error = isolate->factory()->NewReferenceError( 9246 Handle<Object> error = isolate->factory()->NewReferenceError(
9250 "not_defined", HandleVector(&name, 1)); 9247 "not_defined", HandleVector(&name, 1));
9251 return isolate->Throw(*error); 9248 return isolate->Throw(*error);
9252 } else { 9249 } else {
9253 // If absent in sloppy mode: add the property to the global object. 9250 // If absent in sloppy mode: add the property to the global object.
9254 object = Handle<JSReceiver>(context->global_object()); 9251 object = Handle<JSReceiver>(context->global_object());
9255 } 9252 }
9256 9253
9257 RETURN_FAILURE_ON_EXCEPTION( 9254 RETURN_FAILURE_ON_EXCEPTION(
9258 isolate, JSReceiver::SetProperty(object, name, value, NONE, strict_mode)); 9255 isolate, JSReceiver::SetProperty(object, name, value, strict_mode));
9259 9256
9260 return *value; 9257 return *value;
9261 } 9258 }
9262 9259
9263 9260
9264 RUNTIME_FUNCTION(Runtime_Throw) { 9261 RUNTIME_FUNCTION(Runtime_Throw) {
9265 HandleScope scope(isolate); 9262 HandleScope scope(isolate);
9266 ASSERT(args.length() == 1); 9263 ASSERT(args.length() == 1);
9267 9264
9268 return isolate->Throw(args[0]); 9265 return isolate->Throw(args[0]);
(...skipping 5690 matching lines...) Expand 10 before | Expand all | Expand 10 after
14959 } 14956 }
14960 return NULL; 14957 return NULL;
14961 } 14958 }
14962 14959
14963 14960
14964 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { 14961 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
14965 return &(kIntrinsicFunctions[static_cast<int>(id)]); 14962 return &(kIntrinsicFunctions[static_cast<int>(id)]);
14966 } 14963 }
14967 14964
14968 } } // namespace v8::internal 14965 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698