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

Side by Side Diff: src/runtime.cc

Issue 6445: This change removes the %AddProperty native JavaScript function from V8.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 2 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/string.js » ('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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 GlobalObject* global = Top::context()->global(); 497 GlobalObject* global = Top::context()->global();
498 498
499 // According to ECMA-262, section 12.2, page 62, the property must 499 // According to ECMA-262, section 12.2, page 62, the property must
500 // not be deletable. 500 // not be deletable.
501 PropertyAttributes attributes = DONT_DELETE; 501 PropertyAttributes attributes = DONT_DELETE;
502 502
503 // Lookup the property locally in the global object. If it isn't 503 // Lookup the property locally in the global object. If it isn't
504 // there, we add the property and take special precautions to always 504 // there, we add the property and take special precautions to always
505 // add it as a local property even in case of callbacks in the 505 // add it as a local property even in case of callbacks in the
506 // prototype chain (this rules out using SetProperty). 506 // prototype chain (this rules out using SetProperty).
507 // We have IgnoreAttributesAndSetLocalProperty for this.
507 LookupResult lookup; 508 LookupResult lookup;
508 global->LocalLookup(*name, &lookup); 509 global->LocalLookup(*name, &lookup);
509 if (!lookup.IsProperty()) { 510 if (!lookup.IsProperty()) {
510 Object* value = (assign) ? args[1] : Heap::undefined_value(); 511 Object* value = (assign) ? args[1] : Heap::undefined_value();
511 return global->AddProperty(*name, value, attributes); 512 return global->IgnoreAttributesAndSetLocalProperty(*name,
513 » » » » » » value,
514 » » » » » » attributes);
512 } 515 }
513 516
514 // Determine if this is a redeclaration of something read-only. 517 // Determine if this is a redeclaration of something read-only.
515 if (lookup.IsReadOnly()) { 518 if (lookup.IsReadOnly()) {
516 return ThrowRedeclarationError("const", name); 519 return ThrowRedeclarationError("const", name);
517 } 520 }
518 521
519 // Determine if this is a redeclaration of an intercepted read-only 522 // Determine if this is a redeclaration of an intercepted read-only
520 // property and figure out if the property exists at all. 523 // property and figure out if the property exists at all.
521 bool found = true; 524 bool found = true;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 564
562 // According to ECMA-262, section 12.2, page 62, the property must 565 // According to ECMA-262, section 12.2, page 62, the property must
563 // not be deletable. Since it's a const, it must be READ_ONLY too. 566 // not be deletable. Since it's a const, it must be READ_ONLY too.
564 PropertyAttributes attributes = 567 PropertyAttributes attributes =
565 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); 568 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY);
566 569
567 // Lookup the property locally in the global object. If it isn't 570 // Lookup the property locally in the global object. If it isn't
568 // there, we add the property and take special precautions to always 571 // there, we add the property and take special precautions to always
569 // add it as a local property even in case of callbacks in the 572 // add it as a local property even in case of callbacks in the
570 // prototype chain (this rules out using SetProperty). 573 // prototype chain (this rules out using SetProperty).
574 // We use IgnoreAttributesAndSetLocalProperty instead
571 LookupResult lookup; 575 LookupResult lookup;
572 global->LocalLookup(*name, &lookup); 576 global->LocalLookup(*name, &lookup);
573 if (!lookup.IsProperty()) { 577 if (!lookup.IsProperty()) {
574 return global->AddProperty(*name, *value, attributes); 578 return global->IgnoreAttributesAndSetLocalProperty(*name,
579 » » » » » » *value,
580 » » » » » » attributes);
575 } 581 }
576 582
577 // Determine if this is a redeclaration of something not 583 // Determine if this is a redeclaration of something not
578 // read-only. In case the result is hidden behind an interceptor we 584 // read-only. In case the result is hidden behind an interceptor we
579 // need to ask it for the property attributes. 585 // need to ask it for the property attributes.
580 if (!lookup.IsReadOnly()) { 586 if (!lookup.IsReadOnly()) {
581 if (lookup.type() != INTERCEPTOR) { 587 if (lookup.type() != INTERCEPTOR) {
582 return ThrowRedeclarationError("var", name); 588 return ThrowRedeclarationError("var", name);
583 } 589 }
584 590
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
1370 1376
1371 if (name->AsArrayIndex(&index)) { 1377 if (name->AsArrayIndex(&index)) {
1372 ASSERT(attr == NONE); 1378 ASSERT(attr == NONE);
1373 return js_object->SetElement(index, *value); 1379 return js_object->SetElement(index, *value);
1374 } else { 1380 } else {
1375 return js_object->SetProperty(*name, *value, attr); 1381 return js_object->SetProperty(*name, *value, attr);
1376 } 1382 }
1377 } 1383 }
1378 1384
1379 1385
1380 static Object* Runtime_AddProperty(Arguments args) {
1381 NoHandleAllocation ha;
1382 ASSERT(args.length() == 4);
1383
1384 CONVERT_CHECKED(JSObject, object, args[0]);
1385 CONVERT_CHECKED(String, name, args[1]);
1386 RUNTIME_ASSERT(!object->HasLocalProperty(name));
1387 CONVERT_CHECKED(Smi, attr_obj, args[3]);
1388
1389 int attr = attr_obj->value();
1390 RUNTIME_ASSERT((attr & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
1391 PropertyAttributes attributes = static_cast<PropertyAttributes>(attr);
1392
1393 return object->AddProperty(name, args[2], attributes);
1394 }
1395
1396
1397 static Object* Runtime_SetProperty(Arguments args) { 1386 static Object* Runtime_SetProperty(Arguments args) {
1398 NoHandleAllocation ha; 1387 NoHandleAllocation ha;
1399 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); 1388 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
1400 1389
1401 Handle<Object> object = args.at<Object>(0); 1390 Handle<Object> object = args.at<Object>(0);
1402 Handle<Object> key = args.at<Object>(1); 1391 Handle<Object> key = args.at<Object>(1);
1403 Handle<Object> value = args.at<Object>(2); 1392 Handle<Object> value = args.at<Object>(2);
1404 1393
1405 // Compute attributes. 1394 // Compute attributes.
1406 PropertyAttributes attributes = NONE; 1395 PropertyAttributes attributes = NONE;
1407 if (args.length() == 4) { 1396 if (args.length() == 4) {
1408 CONVERT_CHECKED(Smi, value_obj, args[3]); 1397 CONVERT_CHECKED(Smi, value_obj, args[3]);
1409 int value = value_obj->value(); 1398 int unchecked_value = value_obj->value();
1410 // Only attribute bits should be set. 1399 // Only attribute bits should be set.
1411 ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 1400 RUNTIME_ASSERT(
1412 attributes = static_cast<PropertyAttributes>(value); 1401 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
1402 attributes = static_cast<PropertyAttributes>(unchecked_value);
1413 } 1403 }
1414 return Runtime::SetObjectProperty(object, key, value, attributes); 1404 return Runtime::SetObjectProperty(object, key, value, attributes);
1415 } 1405 }
1416 1406
1417 1407
1418 // Set a local property, even if it is READ_ONLY. If the property does not 1408 // Set a local property, even if it is READ_ONLY. If the property does not
1419 // exist, it will be added with attributes NONE. 1409 // exist, it will be added with attributes NONE.
1420 static Object* Runtime_IgnoreAttributesAndSetProperty(Arguments args) { 1410 static Object* Runtime_IgnoreAttributesAndSetProperty(Arguments args) {
1421 NoHandleAllocation ha; 1411 NoHandleAllocation ha;
1422 ASSERT(args.length() == 3); 1412 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
1423
1424 CONVERT_CHECKED(JSObject, object, args[0]); 1413 CONVERT_CHECKED(JSObject, object, args[0]);
1425 CONVERT_CHECKED(String, name, args[1]); 1414 CONVERT_CHECKED(String, name, args[1]);
1415 // Compute attributes.
1416 PropertyAttributes attributes = NONE;
1417 if (args.length() == 4) {
1418 CONVERT_CHECKED(Smi, value_obj, args[3]);
1419 int unchecked_value = value_obj->value();
1420 // Only attribute bits should be set.
1421 RUNTIME_ASSERT(
1422 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
1423 attributes = static_cast<PropertyAttributes>(unchecked_value);
1424 }
1426 1425
1427 return object->IgnoreAttributesAndSetLocalProperty(name, args[2], NONE); 1426 return object->
1427 IgnoreAttributesAndSetLocalProperty(name, args[2], attributes);
1428 } 1428 }
1429 1429
1430 1430
1431 static Object* Runtime_DeleteProperty(Arguments args) { 1431 static Object* Runtime_DeleteProperty(Arguments args) {
1432 NoHandleAllocation ha; 1432 NoHandleAllocation ha;
1433 ASSERT(args.length() == 2); 1433 ASSERT(args.length() == 2);
1434 1434
1435 CONVERT_CHECKED(JSObject, object, args[0]); 1435 CONVERT_CHECKED(JSObject, object, args[0]);
1436 CONVERT_CHECKED(String, key, args[1]); 1436 CONVERT_CHECKED(String, key, args[1]);
1437 return object->DeleteProperty(key); 1437 return object->DeleteProperty(key);
(...skipping 3589 matching lines...) Expand 10 before | Expand all | Expand 10 after
5027 5027
5028 void Runtime::PerformGC(Object* result) { 5028 void Runtime::PerformGC(Object* result) {
5029 Failure* failure = Failure::cast(result); 5029 Failure* failure = Failure::cast(result);
5030 // Try to do a garbage collection; ignore it if it fails. The C 5030 // Try to do a garbage collection; ignore it if it fails. The C
5031 // entry stub will throw an out-of-memory exception in that case. 5031 // entry stub will throw an out-of-memory exception in that case.
5032 Heap::CollectGarbage(failure->requested(), failure->allocation_space()); 5032 Heap::CollectGarbage(failure->requested(), failure->allocation_space());
5033 } 5033 }
5034 5034
5035 5035
5036 } } // namespace v8::internal 5036 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.h ('k') | src/string.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698