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

Side by Side Diff: src/runtime.cc

Issue 15691017: Make assertion scopes thread safe. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 6 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
OLDNEW
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 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 RUNTIME_ASSERT(name->IsString() || name->IsUndefined()); 561 RUNTIME_ASSERT(name->IsString() || name->IsUndefined());
562 Symbol* symbol; 562 Symbol* symbol;
563 MaybeObject* maybe = isolate->heap()->AllocateSymbol(); 563 MaybeObject* maybe = isolate->heap()->AllocateSymbol();
564 if (!maybe->To(&symbol)) return maybe; 564 if (!maybe->To(&symbol)) return maybe;
565 if (name->IsString()) symbol->set_name(*name); 565 if (name->IsString()) symbol->set_name(*name);
566 return symbol; 566 return symbol;
567 } 567 }
568 568
569 569
570 RUNTIME_FUNCTION(MaybeObject*, Runtime_SymbolName) { 570 RUNTIME_FUNCTION(MaybeObject*, Runtime_SymbolName) {
571 NoHandleAllocation ha(isolate); 571 SealHandleScope shs(isolate);
572 ASSERT(args.length() == 1); 572 ASSERT(args.length() == 1);
573 CONVERT_ARG_CHECKED(Symbol, symbol, 0); 573 CONVERT_ARG_CHECKED(Symbol, symbol, 0);
574 return symbol->name(); 574 return symbol->name();
575 } 575 }
576 576
577 577
578 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSProxy) { 578 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSProxy) {
579 NoHandleAllocation ha(isolate); 579 SealHandleScope shs(isolate);
580 ASSERT(args.length() == 2); 580 ASSERT(args.length() == 2);
581 CONVERT_ARG_CHECKED(JSReceiver, handler, 0); 581 CONVERT_ARG_CHECKED(JSReceiver, handler, 0);
582 Object* prototype = args[1]; 582 Object* prototype = args[1];
583 Object* used_prototype = 583 Object* used_prototype =
584 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value(); 584 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value();
585 return isolate->heap()->AllocateJSProxy(handler, used_prototype); 585 return isolate->heap()->AllocateJSProxy(handler, used_prototype);
586 } 586 }
587 587
588 588
589 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSFunctionProxy) { 589 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSFunctionProxy) {
590 NoHandleAllocation ha(isolate); 590 SealHandleScope shs(isolate);
591 ASSERT(args.length() == 4); 591 ASSERT(args.length() == 4);
592 CONVERT_ARG_CHECKED(JSReceiver, handler, 0); 592 CONVERT_ARG_CHECKED(JSReceiver, handler, 0);
593 Object* call_trap = args[1]; 593 Object* call_trap = args[1];
594 RUNTIME_ASSERT(call_trap->IsJSFunction() || call_trap->IsJSFunctionProxy()); 594 RUNTIME_ASSERT(call_trap->IsJSFunction() || call_trap->IsJSFunctionProxy());
595 CONVERT_ARG_CHECKED(JSFunction, construct_trap, 2); 595 CONVERT_ARG_CHECKED(JSFunction, construct_trap, 2);
596 Object* prototype = args[3]; 596 Object* prototype = args[3];
597 Object* used_prototype = 597 Object* used_prototype =
598 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value(); 598 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value();
599 return isolate->heap()->AllocateJSFunctionProxy( 599 return isolate->heap()->AllocateJSFunctionProxy(
600 handler, call_trap, construct_trap, used_prototype); 600 handler, call_trap, construct_trap, used_prototype);
601 } 601 }
602 602
603 603
604 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSProxy) { 604 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSProxy) {
605 NoHandleAllocation ha(isolate); 605 SealHandleScope shs(isolate);
606 ASSERT(args.length() == 1); 606 ASSERT(args.length() == 1);
607 Object* obj = args[0]; 607 Object* obj = args[0];
608 return isolate->heap()->ToBoolean(obj->IsJSProxy()); 608 return isolate->heap()->ToBoolean(obj->IsJSProxy());
609 } 609 }
610 610
611 611
612 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSFunctionProxy) { 612 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSFunctionProxy) {
613 NoHandleAllocation ha(isolate); 613 SealHandleScope shs(isolate);
614 ASSERT(args.length() == 1); 614 ASSERT(args.length() == 1);
615 Object* obj = args[0]; 615 Object* obj = args[0];
616 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy()); 616 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy());
617 } 617 }
618 618
619 619
620 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHandler) { 620 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHandler) {
621 NoHandleAllocation ha(isolate); 621 SealHandleScope shs(isolate);
622 ASSERT(args.length() == 1); 622 ASSERT(args.length() == 1);
623 CONVERT_ARG_CHECKED(JSProxy, proxy, 0); 623 CONVERT_ARG_CHECKED(JSProxy, proxy, 0);
624 return proxy->handler(); 624 return proxy->handler();
625 } 625 }
626 626
627 627
628 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetCallTrap) { 628 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetCallTrap) {
629 NoHandleAllocation ha(isolate); 629 SealHandleScope shs(isolate);
630 ASSERT(args.length() == 1); 630 ASSERT(args.length() == 1);
631 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0); 631 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0);
632 return proxy->call_trap(); 632 return proxy->call_trap();
633 } 633 }
634 634
635 635
636 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructTrap) { 636 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructTrap) {
637 NoHandleAllocation ha(isolate); 637 SealHandleScope shs(isolate);
638 ASSERT(args.length() == 1); 638 ASSERT(args.length() == 1);
639 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0); 639 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0);
640 return proxy->construct_trap(); 640 return proxy->construct_trap();
641 } 641 }
642 642
643 643
644 RUNTIME_FUNCTION(MaybeObject*, Runtime_Fix) { 644 RUNTIME_FUNCTION(MaybeObject*, Runtime_Fix) {
645 NoHandleAllocation ha(isolate); 645 SealHandleScope shs(isolate);
646 ASSERT(args.length() == 1); 646 ASSERT(args.length() == 1);
647 CONVERT_ARG_CHECKED(JSProxy, proxy, 0); 647 CONVERT_ARG_CHECKED(JSProxy, proxy, 0);
648 proxy->Fix(); 648 proxy->Fix();
649 return isolate->heap()->undefined_value(); 649 return isolate->heap()->undefined_value();
650 } 650 }
651 651
652 652
653 static void ArrayBufferWeakCallback(v8::Isolate* external_isolate, 653 static void ArrayBufferWeakCallback(v8::Isolate* external_isolate,
654 Persistent<Value>* object, 654 Persistent<Value>* object,
655 void* data) { 655 void* data) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 return isolate->Throw(*isolate->factory()-> 744 return isolate->Throw(*isolate->factory()->
745 NewRangeError("invalid_array_buffer_length", 745 NewRangeError("invalid_array_buffer_length",
746 HandleVector<Object>(NULL, 0))); 746 HandleVector<Object>(NULL, 0)));
747 } 747 }
748 748
749 return *holder; 749 return *holder;
750 } 750 }
751 751
752 752
753 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferGetByteLength) { 753 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferGetByteLength) {
754 NoHandleAllocation ha(isolate); 754 SealHandleScope shs(isolate);
755 ASSERT(args.length() == 1); 755 ASSERT(args.length() == 1);
756 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); 756 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0);
757 return holder->byte_length(); 757 return holder->byte_length();
758 } 758 }
759 759
760 760
761 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferSliceImpl) { 761 RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferSliceImpl) {
762 HandleScope scope(isolate); 762 HandleScope scope(isolate);
763 ASSERT(args.length() == 3); 763 ASSERT(args.length() == 3);
764 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0); 764 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0);
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1188 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1189 Handle<Object> value(args[2], isolate); 1189 Handle<Object> value(args[2], isolate);
1190 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table())); 1190 Handle<ObjectHashTable> table(ObjectHashTable::cast(weakmap->table()));
1191 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value); 1191 Handle<ObjectHashTable> new_table = PutIntoObjectHashTable(table, key, value);
1192 weakmap->set_table(*new_table); 1192 weakmap->set_table(*new_table);
1193 return isolate->heap()->undefined_value(); 1193 return isolate->heap()->undefined_value();
1194 } 1194 }
1195 1195
1196 1196
1197 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClassOf) { 1197 RUNTIME_FUNCTION(MaybeObject*, Runtime_ClassOf) {
1198 NoHandleAllocation ha(isolate); 1198 SealHandleScope shs(isolate);
1199 ASSERT(args.length() == 1); 1199 ASSERT(args.length() == 1);
1200 Object* obj = args[0]; 1200 Object* obj = args[0];
1201 if (!obj->IsJSObject()) return isolate->heap()->null_value(); 1201 if (!obj->IsJSObject()) return isolate->heap()->null_value();
1202 return JSObject::cast(obj)->class_name(); 1202 return JSObject::cast(obj)->class_name();
1203 } 1203 }
1204 1204
1205 1205
1206 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) { 1206 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) {
1207 NoHandleAllocation ha(isolate); 1207 SealHandleScope shs(isolate);
1208 ASSERT(args.length() == 1); 1208 ASSERT(args.length() == 1);
1209 CONVERT_ARG_CHECKED(Object, obj, 0); 1209 CONVERT_ARG_CHECKED(Object, obj, 0);
1210 // We don't expect access checks to be needed on JSProxy objects. 1210 // We don't expect access checks to be needed on JSProxy objects.
1211 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); 1211 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject());
1212 do { 1212 do {
1213 if (obj->IsAccessCheckNeeded() && 1213 if (obj->IsAccessCheckNeeded() &&
1214 !isolate->MayNamedAccess(JSObject::cast(obj), 1214 !isolate->MayNamedAccess(JSObject::cast(obj),
1215 isolate->heap()->proto_string(), 1215 isolate->heap()->proto_string(),
1216 v8::ACCESS_GET)) { 1216 v8::ACCESS_GET)) {
1217 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); 1217 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET);
(...skipping 11 matching lines...) Expand all
1229 Object* current = receiver->GetPrototype(isolate); 1229 Object* current = receiver->GetPrototype(isolate);
1230 while (current->IsJSObject() && 1230 while (current->IsJSObject() &&
1231 JSObject::cast(current)->map()->is_hidden_prototype()) { 1231 JSObject::cast(current)->map()->is_hidden_prototype()) {
1232 current = current->GetPrototype(isolate); 1232 current = current->GetPrototype(isolate);
1233 } 1233 }
1234 return current; 1234 return current;
1235 } 1235 }
1236 1236
1237 1237
1238 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetPrototype) { 1238 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetPrototype) {
1239 NoHandleAllocation ha(isolate); 1239 SealHandleScope shs(isolate);
1240 ASSERT(args.length() == 2); 1240 ASSERT(args.length() == 2);
1241 CONVERT_ARG_CHECKED(JSObject, obj, 0); 1241 CONVERT_ARG_CHECKED(JSObject, obj, 0);
1242 CONVERT_ARG_CHECKED(Object, prototype, 1); 1242 CONVERT_ARG_CHECKED(Object, prototype, 1);
1243 if (FLAG_harmony_observation && obj->map()->is_observed()) { 1243 if (FLAG_harmony_observation && obj->map()->is_observed()) {
1244 HandleScope scope(isolate); 1244 HandleScope scope(isolate);
1245 Handle<JSObject> receiver(obj); 1245 Handle<JSObject> receiver(obj);
1246 Handle<Object> value(prototype, isolate); 1246 Handle<Object> value(prototype, isolate);
1247 Handle<Object> old_value( 1247 Handle<Object> old_value(
1248 GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate); 1248 GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate);
1249 1249
1250 MaybeObject* result = receiver->SetPrototype(*value, true); 1250 MaybeObject* result = receiver->SetPrototype(*value, true);
1251 Handle<Object> hresult; 1251 Handle<Object> hresult;
1252 if (!result->ToHandle(&hresult, isolate)) return result; 1252 if (!result->ToHandle(&hresult, isolate)) return result;
1253 1253
1254 Handle<Object> new_value( 1254 Handle<Object> new_value(
1255 GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate); 1255 GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate);
1256 if (!new_value->SameValue(*old_value)) { 1256 if (!new_value->SameValue(*old_value)) {
1257 JSObject::EnqueueChangeRecord(receiver, "prototype", 1257 JSObject::EnqueueChangeRecord(receiver, "prototype",
1258 isolate->factory()->proto_string(), 1258 isolate->factory()->proto_string(),
1259 old_value); 1259 old_value);
1260 } 1260 }
1261 return *hresult; 1261 return *hresult;
1262 } 1262 }
1263 return obj->SetPrototype(prototype, true); 1263 return obj->SetPrototype(prototype, true);
1264 } 1264 }
1265 1265
1266 1266
1267 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) { 1267 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsInPrototypeChain) {
1268 NoHandleAllocation ha(isolate); 1268 SealHandleScope shs(isolate);
1269 ASSERT(args.length() == 2); 1269 ASSERT(args.length() == 2);
1270 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8). 1270 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8).
1271 Object* O = args[0]; 1271 Object* O = args[0];
1272 Object* V = args[1]; 1272 Object* V = args[1];
1273 while (true) { 1273 while (true) {
1274 Object* prototype = V->GetPrototype(isolate); 1274 Object* prototype = V->GetPrototype(isolate);
1275 if (prototype->IsNull()) return isolate->heap()->false_value(); 1275 if (prototype->IsNull()) return isolate->heap()->false_value();
1276 if (O == prototype) return isolate->heap()->true_value(); 1276 if (O == prototype) return isolate->heap()->true_value();
1277 V = prototype; 1277 V = prototype;
1278 } 1278 }
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOwnProperty) { 1451 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetOwnProperty) {
1452 HandleScope scope(isolate); 1452 HandleScope scope(isolate);
1453 ASSERT(args.length() == 2); 1453 ASSERT(args.length() == 2);
1454 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 1454 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
1455 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 1455 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
1456 return GetOwnProperty(isolate, obj, name); 1456 return GetOwnProperty(isolate, obj, name);
1457 } 1457 }
1458 1458
1459 1459
1460 RUNTIME_FUNCTION(MaybeObject*, Runtime_PreventExtensions) { 1460 RUNTIME_FUNCTION(MaybeObject*, Runtime_PreventExtensions) {
1461 NoHandleAllocation ha(isolate); 1461 SealHandleScope shs(isolate);
1462 ASSERT(args.length() == 1); 1462 ASSERT(args.length() == 1);
1463 CONVERT_ARG_CHECKED(JSObject, obj, 0); 1463 CONVERT_ARG_CHECKED(JSObject, obj, 0);
1464 return obj->PreventExtensions(); 1464 return obj->PreventExtensions();
1465 } 1465 }
1466 1466
1467 1467
1468 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsExtensible) { 1468 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsExtensible) {
1469 NoHandleAllocation ha(isolate); 1469 SealHandleScope shs(isolate);
1470 ASSERT(args.length() == 1); 1470 ASSERT(args.length() == 1);
1471 CONVERT_ARG_CHECKED(JSObject, obj, 0); 1471 CONVERT_ARG_CHECKED(JSObject, obj, 0);
1472 if (obj->IsJSGlobalProxy()) { 1472 if (obj->IsJSGlobalProxy()) {
1473 Object* proto = obj->GetPrototype(); 1473 Object* proto = obj->GetPrototype();
1474 if (proto->IsNull()) return isolate->heap()->false_value(); 1474 if (proto->IsNull()) return isolate->heap()->false_value();
1475 ASSERT(proto->IsJSGlobalObject()); 1475 ASSERT(proto->IsJSGlobalObject());
1476 obj = JSObject::cast(proto); 1476 obj = JSObject::cast(proto);
1477 } 1477 }
1478 return isolate->heap()->ToBoolean(obj->map()->is_extensible()); 1478 return isolate->heap()->ToBoolean(obj->map()->is_extensible());
1479 } 1479 }
(...skipping 14 matching lines...) Expand all
1494 1494
1495 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateApiFunction) { 1495 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateApiFunction) {
1496 HandleScope scope(isolate); 1496 HandleScope scope(isolate);
1497 ASSERT(args.length() == 1); 1497 ASSERT(args.length() == 1);
1498 CONVERT_ARG_HANDLE_CHECKED(FunctionTemplateInfo, data, 0); 1498 CONVERT_ARG_HANDLE_CHECKED(FunctionTemplateInfo, data, 0);
1499 return *isolate->factory()->CreateApiFunction(data); 1499 return *isolate->factory()->CreateApiFunction(data);
1500 } 1500 }
1501 1501
1502 1502
1503 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsTemplate) { 1503 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsTemplate) {
1504 NoHandleAllocation ha(isolate); 1504 SealHandleScope shs(isolate);
1505 ASSERT(args.length() == 1); 1505 ASSERT(args.length() == 1);
1506 Object* arg = args[0]; 1506 Object* arg = args[0];
1507 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo(); 1507 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo();
1508 return isolate->heap()->ToBoolean(result); 1508 return isolate->heap()->ToBoolean(result);
1509 } 1509 }
1510 1510
1511 1511
1512 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) { 1512 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) {
1513 NoHandleAllocation ha(isolate); 1513 SealHandleScope shs(isolate);
1514 ASSERT(args.length() == 2); 1514 ASSERT(args.length() == 2);
1515 CONVERT_ARG_CHECKED(HeapObject, templ, 0); 1515 CONVERT_ARG_CHECKED(HeapObject, templ, 0);
1516 CONVERT_SMI_ARG_CHECKED(index, 1) 1516 CONVERT_SMI_ARG_CHECKED(index, 1)
1517 int offset = index * kPointerSize + HeapObject::kHeaderSize; 1517 int offset = index * kPointerSize + HeapObject::kHeaderSize;
1518 InstanceType type = templ->map()->instance_type(); 1518 InstanceType type = templ->map()->instance_type();
1519 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || 1519 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE ||
1520 type == OBJECT_TEMPLATE_INFO_TYPE); 1520 type == OBJECT_TEMPLATE_INFO_TYPE);
1521 RUNTIME_ASSERT(offset > 0); 1521 RUNTIME_ASSERT(offset > 0);
1522 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { 1522 if (type == FUNCTION_TEMPLATE_INFO_TYPE) {
1523 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); 1523 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize);
1524 } else { 1524 } else {
1525 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); 1525 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize);
1526 } 1526 }
1527 return *HeapObject::RawField(templ, offset); 1527 return *HeapObject::RawField(templ, offset);
1528 } 1528 }
1529 1529
1530 1530
1531 RUNTIME_FUNCTION(MaybeObject*, Runtime_DisableAccessChecks) { 1531 RUNTIME_FUNCTION(MaybeObject*, Runtime_DisableAccessChecks) {
1532 NoHandleAllocation ha(isolate); 1532 SealHandleScope shs(isolate);
1533 ASSERT(args.length() == 1); 1533 ASSERT(args.length() == 1);
1534 CONVERT_ARG_CHECKED(HeapObject, object, 0); 1534 CONVERT_ARG_CHECKED(HeapObject, object, 0);
1535 Map* old_map = object->map(); 1535 Map* old_map = object->map();
1536 bool needs_access_checks = old_map->is_access_check_needed(); 1536 bool needs_access_checks = old_map->is_access_check_needed();
1537 if (needs_access_checks) { 1537 if (needs_access_checks) {
1538 // Copy map so it won't interfere constructor's initial map. 1538 // Copy map so it won't interfere constructor's initial map.
1539 Map* new_map; 1539 Map* new_map;
1540 MaybeObject* maybe_new_map = old_map->Copy(); 1540 MaybeObject* maybe_new_map = old_map->Copy();
1541 if (!maybe_new_map->To(&new_map)) return maybe_new_map; 1541 if (!maybe_new_map->To(&new_map)) return maybe_new_map;
1542 1542
1543 new_map->set_is_access_check_needed(false); 1543 new_map->set_is_access_check_needed(false);
1544 object->set_map(new_map); 1544 object->set_map(new_map);
1545 } 1545 }
1546 return isolate->heap()->ToBoolean(needs_access_checks); 1546 return isolate->heap()->ToBoolean(needs_access_checks);
1547 } 1547 }
1548 1548
1549 1549
1550 RUNTIME_FUNCTION(MaybeObject*, Runtime_EnableAccessChecks) { 1550 RUNTIME_FUNCTION(MaybeObject*, Runtime_EnableAccessChecks) {
1551 NoHandleAllocation ha(isolate); 1551 SealHandleScope shs(isolate);
1552 ASSERT(args.length() == 1); 1552 ASSERT(args.length() == 1);
1553 CONVERT_ARG_CHECKED(HeapObject, object, 0); 1553 CONVERT_ARG_CHECKED(HeapObject, object, 0);
1554 Map* old_map = object->map(); 1554 Map* old_map = object->map();
1555 if (!old_map->is_access_check_needed()) { 1555 if (!old_map->is_access_check_needed()) {
1556 // Copy map so it won't interfere constructor's initial map. 1556 // Copy map so it won't interfere constructor's initial map.
1557 Map* new_map; 1557 Map* new_map;
1558 MaybeObject* maybe_new_map = old_map->Copy(); 1558 MaybeObject* maybe_new_map = old_map->Copy();
1559 if (!maybe_new_map->To(&new_map)) return maybe_new_map; 1559 if (!maybe_new_map->To(&new_map)) return maybe_new_map;
1560 1560
1561 new_map->set_is_access_check_needed(true); 1561 new_map->set_is_access_check_needed(true);
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1774 RETURN_IF_EMPTY_HANDLE(isolate, 1774 RETURN_IF_EMPTY_HANDLE(isolate,
1775 JSReceiver::SetProperty(object, name, value, mode, kNonStrictMode)); 1775 JSReceiver::SetProperty(object, name, value, mode, kNonStrictMode));
1776 } 1776 }
1777 } 1777 }
1778 1778
1779 return isolate->heap()->undefined_value(); 1779 return isolate->heap()->undefined_value();
1780 } 1780 }
1781 1781
1782 1782
1783 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) { 1783 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) {
1784 NoHandleAllocation nha(isolate); 1784 SealHandleScope shs(isolate);
1785 // args[0] == name 1785 // args[0] == name
1786 // args[1] == language_mode 1786 // args[1] == language_mode
1787 // args[2] == value (optional) 1787 // args[2] == value (optional)
1788 1788
1789 // Determine if we need to assign to the variable if it already 1789 // Determine if we need to assign to the variable if it already
1790 // exists (based on the number of arguments). 1790 // exists (based on the number of arguments).
1791 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); 1791 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3);
1792 bool assign = args.length() == 3; 1792 bool assign = args.length() == 3;
1793 1793
1794 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); 1794 CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1830 // Reload global in case the loop above performed a GC. 1830 // Reload global in case the loop above performed a GC.
1831 global = isolate->context()->global_object(); 1831 global = isolate->context()->global_object();
1832 if (assign) { 1832 if (assign) {
1833 return global->SetProperty(*name, args[2], attributes, strict_mode_flag); 1833 return global->SetProperty(*name, args[2], attributes, strict_mode_flag);
1834 } 1834 }
1835 return isolate->heap()->undefined_value(); 1835 return isolate->heap()->undefined_value();
1836 } 1836 }
1837 1837
1838 1838
1839 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) { 1839 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) {
1840 NoHandleAllocation ha(isolate); 1840 SealHandleScope shs(isolate);
1841 // All constants are declared with an initial value. The name 1841 // All constants are declared with an initial value. The name
1842 // of the constant is the first argument and the initial value 1842 // of the constant is the first argument and the initial value
1843 // is the second. 1843 // is the second.
1844 RUNTIME_ASSERT(args.length() == 2); 1844 RUNTIME_ASSERT(args.length() == 2);
1845 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); 1845 CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
1846 Handle<Object> value = args.at<Object>(1); 1846 Handle<Object> value = args.at<Object>(1);
1847 1847
1848 // Get the current global object from top. 1848 // Get the current global object from top.
1849 GlobalObject* global = isolate->context()->global_object(); 1849 GlobalObject* global = isolate->context()->global_object();
1850 1850
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
2036 Handle<Object> result = RegExpImpl::Exec(regexp, 2036 Handle<Object> result = RegExpImpl::Exec(regexp,
2037 subject, 2037 subject,
2038 index, 2038 index,
2039 last_match_info); 2039 last_match_info);
2040 if (result.is_null()) return Failure::Exception(); 2040 if (result.is_null()) return Failure::Exception();
2041 return *result; 2041 return *result;
2042 } 2042 }
2043 2043
2044 2044
2045 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpConstructResult) { 2045 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpConstructResult) {
2046 NoHandleAllocation ha(isolate); 2046 SealHandleScope shs(isolate);
2047 ASSERT(args.length() == 3); 2047 ASSERT(args.length() == 3);
2048 CONVERT_SMI_ARG_CHECKED(elements_count, 0); 2048 CONVERT_SMI_ARG_CHECKED(elements_count, 0);
2049 if (elements_count < 0 || 2049 if (elements_count < 0 ||
2050 elements_count > FixedArray::kMaxLength || 2050 elements_count > FixedArray::kMaxLength ||
2051 !Smi::IsValid(elements_count)) { 2051 !Smi::IsValid(elements_count)) {
2052 return isolate->ThrowIllegalOperation(); 2052 return isolate->ThrowIllegalOperation();
2053 } 2053 }
2054 Object* new_object; 2054 Object* new_object;
2055 { MaybeObject* maybe_new_object = 2055 { MaybeObject* maybe_new_object =
2056 isolate->heap()->AllocateFixedArrayWithHoles(elements_count); 2056 isolate->heap()->AllocateFixedArrayWithHoles(elements_count);
2057 if (!maybe_new_object->ToObject(&new_object)) return maybe_new_object; 2057 if (!maybe_new_object->ToObject(&new_object)) return maybe_new_object;
2058 } 2058 }
2059 FixedArray* elements = FixedArray::cast(new_object); 2059 FixedArray* elements = FixedArray::cast(new_object);
2060 { MaybeObject* maybe_new_object = isolate->heap()->AllocateRaw( 2060 { MaybeObject* maybe_new_object = isolate->heap()->AllocateRaw(
2061 JSRegExpResult::kSize, NEW_SPACE, OLD_POINTER_SPACE); 2061 JSRegExpResult::kSize, NEW_SPACE, OLD_POINTER_SPACE);
2062 if (!maybe_new_object->ToObject(&new_object)) return maybe_new_object; 2062 if (!maybe_new_object->ToObject(&new_object)) return maybe_new_object;
2063 } 2063 }
2064 { 2064 {
2065 AssertNoAllocation no_gc; 2065 DisallowHeapAllocation no_gc;
2066 HandleScope scope(isolate); 2066 HandleScope scope(isolate);
2067 reinterpret_cast<HeapObject*>(new_object)-> 2067 reinterpret_cast<HeapObject*>(new_object)->
2068 set_map(isolate->native_context()->regexp_result_map()); 2068 set_map(isolate->native_context()->regexp_result_map());
2069 } 2069 }
2070 JSArray* array = JSArray::cast(new_object); 2070 JSArray* array = JSArray::cast(new_object);
2071 array->set_properties(isolate->heap()->empty_fixed_array()); 2071 array->set_properties(isolate->heap()->empty_fixed_array());
2072 array->set_elements(elements); 2072 array->set_elements(elements);
2073 array->set_length(Smi::FromInt(elements_count)); 2073 array->set_length(Smi::FromInt(elements_count));
2074 // Write in-object properties after the length of the array. 2074 // Write in-object properties after the length of the array.
2075 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]); 2075 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]);
2076 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]); 2076 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]);
2077 return array; 2077 return array;
2078 } 2078 }
2079 2079
2080 2080
2081 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) { 2081 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) {
2082 NoHandleAllocation ha(isolate); 2082 SealHandleScope shs(isolate);
2083 AssertNoAllocation no_alloc; 2083 DisallowHeapAllocation no_allocation;
2084 ASSERT(args.length() == 5); 2084 ASSERT(args.length() == 5);
2085 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); 2085 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0);
2086 CONVERT_ARG_CHECKED(String, source, 1); 2086 CONVERT_ARG_CHECKED(String, source, 1);
2087 // If source is the empty string we set it to "(?:)" instead as 2087 // If source is the empty string we set it to "(?:)" instead as
2088 // suggested by ECMA-262, 5th, section 15.10.4.1. 2088 // suggested by ECMA-262, 5th, section 15.10.4.1.
2089 if (source->length() == 0) source = isolate->heap()->query_colon_string(); 2089 if (source->length() == 0) source = isolate->heap()->query_colon_string();
2090 2090
2091 Object* global = args[2]; 2091 Object* global = args[2];
2092 if (!global->IsTrue()) global = isolate->heap()->false_value(); 2092 if (!global->IsTrue()) global = isolate->heap()->false_value();
2093 2093
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
2192 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift); 2192 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift);
2193 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice); 2193 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice);
2194 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice); 2194 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice);
2195 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat); 2195 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat);
2196 2196
2197 return *holder; 2197 return *holder;
2198 } 2198 }
2199 2199
2200 2200
2201 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsClassicModeFunction) { 2201 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsClassicModeFunction) {
2202 NoHandleAllocation ha(isolate); 2202 SealHandleScope shs(isolate);
2203 ASSERT(args.length() == 1); 2203 ASSERT(args.length() == 1);
2204 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); 2204 CONVERT_ARG_CHECKED(JSReceiver, callable, 0);
2205 if (!callable->IsJSFunction()) { 2205 if (!callable->IsJSFunction()) {
2206 HandleScope scope(isolate); 2206 HandleScope scope(isolate);
2207 bool threw = false; 2207 bool threw = false;
2208 Handle<Object> delegate = 2208 Handle<Object> delegate =
2209 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw); 2209 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw);
2210 if (threw) return Failure::Exception(); 2210 if (threw) return Failure::Exception();
2211 callable = JSFunction::cast(*delegate); 2211 callable = JSFunction::cast(*delegate);
2212 } 2212 }
2213 JSFunction* function = JSFunction::cast(callable); 2213 JSFunction* function = JSFunction::cast(callable);
2214 SharedFunctionInfo* shared = function->shared(); 2214 SharedFunctionInfo* shared = function->shared();
2215 return isolate->heap()->ToBoolean(shared->is_classic_mode()); 2215 return isolate->heap()->ToBoolean(shared->is_classic_mode());
2216 } 2216 }
2217 2217
2218 2218
2219 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { 2219 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) {
2220 NoHandleAllocation ha(isolate); 2220 SealHandleScope shs(isolate);
2221 ASSERT(args.length() == 1); 2221 ASSERT(args.length() == 1);
2222 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); 2222 CONVERT_ARG_CHECKED(JSReceiver, callable, 0);
2223 2223
2224 if (!callable->IsJSFunction()) { 2224 if (!callable->IsJSFunction()) {
2225 HandleScope scope(isolate); 2225 HandleScope scope(isolate);
2226 bool threw = false; 2226 bool threw = false;
2227 Handle<Object> delegate = 2227 Handle<Object> delegate =
2228 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw); 2228 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw);
2229 if (threw) return Failure::Exception(); 2229 if (threw) return Failure::Exception();
2230 callable = JSFunction::cast(*delegate); 2230 callable = JSFunction::cast(*delegate);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2268 if (has_pending_exception) { 2268 if (has_pending_exception) {
2269 ASSERT(isolate->has_pending_exception()); 2269 ASSERT(isolate->has_pending_exception());
2270 return Failure::Exception(); 2270 return Failure::Exception();
2271 } 2271 }
2272 literals->set(index, *regexp); 2272 literals->set(index, *regexp);
2273 return *regexp; 2273 return *regexp;
2274 } 2274 }
2275 2275
2276 2276
2277 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) { 2277 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) {
2278 NoHandleAllocation ha(isolate); 2278 SealHandleScope shs(isolate);
2279 ASSERT(args.length() == 1); 2279 ASSERT(args.length() == 1);
2280 2280
2281 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2281 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2282 return f->shared()->name(); 2282 return f->shared()->name();
2283 } 2283 }
2284 2284
2285 2285
2286 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetName) { 2286 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetName) {
2287 NoHandleAllocation ha(isolate); 2287 SealHandleScope shs(isolate);
2288 ASSERT(args.length() == 2); 2288 ASSERT(args.length() == 2);
2289 2289
2290 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2290 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2291 CONVERT_ARG_CHECKED(String, name, 1); 2291 CONVERT_ARG_CHECKED(String, name, 1);
2292 f->shared()->set_name(name); 2292 f->shared()->set_name(name);
2293 return isolate->heap()->undefined_value(); 2293 return isolate->heap()->undefined_value();
2294 } 2294 }
2295 2295
2296 2296
2297 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionNameShouldPrintAsAnonymous) { 2297 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionNameShouldPrintAsAnonymous) {
2298 NoHandleAllocation ha(isolate); 2298 SealHandleScope shs(isolate);
2299 ASSERT(args.length() == 1); 2299 ASSERT(args.length() == 1);
2300 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2300 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2301 return isolate->heap()->ToBoolean( 2301 return isolate->heap()->ToBoolean(
2302 f->shared()->name_should_print_as_anonymous()); 2302 f->shared()->name_should_print_as_anonymous());
2303 } 2303 }
2304 2304
2305 2305
2306 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionMarkNameShouldPrintAsAnonymous) { 2306 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionMarkNameShouldPrintAsAnonymous) {
2307 NoHandleAllocation ha(isolate); 2307 SealHandleScope shs(isolate);
2308 ASSERT(args.length() == 1); 2308 ASSERT(args.length() == 1);
2309 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2309 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2310 f->shared()->set_name_should_print_as_anonymous(true); 2310 f->shared()->set_name_should_print_as_anonymous(true);
2311 return isolate->heap()->undefined_value(); 2311 return isolate->heap()->undefined_value();
2312 } 2312 }
2313 2313
2314 2314
2315 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsGenerator) { 2315 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsGenerator) {
2316 NoHandleAllocation ha(isolate); 2316 SealHandleScope shs(isolate);
2317 ASSERT(args.length() == 1); 2317 ASSERT(args.length() == 1);
2318 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2318 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2319 return isolate->heap()->ToBoolean(f->shared()->is_generator()); 2319 return isolate->heap()->ToBoolean(f->shared()->is_generator());
2320 } 2320 }
2321 2321
2322 2322
2323 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) { 2323 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) {
2324 NoHandleAllocation ha(isolate); 2324 SealHandleScope shs(isolate);
2325 ASSERT(args.length() == 1); 2325 ASSERT(args.length() == 1);
2326 2326
2327 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2327 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2328 f->RemovePrototype(); 2328 f->RemovePrototype();
2329 2329
2330 return isolate->heap()->undefined_value(); 2330 return isolate->heap()->undefined_value();
2331 } 2331 }
2332 2332
2333 2333
2334 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) { 2334 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) {
(...skipping 12 matching lines...) Expand all
2347 HandleScope scope(isolate); 2347 HandleScope scope(isolate);
2348 ASSERT(args.length() == 1); 2348 ASSERT(args.length() == 1);
2349 2349
2350 CONVERT_ARG_HANDLE_CHECKED(JSFunction, f, 0); 2350 CONVERT_ARG_HANDLE_CHECKED(JSFunction, f, 0);
2351 Handle<SharedFunctionInfo> shared(f->shared()); 2351 Handle<SharedFunctionInfo> shared(f->shared());
2352 return *shared->GetSourceCode(); 2352 return *shared->GetSourceCode();
2353 } 2353 }
2354 2354
2355 2355
2356 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScriptSourcePosition) { 2356 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScriptSourcePosition) {
2357 NoHandleAllocation ha(isolate); 2357 SealHandleScope shs(isolate);
2358 ASSERT(args.length() == 1); 2358 ASSERT(args.length() == 1);
2359 2359
2360 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2360 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2361 int pos = fun->shared()->start_position(); 2361 int pos = fun->shared()->start_position();
2362 return Smi::FromInt(pos); 2362 return Smi::FromInt(pos);
2363 } 2363 }
2364 2364
2365 2365
2366 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetPositionForOffset) { 2366 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetPositionForOffset) {
2367 NoHandleAllocation ha(isolate); 2367 SealHandleScope shs(isolate);
2368 ASSERT(args.length() == 2); 2368 ASSERT(args.length() == 2);
2369 2369
2370 CONVERT_ARG_CHECKED(Code, code, 0); 2370 CONVERT_ARG_CHECKED(Code, code, 0);
2371 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]); 2371 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]);
2372 2372
2373 RUNTIME_ASSERT(0 <= offset && offset < code->Size()); 2373 RUNTIME_ASSERT(0 <= offset && offset < code->Size());
2374 2374
2375 Address pc = code->address() + offset; 2375 Address pc = code->address() + offset;
2376 return Smi::FromInt(code->SourcePosition(pc)); 2376 return Smi::FromInt(code->SourcePosition(pc));
2377 } 2377 }
2378 2378
2379 2379
2380 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetInstanceClassName) { 2380 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetInstanceClassName) {
2381 NoHandleAllocation ha(isolate); 2381 SealHandleScope shs(isolate);
2382 ASSERT(args.length() == 2); 2382 ASSERT(args.length() == 2);
2383 2383
2384 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2384 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2385 CONVERT_ARG_CHECKED(String, name, 1); 2385 CONVERT_ARG_CHECKED(String, name, 1);
2386 fun->SetInstanceClassName(name); 2386 fun->SetInstanceClassName(name);
2387 return isolate->heap()->undefined_value(); 2387 return isolate->heap()->undefined_value();
2388 } 2388 }
2389 2389
2390 2390
2391 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetLength) { 2391 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetLength) {
2392 NoHandleAllocation ha(isolate); 2392 SealHandleScope shs(isolate);
2393 ASSERT(args.length() == 2); 2393 ASSERT(args.length() == 2);
2394 2394
2395 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2395 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2396 CONVERT_SMI_ARG_CHECKED(length, 1); 2396 CONVERT_SMI_ARG_CHECKED(length, 1);
2397 fun->shared()->set_length(length); 2397 fun->shared()->set_length(length);
2398 return isolate->heap()->undefined_value(); 2398 return isolate->heap()->undefined_value();
2399 } 2399 }
2400 2400
2401 2401
2402 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetPrototype) { 2402 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetPrototype) {
2403 NoHandleAllocation ha(isolate); 2403 SealHandleScope shs(isolate);
2404 ASSERT(args.length() == 2); 2404 ASSERT(args.length() == 2);
2405 2405
2406 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2406 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2407 ASSERT(fun->should_have_prototype()); 2407 ASSERT(fun->should_have_prototype());
2408 Object* obj; 2408 Object* obj;
2409 { MaybeObject* maybe_obj = 2409 { MaybeObject* maybe_obj =
2410 Accessors::FunctionSetPrototype(fun, args[1], NULL); 2410 Accessors::FunctionSetPrototype(fun, args[1], NULL);
2411 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 2411 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
2412 } 2412 }
2413 return args[0]; // return TOS 2413 return args[0]; // return TOS
2414 } 2414 }
2415 2415
2416 2416
2417 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) { 2417 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) {
2418 NoHandleAllocation ha(isolate); 2418 SealHandleScope shs(isolate);
2419 RUNTIME_ASSERT(args.length() == 1); 2419 RUNTIME_ASSERT(args.length() == 1);
2420 CONVERT_ARG_CHECKED(JSFunction, function, 0); 2420 CONVERT_ARG_CHECKED(JSFunction, function, 0);
2421 2421
2422 String* name = isolate->heap()->prototype_string(); 2422 String* name = isolate->heap()->prototype_string();
2423 2423
2424 if (function->HasFastProperties()) { 2424 if (function->HasFastProperties()) {
2425 // Construct a new field descriptor with updated attributes. 2425 // Construct a new field descriptor with updated attributes.
2426 DescriptorArray* instance_desc = function->map()->instance_descriptors(); 2426 DescriptorArray* instance_desc = function->map()->instance_descriptors();
2427 2427
2428 int index = instance_desc->SearchWithCache(name, function->map()); 2428 int index = instance_desc->SearchWithCache(name, function->map());
(...skipping 21 matching lines...) Expand all
2450 static_cast<PropertyAttributes>(details.attributes() | READ_ONLY), 2450 static_cast<PropertyAttributes>(details.attributes() | READ_ONLY),
2451 details.type(), 2451 details.type(),
2452 details.dictionary_index()); 2452 details.dictionary_index());
2453 function->property_dictionary()->DetailsAtPut(entry, new_details); 2453 function->property_dictionary()->DetailsAtPut(entry, new_details);
2454 } 2454 }
2455 return function; 2455 return function;
2456 } 2456 }
2457 2457
2458 2458
2459 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsAPIFunction) { 2459 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsAPIFunction) {
2460 NoHandleAllocation ha(isolate); 2460 SealHandleScope shs(isolate);
2461 ASSERT(args.length() == 1); 2461 ASSERT(args.length() == 1);
2462 2462
2463 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2463 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2464 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction()); 2464 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction());
2465 } 2465 }
2466 2466
2467 2467
2468 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsBuiltin) { 2468 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsBuiltin) {
2469 NoHandleAllocation ha(isolate); 2469 SealHandleScope shs(isolate);
2470 ASSERT(args.length() == 1); 2470 ASSERT(args.length() == 1);
2471 2471
2472 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2472 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2473 return isolate->heap()->ToBoolean(f->IsBuiltin()); 2473 return isolate->heap()->ToBoolean(f->IsBuiltin());
2474 } 2474 }
2475 2475
2476 2476
2477 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetCode) { 2477 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetCode) {
2478 HandleScope scope(isolate); 2478 HandleScope scope(isolate);
2479 ASSERT(args.length() == 2); 2479 ASSERT(args.length() == 2);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
2549 ASSERT(args.length() == 2); 2549 ASSERT(args.length() == 2);
2550 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 2550 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
2551 CONVERT_SMI_ARG_CHECKED(num, 1); 2551 CONVERT_SMI_ARG_CHECKED(num, 1);
2552 RUNTIME_ASSERT(num >= 0); 2552 RUNTIME_ASSERT(num >= 0);
2553 SetExpectedNofProperties(function, num); 2553 SetExpectedNofProperties(function, num);
2554 return isolate->heap()->undefined_value(); 2554 return isolate->heap()->undefined_value();
2555 } 2555 }
2556 2556
2557 2557
2558 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSGeneratorObject) { 2558 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSGeneratorObject) {
2559 NoHandleAllocation ha(isolate); 2559 SealHandleScope shs(isolate);
2560 ASSERT(args.length() == 0); 2560 ASSERT(args.length() == 0);
2561 2561
2562 JavaScriptFrameIterator it(isolate); 2562 JavaScriptFrameIterator it(isolate);
2563 JavaScriptFrame* frame = it.frame(); 2563 JavaScriptFrame* frame = it.frame();
2564 JSFunction* function = JSFunction::cast(frame->function()); 2564 JSFunction* function = JSFunction::cast(frame->function());
2565 RUNTIME_ASSERT(function->shared()->is_generator()); 2565 RUNTIME_ASSERT(function->shared()->is_generator());
2566 2566
2567 JSGeneratorObject* generator; 2567 JSGeneratorObject* generator;
2568 if (frame->IsConstructor()) { 2568 if (frame->IsConstructor()) {
2569 generator = JSGeneratorObject::cast(frame->receiver()); 2569 generator = JSGeneratorObject::cast(frame->receiver());
2570 } else { 2570 } else {
2571 MaybeObject* maybe_generator = 2571 MaybeObject* maybe_generator =
2572 isolate->heap()->AllocateJSGeneratorObject(function); 2572 isolate->heap()->AllocateJSGeneratorObject(function);
2573 if (!maybe_generator->To(&generator)) return maybe_generator; 2573 if (!maybe_generator->To(&generator)) return maybe_generator;
2574 } 2574 }
2575 generator->set_function(function); 2575 generator->set_function(function);
2576 generator->set_context(Context::cast(frame->context())); 2576 generator->set_context(Context::cast(frame->context()));
2577 generator->set_receiver(frame->receiver()); 2577 generator->set_receiver(frame->receiver());
2578 generator->set_continuation(0); 2578 generator->set_continuation(0);
2579 generator->set_operand_stack(isolate->heap()->empty_fixed_array()); 2579 generator->set_operand_stack(isolate->heap()->empty_fixed_array());
2580 generator->set_stack_handler_index(-1); 2580 generator->set_stack_handler_index(-1);
2581 2581
2582 return generator; 2582 return generator;
2583 } 2583 }
2584 2584
2585 2585
2586 RUNTIME_FUNCTION(MaybeObject*, Runtime_SuspendJSGeneratorObject) { 2586 RUNTIME_FUNCTION(MaybeObject*, Runtime_SuspendJSGeneratorObject) {
2587 NoHandleAllocation ha(isolate); 2587 SealHandleScope shs(isolate);
2588 ASSERT(args.length() == 1); 2588 ASSERT(args.length() == 1);
2589 CONVERT_ARG_CHECKED(JSGeneratorObject, generator_object, 0); 2589 CONVERT_ARG_CHECKED(JSGeneratorObject, generator_object, 0);
2590 2590
2591 JavaScriptFrameIterator stack_iterator(isolate); 2591 JavaScriptFrameIterator stack_iterator(isolate);
2592 JavaScriptFrame* frame = stack_iterator.frame(); 2592 JavaScriptFrame* frame = stack_iterator.frame();
2593 JSFunction* function = JSFunction::cast(frame->function()); 2593 JSFunction* function = JSFunction::cast(frame->function());
2594 RUNTIME_ASSERT(function->shared()->is_generator()); 2594 RUNTIME_ASSERT(function->shared()->is_generator());
2595 ASSERT_EQ(function, generator_object->function()); 2595 ASSERT_EQ(function, generator_object->function());
2596 2596
2597 // We expect there to be at least two values on the operand stack: the return 2597 // We expect there to be at least two values on the operand stack: the return
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2636 2636
2637 2637
2638 // Note that this function is the slow path for resuming generators. It is only 2638 // Note that this function is the slow path for resuming generators. It is only
2639 // called if the suspended activation had operands on the stack, stack handlers 2639 // called if the suspended activation had operands on the stack, stack handlers
2640 // needing rewinding, or if the resume should throw an exception. The fast path 2640 // needing rewinding, or if the resume should throw an exception. The fast path
2641 // is handled directly in FullCodeGenerator::EmitGeneratorResume(), which is 2641 // is handled directly in FullCodeGenerator::EmitGeneratorResume(), which is
2642 // inlined into GeneratorNext, GeneratorSend, and GeneratorThrow. 2642 // inlined into GeneratorNext, GeneratorSend, and GeneratorThrow.
2643 // EmitGeneratorResumeResume is called in any case, as it needs to reconstruct 2643 // EmitGeneratorResumeResume is called in any case, as it needs to reconstruct
2644 // the stack frame and make space for arguments and operands. 2644 // the stack frame and make space for arguments and operands.
2645 RUNTIME_FUNCTION(MaybeObject*, Runtime_ResumeJSGeneratorObject) { 2645 RUNTIME_FUNCTION(MaybeObject*, Runtime_ResumeJSGeneratorObject) {
2646 NoHandleAllocation ha(isolate); 2646 SealHandleScope shs(isolate);
2647 ASSERT(args.length() == 3); 2647 ASSERT(args.length() == 3);
2648 CONVERT_ARG_CHECKED(JSGeneratorObject, generator_object, 0); 2648 CONVERT_ARG_CHECKED(JSGeneratorObject, generator_object, 0);
2649 CONVERT_ARG_CHECKED(Object, value, 1); 2649 CONVERT_ARG_CHECKED(Object, value, 1);
2650 CONVERT_SMI_ARG_CHECKED(resume_mode_int, 2); 2650 CONVERT_SMI_ARG_CHECKED(resume_mode_int, 2);
2651 JavaScriptFrameIterator stack_iterator(isolate); 2651 JavaScriptFrameIterator stack_iterator(isolate);
2652 JavaScriptFrame* frame = stack_iterator.frame(); 2652 JavaScriptFrame* frame = stack_iterator.frame();
2653 2653
2654 ASSERT_EQ(frame->function(), generator_object->function()); 2654 ASSERT_EQ(frame->function(), generator_object->function());
2655 2655
2656 STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting <= 0); 2656 STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting <= 0);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2692 int continuation = generator->continuation(); 2692 int continuation = generator->continuation();
2693 const char* message = continuation == JSGeneratorObject::kGeneratorClosed ? 2693 const char* message = continuation == JSGeneratorObject::kGeneratorClosed ?
2694 "generator_finished" : "generator_running"; 2694 "generator_finished" : "generator_running";
2695 Vector< Handle<Object> > argv = HandleVector<Object>(NULL, 0); 2695 Vector< Handle<Object> > argv = HandleVector<Object>(NULL, 0);
2696 Handle<Object> error = isolate->factory()->NewError(message, argv); 2696 Handle<Object> error = isolate->factory()->NewError(message, argv);
2697 return isolate->Throw(*error); 2697 return isolate->Throw(*error);
2698 } 2698 }
2699 2699
2700 2700
2701 RUNTIME_FUNCTION(MaybeObject*, Runtime_ObjectFreeze) { 2701 RUNTIME_FUNCTION(MaybeObject*, Runtime_ObjectFreeze) {
2702 NoHandleAllocation ha(isolate); 2702 SealHandleScope shs(isolate);
2703 ASSERT(args.length() == 1); 2703 ASSERT(args.length() == 1);
2704 CONVERT_ARG_CHECKED(JSObject, object, 0); 2704 CONVERT_ARG_CHECKED(JSObject, object, 0);
2705 return object->Freeze(isolate); 2705 return object->Freeze(isolate);
2706 } 2706 }
2707 2707
2708 2708
2709 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate, 2709 MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate,
2710 Object* char_code) { 2710 Object* char_code) {
2711 if (char_code->IsNumber()) { 2711 if (char_code->IsNumber()) {
2712 return isolate->heap()->LookupSingleCharacterStringFromCode( 2712 return isolate->heap()->LookupSingleCharacterStringFromCode(
2713 NumberToUint32(char_code) & 0xffff); 2713 NumberToUint32(char_code) & 0xffff);
2714 } 2714 }
2715 return isolate->heap()->empty_string(); 2715 return isolate->heap()->empty_string();
2716 } 2716 }
2717 2717
2718 2718
2719 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) { 2719 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) {
2720 NoHandleAllocation ha(isolate); 2720 SealHandleScope shs(isolate);
2721 ASSERT(args.length() == 2); 2721 ASSERT(args.length() == 2);
2722 2722
2723 CONVERT_ARG_CHECKED(String, subject, 0); 2723 CONVERT_ARG_CHECKED(String, subject, 0);
2724 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]); 2724 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]);
2725 2725
2726 // Flatten the string. If someone wants to get a char at an index 2726 // Flatten the string. If someone wants to get a char at an index
2727 // in a cons string, it is likely that more indices will be 2727 // in a cons string, it is likely that more indices will be
2728 // accessed. 2728 // accessed.
2729 Object* flat; 2729 Object* flat;
2730 { MaybeObject* maybe_flat = subject->TryFlatten(); 2730 { MaybeObject* maybe_flat = subject->TryFlatten();
2731 if (!maybe_flat->ToObject(&flat)) return maybe_flat; 2731 if (!maybe_flat->ToObject(&flat)) return maybe_flat;
2732 } 2732 }
2733 subject = String::cast(flat); 2733 subject = String::cast(flat);
2734 2734
2735 if (i >= static_cast<uint32_t>(subject->length())) { 2735 if (i >= static_cast<uint32_t>(subject->length())) {
2736 return isolate->heap()->nan_value(); 2736 return isolate->heap()->nan_value();
2737 } 2737 }
2738 2738
2739 return Smi::FromInt(subject->Get(i)); 2739 return Smi::FromInt(subject->Get(i));
2740 } 2740 }
2741 2741
2742 2742
2743 RUNTIME_FUNCTION(MaybeObject*, Runtime_CharFromCode) { 2743 RUNTIME_FUNCTION(MaybeObject*, Runtime_CharFromCode) {
2744 NoHandleAllocation ha(isolate); 2744 SealHandleScope shs(isolate);
2745 ASSERT(args.length() == 1); 2745 ASSERT(args.length() == 1);
2746 return CharFromCode(isolate, args[0]); 2746 return CharFromCode(isolate, args[0]);
2747 } 2747 }
2748 2748
2749 2749
2750 class FixedArrayBuilder { 2750 class FixedArrayBuilder {
2751 public: 2751 public:
2752 explicit FixedArrayBuilder(Isolate* isolate, int initial_capacity) 2752 explicit FixedArrayBuilder(Isolate* isolate, int initial_capacity)
2753 : array_(isolate->factory()->NewFixedArrayWithHoles(initial_capacity)), 2753 : array_(isolate->factory()->NewFixedArrayWithHoles(initial_capacity)),
2754 length_(0), 2754 length_(0),
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
2904 2904
2905 2905
2906 Handle<String> ToString() { 2906 Handle<String> ToString() {
2907 if (array_builder_.length() == 0) { 2907 if (array_builder_.length() == 0) {
2908 return heap_->isolate()->factory()->empty_string(); 2908 return heap_->isolate()->factory()->empty_string();
2909 } 2909 }
2910 2910
2911 Handle<String> joined_string; 2911 Handle<String> joined_string;
2912 if (is_ascii_) { 2912 if (is_ascii_) {
2913 Handle<SeqOneByteString> seq = NewRawOneByteString(character_count_); 2913 Handle<SeqOneByteString> seq = NewRawOneByteString(character_count_);
2914 AssertNoAllocation no_alloc; 2914 DisallowHeapAllocation no_gc;
2915 uint8_t* char_buffer = seq->GetChars(); 2915 uint8_t* char_buffer = seq->GetChars();
2916 StringBuilderConcatHelper(*subject_, 2916 StringBuilderConcatHelper(*subject_,
2917 char_buffer, 2917 char_buffer,
2918 *array_builder_.array(), 2918 *array_builder_.array(),
2919 array_builder_.length()); 2919 array_builder_.length());
2920 joined_string = Handle<String>::cast(seq); 2920 joined_string = Handle<String>::cast(seq);
2921 } else { 2921 } else {
2922 // Non-ASCII. 2922 // Non-ASCII.
2923 Handle<SeqTwoByteString> seq = NewRawTwoByteString(character_count_); 2923 Handle<SeqTwoByteString> seq = NewRawTwoByteString(character_count_);
2924 AssertNoAllocation no_alloc; 2924 DisallowHeapAllocation no_gc;
2925 uc16* char_buffer = seq->GetChars(); 2925 uc16* char_buffer = seq->GetChars();
2926 StringBuilderConcatHelper(*subject_, 2926 StringBuilderConcatHelper(*subject_,
2927 char_buffer, 2927 char_buffer,
2928 *array_builder_.array(), 2928 *array_builder_.array(),
2929 array_builder_.length()); 2929 array_builder_.length());
2930 joined_string = Handle<String>::cast(seq); 2930 joined_string = Handle<String>::cast(seq);
2931 } 2931 }
2932 return joined_string; 2932 return joined_string;
2933 } 2933 }
2934 2934
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
3156 ZoneList<ReplacementPart> parts_; 3156 ZoneList<ReplacementPart> parts_;
3157 ZoneList<Handle<String> > replacement_substrings_; 3157 ZoneList<Handle<String> > replacement_substrings_;
3158 Zone* zone_; 3158 Zone* zone_;
3159 }; 3159 };
3160 3160
3161 3161
3162 bool CompiledReplacement::Compile(Handle<String> replacement, 3162 bool CompiledReplacement::Compile(Handle<String> replacement,
3163 int capture_count, 3163 int capture_count,
3164 int subject_length) { 3164 int subject_length) {
3165 { 3165 {
3166 AssertNoAllocation no_alloc; 3166 DisallowHeapAllocation no_gc;
3167 String::FlatContent content = replacement->GetFlatContent(); 3167 String::FlatContent content = replacement->GetFlatContent();
3168 ASSERT(content.IsFlat()); 3168 ASSERT(content.IsFlat());
3169 bool simple = false; 3169 bool simple = false;
3170 if (content.IsAscii()) { 3170 if (content.IsAscii()) {
3171 simple = ParseReplacementPattern(&parts_, 3171 simple = ParseReplacementPattern(&parts_,
3172 content.ToOneByteVector(), 3172 content.ToOneByteVector(),
3173 capture_count, 3173 capture_count,
3174 subject_length, 3174 subject_length,
3175 zone()); 3175 zone());
3176 } else { 3176 } else {
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
3307 } 3307 }
3308 3308
3309 3309
3310 void FindStringIndicesDispatch(Isolate* isolate, 3310 void FindStringIndicesDispatch(Isolate* isolate,
3311 String* subject, 3311 String* subject,
3312 String* pattern, 3312 String* pattern,
3313 ZoneList<int>* indices, 3313 ZoneList<int>* indices,
3314 unsigned int limit, 3314 unsigned int limit,
3315 Zone* zone) { 3315 Zone* zone) {
3316 { 3316 {
3317 AssertNoAllocation no_gc; 3317 DisallowHeapAllocation no_gc;
3318 String::FlatContent subject_content = subject->GetFlatContent(); 3318 String::FlatContent subject_content = subject->GetFlatContent();
3319 String::FlatContent pattern_content = pattern->GetFlatContent(); 3319 String::FlatContent pattern_content = pattern->GetFlatContent();
3320 ASSERT(subject_content.IsFlat()); 3320 ASSERT(subject_content.IsFlat());
3321 ASSERT(pattern_content.IsFlat()); 3321 ASSERT(pattern_content.IsFlat());
3322 if (subject_content.IsAscii()) { 3322 if (subject_content.IsAscii()) {
3323 Vector<const uint8_t> subject_vector = subject_content.ToOneByteVector(); 3323 Vector<const uint8_t> subject_vector = subject_content.ToOneByteVector();
3324 if (pattern_content.IsAscii()) { 3324 if (pattern_content.IsAscii()) {
3325 Vector<const uint8_t> pattern_vector = 3325 Vector<const uint8_t> pattern_vector =
3326 pattern_content.ToOneByteVector(); 3326 pattern_content.ToOneByteVector();
3327 if (pattern_vector.length() == 1) { 3327 if (pattern_vector.length() == 1) {
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
3776 3776
3777 int pattern_length = pat->length(); 3777 int pattern_length = pat->length();
3778 if (pattern_length == 0) return start_index; 3778 if (pattern_length == 0) return start_index;
3779 3779
3780 int subject_length = sub->length(); 3780 int subject_length = sub->length();
3781 if (start_index + pattern_length > subject_length) return -1; 3781 if (start_index + pattern_length > subject_length) return -1;
3782 3782
3783 if (!sub->IsFlat()) FlattenString(sub); 3783 if (!sub->IsFlat()) FlattenString(sub);
3784 if (!pat->IsFlat()) FlattenString(pat); 3784 if (!pat->IsFlat()) FlattenString(pat);
3785 3785
3786 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid 3786 DisallowHeapAllocation no_gc; // ensure vectors stay valid
3787 // Extract flattened substrings of cons strings before determining asciiness. 3787 // Extract flattened substrings of cons strings before determining asciiness.
3788 String::FlatContent seq_sub = sub->GetFlatContent(); 3788 String::FlatContent seq_sub = sub->GetFlatContent();
3789 String::FlatContent seq_pat = pat->GetFlatContent(); 3789 String::FlatContent seq_pat = pat->GetFlatContent();
3790 3790
3791 // dispatch on type of strings 3791 // dispatch on type of strings
3792 if (seq_pat.IsAscii()) { 3792 if (seq_pat.IsAscii()) {
3793 Vector<const uint8_t> pat_vector = seq_pat.ToOneByteVector(); 3793 Vector<const uint8_t> pat_vector = seq_pat.ToOneByteVector();
3794 if (seq_sub.IsAscii()) { 3794 if (seq_sub.IsAscii()) {
3795 return SearchString(isolate, 3795 return SearchString(isolate,
3796 seq_sub.ToOneByteVector(), 3796 seq_sub.ToOneByteVector(),
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
3887 } 3887 }
3888 3888
3889 if (pat_length == 0) { 3889 if (pat_length == 0) {
3890 return Smi::FromInt(start_index); 3890 return Smi::FromInt(start_index);
3891 } 3891 }
3892 3892
3893 if (!sub->IsFlat()) FlattenString(sub); 3893 if (!sub->IsFlat()) FlattenString(sub);
3894 if (!pat->IsFlat()) FlattenString(pat); 3894 if (!pat->IsFlat()) FlattenString(pat);
3895 3895
3896 int position = -1; 3896 int position = -1;
3897 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid 3897 DisallowHeapAllocation no_gc; // ensure vectors stay valid
3898 3898
3899 String::FlatContent sub_content = sub->GetFlatContent(); 3899 String::FlatContent sub_content = sub->GetFlatContent();
3900 String::FlatContent pat_content = pat->GetFlatContent(); 3900 String::FlatContent pat_content = pat->GetFlatContent();
3901 3901
3902 if (pat_content.IsAscii()) { 3902 if (pat_content.IsAscii()) {
3903 Vector<const uint8_t> pat_vector = pat_content.ToOneByteVector(); 3903 Vector<const uint8_t> pat_vector = pat_content.ToOneByteVector();
3904 if (sub_content.IsAscii()) { 3904 if (sub_content.IsAscii()) {
3905 position = StringMatchBackwards(sub_content.ToOneByteVector(), 3905 position = StringMatchBackwards(sub_content.ToOneByteVector(),
3906 pat_vector, 3906 pat_vector,
3907 start_index); 3907 start_index);
(...skipping 13 matching lines...) Expand all
3921 pat_vector, 3921 pat_vector,
3922 start_index); 3922 start_index);
3923 } 3923 }
3924 } 3924 }
3925 3925
3926 return Smi::FromInt(position); 3926 return Smi::FromInt(position);
3927 } 3927 }
3928 3928
3929 3929
3930 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) { 3930 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) {
3931 NoHandleAllocation ha(isolate); 3931 SealHandleScope shs(isolate);
3932 ASSERT(args.length() == 2); 3932 ASSERT(args.length() == 2);
3933 3933
3934 CONVERT_ARG_CHECKED(String, str1, 0); 3934 CONVERT_ARG_CHECKED(String, str1, 0);
3935 CONVERT_ARG_CHECKED(String, str2, 1); 3935 CONVERT_ARG_CHECKED(String, str2, 1);
3936 3936
3937 if (str1 == str2) return Smi::FromInt(0); // Equal. 3937 if (str1 == str2) return Smi::FromInt(0); // Equal.
3938 int str1_length = str1->length(); 3938 int str1_length = str1->length();
3939 int str2_length = str2->length(); 3939 int str2_length = str2->length();
3940 3940
3941 // Decide trivial cases without flattening. 3941 // Decide trivial cases without flattening.
(...skipping 27 matching lines...) Expand all
3969 uint16_t char1 = stream1.GetNext(); 3969 uint16_t char1 = stream1.GetNext();
3970 uint16_t char2 = stream2.GetNext(); 3970 uint16_t char2 = stream2.GetNext();
3971 if (char1 != char2) return Smi::FromInt(char1 - char2); 3971 if (char1 != char2) return Smi::FromInt(char1 - char2);
3972 } 3972 }
3973 3973
3974 return Smi::FromInt(str1_length - str2_length); 3974 return Smi::FromInt(str1_length - str2_length);
3975 } 3975 }
3976 3976
3977 3977
3978 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) { 3978 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) {
3979 NoHandleAllocation ha(isolate); 3979 SealHandleScope shs(isolate);
3980 ASSERT(args.length() == 3); 3980 ASSERT(args.length() == 3);
3981 3981
3982 CONVERT_ARG_CHECKED(String, value, 0); 3982 CONVERT_ARG_CHECKED(String, value, 0);
3983 int start, end; 3983 int start, end;
3984 // We have a fast integer-only case here to avoid a conversion to double in 3984 // We have a fast integer-only case here to avoid a conversion to double in
3985 // the common case where from and to are Smis. 3985 // the common case where from and to are Smis.
3986 if (args[1]->IsSmi() && args[2]->IsSmi()) { 3986 if (args[1]->IsSmi() && args[2]->IsSmi()) {
3987 CONVERT_SMI_ARG_CHECKED(from_number, 1); 3987 CONVERT_SMI_ARG_CHECKED(from_number, 1);
3988 CONVERT_SMI_ARG_CHECKED(to_number, 2); 3988 CONVERT_SMI_ARG_CHECKED(to_number, 2);
3989 start = from_number; 3989 start = from_number;
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
4231 return SearchRegExpMultiple<false>( 4231 return SearchRegExpMultiple<false>(
4232 isolate, subject, regexp, last_match_info, result_array); 4232 isolate, subject, regexp, last_match_info, result_array);
4233 } else { 4233 } else {
4234 return SearchRegExpMultiple<true>( 4234 return SearchRegExpMultiple<true>(
4235 isolate, subject, regexp, last_match_info, result_array); 4235 isolate, subject, regexp, last_match_info, result_array);
4236 } 4236 }
4237 } 4237 }
4238 4238
4239 4239
4240 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToRadixString) { 4240 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToRadixString) {
4241 NoHandleAllocation ha(isolate); 4241 SealHandleScope shs(isolate);
4242 ASSERT(args.length() == 2); 4242 ASSERT(args.length() == 2);
4243 CONVERT_SMI_ARG_CHECKED(radix, 1); 4243 CONVERT_SMI_ARG_CHECKED(radix, 1);
4244 RUNTIME_ASSERT(2 <= radix && radix <= 36); 4244 RUNTIME_ASSERT(2 <= radix && radix <= 36);
4245 4245
4246 // Fast case where the result is a one character string. 4246 // Fast case where the result is a one character string.
4247 if (args[0]->IsSmi()) { 4247 if (args[0]->IsSmi()) {
4248 int value = args.smi_at(0); 4248 int value = args.smi_at(0);
4249 if (value >= 0 && value < radix) { 4249 if (value >= 0 && value < radix) {
4250 // Character array used for conversion. 4250 // Character array used for conversion.
4251 static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz"; 4251 static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz";
(...skipping 15 matching lines...) Expand all
4267 } 4267 }
4268 char* str = DoubleToRadixCString(value, radix); 4268 char* str = DoubleToRadixCString(value, radix);
4269 MaybeObject* result = 4269 MaybeObject* result =
4270 isolate->heap()->AllocateStringFromOneByte(CStrVector(str)); 4270 isolate->heap()->AllocateStringFromOneByte(CStrVector(str));
4271 DeleteArray(str); 4271 DeleteArray(str);
4272 return result; 4272 return result;
4273 } 4273 }
4274 4274
4275 4275
4276 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToFixed) { 4276 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToFixed) {
4277 NoHandleAllocation ha(isolate); 4277 SealHandleScope shs(isolate);
4278 ASSERT(args.length() == 2); 4278 ASSERT(args.length() == 2);
4279 4279
4280 CONVERT_DOUBLE_ARG_CHECKED(value, 0); 4280 CONVERT_DOUBLE_ARG_CHECKED(value, 0);
4281 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1); 4281 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
4282 int f = FastD2IChecked(f_number); 4282 int f = FastD2IChecked(f_number);
4283 RUNTIME_ASSERT(f >= 0); 4283 RUNTIME_ASSERT(f >= 0);
4284 char* str = DoubleToFixedCString(value, f); 4284 char* str = DoubleToFixedCString(value, f);
4285 MaybeObject* res = 4285 MaybeObject* res =
4286 isolate->heap()->AllocateStringFromOneByte(CStrVector(str)); 4286 isolate->heap()->AllocateStringFromOneByte(CStrVector(str));
4287 DeleteArray(str); 4287 DeleteArray(str);
4288 return res; 4288 return res;
4289 } 4289 }
4290 4290
4291 4291
4292 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToExponential) { 4292 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToExponential) {
4293 NoHandleAllocation ha(isolate); 4293 SealHandleScope shs(isolate);
4294 ASSERT(args.length() == 2); 4294 ASSERT(args.length() == 2);
4295 4295
4296 CONVERT_DOUBLE_ARG_CHECKED(value, 0); 4296 CONVERT_DOUBLE_ARG_CHECKED(value, 0);
4297 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1); 4297 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
4298 int f = FastD2IChecked(f_number); 4298 int f = FastD2IChecked(f_number);
4299 RUNTIME_ASSERT(f >= -1 && f <= 20); 4299 RUNTIME_ASSERT(f >= -1 && f <= 20);
4300 char* str = DoubleToExponentialCString(value, f); 4300 char* str = DoubleToExponentialCString(value, f);
4301 MaybeObject* res = 4301 MaybeObject* res =
4302 isolate->heap()->AllocateStringFromOneByte(CStrVector(str)); 4302 isolate->heap()->AllocateStringFromOneByte(CStrVector(str));
4303 DeleteArray(str); 4303 DeleteArray(str);
4304 return res; 4304 return res;
4305 } 4305 }
4306 4306
4307 4307
4308 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToPrecision) { 4308 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToPrecision) {
4309 NoHandleAllocation ha(isolate); 4309 SealHandleScope shs(isolate);
4310 ASSERT(args.length() == 2); 4310 ASSERT(args.length() == 2);
4311 4311
4312 CONVERT_DOUBLE_ARG_CHECKED(value, 0); 4312 CONVERT_DOUBLE_ARG_CHECKED(value, 0);
4313 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1); 4313 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
4314 int f = FastD2IChecked(f_number); 4314 int f = FastD2IChecked(f_number);
4315 RUNTIME_ASSERT(f >= 1 && f <= 21); 4315 RUNTIME_ASSERT(f >= 1 && f <= 21);
4316 char* str = DoubleToPrecisionCString(value, f); 4316 char* str = DoubleToPrecisionCString(value, f);
4317 MaybeObject* res = 4317 MaybeObject* res =
4318 isolate->heap()->AllocateStringFromOneByte(CStrVector(str)); 4318 isolate->heap()->AllocateStringFromOneByte(CStrVector(str));
4319 DeleteArray(str); 4319 DeleteArray(str);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
4436 // the element if so. 4436 // the element if so.
4437 if (name->AsArrayIndex(&index)) { 4437 if (name->AsArrayIndex(&index)) {
4438 return GetElementOrCharAt(isolate, object, index); 4438 return GetElementOrCharAt(isolate, object, index);
4439 } else { 4439 } else {
4440 return object->GetProperty(*name); 4440 return object->GetProperty(*name);
4441 } 4441 }
4442 } 4442 }
4443 4443
4444 4444
4445 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetProperty) { 4445 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetProperty) {
4446 NoHandleAllocation ha(isolate); 4446 SealHandleScope shs(isolate);
4447 ASSERT(args.length() == 2); 4447 ASSERT(args.length() == 2);
4448 4448
4449 Handle<Object> object = args.at<Object>(0); 4449 Handle<Object> object = args.at<Object>(0);
4450 Handle<Object> key = args.at<Object>(1); 4450 Handle<Object> key = args.at<Object>(1);
4451 4451
4452 return Runtime::GetObjectProperty(isolate, object, key); 4452 return Runtime::GetObjectProperty(isolate, object, key);
4453 } 4453 }
4454 4454
4455 4455
4456 // KeyedGetProperty is called from KeyedLoadIC::GenerateGeneric. 4456 // KeyedGetProperty is called from KeyedLoadIC::GenerateGeneric.
4457 RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) { 4457 RUNTIME_FUNCTION(MaybeObject*, Runtime_KeyedGetProperty) {
4458 NoHandleAllocation ha(isolate); 4458 SealHandleScope shs(isolate);
4459 ASSERT(args.length() == 2); 4459 ASSERT(args.length() == 2);
4460 4460
4461 // Fast cases for getting named properties of the receiver JSObject 4461 // Fast cases for getting named properties of the receiver JSObject
4462 // itself. 4462 // itself.
4463 // 4463 //
4464 // The global proxy objects has to be excluded since LocalLookup on 4464 // The global proxy objects has to be excluded since LocalLookup on
4465 // the global proxy object can return a valid result even though the 4465 // the global proxy object can return a valid result even though the
4466 // global proxy object never has properties. This is the case 4466 // global proxy object never has properties. This is the case
4467 // because the global proxy object forwards everything to its hidden 4467 // because the global proxy object forwards everything to its hidden
4468 // prototype including local lookups. 4468 // prototype including local lookups.
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
4656 return Runtime::ForceSetObjectProperty(isolate, 4656 return Runtime::ForceSetObjectProperty(isolate,
4657 js_object, 4657 js_object,
4658 name, 4658 name,
4659 obj_value, 4659 obj_value,
4660 attr); 4660 attr);
4661 } 4661 }
4662 4662
4663 4663
4664 // Return property without being observable by accessors or interceptors. 4664 // Return property without being observable by accessors or interceptors.
4665 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDataProperty) { 4665 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDataProperty) {
4666 NoHandleAllocation ha(isolate); 4666 SealHandleScope shs(isolate);
4667 ASSERT(args.length() == 2); 4667 ASSERT(args.length() == 2);
4668 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 4668 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
4669 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 4669 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
4670 LookupResult lookup(isolate); 4670 LookupResult lookup(isolate);
4671 object->LookupRealNamedProperty(*key, &lookup); 4671 object->LookupRealNamedProperty(*key, &lookup);
4672 if (!lookup.IsFound()) return isolate->heap()->undefined_value(); 4672 if (!lookup.IsFound()) return isolate->heap()->undefined_value();
4673 switch (lookup.type()) { 4673 switch (lookup.type()) {
4674 case NORMAL: 4674 case NORMAL:
4675 return lookup.holder()->GetNormalizedProperty(&lookup); 4675 return lookup.holder()->GetNormalizedProperty(&lookup);
4676 case FIELD: 4676 case FIELD:
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
4869 if (has_pending_exception) return Failure::Exception(); 4869 if (has_pending_exception) return Failure::Exception();
4870 name = Handle<String>::cast(converted); 4870 name = Handle<String>::cast(converted);
4871 } 4871 }
4872 4872
4873 if (name->IsString()) Handle<String>::cast(name)->TryFlatten(); 4873 if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
4874 return receiver->DeleteProperty(*name, mode); 4874 return receiver->DeleteProperty(*name, mode);
4875 } 4875 }
4876 4876
4877 4877
4878 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetProperty) { 4878 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetProperty) {
4879 NoHandleAllocation ha(isolate); 4879 SealHandleScope shs(isolate);
4880 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); 4880 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5);
4881 4881
4882 Handle<Object> object = args.at<Object>(0); 4882 Handle<Object> object = args.at<Object>(0);
4883 Handle<Object> key = args.at<Object>(1); 4883 Handle<Object> key = args.at<Object>(1);
4884 Handle<Object> value = args.at<Object>(2); 4884 Handle<Object> value = args.at<Object>(2);
4885 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); 4885 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3);
4886 RUNTIME_ASSERT( 4886 RUNTIME_ASSERT(
4887 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4887 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4888 // Compute attributes. 4888 // Compute attributes.
4889 PropertyAttributes attributes = 4889 PropertyAttributes attributes =
(...skipping 18 matching lines...) Expand all
4908 HandleScope scope(isolate); 4908 HandleScope scope(isolate);
4909 RUNTIME_ASSERT(args.length() == 2); 4909 RUNTIME_ASSERT(args.length() == 2);
4910 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 4910 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
4911 CONVERT_ARG_HANDLE_CHECKED(Map, map, 1); 4911 CONVERT_ARG_HANDLE_CHECKED(Map, map, 1);
4912 JSObject::TransitionElementsKind(array, map->elements_kind()); 4912 JSObject::TransitionElementsKind(array, map->elements_kind());
4913 return *array; 4913 return *array;
4914 } 4914 }
4915 4915
4916 4916
4917 RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsSmiToDouble) { 4917 RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsSmiToDouble) {
4918 NoHandleAllocation ha(isolate); 4918 SealHandleScope shs(isolate);
4919 RUNTIME_ASSERT(args.length() == 1); 4919 RUNTIME_ASSERT(args.length() == 1);
4920 Handle<Object> object = args.at<Object>(0); 4920 Handle<Object> object = args.at<Object>(0);
4921 if (object->IsJSObject()) { 4921 if (object->IsJSObject()) {
4922 Handle<JSObject> js_object(Handle<JSObject>::cast(object)); 4922 Handle<JSObject> js_object(Handle<JSObject>::cast(object));
4923 ASSERT(!js_object->map()->is_observed()); 4923 ASSERT(!js_object->map()->is_observed());
4924 ElementsKind new_kind = js_object->HasFastHoleyElements() 4924 ElementsKind new_kind = js_object->HasFastHoleyElements()
4925 ? FAST_HOLEY_DOUBLE_ELEMENTS 4925 ? FAST_HOLEY_DOUBLE_ELEMENTS
4926 : FAST_DOUBLE_ELEMENTS; 4926 : FAST_DOUBLE_ELEMENTS;
4927 return TransitionElements(object, new_kind, isolate); 4927 return TransitionElements(object, new_kind, isolate);
4928 } else { 4928 } else {
4929 return *object; 4929 return *object;
4930 } 4930 }
4931 } 4931 }
4932 4932
4933 4933
4934 RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsDoubleToObject) { 4934 RUNTIME_FUNCTION(MaybeObject*, Runtime_TransitionElementsDoubleToObject) {
4935 NoHandleAllocation ha(isolate); 4935 SealHandleScope shs(isolate);
4936 RUNTIME_ASSERT(args.length() == 1); 4936 RUNTIME_ASSERT(args.length() == 1);
4937 Handle<Object> object = args.at<Object>(0); 4937 Handle<Object> object = args.at<Object>(0);
4938 if (object->IsJSObject()) { 4938 if (object->IsJSObject()) {
4939 Handle<JSObject> js_object(Handle<JSObject>::cast(object)); 4939 Handle<JSObject> js_object(Handle<JSObject>::cast(object));
4940 ASSERT(!js_object->map()->is_observed()); 4940 ASSERT(!js_object->map()->is_observed());
4941 ElementsKind new_kind = js_object->HasFastHoleyElements() 4941 ElementsKind new_kind = js_object->HasFastHoleyElements()
4942 ? FAST_HOLEY_ELEMENTS 4942 ? FAST_HOLEY_ELEMENTS
4943 : FAST_ELEMENTS; 4943 : FAST_ELEMENTS;
4944 return TransitionElements(object, new_kind, isolate); 4944 return TransitionElements(object, new_kind, isolate);
4945 } else { 4945 } else {
4946 return *object; 4946 return *object;
4947 } 4947 }
4948 } 4948 }
4949 4949
4950 4950
4951 // Set the native flag on the function. 4951 // Set the native flag on the function.
4952 // This is used to decide if we should transform null and undefined 4952 // This is used to decide if we should transform null and undefined
4953 // into the global object when doing call and apply. 4953 // into the global object when doing call and apply.
4954 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNativeFlag) { 4954 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNativeFlag) {
4955 NoHandleAllocation ha(isolate); 4955 SealHandleScope shs(isolate);
4956 RUNTIME_ASSERT(args.length() == 1); 4956 RUNTIME_ASSERT(args.length() == 1);
4957 4957
4958 Handle<Object> object = args.at<Object>(0); 4958 Handle<Object> object = args.at<Object>(0);
4959 4959
4960 if (object->IsJSFunction()) { 4960 if (object->IsJSFunction()) {
4961 JSFunction* func = JSFunction::cast(*object); 4961 JSFunction* func = JSFunction::cast(*object);
4962 func->shared()->set_native(true); 4962 func->shared()->set_native(true);
4963 } 4963 }
4964 return isolate->heap()->undefined_value(); 4964 return isolate->heap()->undefined_value();
4965 } 4965 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
5011 FixedArray* object_array = FixedArray::cast(object->elements()); 5011 FixedArray* object_array = FixedArray::cast(object->elements());
5012 object_array->set(store_index, *value); 5012 object_array->set(store_index, *value);
5013 } 5013 }
5014 return *object; 5014 return *object;
5015 } 5015 }
5016 5016
5017 5017
5018 // Check whether debugger and is about to step into the callback that is passed 5018 // Check whether debugger and is about to step into the callback that is passed
5019 // to a built-in function such as Array.forEach. 5019 // to a built-in function such as Array.forEach.
5020 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugCallbackSupportsStepping) { 5020 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugCallbackSupportsStepping) {
5021 NoHandleAllocation ha(isolate); 5021 SealHandleScope shs(isolate);
5022 #ifdef ENABLE_DEBUGGER_SUPPORT 5022 #ifdef ENABLE_DEBUGGER_SUPPORT
5023 if (!isolate->IsDebuggerActive() || !isolate->debug()->StepInActive()) { 5023 if (!isolate->IsDebuggerActive() || !isolate->debug()->StepInActive()) {
5024 return isolate->heap()->false_value(); 5024 return isolate->heap()->false_value();
5025 } 5025 }
5026 CONVERT_ARG_CHECKED(Object, callback, 0); 5026 CONVERT_ARG_CHECKED(Object, callback, 0);
5027 // We do not step into the callback if it's a builtin or not even a function. 5027 // We do not step into the callback if it's a builtin or not even a function.
5028 if (!callback->IsJSFunction() || JSFunction::cast(callback)->IsBuiltin()) { 5028 if (!callback->IsJSFunction() || JSFunction::cast(callback)->IsBuiltin()) {
5029 return isolate->heap()->false_value(); 5029 return isolate->heap()->false_value();
5030 } 5030 }
5031 return isolate->heap()->true_value(); 5031 return isolate->heap()->true_value();
5032 #else 5032 #else
5033 return isolate->heap()->false_value(); 5033 return isolate->heap()->false_value();
5034 #endif // ENABLE_DEBUGGER_SUPPORT 5034 #endif // ENABLE_DEBUGGER_SUPPORT
5035 } 5035 }
5036 5036
5037 5037
5038 // Set one shot breakpoints for the callback function that is passed to a 5038 // Set one shot breakpoints for the callback function that is passed to a
5039 // built-in function such as Array.forEach to enable stepping into the callback. 5039 // built-in function such as Array.forEach to enable stepping into the callback.
5040 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrepareStepInIfStepping) { 5040 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrepareStepInIfStepping) {
5041 NoHandleAllocation ha(isolate); 5041 SealHandleScope shs(isolate);
5042 #ifdef ENABLE_DEBUGGER_SUPPORT 5042 #ifdef ENABLE_DEBUGGER_SUPPORT
5043 Debug* debug = isolate->debug(); 5043 Debug* debug = isolate->debug();
5044 if (!debug->IsStepping()) return isolate->heap()->undefined_value(); 5044 if (!debug->IsStepping()) return isolate->heap()->undefined_value();
5045 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callback, 0); 5045 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callback, 0);
5046 HandleScope scope(isolate); 5046 HandleScope scope(isolate);
5047 // When leaving the callback, step out has been activated, but not performed 5047 // When leaving the callback, step out has been activated, but not performed
5048 // if we do not leave the builtin. To be able to step into the callback 5048 // if we do not leave the builtin. To be able to step into the callback
5049 // again, we need to clear the step out at this point. 5049 // again, we need to clear the step out at this point.
5050 debug->ClearStepOut(); 5050 debug->ClearStepOut();
5051 debug->FloodWithOneShot(callback); 5051 debug->FloodWithOneShot(callback);
5052 #endif // ENABLE_DEBUGGER_SUPPORT 5052 #endif // ENABLE_DEBUGGER_SUPPORT
5053 return isolate->heap()->undefined_value(); 5053 return isolate->heap()->undefined_value();
5054 } 5054 }
5055 5055
5056 5056
5057 // Set a local property, even if it is READ_ONLY. If the property does not 5057 // Set a local property, even if it is READ_ONLY. If the property does not
5058 // exist, it will be added with attributes NONE. 5058 // exist, it will be added with attributes NONE.
5059 RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) { 5059 RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) {
5060 NoHandleAllocation ha(isolate); 5060 SealHandleScope shs(isolate);
5061 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); 5061 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
5062 CONVERT_ARG_CHECKED(JSObject, object, 0); 5062 CONVERT_ARG_CHECKED(JSObject, object, 0);
5063 CONVERT_ARG_CHECKED(Name, name, 1); 5063 CONVERT_ARG_CHECKED(Name, name, 1);
5064 // Compute attributes. 5064 // Compute attributes.
5065 PropertyAttributes attributes = NONE; 5065 PropertyAttributes attributes = NONE;
5066 if (args.length() == 4) { 5066 if (args.length() == 4) {
5067 CONVERT_SMI_ARG_CHECKED(unchecked_value, 3); 5067 CONVERT_SMI_ARG_CHECKED(unchecked_value, 3);
5068 // Only attribute bits should be set. 5068 // Only attribute bits should be set.
5069 RUNTIME_ASSERT( 5069 RUNTIME_ASSERT(
5070 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5070 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5071 attributes = static_cast<PropertyAttributes>(unchecked_value); 5071 attributes = static_cast<PropertyAttributes>(unchecked_value);
5072 } 5072 }
5073 5073
5074 return object-> 5074 return object->
5075 SetLocalPropertyIgnoreAttributes(name, args[2], attributes); 5075 SetLocalPropertyIgnoreAttributes(name, args[2], attributes);
5076 } 5076 }
5077 5077
5078 5078
5079 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { 5079 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) {
5080 NoHandleAllocation ha(isolate); 5080 SealHandleScope shs(isolate);
5081 ASSERT(args.length() == 3); 5081 ASSERT(args.length() == 3);
5082 5082
5083 CONVERT_ARG_CHECKED(JSReceiver, object, 0); 5083 CONVERT_ARG_CHECKED(JSReceiver, object, 0);
5084 CONVERT_ARG_CHECKED(Name, key, 1); 5084 CONVERT_ARG_CHECKED(Name, key, 1);
5085 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); 5085 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2);
5086 return object->DeleteProperty(key, (strict_mode == kStrictMode) 5086 return object->DeleteProperty(key, (strict_mode == kStrictMode)
5087 ? JSReceiver::STRICT_DELETION 5087 ? JSReceiver::STRICT_DELETION
5088 : JSReceiver::NORMAL_DELETION); 5088 : JSReceiver::NORMAL_DELETION);
5089 } 5089 }
5090 5090
(...skipping 10 matching lines...) Expand all
5101 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) { 5101 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) {
5102 return HasLocalPropertyImplementation(isolate, 5102 return HasLocalPropertyImplementation(isolate,
5103 Handle<JSObject>::cast(proto), 5103 Handle<JSObject>::cast(proto),
5104 key); 5104 key);
5105 } 5105 }
5106 return isolate->heap()->false_value(); 5106 return isolate->heap()->false_value();
5107 } 5107 }
5108 5108
5109 5109
5110 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { 5110 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) {
5111 NoHandleAllocation ha(isolate); 5111 SealHandleScope shs(isolate);
5112 ASSERT(args.length() == 2); 5112 ASSERT(args.length() == 2);
5113 CONVERT_ARG_CHECKED(Name, key, 1); 5113 CONVERT_ARG_CHECKED(Name, key, 1);
5114 5114
5115 uint32_t index; 5115 uint32_t index;
5116 const bool key_is_array_index = key->AsArrayIndex(&index); 5116 const bool key_is_array_index = key->AsArrayIndex(&index);
5117 5117
5118 Object* obj = args[0]; 5118 Object* obj = args[0];
5119 // Only JS objects can have properties. 5119 // Only JS objects can have properties.
5120 if (obj->IsJSObject()) { 5120 if (obj->IsJSObject()) {
5121 JSObject* object = JSObject::cast(obj); 5121 JSObject* object = JSObject::cast(obj);
(...skipping 18 matching lines...) Expand all
5140 String* string = String::cast(obj); 5140 String* string = String::cast(obj);
5141 if (index < static_cast<uint32_t>(string->length())) { 5141 if (index < static_cast<uint32_t>(string->length())) {
5142 return isolate->heap()->true_value(); 5142 return isolate->heap()->true_value();
5143 } 5143 }
5144 } 5144 }
5145 return isolate->heap()->false_value(); 5145 return isolate->heap()->false_value();
5146 } 5146 }
5147 5147
5148 5148
5149 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { 5149 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) {
5150 NoHandleAllocation na(isolate); 5150 SealHandleScope shs(isolate);
5151 ASSERT(args.length() == 2); 5151 ASSERT(args.length() == 2);
5152 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); 5152 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0);
5153 CONVERT_ARG_CHECKED(Name, key, 1); 5153 CONVERT_ARG_CHECKED(Name, key, 1);
5154 5154
5155 bool result = receiver->HasProperty(key); 5155 bool result = receiver->HasProperty(key);
5156 if (isolate->has_pending_exception()) return Failure::Exception(); 5156 if (isolate->has_pending_exception()) return Failure::Exception();
5157 return isolate->heap()->ToBoolean(result); 5157 return isolate->heap()->ToBoolean(result);
5158 } 5158 }
5159 5159
5160 5160
5161 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) { 5161 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) {
5162 NoHandleAllocation na(isolate); 5162 SealHandleScope shs(isolate);
5163 ASSERT(args.length() == 2); 5163 ASSERT(args.length() == 2);
5164 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); 5164 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0);
5165 CONVERT_SMI_ARG_CHECKED(index, 1); 5165 CONVERT_SMI_ARG_CHECKED(index, 1);
5166 5166
5167 bool result = receiver->HasElement(index); 5167 bool result = receiver->HasElement(index);
5168 if (isolate->has_pending_exception()) return Failure::Exception(); 5168 if (isolate->has_pending_exception()) return Failure::Exception();
5169 return isolate->heap()->ToBoolean(result); 5169 return isolate->heap()->ToBoolean(result);
5170 } 5170 }
5171 5171
5172 5172
5173 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { 5173 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) {
5174 NoHandleAllocation ha(isolate); 5174 SealHandleScope shs(isolate);
5175 ASSERT(args.length() == 2); 5175 ASSERT(args.length() == 2);
5176 5176
5177 CONVERT_ARG_CHECKED(JSObject, object, 0); 5177 CONVERT_ARG_CHECKED(JSObject, object, 0);
5178 CONVERT_ARG_CHECKED(Name, key, 1); 5178 CONVERT_ARG_CHECKED(Name, key, 1);
5179 5179
5180 PropertyAttributes att = object->GetLocalPropertyAttribute(key); 5180 PropertyAttributes att = object->GetLocalPropertyAttribute(key);
5181 return isolate->heap()->ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0); 5181 return isolate->heap()->ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0);
5182 } 5182 }
5183 5183
5184 5184
5185 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) { 5185 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNames) {
5186 HandleScope scope(isolate); 5186 HandleScope scope(isolate);
5187 ASSERT(args.length() == 1); 5187 ASSERT(args.length() == 1);
5188 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); 5188 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
5189 bool threw = false; 5189 bool threw = false;
5190 Handle<JSArray> result = GetKeysFor(object, &threw); 5190 Handle<JSArray> result = GetKeysFor(object, &threw);
5191 if (threw) return Failure::Exception(); 5191 if (threw) return Failure::Exception();
5192 return *result; 5192 return *result;
5193 } 5193 }
5194 5194
5195 5195
5196 // Returns either a FixedArray as Runtime_GetPropertyNames, 5196 // Returns either a FixedArray as Runtime_GetPropertyNames,
5197 // or, if the given object has an enum cache that contains 5197 // or, if the given object has an enum cache that contains
5198 // all enumerable properties of the object and its prototypes 5198 // all enumerable properties of the object and its prototypes
5199 // have none, the map of the object. This is used to speed up 5199 // have none, the map of the object. This is used to speed up
5200 // the check for deletions during a for-in. 5200 // the check for deletions during a for-in.
5201 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { 5201 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) {
5202 NoHandleAllocation ha(isolate); 5202 SealHandleScope shs(isolate);
5203 ASSERT(args.length() == 1); 5203 ASSERT(args.length() == 1);
5204 5204
5205 CONVERT_ARG_CHECKED(JSReceiver, raw_object, 0); 5205 CONVERT_ARG_CHECKED(JSReceiver, raw_object, 0);
5206 5206
5207 if (raw_object->IsSimpleEnum()) return raw_object->map(); 5207 if (raw_object->IsSimpleEnum()) return raw_object->map();
5208 5208
5209 HandleScope scope(isolate); 5209 HandleScope scope(isolate);
5210 Handle<JSReceiver> object(raw_object); 5210 Handle<JSReceiver> object(raw_object);
5211 bool threw = false; 5211 bool threw = false;
5212 Handle<FixedArray> content = 5212 Handle<FixedArray> content =
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
5431 Handle<Object> entry_str = 5431 Handle<Object> entry_str =
5432 isolate->factory()->NumberToString(entry_handle); 5432 isolate->factory()->NumberToString(entry_handle);
5433 copy->set(i, *entry_str); 5433 copy->set(i, *entry_str);
5434 } 5434 }
5435 } 5435 }
5436 return *isolate->factory()->NewJSArrayWithElements(copy); 5436 return *isolate->factory()->NewJSArrayWithElements(copy);
5437 } 5437 }
5438 5438
5439 5439
5440 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) { 5440 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) {
5441 NoHandleAllocation ha(isolate); 5441 SealHandleScope shs(isolate);
5442 ASSERT(args.length() == 1); 5442 ASSERT(args.length() == 1);
5443 5443
5444 // Compute the frame holding the arguments. 5444 // Compute the frame holding the arguments.
5445 JavaScriptFrameIterator it(isolate); 5445 JavaScriptFrameIterator it(isolate);
5446 it.AdvanceToArgumentsFrame(); 5446 it.AdvanceToArgumentsFrame();
5447 JavaScriptFrame* frame = it.frame(); 5447 JavaScriptFrame* frame = it.frame();
5448 5448
5449 // Get the actual number of provided arguments. 5449 // Get the actual number of provided arguments.
5450 const uint32_t n = frame->ComputeParametersCount(); 5450 const uint32_t n = frame->ComputeParametersCount();
5451 5451
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
5490 } 5490 }
5491 return function; 5491 return function;
5492 } 5492 }
5493 5493
5494 // Lookup in the initial Object.prototype object. 5494 // Lookup in the initial Object.prototype object.
5495 return isolate->initial_object_prototype()->GetProperty(*key); 5495 return isolate->initial_object_prototype()->GetProperty(*key);
5496 } 5496 }
5497 5497
5498 5498
5499 RUNTIME_FUNCTION(MaybeObject*, Runtime_ToFastProperties) { 5499 RUNTIME_FUNCTION(MaybeObject*, Runtime_ToFastProperties) {
5500 NoHandleAllocation ha(isolate); 5500 SealHandleScope shs(isolate);
5501 ASSERT(args.length() == 1); 5501 ASSERT(args.length() == 1);
5502 Object* object = args[0]; 5502 Object* object = args[0];
5503 return (object->IsJSObject() && !object->IsGlobalObject()) 5503 return (object->IsJSObject() && !object->IsGlobalObject())
5504 ? JSObject::cast(object)->TransformToFastProperties(0) 5504 ? JSObject::cast(object)->TransformToFastProperties(0)
5505 : object; 5505 : object;
5506 } 5506 }
5507 5507
5508 5508
5509 RUNTIME_FUNCTION(MaybeObject*, Runtime_ToBool) { 5509 RUNTIME_FUNCTION(MaybeObject*, Runtime_ToBool) {
5510 NoHandleAllocation ha(isolate); 5510 SealHandleScope shs(isolate);
5511 ASSERT(args.length() == 1); 5511 ASSERT(args.length() == 1);
5512 5512
5513 return isolate->heap()->ToBoolean(args[0]->BooleanValue()); 5513 return isolate->heap()->ToBoolean(args[0]->BooleanValue());
5514 } 5514 }
5515 5515
5516 5516
5517 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47). 5517 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47).
5518 // Possible optimizations: put the type string into the oddballs. 5518 // Possible optimizations: put the type string into the oddballs.
5519 RUNTIME_FUNCTION(MaybeObject*, Runtime_Typeof) { 5519 RUNTIME_FUNCTION(MaybeObject*, Runtime_Typeof) {
5520 NoHandleAllocation ha(isolate); 5520 SealHandleScope shs(isolate);
5521 5521
5522 Object* obj = args[0]; 5522 Object* obj = args[0];
5523 if (obj->IsNumber()) return isolate->heap()->number_string(); 5523 if (obj->IsNumber()) return isolate->heap()->number_string();
5524 HeapObject* heap_obj = HeapObject::cast(obj); 5524 HeapObject* heap_obj = HeapObject::cast(obj);
5525 5525
5526 // typeof an undetectable object is 'undefined' 5526 // typeof an undetectable object is 'undefined'
5527 if (heap_obj->map()->is_undetectable()) { 5527 if (heap_obj->map()->is_undetectable()) {
5528 return isolate->heap()->undefined_string(); 5528 return isolate->heap()->undefined_string();
5529 } 5529 }
5530 5530
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
5574 5574
5575 for (int i = from + 1; i < to; i++) { 5575 for (int i = from + 1; i < to; i++) {
5576 d = 10 * d + (s[i] - '0'); 5576 d = 10 * d + (s[i] - '0');
5577 } 5577 }
5578 5578
5579 return d; 5579 return d;
5580 } 5580 }
5581 5581
5582 5582
5583 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToNumber) { 5583 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToNumber) {
5584 NoHandleAllocation ha(isolate); 5584 SealHandleScope shs(isolate);
5585 ASSERT(args.length() == 1); 5585 ASSERT(args.length() == 1);
5586 CONVERT_ARG_CHECKED(String, subject, 0); 5586 CONVERT_ARG_CHECKED(String, subject, 0);
5587 subject->TryFlatten(); 5587 subject->TryFlatten();
5588 5588
5589 // Fast case: short integer or some sorts of junk values. 5589 // Fast case: short integer or some sorts of junk values.
5590 int len = subject->length(); 5590 int len = subject->length();
5591 if (subject->IsSeqOneByteString()) { 5591 if (subject->IsSeqOneByteString()) {
5592 if (len == 0) return Smi::FromInt(0); 5592 if (len == 0) return Smi::FromInt(0);
5593 5593
5594 uint8_t const* data = SeqOneByteString::cast(subject)->GetChars(); 5594 uint8_t const* data = SeqOneByteString::cast(subject)->GetChars();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
5629 } 5629 }
5630 } 5630 }
5631 5631
5632 // Slower case. 5632 // Slower case.
5633 return isolate->heap()->NumberFromDouble( 5633 return isolate->heap()->NumberFromDouble(
5634 StringToDouble(isolate->unicode_cache(), subject, ALLOW_HEX)); 5634 StringToDouble(isolate->unicode_cache(), subject, ALLOW_HEX));
5635 } 5635 }
5636 5636
5637 5637
5638 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewString) { 5638 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewString) {
5639 NoHandleAllocation ha(isolate); 5639 SealHandleScope shs(isolate);
5640 CONVERT_SMI_ARG_CHECKED(length, 0); 5640 CONVERT_SMI_ARG_CHECKED(length, 0);
5641 CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1); 5641 CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1);
5642 if (length == 0) return isolate->heap()->empty_string(); 5642 if (length == 0) return isolate->heap()->empty_string();
5643 if (is_one_byte) { 5643 if (is_one_byte) {
5644 return isolate->heap()->AllocateRawOneByteString(length); 5644 return isolate->heap()->AllocateRawOneByteString(length);
5645 } else { 5645 } else {
5646 return isolate->heap()->AllocateRawTwoByteString(length); 5646 return isolate->heap()->AllocateRawTwoByteString(length);
5647 } 5647 }
5648 } 5648 }
5649 5649
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
5692 5692
5693 RUNTIME_FUNCTION(MaybeObject*, Runtime_BasicJSONStringify) { 5693 RUNTIME_FUNCTION(MaybeObject*, Runtime_BasicJSONStringify) {
5694 HandleScope scope(isolate); 5694 HandleScope scope(isolate);
5695 ASSERT(args.length() == 1); 5695 ASSERT(args.length() == 1);
5696 BasicJsonStringifier stringifier(isolate); 5696 BasicJsonStringifier stringifier(isolate);
5697 return stringifier.Stringify(Handle<Object>(args[0], isolate)); 5697 return stringifier.Stringify(Handle<Object>(args[0], isolate));
5698 } 5698 }
5699 5699
5700 5700
5701 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseInt) { 5701 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseInt) {
5702 NoHandleAllocation ha(isolate); 5702 SealHandleScope shs(isolate);
5703 5703
5704 CONVERT_ARG_CHECKED(String, s, 0); 5704 CONVERT_ARG_CHECKED(String, s, 0);
5705 CONVERT_SMI_ARG_CHECKED(radix, 1); 5705 CONVERT_SMI_ARG_CHECKED(radix, 1);
5706 5706
5707 s->TryFlatten(); 5707 s->TryFlatten();
5708 5708
5709 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36)); 5709 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36));
5710 double value = StringToInt(isolate->unicode_cache(), s, radix); 5710 double value = StringToInt(isolate->unicode_cache(), s, radix);
5711 return isolate->heap()->NumberFromDouble(value); 5711 return isolate->heap()->NumberFromDouble(value);
5712 } 5712 }
5713 5713
5714 5714
5715 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseFloat) { 5715 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseFloat) {
5716 NoHandleAllocation ha(isolate); 5716 SealHandleScope shs(isolate);
5717 CONVERT_ARG_CHECKED(String, str, 0); 5717 CONVERT_ARG_CHECKED(String, str, 0);
5718 5718
5719 // ECMA-262 section 15.1.2.3, empty string is NaN 5719 // ECMA-262 section 15.1.2.3, empty string is NaN
5720 double value = StringToDouble(isolate->unicode_cache(), 5720 double value = StringToDouble(isolate->unicode_cache(),
5721 str, ALLOW_TRAILING_JUNK, OS::nan_value()); 5721 str, ALLOW_TRAILING_JUNK, OS::nan_value());
5722 5722
5723 // Create a number object from the value. 5723 // Create a number object from the value.
5724 return isolate->heap()->NumberFromDouble(value); 5724 return isolate->heap()->NumberFromDouble(value);
5725 } 5725 }
5726 5726
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
5961 }; 5961 };
5962 5962
5963 } // namespace 5963 } // namespace
5964 5964
5965 5965
5966 template <typename ConvertTraits> 5966 template <typename ConvertTraits>
5967 MUST_USE_RESULT static MaybeObject* ConvertCase( 5967 MUST_USE_RESULT static MaybeObject* ConvertCase(
5968 Arguments args, 5968 Arguments args,
5969 Isolate* isolate, 5969 Isolate* isolate,
5970 unibrow::Mapping<typename ConvertTraits::UnibrowConverter, 128>* mapping) { 5970 unibrow::Mapping<typename ConvertTraits::UnibrowConverter, 128>* mapping) {
5971 NoHandleAllocation ha(isolate); 5971 SealHandleScope shs(isolate);
5972 CONVERT_ARG_CHECKED(String, s, 0); 5972 CONVERT_ARG_CHECKED(String, s, 0);
5973 s = s->TryFlattenGetString(); 5973 s = s->TryFlattenGetString();
5974 5974
5975 const int length = s->length(); 5975 const int length = s->length();
5976 // Assume that the string is not empty; we need this assumption later 5976 // Assume that the string is not empty; we need this assumption later
5977 if (length == 0) return s; 5977 if (length == 0) return s;
5978 5978
5979 // Simpler handling of ASCII strings. 5979 // Simpler handling of ASCII strings.
5980 // 5980 //
5981 // NOTE: This assumes that the upper/lower case of an ASCII 5981 // NOTE: This assumes that the upper/lower case of an ASCII
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
6028 args, isolate, isolate->runtime_state()->to_upper_mapping()); 6028 args, isolate, isolate->runtime_state()->to_upper_mapping());
6029 } 6029 }
6030 6030
6031 6031
6032 static inline bool IsTrimWhiteSpace(unibrow::uchar c) { 6032 static inline bool IsTrimWhiteSpace(unibrow::uchar c) {
6033 return unibrow::WhiteSpace::Is(c) || c == 0x200b || c == 0xfeff; 6033 return unibrow::WhiteSpace::Is(c) || c == 0x200b || c == 0xfeff;
6034 } 6034 }
6035 6035
6036 6036
6037 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringTrim) { 6037 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringTrim) {
6038 NoHandleAllocation ha(isolate); 6038 SealHandleScope shs(isolate);
6039 ASSERT(args.length() == 3); 6039 ASSERT(args.length() == 3);
6040 6040
6041 CONVERT_ARG_CHECKED(String, s, 0); 6041 CONVERT_ARG_CHECKED(String, s, 0);
6042 CONVERT_BOOLEAN_ARG_CHECKED(trimLeft, 1); 6042 CONVERT_BOOLEAN_ARG_CHECKED(trimLeft, 1);
6043 CONVERT_BOOLEAN_ARG_CHECKED(trimRight, 2); 6043 CONVERT_BOOLEAN_ARG_CHECKED(trimRight, 2);
6044 6044
6045 s->TryFlatten(); 6045 s->TryFlatten();
6046 int length = s->length(); 6046 int length = s->length();
6047 6047
6048 int left = 0; 6048 int left = 0;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
6154 6154
6155 6155
6156 // Copies ASCII characters to the given fixed array looking up 6156 // Copies ASCII characters to the given fixed array looking up
6157 // one-char strings in the cache. Gives up on the first char that is 6157 // one-char strings in the cache. Gives up on the first char that is
6158 // not in the cache and fills the remainder with smi zeros. Returns 6158 // not in the cache and fills the remainder with smi zeros. Returns
6159 // the length of the successfully copied prefix. 6159 // the length of the successfully copied prefix.
6160 static int CopyCachedAsciiCharsToArray(Heap* heap, 6160 static int CopyCachedAsciiCharsToArray(Heap* heap,
6161 const uint8_t* chars, 6161 const uint8_t* chars,
6162 FixedArray* elements, 6162 FixedArray* elements,
6163 int length) { 6163 int length) {
6164 AssertNoAllocation no_gc; 6164 DisallowHeapAllocation no_gc;
6165 FixedArray* ascii_cache = heap->single_character_string_cache(); 6165 FixedArray* ascii_cache = heap->single_character_string_cache();
6166 Object* undefined = heap->undefined_value(); 6166 Object* undefined = heap->undefined_value();
6167 int i; 6167 int i;
6168 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc); 6168 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc);
6169 for (i = 0; i < length; ++i) { 6169 for (i = 0; i < length; ++i) {
6170 Object* value = ascii_cache->get(chars[i]); 6170 Object* value = ascii_cache->get(chars[i]);
6171 if (value == undefined) break; 6171 if (value == undefined) break;
6172 elements->set(i, value, mode); 6172 elements->set(i, value, mode);
6173 } 6173 }
6174 if (i < length) { 6174 if (i < length) {
(...skipping 25 matching lines...) Expand all
6200 Handle<FixedArray> elements; 6200 Handle<FixedArray> elements;
6201 int position = 0; 6201 int position = 0;
6202 if (s->IsFlat() && s->IsOneByteRepresentation()) { 6202 if (s->IsFlat() && s->IsOneByteRepresentation()) {
6203 // Try using cached chars where possible. 6203 // Try using cached chars where possible.
6204 Object* obj; 6204 Object* obj;
6205 { MaybeObject* maybe_obj = 6205 { MaybeObject* maybe_obj =
6206 isolate->heap()->AllocateUninitializedFixedArray(length); 6206 isolate->heap()->AllocateUninitializedFixedArray(length);
6207 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 6207 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
6208 } 6208 }
6209 elements = Handle<FixedArray>(FixedArray::cast(obj), isolate); 6209 elements = Handle<FixedArray>(FixedArray::cast(obj), isolate);
6210 AssertNoAllocation no_gc; 6210 DisallowHeapAllocation no_gc;
6211 String::FlatContent content = s->GetFlatContent(); 6211 String::FlatContent content = s->GetFlatContent();
6212 if (content.IsAscii()) { 6212 if (content.IsAscii()) {
6213 Vector<const uint8_t> chars = content.ToOneByteVector(); 6213 Vector<const uint8_t> chars = content.ToOneByteVector();
6214 // Note, this will initialize all elements (not only the prefix) 6214 // Note, this will initialize all elements (not only the prefix)
6215 // to prevent GC from seeing partially initialized array. 6215 // to prevent GC from seeing partially initialized array.
6216 position = CopyCachedAsciiCharsToArray(isolate->heap(), 6216 position = CopyCachedAsciiCharsToArray(isolate->heap(),
6217 chars.start(), 6217 chars.start(),
6218 *elements, 6218 *elements,
6219 length); 6219 length);
6220 } else { 6220 } else {
(...skipping 14 matching lines...) Expand all
6235 for (int i = 0; i < length; ++i) { 6235 for (int i = 0; i < length; ++i) {
6236 ASSERT(String::cast(elements->get(i))->length() == 1); 6236 ASSERT(String::cast(elements->get(i))->length() == 1);
6237 } 6237 }
6238 #endif 6238 #endif
6239 6239
6240 return *isolate->factory()->NewJSArrayWithElements(elements); 6240 return *isolate->factory()->NewJSArrayWithElements(elements);
6241 } 6241 }
6242 6242
6243 6243
6244 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) { 6244 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) {
6245 NoHandleAllocation ha(isolate); 6245 SealHandleScope shs(isolate);
6246 ASSERT(args.length() == 1); 6246 ASSERT(args.length() == 1);
6247 CONVERT_ARG_CHECKED(String, value, 0); 6247 CONVERT_ARG_CHECKED(String, value, 0);
6248 return value->ToObject(); 6248 return value->ToObject();
6249 } 6249 }
6250 6250
6251 6251
6252 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { 6252 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) {
6253 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; 6253 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth];
6254 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); 6254 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars);
6255 return char_length == 0; 6255 return char_length == 0;
6256 } 6256 }
6257 6257
6258 6258
6259 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToString) { 6259 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToString) {
6260 NoHandleAllocation ha(isolate); 6260 SealHandleScope shs(isolate);
6261 ASSERT(args.length() == 1); 6261 ASSERT(args.length() == 1);
6262 6262
6263 Object* number = args[0]; 6263 Object* number = args[0];
6264 RUNTIME_ASSERT(number->IsNumber()); 6264 RUNTIME_ASSERT(number->IsNumber());
6265 6265
6266 return isolate->heap()->NumberToString(number); 6266 return isolate->heap()->NumberToString(number);
6267 } 6267 }
6268 6268
6269 6269
6270 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToStringSkipCache) { 6270 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToStringSkipCache) {
6271 NoHandleAllocation ha(isolate); 6271 SealHandleScope shs(isolate);
6272 ASSERT(args.length() == 1); 6272 ASSERT(args.length() == 1);
6273 6273
6274 Object* number = args[0]; 6274 Object* number = args[0];
6275 RUNTIME_ASSERT(number->IsNumber()); 6275 RUNTIME_ASSERT(number->IsNumber());
6276 6276
6277 return isolate->heap()->NumberToString( 6277 return isolate->heap()->NumberToString(
6278 number, false, isolate->heap()->GetPretenureMode()); 6278 number, false, isolate->heap()->GetPretenureMode());
6279 } 6279 }
6280 6280
6281 6281
6282 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToInteger) { 6282 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToInteger) {
6283 NoHandleAllocation ha(isolate); 6283 SealHandleScope shs(isolate);
6284 ASSERT(args.length() == 1); 6284 ASSERT(args.length() == 1);
6285 6285
6286 CONVERT_DOUBLE_ARG_CHECKED(number, 0); 6286 CONVERT_DOUBLE_ARG_CHECKED(number, 0);
6287 6287
6288 // We do not include 0 so that we don't have to treat +0 / -0 cases. 6288 // We do not include 0 so that we don't have to treat +0 / -0 cases.
6289 if (number > 0 && number <= Smi::kMaxValue) { 6289 if (number > 0 && number <= Smi::kMaxValue) {
6290 return Smi::FromInt(static_cast<int>(number)); 6290 return Smi::FromInt(static_cast<int>(number));
6291 } 6291 }
6292 return isolate->heap()->NumberFromDouble(DoubleToInteger(number)); 6292 return isolate->heap()->NumberFromDouble(DoubleToInteger(number));
6293 } 6293 }
6294 6294
6295 6295
6296 // ES6 draft 9.1.11 6296 // ES6 draft 9.1.11
6297 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToPositiveInteger) { 6297 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToPositiveInteger) {
6298 NoHandleAllocation ha(isolate); 6298 SealHandleScope shs(isolate);
6299 ASSERT(args.length() == 1); 6299 ASSERT(args.length() == 1);
6300 6300
6301 CONVERT_DOUBLE_ARG_CHECKED(number, 0); 6301 CONVERT_DOUBLE_ARG_CHECKED(number, 0);
6302 6302
6303 // We do not include 0 so that we don't have to treat +0 / -0 cases. 6303 // We do not include 0 so that we don't have to treat +0 / -0 cases.
6304 if (number > 0 && number <= Smi::kMaxValue) { 6304 if (number > 0 && number <= Smi::kMaxValue) {
6305 return Smi::FromInt(static_cast<int>(number)); 6305 return Smi::FromInt(static_cast<int>(number));
6306 } 6306 }
6307 if (number <= 0) { 6307 if (number <= 0) {
6308 return Smi::FromInt(0); 6308 return Smi::FromInt(0);
6309 } 6309 }
6310 return isolate->heap()->NumberFromDouble(DoubleToInteger(number)); 6310 return isolate->heap()->NumberFromDouble(DoubleToInteger(number));
6311 } 6311 }
6312 6312
6313 6313
6314 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToIntegerMapMinusZero) { 6314 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToIntegerMapMinusZero) {
6315 NoHandleAllocation ha(isolate); 6315 SealHandleScope shs(isolate);
6316 ASSERT(args.length() == 1); 6316 ASSERT(args.length() == 1);
6317 6317
6318 CONVERT_DOUBLE_ARG_CHECKED(number, 0); 6318 CONVERT_DOUBLE_ARG_CHECKED(number, 0);
6319 6319
6320 // We do not include 0 so that we don't have to treat +0 / -0 cases. 6320 // We do not include 0 so that we don't have to treat +0 / -0 cases.
6321 if (number > 0 && number <= Smi::kMaxValue) { 6321 if (number > 0 && number <= Smi::kMaxValue) {
6322 return Smi::FromInt(static_cast<int>(number)); 6322 return Smi::FromInt(static_cast<int>(number));
6323 } 6323 }
6324 6324
6325 double double_value = DoubleToInteger(number); 6325 double double_value = DoubleToInteger(number);
6326 // Map both -0 and +0 to +0. 6326 // Map both -0 and +0 to +0.
6327 if (double_value == 0) double_value = 0; 6327 if (double_value == 0) double_value = 0;
6328 6328
6329 return isolate->heap()->NumberFromDouble(double_value); 6329 return isolate->heap()->NumberFromDouble(double_value);
6330 } 6330 }
6331 6331
6332 6332
6333 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSUint32) { 6333 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSUint32) {
6334 NoHandleAllocation ha(isolate); 6334 SealHandleScope shs(isolate);
6335 ASSERT(args.length() == 1); 6335 ASSERT(args.length() == 1);
6336 6336
6337 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]); 6337 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]);
6338 return isolate->heap()->NumberFromUint32(number); 6338 return isolate->heap()->NumberFromUint32(number);
6339 } 6339 }
6340 6340
6341 6341
6342 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSInt32) { 6342 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToJSInt32) {
6343 NoHandleAllocation ha(isolate); 6343 SealHandleScope shs(isolate);
6344 ASSERT(args.length() == 1); 6344 ASSERT(args.length() == 1);
6345 6345
6346 CONVERT_DOUBLE_ARG_CHECKED(number, 0); 6346 CONVERT_DOUBLE_ARG_CHECKED(number, 0);
6347 6347
6348 // We do not include 0 so that we don't have to treat +0 / -0 cases. 6348 // We do not include 0 so that we don't have to treat +0 / -0 cases.
6349 if (number > 0 && number <= Smi::kMaxValue) { 6349 if (number > 0 && number <= Smi::kMaxValue) {
6350 return Smi::FromInt(static_cast<int>(number)); 6350 return Smi::FromInt(static_cast<int>(number));
6351 } 6351 }
6352 return isolate->heap()->NumberFromInt32(DoubleToInt32(number)); 6352 return isolate->heap()->NumberFromInt32(DoubleToInt32(number));
6353 } 6353 }
6354 6354
6355 6355
6356 // Converts a Number to a Smi, if possible. Returns NaN if the number is not 6356 // Converts a Number to a Smi, if possible. Returns NaN if the number is not
6357 // a small integer. 6357 // a small integer.
6358 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToSmi) { 6358 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberToSmi) {
6359 NoHandleAllocation ha(isolate); 6359 SealHandleScope shs(isolate);
6360 ASSERT(args.length() == 1); 6360 ASSERT(args.length() == 1);
6361 6361
6362 Object* obj = args[0]; 6362 Object* obj = args[0];
6363 if (obj->IsSmi()) { 6363 if (obj->IsSmi()) {
6364 return obj; 6364 return obj;
6365 } 6365 }
6366 if (obj->IsHeapNumber()) { 6366 if (obj->IsHeapNumber()) {
6367 double value = HeapNumber::cast(obj)->value(); 6367 double value = HeapNumber::cast(obj)->value();
6368 int int_value = FastD2I(value); 6368 int int_value = FastD2I(value);
6369 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) { 6369 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
6370 return Smi::FromInt(int_value); 6370 return Smi::FromInt(int_value);
6371 } 6371 }
6372 } 6372 }
6373 return isolate->heap()->nan_value(); 6373 return isolate->heap()->nan_value();
6374 } 6374 }
6375 6375
6376 6376
6377 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateHeapNumber) { 6377 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateHeapNumber) {
6378 NoHandleAllocation ha(isolate); 6378 SealHandleScope shs(isolate);
6379 ASSERT(args.length() == 0); 6379 ASSERT(args.length() == 0);
6380 return isolate->heap()->AllocateHeapNumber(0); 6380 return isolate->heap()->AllocateHeapNumber(0);
6381 } 6381 }
6382 6382
6383 6383
6384 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAdd) { 6384 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAdd) {
6385 NoHandleAllocation ha(isolate); 6385 SealHandleScope shs(isolate);
6386 ASSERT(args.length() == 2); 6386 ASSERT(args.length() == 2);
6387 6387
6388 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6388 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6389 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6389 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6390 return isolate->heap()->NumberFromDouble(x + y); 6390 return isolate->heap()->NumberFromDouble(x + y);
6391 } 6391 }
6392 6392
6393 6393
6394 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSub) { 6394 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSub) {
6395 NoHandleAllocation ha(isolate); 6395 SealHandleScope shs(isolate);
6396 ASSERT(args.length() == 2); 6396 ASSERT(args.length() == 2);
6397 6397
6398 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6398 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6399 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6399 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6400 return isolate->heap()->NumberFromDouble(x - y); 6400 return isolate->heap()->NumberFromDouble(x - y);
6401 } 6401 }
6402 6402
6403 6403
6404 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMul) { 6404 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMul) {
6405 NoHandleAllocation ha(isolate); 6405 SealHandleScope shs(isolate);
6406 ASSERT(args.length() == 2); 6406 ASSERT(args.length() == 2);
6407 6407
6408 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6408 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6409 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6409 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6410 return isolate->heap()->NumberFromDouble(x * y); 6410 return isolate->heap()->NumberFromDouble(x * y);
6411 } 6411 }
6412 6412
6413 6413
6414 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberUnaryMinus) { 6414 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberUnaryMinus) {
6415 NoHandleAllocation ha(isolate); 6415 SealHandleScope shs(isolate);
6416 ASSERT(args.length() == 1); 6416 ASSERT(args.length() == 1);
6417 6417
6418 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6418 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6419 return isolate->heap()->NumberFromDouble(-x); 6419 return isolate->heap()->NumberFromDouble(-x);
6420 } 6420 }
6421 6421
6422 6422
6423 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAlloc) { 6423 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAlloc) {
6424 NoHandleAllocation ha(isolate); 6424 SealHandleScope shs(isolate);
6425 ASSERT(args.length() == 0); 6425 ASSERT(args.length() == 0);
6426 6426
6427 return isolate->heap()->NumberFromDouble(9876543210.0); 6427 return isolate->heap()->NumberFromDouble(9876543210.0);
6428 } 6428 }
6429 6429
6430 6430
6431 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberDiv) { 6431 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberDiv) {
6432 NoHandleAllocation ha(isolate); 6432 SealHandleScope shs(isolate);
6433 ASSERT(args.length() == 2); 6433 ASSERT(args.length() == 2);
6434 6434
6435 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6435 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6436 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6436 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6437 return isolate->heap()->NumberFromDouble(x / y); 6437 return isolate->heap()->NumberFromDouble(x / y);
6438 } 6438 }
6439 6439
6440 6440
6441 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMod) { 6441 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberMod) {
6442 NoHandleAllocation ha(isolate); 6442 SealHandleScope shs(isolate);
6443 ASSERT(args.length() == 2); 6443 ASSERT(args.length() == 2);
6444 6444
6445 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6445 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6446 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6446 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6447 6447
6448 x = modulo(x, y); 6448 x = modulo(x, y);
6449 // NumberFromDouble may return a Smi instead of a Number object 6449 // NumberFromDouble may return a Smi instead of a Number object
6450 return isolate->heap()->NumberFromDouble(x); 6450 return isolate->heap()->NumberFromDouble(x);
6451 } 6451 }
6452 6452
6453 6453
6454 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberImul) { 6454 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberImul) {
6455 NoHandleAllocation ha(isolate); 6455 SealHandleScope shs(isolate);
6456 ASSERT(args.length() == 2); 6456 ASSERT(args.length() == 2);
6457 6457
6458 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6458 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6459 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6459 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6460 return isolate->heap()->NumberFromInt32(x * y); 6460 return isolate->heap()->NumberFromInt32(x * y);
6461 } 6461 }
6462 6462
6463 6463
6464 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) { 6464 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) {
6465 NoHandleAllocation ha(isolate); 6465 SealHandleScope shs(isolate);
6466 ASSERT(args.length() == 2); 6466 ASSERT(args.length() == 2);
6467 CONVERT_ARG_CHECKED(String, str1, 0); 6467 CONVERT_ARG_CHECKED(String, str1, 0);
6468 CONVERT_ARG_CHECKED(String, str2, 1); 6468 CONVERT_ARG_CHECKED(String, str2, 1);
6469 isolate->counters()->string_add_runtime()->Increment(); 6469 isolate->counters()->string_add_runtime()->Increment();
6470 return isolate->heap()->AllocateConsString(str1, str2); 6470 return isolate->heap()->AllocateConsString(str1, str2);
6471 } 6471 }
6472 6472
6473 6473
6474 template <typename sinkchar> 6474 template <typename sinkchar>
6475 static inline void StringBuilderConcatHelper(String* special, 6475 static inline void StringBuilderConcatHelper(String* special,
(...skipping 28 matching lines...) Expand all
6504 String* string = String::cast(element); 6504 String* string = String::cast(element);
6505 int element_length = string->length(); 6505 int element_length = string->length();
6506 String::WriteToFlat(string, sink + position, 0, element_length); 6506 String::WriteToFlat(string, sink + position, 0, element_length);
6507 position += element_length; 6507 position += element_length;
6508 } 6508 }
6509 } 6509 }
6510 } 6510 }
6511 6511
6512 6512
6513 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) { 6513 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) {
6514 NoHandleAllocation ha(isolate); 6514 SealHandleScope shs(isolate);
6515 ASSERT(args.length() == 3); 6515 ASSERT(args.length() == 3);
6516 CONVERT_ARG_CHECKED(JSArray, array, 0); 6516 CONVERT_ARG_CHECKED(JSArray, array, 0);
6517 if (!args[1]->IsSmi()) { 6517 if (!args[1]->IsSmi()) {
6518 isolate->context()->mark_out_of_memory(); 6518 isolate->context()->mark_out_of_memory();
6519 return Failure::OutOfMemoryException(0x14); 6519 return Failure::OutOfMemoryException(0x14);
6520 } 6520 }
6521 int array_length = args.smi_at(1); 6521 int array_length = args.smi_at(1);
6522 CONVERT_ARG_CHECKED(String, special, 2); 6522 CONVERT_ARG_CHECKED(String, special, 2);
6523 6523
6524 // This assumption is used by the slice encoding in one or two smis. 6524 // This assumption is used by the slice encoding in one or two smis.
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
6621 StringBuilderConcatHelper(special, 6621 StringBuilderConcatHelper(special,
6622 answer->GetChars(), 6622 answer->GetChars(),
6623 fixed_array, 6623 fixed_array,
6624 array_length); 6624 array_length);
6625 return answer; 6625 return answer;
6626 } 6626 }
6627 } 6627 }
6628 6628
6629 6629
6630 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) { 6630 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) {
6631 NoHandleAllocation ha(isolate); 6631 SealHandleScope shs(isolate);
6632 ASSERT(args.length() == 3); 6632 ASSERT(args.length() == 3);
6633 CONVERT_ARG_CHECKED(JSArray, array, 0); 6633 CONVERT_ARG_CHECKED(JSArray, array, 0);
6634 if (!args[1]->IsSmi()) { 6634 if (!args[1]->IsSmi()) {
6635 isolate->context()->mark_out_of_memory(); 6635 isolate->context()->mark_out_of_memory();
6636 return Failure::OutOfMemoryException(0x16); 6636 return Failure::OutOfMemoryException(0x16);
6637 } 6637 }
6638 int array_length = args.smi_at(1); 6638 int array_length = args.smi_at(1);
6639 CONVERT_ARG_CHECKED(String, separator, 2); 6639 CONVERT_ARG_CHECKED(String, separator, 2);
6640 6640
6641 if (!array->HasFastObjectElements()) { 6641 if (!array->HasFastObjectElements()) {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
6746 0, separator_length); 6746 0, separator_length);
6747 cursor += separator_length; 6747 cursor += separator_length;
6748 previous_separator_position++; 6748 previous_separator_position++;
6749 } 6749 }
6750 } 6750 }
6751 ASSERT(cursor <= buffer.length()); 6751 ASSERT(cursor <= buffer.length());
6752 } 6752 }
6753 6753
6754 6754
6755 RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) { 6755 RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) {
6756 NoHandleAllocation ha(isolate); 6756 SealHandleScope shs(isolate);
6757 ASSERT(args.length() == 3); 6757 ASSERT(args.length() == 3);
6758 CONVERT_ARG_CHECKED(JSArray, elements_array, 0); 6758 CONVERT_ARG_CHECKED(JSArray, elements_array, 0);
6759 RUNTIME_ASSERT(elements_array->HasFastSmiOrObjectElements()); 6759 RUNTIME_ASSERT(elements_array->HasFastSmiOrObjectElements());
6760 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]); 6760 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]);
6761 CONVERT_ARG_CHECKED(String, separator, 2); 6761 CONVERT_ARG_CHECKED(String, separator, 2);
6762 // elements_array is fast-mode JSarray of alternating positions 6762 // elements_array is fast-mode JSarray of alternating positions
6763 // (increasing order) and strings. 6763 // (increasing order) and strings.
6764 // array_length is length of original array (used to add separators); 6764 // array_length is length of original array (used to add separators);
6765 // separator is string to put between elements. Assumed to be non-empty. 6765 // separator is string to put between elements. Assumed to be non-empty.
6766 6766
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
6842 array_length, 6842 array_length,
6843 separator, 6843 separator,
6844 Vector<uc16>(result_string->GetChars(), 6844 Vector<uc16>(result_string->GetChars(),
6845 string_length)); 6845 string_length));
6846 return result_string; 6846 return result_string;
6847 } 6847 }
6848 } 6848 }
6849 6849
6850 6850
6851 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberOr) { 6851 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberOr) {
6852 NoHandleAllocation ha(isolate); 6852 SealHandleScope shs(isolate);
6853 ASSERT(args.length() == 2); 6853 ASSERT(args.length() == 2);
6854 6854
6855 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6855 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6856 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6856 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6857 return isolate->heap()->NumberFromInt32(x | y); 6857 return isolate->heap()->NumberFromInt32(x | y);
6858 } 6858 }
6859 6859
6860 6860
6861 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAnd) { 6861 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberAnd) {
6862 NoHandleAllocation ha(isolate); 6862 SealHandleScope shs(isolate);
6863 ASSERT(args.length() == 2); 6863 ASSERT(args.length() == 2);
6864 6864
6865 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6865 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6866 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6866 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6867 return isolate->heap()->NumberFromInt32(x & y); 6867 return isolate->heap()->NumberFromInt32(x & y);
6868 } 6868 }
6869 6869
6870 6870
6871 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberXor) { 6871 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberXor) {
6872 NoHandleAllocation ha(isolate); 6872 SealHandleScope shs(isolate);
6873 ASSERT(args.length() == 2); 6873 ASSERT(args.length() == 2);
6874 6874
6875 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6875 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6876 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6876 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6877 return isolate->heap()->NumberFromInt32(x ^ y); 6877 return isolate->heap()->NumberFromInt32(x ^ y);
6878 } 6878 }
6879 6879
6880 6880
6881 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberNot) { 6881 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberNot) {
6882 NoHandleAllocation ha(isolate); 6882 SealHandleScope shs(isolate);
6883 ASSERT(args.length() == 1); 6883 ASSERT(args.length() == 1);
6884 6884
6885 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6885 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6886 return isolate->heap()->NumberFromInt32(~x); 6886 return isolate->heap()->NumberFromInt32(~x);
6887 } 6887 }
6888 6888
6889 6889
6890 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShl) { 6890 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShl) {
6891 NoHandleAllocation ha(isolate); 6891 SealHandleScope shs(isolate);
6892 ASSERT(args.length() == 2); 6892 ASSERT(args.length() == 2);
6893 6893
6894 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6894 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6895 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6895 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6896 return isolate->heap()->NumberFromInt32(x << (y & 0x1f)); 6896 return isolate->heap()->NumberFromInt32(x << (y & 0x1f));
6897 } 6897 }
6898 6898
6899 6899
6900 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShr) { 6900 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberShr) {
6901 NoHandleAllocation ha(isolate); 6901 SealHandleScope shs(isolate);
6902 ASSERT(args.length() == 2); 6902 ASSERT(args.length() == 2);
6903 6903
6904 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]); 6904 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]);
6905 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6905 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6906 return isolate->heap()->NumberFromUint32(x >> (y & 0x1f)); 6906 return isolate->heap()->NumberFromUint32(x >> (y & 0x1f));
6907 } 6907 }
6908 6908
6909 6909
6910 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSar) { 6910 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberSar) {
6911 NoHandleAllocation ha(isolate); 6911 SealHandleScope shs(isolate);
6912 ASSERT(args.length() == 2); 6912 ASSERT(args.length() == 2);
6913 6913
6914 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 6914 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
6915 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 6915 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
6916 return isolate->heap()->NumberFromInt32(ArithmeticShiftRight(x, y & 0x1f)); 6916 return isolate->heap()->NumberFromInt32(ArithmeticShiftRight(x, y & 0x1f));
6917 } 6917 }
6918 6918
6919 6919
6920 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberEquals) { 6920 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberEquals) {
6921 NoHandleAllocation ha(isolate); 6921 SealHandleScope shs(isolate);
6922 ASSERT(args.length() == 2); 6922 ASSERT(args.length() == 2);
6923 6923
6924 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6924 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6925 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6925 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6926 if (std::isnan(x)) return Smi::FromInt(NOT_EQUAL); 6926 if (std::isnan(x)) return Smi::FromInt(NOT_EQUAL);
6927 if (std::isnan(y)) return Smi::FromInt(NOT_EQUAL); 6927 if (std::isnan(y)) return Smi::FromInt(NOT_EQUAL);
6928 if (x == y) return Smi::FromInt(EQUAL); 6928 if (x == y) return Smi::FromInt(EQUAL);
6929 Object* result; 6929 Object* result;
6930 if ((fpclassify(x) == FP_ZERO) && (fpclassify(y) == FP_ZERO)) { 6930 if ((fpclassify(x) == FP_ZERO) && (fpclassify(y) == FP_ZERO)) {
6931 result = Smi::FromInt(EQUAL); 6931 result = Smi::FromInt(EQUAL);
6932 } else { 6932 } else {
6933 result = Smi::FromInt(NOT_EQUAL); 6933 result = Smi::FromInt(NOT_EQUAL);
6934 } 6934 }
6935 return result; 6935 return result;
6936 } 6936 }
6937 6937
6938 6938
6939 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringEquals) { 6939 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringEquals) {
6940 NoHandleAllocation ha(isolate); 6940 SealHandleScope shs(isolate);
6941 ASSERT(args.length() == 2); 6941 ASSERT(args.length() == 2);
6942 6942
6943 CONVERT_ARG_CHECKED(String, x, 0); 6943 CONVERT_ARG_CHECKED(String, x, 0);
6944 CONVERT_ARG_CHECKED(String, y, 1); 6944 CONVERT_ARG_CHECKED(String, y, 1);
6945 6945
6946 bool not_equal = !x->Equals(y); 6946 bool not_equal = !x->Equals(y);
6947 // This is slightly convoluted because the value that signifies 6947 // This is slightly convoluted because the value that signifies
6948 // equality is 0 and inequality is 1 so we have to negate the result 6948 // equality is 0 and inequality is 1 so we have to negate the result
6949 // from String::Equals. 6949 // from String::Equals.
6950 ASSERT(not_equal == 0 || not_equal == 1); 6950 ASSERT(not_equal == 0 || not_equal == 1);
6951 STATIC_CHECK(EQUAL == 0); 6951 STATIC_CHECK(EQUAL == 0);
6952 STATIC_CHECK(NOT_EQUAL == 1); 6952 STATIC_CHECK(NOT_EQUAL == 1);
6953 return Smi::FromInt(not_equal); 6953 return Smi::FromInt(not_equal);
6954 } 6954 }
6955 6955
6956 6956
6957 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberCompare) { 6957 RUNTIME_FUNCTION(MaybeObject*, Runtime_NumberCompare) {
6958 NoHandleAllocation ha(isolate); 6958 SealHandleScope shs(isolate);
6959 ASSERT(args.length() == 3); 6959 ASSERT(args.length() == 3);
6960 6960
6961 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6961 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6962 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6962 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6963 if (std::isnan(x) || std::isnan(y)) return args[2]; 6963 if (std::isnan(x) || std::isnan(y)) return args[2];
6964 if (x == y) return Smi::FromInt(EQUAL); 6964 if (x == y) return Smi::FromInt(EQUAL);
6965 if (isless(x, y)) return Smi::FromInt(LESS); 6965 if (isless(x, y)) return Smi::FromInt(LESS);
6966 return Smi::FromInt(GREATER); 6966 return Smi::FromInt(GREATER);
6967 } 6967 }
6968 6968
6969 6969
6970 // Compare two Smis as if they were converted to strings and then 6970 // Compare two Smis as if they were converted to strings and then
6971 // compared lexicographically. 6971 // compared lexicographically.
6972 RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) { 6972 RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) {
6973 NoHandleAllocation ha(isolate); 6973 SealHandleScope shs(isolate);
6974 ASSERT(args.length() == 2); 6974 ASSERT(args.length() == 2);
6975 CONVERT_SMI_ARG_CHECKED(x_value, 0); 6975 CONVERT_SMI_ARG_CHECKED(x_value, 0);
6976 CONVERT_SMI_ARG_CHECKED(y_value, 1); 6976 CONVERT_SMI_ARG_CHECKED(y_value, 1);
6977 6977
6978 // If the integers are equal so are the string representations. 6978 // If the integers are equal so are the string representations.
6979 if (x_value == y_value) return Smi::FromInt(EQUAL); 6979 if (x_value == y_value) return Smi::FromInt(EQUAL);
6980 6980
6981 // If one of the integers is zero the normal integer order is the 6981 // If one of the integers is zero the normal integer order is the
6982 // same as the lexicographic order of the string representations. 6982 // same as the lexicographic order of the string representations.
6983 if (x_value == 0 || y_value == 0) 6983 if (x_value == 0 || y_value == 0)
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
7067 ASSERT(y->IsFlat()); 7067 ASSERT(y->IsFlat());
7068 Object* equal_prefix_result = Smi::FromInt(EQUAL); 7068 Object* equal_prefix_result = Smi::FromInt(EQUAL);
7069 int prefix_length = x->length(); 7069 int prefix_length = x->length();
7070 if (y->length() < prefix_length) { 7070 if (y->length() < prefix_length) {
7071 prefix_length = y->length(); 7071 prefix_length = y->length();
7072 equal_prefix_result = Smi::FromInt(GREATER); 7072 equal_prefix_result = Smi::FromInt(GREATER);
7073 } else if (y->length() > prefix_length) { 7073 } else if (y->length() > prefix_length) {
7074 equal_prefix_result = Smi::FromInt(LESS); 7074 equal_prefix_result = Smi::FromInt(LESS);
7075 } 7075 }
7076 int r; 7076 int r;
7077 AssertNoAllocation no_gc; 7077 DisallowHeapAllocation no_gc;
7078 String::FlatContent x_content = x->GetFlatContent(); 7078 String::FlatContent x_content = x->GetFlatContent();
7079 String::FlatContent y_content = y->GetFlatContent(); 7079 String::FlatContent y_content = y->GetFlatContent();
7080 if (x_content.IsAscii()) { 7080 if (x_content.IsAscii()) {
7081 Vector<const uint8_t> x_chars = x_content.ToOneByteVector(); 7081 Vector<const uint8_t> x_chars = x_content.ToOneByteVector();
7082 if (y_content.IsAscii()) { 7082 if (y_content.IsAscii()) {
7083 Vector<const uint8_t> y_chars = y_content.ToOneByteVector(); 7083 Vector<const uint8_t> y_chars = y_content.ToOneByteVector();
7084 r = CompareChars(x_chars.start(), y_chars.start(), prefix_length); 7084 r = CompareChars(x_chars.start(), y_chars.start(), prefix_length);
7085 } else { 7085 } else {
7086 Vector<const uc16> y_chars = y_content.ToUC16Vector(); 7086 Vector<const uc16> y_chars = y_content.ToUC16Vector();
7087 r = CompareChars(x_chars.start(), y_chars.start(), prefix_length); 7087 r = CompareChars(x_chars.start(), y_chars.start(), prefix_length);
(...skipping 14 matching lines...) Expand all
7102 } else { 7102 } else {
7103 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER); 7103 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER);
7104 } 7104 }
7105 ASSERT(result == 7105 ASSERT(result ==
7106 StringCharacterStreamCompare(Isolate::Current()->runtime_state(), x, y)); 7106 StringCharacterStreamCompare(Isolate::Current()->runtime_state(), x, y));
7107 return result; 7107 return result;
7108 } 7108 }
7109 7109
7110 7110
7111 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) { 7111 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) {
7112 NoHandleAllocation ha(isolate); 7112 SealHandleScope shs(isolate);
7113 ASSERT(args.length() == 2); 7113 ASSERT(args.length() == 2);
7114 7114
7115 CONVERT_ARG_CHECKED(String, x, 0); 7115 CONVERT_ARG_CHECKED(String, x, 0);
7116 CONVERT_ARG_CHECKED(String, y, 1); 7116 CONVERT_ARG_CHECKED(String, y, 1);
7117 7117
7118 isolate->counters()->string_compare_runtime()->Increment(); 7118 isolate->counters()->string_compare_runtime()->Increment();
7119 7119
7120 // A few fast case tests before we flatten. 7120 // A few fast case tests before we flatten.
7121 if (x == y) return Smi::FromInt(EQUAL); 7121 if (x == y) return Smi::FromInt(EQUAL);
7122 if (y->length() == 0) { 7122 if (y->length() == 0) {
(...skipping 14 matching lines...) Expand all
7137 { MaybeObject* maybe_obj = isolate->heap()->PrepareForCompare(y); 7137 { MaybeObject* maybe_obj = isolate->heap()->PrepareForCompare(y);
7138 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 7138 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
7139 } 7139 }
7140 7140
7141 return (x->IsFlat() && y->IsFlat()) ? FlatStringCompare(x, y) 7141 return (x->IsFlat() && y->IsFlat()) ? FlatStringCompare(x, y)
7142 : StringCharacterStreamCompare(isolate->runtime_state(), x, y); 7142 : StringCharacterStreamCompare(isolate->runtime_state(), x, y);
7143 } 7143 }
7144 7144
7145 7145
7146 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_acos) { 7146 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_acos) {
7147 NoHandleAllocation ha(isolate); 7147 SealHandleScope shs(isolate);
7148 ASSERT(args.length() == 1); 7148 ASSERT(args.length() == 1);
7149 isolate->counters()->math_acos()->Increment(); 7149 isolate->counters()->math_acos()->Increment();
7150 7150
7151 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7151 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7152 return isolate->transcendental_cache()->Get(TranscendentalCache::ACOS, x); 7152 return isolate->transcendental_cache()->Get(TranscendentalCache::ACOS, x);
7153 } 7153 }
7154 7154
7155 7155
7156 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_asin) { 7156 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_asin) {
7157 NoHandleAllocation ha(isolate); 7157 SealHandleScope shs(isolate);
7158 ASSERT(args.length() == 1); 7158 ASSERT(args.length() == 1);
7159 isolate->counters()->math_asin()->Increment(); 7159 isolate->counters()->math_asin()->Increment();
7160 7160
7161 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7161 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7162 return isolate->transcendental_cache()->Get(TranscendentalCache::ASIN, x); 7162 return isolate->transcendental_cache()->Get(TranscendentalCache::ASIN, x);
7163 } 7163 }
7164 7164
7165 7165
7166 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan) { 7166 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan) {
7167 NoHandleAllocation ha(isolate); 7167 SealHandleScope shs(isolate);
7168 ASSERT(args.length() == 1); 7168 ASSERT(args.length() == 1);
7169 isolate->counters()->math_atan()->Increment(); 7169 isolate->counters()->math_atan()->Increment();
7170 7170
7171 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7171 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7172 return isolate->transcendental_cache()->Get(TranscendentalCache::ATAN, x); 7172 return isolate->transcendental_cache()->Get(TranscendentalCache::ATAN, x);
7173 } 7173 }
7174 7174
7175 7175
7176 static const double kPiDividedBy4 = 0.78539816339744830962; 7176 static const double kPiDividedBy4 = 0.78539816339744830962;
7177 7177
7178 7178
7179 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan2) { 7179 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan2) {
7180 NoHandleAllocation ha(isolate); 7180 SealHandleScope shs(isolate);
7181 ASSERT(args.length() == 2); 7181 ASSERT(args.length() == 2);
7182 isolate->counters()->math_atan2()->Increment(); 7182 isolate->counters()->math_atan2()->Increment();
7183 7183
7184 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7184 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7185 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7185 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7186 double result; 7186 double result;
7187 if (std::isinf(x) && std::isinf(y)) { 7187 if (std::isinf(x) && std::isinf(y)) {
7188 // Make sure that the result in case of two infinite arguments 7188 // Make sure that the result in case of two infinite arguments
7189 // is a multiple of Pi / 4. The sign of the result is determined 7189 // is a multiple of Pi / 4. The sign of the result is determined
7190 // by the first argument (x) and the sign of the second argument 7190 // by the first argument (x) and the sign of the second argument
7191 // determines the multiplier: one or three. 7191 // determines the multiplier: one or three.
7192 int multiplier = (x < 0) ? -1 : 1; 7192 int multiplier = (x < 0) ? -1 : 1;
7193 if (y < 0) multiplier *= 3; 7193 if (y < 0) multiplier *= 3;
7194 result = multiplier * kPiDividedBy4; 7194 result = multiplier * kPiDividedBy4;
7195 } else { 7195 } else {
7196 result = atan2(x, y); 7196 result = atan2(x, y);
7197 } 7197 }
7198 return isolate->heap()->AllocateHeapNumber(result); 7198 return isolate->heap()->AllocateHeapNumber(result);
7199 } 7199 }
7200 7200
7201 7201
7202 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_ceil) { 7202 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_ceil) {
7203 NoHandleAllocation ha(isolate); 7203 SealHandleScope shs(isolate);
7204 ASSERT(args.length() == 1); 7204 ASSERT(args.length() == 1);
7205 isolate->counters()->math_ceil()->Increment(); 7205 isolate->counters()->math_ceil()->Increment();
7206 7206
7207 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7207 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7208 return isolate->heap()->NumberFromDouble(ceiling(x)); 7208 return isolate->heap()->NumberFromDouble(ceiling(x));
7209 } 7209 }
7210 7210
7211 7211
7212 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_cos) { 7212 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_cos) {
7213 NoHandleAllocation ha(isolate); 7213 SealHandleScope shs(isolate);
7214 ASSERT(args.length() == 1); 7214 ASSERT(args.length() == 1);
7215 isolate->counters()->math_cos()->Increment(); 7215 isolate->counters()->math_cos()->Increment();
7216 7216
7217 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7217 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7218 return isolate->transcendental_cache()->Get(TranscendentalCache::COS, x); 7218 return isolate->transcendental_cache()->Get(TranscendentalCache::COS, x);
7219 } 7219 }
7220 7220
7221 7221
7222 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_exp) { 7222 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_exp) {
7223 NoHandleAllocation ha(isolate); 7223 SealHandleScope shs(isolate);
7224 ASSERT(args.length() == 1); 7224 ASSERT(args.length() == 1);
7225 isolate->counters()->math_exp()->Increment(); 7225 isolate->counters()->math_exp()->Increment();
7226 7226
7227 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7227 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7228 lazily_initialize_fast_exp(); 7228 lazily_initialize_fast_exp();
7229 return isolate->heap()->NumberFromDouble(fast_exp(x)); 7229 return isolate->heap()->NumberFromDouble(fast_exp(x));
7230 } 7230 }
7231 7231
7232 7232
7233 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_floor) { 7233 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_floor) {
7234 NoHandleAllocation ha(isolate); 7234 SealHandleScope shs(isolate);
7235 ASSERT(args.length() == 1); 7235 ASSERT(args.length() == 1);
7236 isolate->counters()->math_floor()->Increment(); 7236 isolate->counters()->math_floor()->Increment();
7237 7237
7238 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7238 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7239 return isolate->heap()->NumberFromDouble(floor(x)); 7239 return isolate->heap()->NumberFromDouble(floor(x));
7240 } 7240 }
7241 7241
7242 7242
7243 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_log) { 7243 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_log) {
7244 NoHandleAllocation ha(isolate); 7244 SealHandleScope shs(isolate);
7245 ASSERT(args.length() == 1); 7245 ASSERT(args.length() == 1);
7246 isolate->counters()->math_log()->Increment(); 7246 isolate->counters()->math_log()->Increment();
7247 7247
7248 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7248 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7249 return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x); 7249 return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x);
7250 } 7250 }
7251 7251
7252 // Slow version of Math.pow. We check for fast paths for special cases. 7252 // Slow version of Math.pow. We check for fast paths for special cases.
7253 // Used if SSE2/VFP3 is not available. 7253 // Used if SSE2/VFP3 is not available.
7254 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow) { 7254 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow) {
7255 NoHandleAllocation ha(isolate); 7255 SealHandleScope shs(isolate);
7256 ASSERT(args.length() == 2); 7256 ASSERT(args.length() == 2);
7257 isolate->counters()->math_pow()->Increment(); 7257 isolate->counters()->math_pow()->Increment();
7258 7258
7259 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7259 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7260 7260
7261 // If the second argument is a smi, it is much faster to call the 7261 // If the second argument is a smi, it is much faster to call the
7262 // custom powi() function than the generic pow(). 7262 // custom powi() function than the generic pow().
7263 if (args[1]->IsSmi()) { 7263 if (args[1]->IsSmi()) {
7264 int y = args.smi_at(1); 7264 int y = args.smi_at(1);
7265 return isolate->heap()->NumberFromDouble(power_double_int(x, y)); 7265 return isolate->heap()->NumberFromDouble(power_double_int(x, y));
7266 } 7266 }
7267 7267
7268 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7268 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7269 double result = power_helper(x, y); 7269 double result = power_helper(x, y);
7270 if (std::isnan(result)) return isolate->heap()->nan_value(); 7270 if (std::isnan(result)) return isolate->heap()->nan_value();
7271 return isolate->heap()->AllocateHeapNumber(result); 7271 return isolate->heap()->AllocateHeapNumber(result);
7272 } 7272 }
7273 7273
7274 // Fast version of Math.pow if we know that y is not an integer and y is not 7274 // Fast version of Math.pow if we know that y is not an integer and y is not
7275 // -0.5 or 0.5. Used as slow case from full codegen. 7275 // -0.5 or 0.5. Used as slow case from full codegen.
7276 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow_cfunction) { 7276 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow_cfunction) {
7277 NoHandleAllocation ha(isolate); 7277 SealHandleScope shs(isolate);
7278 ASSERT(args.length() == 2); 7278 ASSERT(args.length() == 2);
7279 isolate->counters()->math_pow()->Increment(); 7279 isolate->counters()->math_pow()->Increment();
7280 7280
7281 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7281 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7282 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7282 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7283 if (y == 0) { 7283 if (y == 0) {
7284 return Smi::FromInt(1); 7284 return Smi::FromInt(1);
7285 } else { 7285 } else {
7286 double result = power_double_double(x, y); 7286 double result = power_double_double(x, y);
7287 if (std::isnan(result)) return isolate->heap()->nan_value(); 7287 if (std::isnan(result)) return isolate->heap()->nan_value();
7288 return isolate->heap()->AllocateHeapNumber(result); 7288 return isolate->heap()->AllocateHeapNumber(result);
7289 } 7289 }
7290 } 7290 }
7291 7291
7292 7292
7293 RUNTIME_FUNCTION(MaybeObject*, Runtime_RoundNumber) { 7293 RUNTIME_FUNCTION(MaybeObject*, Runtime_RoundNumber) {
7294 NoHandleAllocation ha(isolate); 7294 SealHandleScope shs(isolate);
7295 ASSERT(args.length() == 1); 7295 ASSERT(args.length() == 1);
7296 isolate->counters()->math_round()->Increment(); 7296 isolate->counters()->math_round()->Increment();
7297 7297
7298 if (!args[0]->IsHeapNumber()) { 7298 if (!args[0]->IsHeapNumber()) {
7299 // Must be smi. Return the argument unchanged for all the other types 7299 // Must be smi. Return the argument unchanged for all the other types
7300 // to make fuzz-natives test happy. 7300 // to make fuzz-natives test happy.
7301 return args[0]; 7301 return args[0];
7302 } 7302 }
7303 7303
7304 HeapNumber* number = reinterpret_cast<HeapNumber*>(args[0]); 7304 HeapNumber* number = reinterpret_cast<HeapNumber*>(args[0]);
(...skipping 22 matching lines...) Expand all
7327 } 7327 }
7328 7328
7329 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value(); 7329 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value();
7330 7330
7331 // Do not call NumberFromDouble() to avoid extra checks. 7331 // Do not call NumberFromDouble() to avoid extra checks.
7332 return isolate->heap()->AllocateHeapNumber(floor(value + 0.5)); 7332 return isolate->heap()->AllocateHeapNumber(floor(value + 0.5));
7333 } 7333 }
7334 7334
7335 7335
7336 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sin) { 7336 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sin) {
7337 NoHandleAllocation ha(isolate); 7337 SealHandleScope shs(isolate);
7338 ASSERT(args.length() == 1); 7338 ASSERT(args.length() == 1);
7339 isolate->counters()->math_sin()->Increment(); 7339 isolate->counters()->math_sin()->Increment();
7340 7340
7341 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7341 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7342 return isolate->transcendental_cache()->Get(TranscendentalCache::SIN, x); 7342 return isolate->transcendental_cache()->Get(TranscendentalCache::SIN, x);
7343 } 7343 }
7344 7344
7345 7345
7346 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sqrt) { 7346 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sqrt) {
7347 NoHandleAllocation ha(isolate); 7347 SealHandleScope shs(isolate);
7348 ASSERT(args.length() == 1); 7348 ASSERT(args.length() == 1);
7349 isolate->counters()->math_sqrt()->Increment(); 7349 isolate->counters()->math_sqrt()->Increment();
7350 7350
7351 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7351 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7352 return isolate->heap()->AllocateHeapNumber(fast_sqrt(x)); 7352 return isolate->heap()->AllocateHeapNumber(fast_sqrt(x));
7353 } 7353 }
7354 7354
7355 7355
7356 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_tan) { 7356 RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_tan) {
7357 NoHandleAllocation ha(isolate); 7357 SealHandleScope shs(isolate);
7358 ASSERT(args.length() == 1); 7358 ASSERT(args.length() == 1);
7359 isolate->counters()->math_tan()->Increment(); 7359 isolate->counters()->math_tan()->Increment();
7360 7360
7361 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7361 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7362 return isolate->transcendental_cache()->Get(TranscendentalCache::TAN, x); 7362 return isolate->transcendental_cache()->Get(TranscendentalCache::TAN, x);
7363 } 7363 }
7364 7364
7365 7365
7366 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) { 7366 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) {
7367 NoHandleAllocation ha(isolate); 7367 SealHandleScope shs(isolate);
7368 ASSERT(args.length() == 2); 7368 ASSERT(args.length() == 2);
7369 7369
7370 CONVERT_SMI_ARG_CHECKED(year, 0); 7370 CONVERT_SMI_ARG_CHECKED(year, 0);
7371 CONVERT_SMI_ARG_CHECKED(month, 1); 7371 CONVERT_SMI_ARG_CHECKED(month, 1);
7372 7372
7373 return Smi::FromInt(isolate->date_cache()->DaysFromYearMonth(year, month)); 7373 return Smi::FromInt(isolate->date_cache()->DaysFromYearMonth(year, month));
7374 } 7374 }
7375 7375
7376 7376
7377 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateSetValue) { 7377 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateSetValue) {
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
7500 for (int i = 0; i < argument_count; ++i) { 7500 for (int i = 0; i < argument_count; ++i) {
7501 elements->set(i, *(parameters - i - 1)); 7501 elements->set(i, *(parameters - i - 1));
7502 } 7502 }
7503 } 7503 }
7504 } 7504 }
7505 return *result; 7505 return *result;
7506 } 7506 }
7507 7507
7508 7508
7509 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStrictArgumentsFast) { 7509 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStrictArgumentsFast) {
7510 NoHandleAllocation ha(isolate); 7510 SealHandleScope shs(isolate);
7511 ASSERT(args.length() == 3); 7511 ASSERT(args.length() == 3);
7512 7512
7513 JSFunction* callee = JSFunction::cast(args[0]); 7513 JSFunction* callee = JSFunction::cast(args[0]);
7514 Object** parameters = reinterpret_cast<Object**>(args[1]); 7514 Object** parameters = reinterpret_cast<Object**>(args[1]);
7515 const int length = args.smi_at(2); 7515 const int length = args.smi_at(2);
7516 7516
7517 Object* result; 7517 Object* result;
7518 { MaybeObject* maybe_result = 7518 { MaybeObject* maybe_result =
7519 isolate->heap()->AllocateArgumentsObject(callee, length); 7519 isolate->heap()->AllocateArgumentsObject(callee, length);
7520 if (!maybe_result->ToObject(&result)) return maybe_result; 7520 if (!maybe_result->ToObject(&result)) return maybe_result;
7521 } 7521 }
7522 // Allocate the elements if needed. 7522 // Allocate the elements if needed.
7523 if (length > 0) { 7523 if (length > 0) {
7524 // Allocate the fixed array. 7524 // Allocate the fixed array.
7525 Object* obj; 7525 Object* obj;
7526 { MaybeObject* maybe_obj = isolate->heap()->AllocateRawFixedArray(length); 7526 { MaybeObject* maybe_obj = isolate->heap()->AllocateRawFixedArray(length);
7527 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 7527 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
7528 } 7528 }
7529 7529
7530 AssertNoAllocation no_gc; 7530 DisallowHeapAllocation no_gc;
7531 FixedArray* array = reinterpret_cast<FixedArray*>(obj); 7531 FixedArray* array = reinterpret_cast<FixedArray*>(obj);
7532 array->set_map_no_write_barrier(isolate->heap()->fixed_array_map()); 7532 array->set_map_no_write_barrier(isolate->heap()->fixed_array_map());
7533 array->set_length(length); 7533 array->set_length(length);
7534 7534
7535 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); 7535 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc);
7536 for (int i = 0; i < length; i++) { 7536 for (int i = 0; i < length; i++) {
7537 array->set(i, *--parameters, mode); 7537 array->set(i, *--parameters, mode);
7538 } 7538 }
7539 JSObject::cast(result)->set_elements(FixedArray::cast(obj)); 7539 JSObject::cast(result)->set_elements(FixedArray::cast(obj));
7540 } 7540 }
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
7943 private: 7943 private:
7944 JSFunction* function_; 7944 JSFunction* function_;
7945 bool has_activations_; 7945 bool has_activations_;
7946 }; 7946 };
7947 7947
7948 7948
7949 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyStubFailure) { 7949 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyStubFailure) {
7950 HandleScope scope(isolate); 7950 HandleScope scope(isolate);
7951 ASSERT(args.length() == 0); 7951 ASSERT(args.length() == 0);
7952 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 7952 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
7953 ASSERT(isolate->heap()->IsAllocationAllowed()); 7953 ASSERT(AllowHeapAllocation::IsAllowed());
7954 delete deoptimizer; 7954 delete deoptimizer;
7955 return isolate->heap()->undefined_value(); 7955 return isolate->heap()->undefined_value();
7956 } 7956 }
7957 7957
7958 7958
7959 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) { 7959 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyDeoptimized) {
7960 HandleScope scope(isolate); 7960 HandleScope scope(isolate);
7961 ASSERT(args.length() == 1); 7961 ASSERT(args.length() == 1);
7962 RUNTIME_ASSERT(args[0]->IsSmi()); 7962 RUNTIME_ASSERT(args[0]->IsSmi());
7963 Deoptimizer::BailoutType type = 7963 Deoptimizer::BailoutType type =
7964 static_cast<Deoptimizer::BailoutType>(args.smi_at(0)); 7964 static_cast<Deoptimizer::BailoutType>(args.smi_at(0));
7965 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 7965 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
7966 ASSERT(isolate->heap()->IsAllocationAllowed()); 7966 ASSERT(AllowHeapAllocation::IsAllowed());
7967 7967
7968 ASSERT(deoptimizer->compiled_code_kind() == Code::OPTIMIZED_FUNCTION); 7968 ASSERT(deoptimizer->compiled_code_kind() == Code::OPTIMIZED_FUNCTION);
7969 7969
7970 // Make sure to materialize objects before causing any allocation. 7970 // Make sure to materialize objects before causing any allocation.
7971 JavaScriptFrameIterator it(isolate); 7971 JavaScriptFrameIterator it(isolate);
7972 deoptimizer->MaterializeHeapObjects(&it); 7972 deoptimizer->MaterializeHeapObjects(&it);
7973 delete deoptimizer; 7973 delete deoptimizer;
7974 7974
7975 JavaScriptFrame* frame = it.frame(); 7975 JavaScriptFrame* frame = it.frame();
7976 RUNTIME_ASSERT(frame->function()->IsJSFunction()); 7976 RUNTIME_ASSERT(frame->function()->IsJSFunction());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
8017 // Evict optimized code for this function from the cache so that it doesn't 8017 // Evict optimized code for this function from the cache so that it doesn't
8018 // get used for new closures. 8018 // get used for new closures.
8019 function->shared()->EvictFromOptimizedCodeMap(*optimized_code, 8019 function->shared()->EvictFromOptimizedCodeMap(*optimized_code,
8020 "notify deoptimized"); 8020 "notify deoptimized");
8021 8021
8022 return isolate->heap()->undefined_value(); 8022 return isolate->heap()->undefined_value();
8023 } 8023 }
8024 8024
8025 8025
8026 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyOSR) { 8026 RUNTIME_FUNCTION(MaybeObject*, Runtime_NotifyOSR) {
8027 NoHandleAllocation ha(isolate); 8027 SealHandleScope shs(isolate);
8028 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 8028 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
8029 delete deoptimizer; 8029 delete deoptimizer;
8030 return isolate->heap()->undefined_value(); 8030 return isolate->heap()->undefined_value();
8031 } 8031 }
8032 8032
8033 8033
8034 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeoptimizeFunction) { 8034 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeoptimizeFunction) {
8035 HandleScope scope(isolate); 8035 HandleScope scope(isolate);
8036 ASSERT(args.length() == 1); 8036 ASSERT(args.length() == 1);
8037 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8037 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
(...skipping 12 matching lines...) Expand all
8050 Code* unoptimized = function->shared()->code(); 8050 Code* unoptimized = function->shared()->code();
8051 if (unoptimized->kind() == Code::FUNCTION) { 8051 if (unoptimized->kind() == Code::FUNCTION) {
8052 unoptimized->ClearInlineCaches(); 8052 unoptimized->ClearInlineCaches();
8053 unoptimized->ClearTypeFeedbackCells(isolate->heap()); 8053 unoptimized->ClearTypeFeedbackCells(isolate->heap());
8054 } 8054 }
8055 return isolate->heap()->undefined_value(); 8055 return isolate->heap()->undefined_value();
8056 } 8056 }
8057 8057
8058 8058
8059 RUNTIME_FUNCTION(MaybeObject*, Runtime_RunningInSimulator) { 8059 RUNTIME_FUNCTION(MaybeObject*, Runtime_RunningInSimulator) {
8060 NoHandleAllocation ha(isolate); 8060 SealHandleScope shs(isolate);
8061 #if defined(USE_SIMULATOR) 8061 #if defined(USE_SIMULATOR)
8062 return isolate->heap()->true_value(); 8062 return isolate->heap()->true_value();
8063 #else 8063 #else
8064 return isolate->heap()->false_value(); 8064 return isolate->heap()->false_value();
8065 #endif 8065 #endif
8066 } 8066 }
8067 8067
8068 8068
8069 RUNTIME_FUNCTION(MaybeObject*, Runtime_OptimizeFunctionOnNextCall) { 8069 RUNTIME_FUNCTION(MaybeObject*, Runtime_OptimizeFunctionOnNextCall) {
8070 HandleScope scope(isolate); 8070 HandleScope scope(isolate);
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
8249 } else { 8249 } else {
8250 if (function->IsMarkedForLazyRecompilation()) { 8250 if (function->IsMarkedForLazyRecompilation()) {
8251 function->ReplaceCode(function->shared()->code()); 8251 function->ReplaceCode(function->shared()->code());
8252 } 8252 }
8253 return Smi::FromInt(-1); 8253 return Smi::FromInt(-1);
8254 } 8254 }
8255 } 8255 }
8256 8256
8257 8257
8258 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckIsBootstrapping) { 8258 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckIsBootstrapping) {
8259 NoHandleAllocation ha(isolate); 8259 SealHandleScope shs(isolate);
8260 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive()); 8260 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive());
8261 return isolate->heap()->undefined_value(); 8261 return isolate->heap()->undefined_value();
8262 } 8262 }
8263 8263
8264 8264
8265 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetRootNaN) { 8265 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetRootNaN) {
8266 NoHandleAllocation ha(isolate); 8266 SealHandleScope shs(isolate);
8267 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive()); 8267 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive());
8268 return isolate->heap()->nan_value(); 8268 return isolate->heap()->nan_value();
8269 } 8269 }
8270 8270
8271 8271
8272 RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) { 8272 RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) {
8273 HandleScope scope(isolate); 8273 HandleScope scope(isolate);
8274 ASSERT(args.length() >= 2); 8274 ASSERT(args.length() >= 2);
8275 int argc = args.length() - 2; 8275 int argc = args.length() - 2;
8276 CONVERT_ARG_CHECKED(JSReceiver, fun, argc + 1); 8276 CONVERT_ARG_CHECKED(JSReceiver, fun, argc + 1);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
8350 8350
8351 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructorDelegate) { 8351 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructorDelegate) {
8352 HandleScope scope(isolate); 8352 HandleScope scope(isolate);
8353 ASSERT(args.length() == 1); 8353 ASSERT(args.length() == 1);
8354 RUNTIME_ASSERT(!args[0]->IsJSFunction()); 8354 RUNTIME_ASSERT(!args[0]->IsJSFunction());
8355 return *Execution::GetConstructorDelegate(args.at<Object>(0)); 8355 return *Execution::GetConstructorDelegate(args.at<Object>(0));
8356 } 8356 }
8357 8357
8358 8358
8359 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewGlobalContext) { 8359 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewGlobalContext) {
8360 NoHandleAllocation ha(isolate); 8360 SealHandleScope shs(isolate);
8361 ASSERT(args.length() == 2); 8361 ASSERT(args.length() == 2);
8362 8362
8363 CONVERT_ARG_CHECKED(JSFunction, function, 0); 8363 CONVERT_ARG_CHECKED(JSFunction, function, 0);
8364 CONVERT_ARG_CHECKED(ScopeInfo, scope_info, 1); 8364 CONVERT_ARG_CHECKED(ScopeInfo, scope_info, 1);
8365 Context* result; 8365 Context* result;
8366 MaybeObject* maybe_result = 8366 MaybeObject* maybe_result =
8367 isolate->heap()->AllocateGlobalContext(function, scope_info); 8367 isolate->heap()->AllocateGlobalContext(function, scope_info);
8368 if (!maybe_result->To(&result)) return maybe_result; 8368 if (!maybe_result->To(&result)) return maybe_result;
8369 8369
8370 ASSERT(function->context() == isolate->context()); 8370 ASSERT(function->context() == isolate->context());
8371 ASSERT(function->context()->global_object() == result->global_object()); 8371 ASSERT(function->context()->global_object() == result->global_object());
8372 isolate->set_context(result); 8372 isolate->set_context(result);
8373 result->global_object()->set_global_context(result); 8373 result->global_object()->set_global_context(result);
8374 8374
8375 return result; // non-failure 8375 return result; // non-failure
8376 } 8376 }
8377 8377
8378 8378
8379 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewFunctionContext) { 8379 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewFunctionContext) {
8380 NoHandleAllocation ha(isolate); 8380 SealHandleScope shs(isolate);
8381 ASSERT(args.length() == 1); 8381 ASSERT(args.length() == 1);
8382 8382
8383 CONVERT_ARG_CHECKED(JSFunction, function, 0); 8383 CONVERT_ARG_CHECKED(JSFunction, function, 0);
8384 int length = function->shared()->scope_info()->ContextLength(); 8384 int length = function->shared()->scope_info()->ContextLength();
8385 Context* result; 8385 Context* result;
8386 MaybeObject* maybe_result = 8386 MaybeObject* maybe_result =
8387 isolate->heap()->AllocateFunctionContext(length, function); 8387 isolate->heap()->AllocateFunctionContext(length, function);
8388 if (!maybe_result->To(&result)) return maybe_result; 8388 if (!maybe_result->To(&result)) return maybe_result;
8389 8389
8390 isolate->set_context(result); 8390 isolate->set_context(result);
8391 8391
8392 return result; // non-failure 8392 return result; // non-failure
8393 } 8393 }
8394 8394
8395 8395
8396 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushWithContext) { 8396 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushWithContext) {
8397 NoHandleAllocation ha(isolate); 8397 SealHandleScope shs(isolate);
8398 ASSERT(args.length() == 2); 8398 ASSERT(args.length() == 2);
8399 JSObject* extension_object; 8399 JSObject* extension_object;
8400 if (args[0]->IsJSObject()) { 8400 if (args[0]->IsJSObject()) {
8401 extension_object = JSObject::cast(args[0]); 8401 extension_object = JSObject::cast(args[0]);
8402 } else { 8402 } else {
8403 // Convert the object to a proper JavaScript object. 8403 // Convert the object to a proper JavaScript object.
8404 MaybeObject* maybe_js_object = args[0]->ToObject(); 8404 MaybeObject* maybe_js_object = args[0]->ToObject();
8405 if (!maybe_js_object->To(&extension_object)) { 8405 if (!maybe_js_object->To(&extension_object)) {
8406 if (Failure::cast(maybe_js_object)->IsInternalError()) { 8406 if (Failure::cast(maybe_js_object)->IsInternalError()) {
8407 HandleScope scope(isolate); 8407 HandleScope scope(isolate);
(...skipping 23 matching lines...) Expand all
8431 isolate->heap()->AllocateWithContext(function, 8431 isolate->heap()->AllocateWithContext(function,
8432 isolate->context(), 8432 isolate->context(),
8433 extension_object); 8433 extension_object);
8434 if (!maybe_context->To(&context)) return maybe_context; 8434 if (!maybe_context->To(&context)) return maybe_context;
8435 isolate->set_context(context); 8435 isolate->set_context(context);
8436 return context; 8436 return context;
8437 } 8437 }
8438 8438
8439 8439
8440 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushCatchContext) { 8440 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushCatchContext) {
8441 NoHandleAllocation ha(isolate); 8441 SealHandleScope shs(isolate);
8442 ASSERT(args.length() == 3); 8442 ASSERT(args.length() == 3);
8443 String* name = String::cast(args[0]); 8443 String* name = String::cast(args[0]);
8444 Object* thrown_object = args[1]; 8444 Object* thrown_object = args[1];
8445 JSFunction* function; 8445 JSFunction* function;
8446 if (args[2]->IsSmi()) { 8446 if (args[2]->IsSmi()) {
8447 // A smi sentinel indicates a context nested inside global code rather 8447 // A smi sentinel indicates a context nested inside global code rather
8448 // than some function. There is a canonical empty function that can be 8448 // than some function. There is a canonical empty function that can be
8449 // gotten from the native context. 8449 // gotten from the native context.
8450 function = isolate->context()->native_context()->closure(); 8450 function = isolate->context()->native_context()->closure();
8451 } else { 8451 } else {
8452 function = JSFunction::cast(args[2]); 8452 function = JSFunction::cast(args[2]);
8453 } 8453 }
8454 Context* context; 8454 Context* context;
8455 MaybeObject* maybe_context = 8455 MaybeObject* maybe_context =
8456 isolate->heap()->AllocateCatchContext(function, 8456 isolate->heap()->AllocateCatchContext(function,
8457 isolate->context(), 8457 isolate->context(),
8458 name, 8458 name,
8459 thrown_object); 8459 thrown_object);
8460 if (!maybe_context->To(&context)) return maybe_context; 8460 if (!maybe_context->To(&context)) return maybe_context;
8461 isolate->set_context(context); 8461 isolate->set_context(context);
8462 return context; 8462 return context;
8463 } 8463 }
8464 8464
8465 8465
8466 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushBlockContext) { 8466 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushBlockContext) {
8467 NoHandleAllocation ha(isolate); 8467 SealHandleScope shs(isolate);
8468 ASSERT(args.length() == 2); 8468 ASSERT(args.length() == 2);
8469 ScopeInfo* scope_info = ScopeInfo::cast(args[0]); 8469 ScopeInfo* scope_info = ScopeInfo::cast(args[0]);
8470 JSFunction* function; 8470 JSFunction* function;
8471 if (args[1]->IsSmi()) { 8471 if (args[1]->IsSmi()) {
8472 // A smi sentinel indicates a context nested inside global code rather 8472 // A smi sentinel indicates a context nested inside global code rather
8473 // than some function. There is a canonical empty function that can be 8473 // than some function. There is a canonical empty function that can be
8474 // gotten from the native context. 8474 // gotten from the native context.
8475 function = isolate->context()->native_context()->closure(); 8475 function = isolate->context()->native_context()->closure();
8476 } else { 8476 } else {
8477 function = JSFunction::cast(args[1]); 8477 function = JSFunction::cast(args[1]);
8478 } 8478 }
8479 Context* context; 8479 Context* context;
8480 MaybeObject* maybe_context = 8480 MaybeObject* maybe_context =
8481 isolate->heap()->AllocateBlockContext(function, 8481 isolate->heap()->AllocateBlockContext(function,
8482 isolate->context(), 8482 isolate->context(),
8483 scope_info); 8483 scope_info);
8484 if (!maybe_context->To(&context)) return maybe_context; 8484 if (!maybe_context->To(&context)) return maybe_context;
8485 isolate->set_context(context); 8485 isolate->set_context(context);
8486 return context; 8486 return context;
8487 } 8487 }
8488 8488
8489 8489
8490 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSModule) { 8490 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSModule) {
8491 NoHandleAllocation ha(isolate); 8491 SealHandleScope shs(isolate);
8492 ASSERT(args.length() == 1); 8492 ASSERT(args.length() == 1);
8493 Object* obj = args[0]; 8493 Object* obj = args[0];
8494 return isolate->heap()->ToBoolean(obj->IsJSModule()); 8494 return isolate->heap()->ToBoolean(obj->IsJSModule());
8495 } 8495 }
8496 8496
8497 8497
8498 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushModuleContext) { 8498 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushModuleContext) {
8499 NoHandleAllocation ha(isolate); 8499 SealHandleScope shs(isolate);
8500 ASSERT(args.length() == 2); 8500 ASSERT(args.length() == 2);
8501 CONVERT_SMI_ARG_CHECKED(index, 0); 8501 CONVERT_SMI_ARG_CHECKED(index, 0);
8502 8502
8503 if (!args[1]->IsScopeInfo()) { 8503 if (!args[1]->IsScopeInfo()) {
8504 // Module already initialized. Find hosting context and retrieve context. 8504 // Module already initialized. Find hosting context and retrieve context.
8505 Context* host = Context::cast(isolate->context())->global_context(); 8505 Context* host = Context::cast(isolate->context())->global_context();
8506 Context* context = Context::cast(host->get(index)); 8506 Context* context = Context::cast(host->get(index));
8507 ASSERT(context->previous() == isolate->context()); 8507 ASSERT(context->previous() == isolate->context());
8508 isolate->set_context(context); 8508 isolate->set_context(context);
8509 return context; 8509 return context;
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
8873 8873
8874 RUNTIME_FUNCTION(MaybeObject*, Runtime_ReThrow) { 8874 RUNTIME_FUNCTION(MaybeObject*, Runtime_ReThrow) {
8875 HandleScope scope(isolate); 8875 HandleScope scope(isolate);
8876 ASSERT(args.length() == 1); 8876 ASSERT(args.length() == 1);
8877 8877
8878 return isolate->ReThrow(args[0]); 8878 return isolate->ReThrow(args[0]);
8879 } 8879 }
8880 8880
8881 8881
8882 RUNTIME_FUNCTION(MaybeObject*, Runtime_PromoteScheduledException) { 8882 RUNTIME_FUNCTION(MaybeObject*, Runtime_PromoteScheduledException) {
8883 NoHandleAllocation ha(isolate); 8883 SealHandleScope shs(isolate);
8884 ASSERT_EQ(0, args.length()); 8884 ASSERT_EQ(0, args.length());
8885 return isolate->PromoteScheduledException(); 8885 return isolate->PromoteScheduledException();
8886 } 8886 }
8887 8887
8888 8888
8889 RUNTIME_FUNCTION(MaybeObject*, Runtime_ThrowReferenceError) { 8889 RUNTIME_FUNCTION(MaybeObject*, Runtime_ThrowReferenceError) {
8890 HandleScope scope(isolate); 8890 HandleScope scope(isolate);
8891 ASSERT(args.length() == 1); 8891 ASSERT(args.length() == 1);
8892 8892
8893 Handle<Object> name(args[0], isolate); 8893 Handle<Object> name(args[0], isolate);
8894 Handle<Object> reference_error = 8894 Handle<Object> reference_error =
8895 isolate->factory()->NewReferenceError("not_defined", 8895 isolate->factory()->NewReferenceError("not_defined",
8896 HandleVector(&name, 1)); 8896 HandleVector(&name, 1));
8897 return isolate->Throw(*reference_error); 8897 return isolate->Throw(*reference_error);
8898 } 8898 }
8899 8899
8900 8900
8901 RUNTIME_FUNCTION(MaybeObject*, Runtime_ThrowNotDateError) { 8901 RUNTIME_FUNCTION(MaybeObject*, Runtime_ThrowNotDateError) {
8902 HandleScope scope(isolate); 8902 HandleScope scope(isolate);
8903 ASSERT(args.length() == 0); 8903 ASSERT(args.length() == 0);
8904 return isolate->Throw(*isolate->factory()->NewTypeError( 8904 return isolate->Throw(*isolate->factory()->NewTypeError(
8905 "not_date_object", HandleVector<Object>(NULL, 0))); 8905 "not_date_object", HandleVector<Object>(NULL, 0)));
8906 } 8906 }
8907 8907
8908 8908
8909 8909
8910 RUNTIME_FUNCTION(MaybeObject*, Runtime_StackGuard) { 8910 RUNTIME_FUNCTION(MaybeObject*, Runtime_StackGuard) {
8911 NoHandleAllocation ha(isolate); 8911 SealHandleScope shs(isolate);
8912 ASSERT(args.length() == 0); 8912 ASSERT(args.length() == 0);
8913 8913
8914 // First check if this is a real stack overflow. 8914 // First check if this is a real stack overflow.
8915 if (isolate->stack_guard()->IsStackOverflow()) { 8915 if (isolate->stack_guard()->IsStackOverflow()) {
8916 NoHandleAllocation na(isolate); 8916 SealHandleScope shs(isolate);
8917 return isolate->StackOverflow(); 8917 return isolate->StackOverflow();
8918 } 8918 }
8919 8919
8920 return Execution::HandleStackGuardInterrupt(isolate); 8920 return Execution::HandleStackGuardInterrupt(isolate);
8921 } 8921 }
8922 8922
8923 8923
8924 RUNTIME_FUNCTION(MaybeObject*, Runtime_Interrupt) { 8924 RUNTIME_FUNCTION(MaybeObject*, Runtime_Interrupt) {
8925 NoHandleAllocation ha(isolate); 8925 SealHandleScope shs(isolate);
8926 ASSERT(args.length() == 0); 8926 ASSERT(args.length() == 0);
8927 return Execution::HandleStackGuardInterrupt(isolate); 8927 return Execution::HandleStackGuardInterrupt(isolate);
8928 } 8928 }
8929 8929
8930 8930
8931 static int StackSize(Isolate* isolate) { 8931 static int StackSize(Isolate* isolate) {
8932 int n = 0; 8932 int n = 0;
8933 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) n++; 8933 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) n++;
8934 return n; 8934 return n;
8935 } 8935 }
(...skipping 15 matching lines...) Expand all
8951 } else { 8951 } else {
8952 // function result 8952 // function result
8953 PrintF("} -> "); 8953 PrintF("} -> ");
8954 result->ShortPrint(); 8954 result->ShortPrint();
8955 PrintF("\n"); 8955 PrintF("\n");
8956 } 8956 }
8957 } 8957 }
8958 8958
8959 8959
8960 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceEnter) { 8960 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceEnter) {
8961 NoHandleAllocation ha(isolate); 8961 SealHandleScope shs(isolate);
8962 ASSERT(args.length() == 0); 8962 ASSERT(args.length() == 0);
8963 PrintTransition(isolate, NULL); 8963 PrintTransition(isolate, NULL);
8964 return isolate->heap()->undefined_value(); 8964 return isolate->heap()->undefined_value();
8965 } 8965 }
8966 8966
8967 8967
8968 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceExit) { 8968 RUNTIME_FUNCTION(MaybeObject*, Runtime_TraceExit) {
8969 NoHandleAllocation ha(isolate); 8969 SealHandleScope shs(isolate);
8970 PrintTransition(isolate, args[0]); 8970 PrintTransition(isolate, args[0]);
8971 return args[0]; // return TOS 8971 return args[0]; // return TOS
8972 } 8972 }
8973 8973
8974 8974
8975 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrint) { 8975 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPrint) {
8976 NoHandleAllocation ha(isolate); 8976 SealHandleScope shs(isolate);
8977 ASSERT(args.length() == 1); 8977 ASSERT(args.length() == 1);
8978 8978
8979 #ifdef DEBUG 8979 #ifdef DEBUG
8980 if (args[0]->IsString()) { 8980 if (args[0]->IsString()) {
8981 // If we have a string, assume it's a code "marker" 8981 // If we have a string, assume it's a code "marker"
8982 // and print some interesting cpu debugging info. 8982 // and print some interesting cpu debugging info.
8983 JavaScriptFrameIterator it(isolate); 8983 JavaScriptFrameIterator it(isolate);
8984 JavaScriptFrame* frame = it.frame(); 8984 JavaScriptFrame* frame = it.frame();
8985 PrintF("fp = %p, sp = %p, caller_sp = %p: ", 8985 PrintF("fp = %p, sp = %p, caller_sp = %p: ",
8986 frame->fp(), frame->sp(), frame->caller_sp()); 8986 frame->fp(), frame->sp(), frame->caller_sp());
(...skipping 10 matching lines...) Expand all
8997 args[0]->ShortPrint(); 8997 args[0]->ShortPrint();
8998 #endif 8998 #endif
8999 PrintF("\n"); 8999 PrintF("\n");
9000 Flush(); 9000 Flush();
9001 9001
9002 return args[0]; // return TOS 9002 return args[0]; // return TOS
9003 } 9003 }
9004 9004
9005 9005
9006 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugTrace) { 9006 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugTrace) {
9007 NoHandleAllocation ha(isolate); 9007 SealHandleScope shs(isolate);
9008 ASSERT(args.length() == 0); 9008 ASSERT(args.length() == 0);
9009 isolate->PrintStack(stdout); 9009 isolate->PrintStack(stdout);
9010 return isolate->heap()->undefined_value(); 9010 return isolate->heap()->undefined_value();
9011 } 9011 }
9012 9012
9013 9013
9014 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCurrentTime) { 9014 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateCurrentTime) {
9015 NoHandleAllocation ha(isolate); 9015 SealHandleScope shs(isolate);
9016 ASSERT(args.length() == 0); 9016 ASSERT(args.length() == 0);
9017 9017
9018 // According to ECMA-262, section 15.9.1, page 117, the precision of 9018 // According to ECMA-262, section 15.9.1, page 117, the precision of
9019 // the number in a Date object representing a particular instant in 9019 // the number in a Date object representing a particular instant in
9020 // time is milliseconds. Therefore, we floor the result of getting 9020 // time is milliseconds. Therefore, we floor the result of getting
9021 // the OS time. 9021 // the OS time.
9022 double millis = floor(OS::TimeCurrentMillis()); 9022 double millis = floor(OS::TimeCurrentMillis());
9023 return isolate->heap()->NumberFromDouble(millis); 9023 return isolate->heap()->NumberFromDouble(millis);
9024 } 9024 }
9025 9025
9026 9026
9027 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) { 9027 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateParseString) {
9028 HandleScope scope(isolate); 9028 HandleScope scope(isolate);
9029 ASSERT(args.length() == 2); 9029 ASSERT(args.length() == 2);
9030 9030
9031 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); 9031 CONVERT_ARG_HANDLE_CHECKED(String, str, 0);
9032 FlattenString(str); 9032 FlattenString(str);
9033 9033
9034 CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1); 9034 CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1);
9035 9035
9036 MaybeObject* maybe_result_array = 9036 MaybeObject* maybe_result_array =
9037 output->EnsureCanContainHeapObjectElements(); 9037 output->EnsureCanContainHeapObjectElements();
9038 if (maybe_result_array->IsFailure()) return maybe_result_array; 9038 if (maybe_result_array->IsFailure()) return maybe_result_array;
9039 RUNTIME_ASSERT(output->HasFastObjectElements()); 9039 RUNTIME_ASSERT(output->HasFastObjectElements());
9040 9040
9041 AssertNoAllocation no_allocation; 9041 DisallowHeapAllocation no_gc;
9042 9042
9043 FixedArray* output_array = FixedArray::cast(output->elements()); 9043 FixedArray* output_array = FixedArray::cast(output->elements());
9044 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE); 9044 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE);
9045 bool result; 9045 bool result;
9046 String::FlatContent str_content = str->GetFlatContent(); 9046 String::FlatContent str_content = str->GetFlatContent();
9047 if (str_content.IsAscii()) { 9047 if (str_content.IsAscii()) {
9048 result = DateParser::Parse(str_content.ToOneByteVector(), 9048 result = DateParser::Parse(str_content.ToOneByteVector(),
9049 output_array, 9049 output_array,
9050 isolate->unicode_cache()); 9050 isolate->unicode_cache());
9051 } else { 9051 } else {
9052 ASSERT(str_content.IsTwoByte()); 9052 ASSERT(str_content.IsTwoByte());
9053 result = DateParser::Parse(str_content.ToUC16Vector(), 9053 result = DateParser::Parse(str_content.ToUC16Vector(),
9054 output_array, 9054 output_array,
9055 isolate->unicode_cache()); 9055 isolate->unicode_cache());
9056 } 9056 }
9057 9057
9058 if (result) { 9058 if (result) {
9059 return *output; 9059 return *output;
9060 } else { 9060 } else {
9061 return isolate->heap()->null_value(); 9061 return isolate->heap()->null_value();
9062 } 9062 }
9063 } 9063 }
9064 9064
9065 9065
9066 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimezone) { 9066 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimezone) {
9067 NoHandleAllocation ha(isolate); 9067 SealHandleScope shs(isolate);
9068 ASSERT(args.length() == 1); 9068 ASSERT(args.length() == 1);
9069 9069
9070 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 9070 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
9071 int64_t time = isolate->date_cache()->EquivalentTime(static_cast<int64_t>(x)); 9071 int64_t time = isolate->date_cache()->EquivalentTime(static_cast<int64_t>(x));
9072 const char* zone = OS::LocalTimezone(static_cast<double>(time)); 9072 const char* zone = OS::LocalTimezone(static_cast<double>(time));
9073 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone)); 9073 return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone));
9074 } 9074 }
9075 9075
9076 9076
9077 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateToUTC) { 9077 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateToUTC) {
9078 NoHandleAllocation ha(isolate); 9078 SealHandleScope shs(isolate);
9079 ASSERT(args.length() == 1); 9079 ASSERT(args.length() == 1);
9080 9080
9081 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 9081 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
9082 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); 9082 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x));
9083 9083
9084 return isolate->heap()->NumberFromDouble(static_cast<double>(time)); 9084 return isolate->heap()->NumberFromDouble(static_cast<double>(time));
9085 } 9085 }
9086 9086
9087 9087
9088 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalReceiver) { 9088 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalReceiver) {
9089 NoHandleAllocation ha(isolate); 9089 SealHandleScope shs(isolate);
9090 ASSERT(args.length() == 1); 9090 ASSERT(args.length() == 1);
9091 Object* global = args[0]; 9091 Object* global = args[0];
9092 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value(); 9092 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value();
9093 return JSGlobalObject::cast(global)->global_receiver(); 9093 return JSGlobalObject::cast(global)->global_receiver();
9094 } 9094 }
9095 9095
9096 9096
9097 RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) { 9097 RUNTIME_FUNCTION(MaybeObject*, Runtime_ParseJson) {
9098 HandleScope scope(isolate); 9098 HandleScope scope(isolate);
9099 ASSERT_EQ(1, args.length()); 9099 ASSERT_EQ(1, args.length());
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
9228 args.smi_at(4)); 9228 args.smi_at(4));
9229 } 9229 }
9230 9230
9231 9231
9232 static MaybeObject* Allocate(Isolate* isolate, 9232 static MaybeObject* Allocate(Isolate* isolate,
9233 int size, 9233 int size,
9234 AllocationSpace space) { 9234 AllocationSpace space) {
9235 // Allocate a block of memory in the given space (filled with a filler). 9235 // Allocate a block of memory in the given space (filled with a filler).
9236 // Use as fallback for allocation in generated code when the space 9236 // Use as fallback for allocation in generated code when the space
9237 // is full. 9237 // is full.
9238 NoHandleAllocation ha(isolate); 9238 SealHandleScope shs(isolate);
9239 RUNTIME_ASSERT(IsAligned(size, kPointerSize)); 9239 RUNTIME_ASSERT(IsAligned(size, kPointerSize));
9240 RUNTIME_ASSERT(size > 0); 9240 RUNTIME_ASSERT(size > 0);
9241 Heap* heap = isolate->heap(); 9241 Heap* heap = isolate->heap();
9242 RUNTIME_ASSERT(size <= heap->MaxRegularSpaceAllocationSize()); 9242 RUNTIME_ASSERT(size <= heap->MaxRegularSpaceAllocationSize());
9243 Object* allocation; 9243 Object* allocation;
9244 { MaybeObject* maybe_allocation; 9244 { MaybeObject* maybe_allocation;
9245 if (space == NEW_SPACE) { 9245 if (space == NEW_SPACE) {
9246 maybe_allocation = heap->new_space()->AllocateRaw(size); 9246 maybe_allocation = heap->new_space()->AllocateRaw(size);
9247 } else { 9247 } else {
9248 ASSERT(space == OLD_POINTER_SPACE || space == OLD_DATA_SPACE); 9248 ASSERT(space == OLD_POINTER_SPACE || space == OLD_DATA_SPACE);
9249 maybe_allocation = heap->paged_space(space)->AllocateRaw(size); 9249 maybe_allocation = heap->paged_space(space)->AllocateRaw(size);
9250 } 9250 }
9251 if (maybe_allocation->ToObject(&allocation)) { 9251 if (maybe_allocation->ToObject(&allocation)) {
9252 heap->CreateFillerObjectAt(HeapObject::cast(allocation)->address(), size); 9252 heap->CreateFillerObjectAt(HeapObject::cast(allocation)->address(), size);
9253 } 9253 }
9254 return maybe_allocation; 9254 return maybe_allocation;
9255 } 9255 }
9256 } 9256 }
9257 9257
9258 9258
9259 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInNewSpace) { 9259 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInNewSpace) {
9260 NoHandleAllocation ha(isolate); 9260 SealHandleScope shs(isolate);
9261 ASSERT(args.length() == 1); 9261 ASSERT(args.length() == 1);
9262 CONVERT_ARG_HANDLE_CHECKED(Smi, size_smi, 0); 9262 CONVERT_ARG_HANDLE_CHECKED(Smi, size_smi, 0);
9263 return Allocate(isolate, size_smi->value(), NEW_SPACE); 9263 return Allocate(isolate, size_smi->value(), NEW_SPACE);
9264 } 9264 }
9265 9265
9266 9266
9267 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInOldPointerSpace) { 9267 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInOldPointerSpace) {
9268 NoHandleAllocation ha(isolate); 9268 SealHandleScope shs(isolate);
9269 ASSERT(args.length() == 1); 9269 ASSERT(args.length() == 1);
9270 CONVERT_ARG_HANDLE_CHECKED(Smi, size_smi, 0); 9270 CONVERT_ARG_HANDLE_CHECKED(Smi, size_smi, 0);
9271 return Allocate(isolate, size_smi->value(), OLD_POINTER_SPACE); 9271 return Allocate(isolate, size_smi->value(), OLD_POINTER_SPACE);
9272 } 9272 }
9273 9273
9274 9274
9275 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInOldDataSpace) { 9275 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInOldDataSpace) {
9276 NoHandleAllocation ha(isolate); 9276 SealHandleScope shs(isolate);
9277 ASSERT(args.length() == 1); 9277 ASSERT(args.length() == 1);
9278 CONVERT_ARG_HANDLE_CHECKED(Smi, size_smi, 0); 9278 CONVERT_ARG_HANDLE_CHECKED(Smi, size_smi, 0);
9279 return Allocate(isolate, size_smi->value(), OLD_DATA_SPACE); 9279 return Allocate(isolate, size_smi->value(), OLD_DATA_SPACE);
9280 } 9280 }
9281 9281
9282 9282
9283 // Push an object unto an array of objects if it is not already in the 9283 // Push an object unto an array of objects if it is not already in the
9284 // array. Returns true if the element was pushed on the stack and 9284 // array. Returns true if the element was pushed on the stack and
9285 // false otherwise. 9285 // false otherwise.
9286 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) { 9286 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) {
9287 NoHandleAllocation ha(isolate); 9287 SealHandleScope shs(isolate);
9288 ASSERT(args.length() == 2); 9288 ASSERT(args.length() == 2);
9289 CONVERT_ARG_CHECKED(JSArray, array, 0); 9289 CONVERT_ARG_CHECKED(JSArray, array, 0);
9290 CONVERT_ARG_CHECKED(JSReceiver, element, 1); 9290 CONVERT_ARG_CHECKED(JSReceiver, element, 1);
9291 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements()); 9291 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements());
9292 int length = Smi::cast(array->length())->value(); 9292 int length = Smi::cast(array->length())->value();
9293 FixedArray* elements = FixedArray::cast(array->elements()); 9293 FixedArray* elements = FixedArray::cast(array->elements());
9294 for (int i = 0; i < length; i++) { 9294 for (int i = 0; i < length; i++) {
9295 if (elements->get(i) == element) return isolate->heap()->false_value(); 9295 if (elements->get(i) == element) return isolate->heap()->false_value();
9296 } 9296 }
9297 Object* obj; 9297 Object* obj;
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after
9994 *isolate->factory()->NewRangeError("invalid_array_length", 9994 *isolate->factory()->NewRangeError("invalid_array_length",
9995 HandleVector<Object>(NULL, 0))); 9995 HandleVector<Object>(NULL, 0)));
9996 } 9996 }
9997 return *visitor.ToArray(); 9997 return *visitor.ToArray();
9998 } 9998 }
9999 9999
10000 10000
10001 // This will not allocate (flatten the string), but it may run 10001 // This will not allocate (flatten the string), but it may run
10002 // very slowly for very deeply nested ConsStrings. For debugging use only. 10002 // very slowly for very deeply nested ConsStrings. For debugging use only.
10003 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) { 10003 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) {
10004 NoHandleAllocation ha(isolate); 10004 SealHandleScope shs(isolate);
10005 ASSERT(args.length() == 1); 10005 ASSERT(args.length() == 1);
10006 10006
10007 CONVERT_ARG_CHECKED(String, string, 0); 10007 CONVERT_ARG_CHECKED(String, string, 0);
10008 ConsStringIteratorOp op; 10008 ConsStringIteratorOp op;
10009 StringCharacterStream stream(string, &op); 10009 StringCharacterStream stream(string, &op);
10010 while (stream.HasMore()) { 10010 while (stream.HasMore()) {
10011 uint16_t character = stream.GetNext(); 10011 uint16_t character = stream.GetNext();
10012 PrintF("%c", character); 10012 PrintF("%c", character);
10013 } 10013 }
10014 return string; 10014 return string;
10015 } 10015 }
10016 10016
10017 // Moves all own elements of an object, that are below a limit, to positions 10017 // Moves all own elements of an object, that are below a limit, to positions
10018 // starting at zero. All undefined values are placed after non-undefined values, 10018 // starting at zero. All undefined values are placed after non-undefined values,
10019 // and are followed by non-existing element. Does not change the length 10019 // and are followed by non-existing element. Does not change the length
10020 // property. 10020 // property.
10021 // Returns the number of non-undefined elements collected. 10021 // Returns the number of non-undefined elements collected.
10022 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) { 10022 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) {
10023 NoHandleAllocation ha(isolate); 10023 SealHandleScope shs(isolate);
10024 ASSERT(args.length() == 2); 10024 ASSERT(args.length() == 2);
10025 CONVERT_ARG_CHECKED(JSObject, object, 0); 10025 CONVERT_ARG_CHECKED(JSObject, object, 0);
10026 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); 10026 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
10027 return object->PrepareElementsForSort(limit); 10027 return object->PrepareElementsForSort(limit);
10028 } 10028 }
10029 10029
10030 10030
10031 // Move contents of argument 0 (an array) to argument 1 (an array) 10031 // Move contents of argument 0 (an array) to argument 1 (an array)
10032 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) { 10032 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) {
10033 NoHandleAllocation ha(isolate); 10033 SealHandleScope shs(isolate);
10034 ASSERT(args.length() == 2); 10034 ASSERT(args.length() == 2);
10035 CONVERT_ARG_CHECKED(JSArray, from, 0); 10035 CONVERT_ARG_CHECKED(JSArray, from, 0);
10036 CONVERT_ARG_CHECKED(JSArray, to, 1); 10036 CONVERT_ARG_CHECKED(JSArray, to, 1);
10037 from->ValidateElements(); 10037 from->ValidateElements();
10038 to->ValidateElements(); 10038 to->ValidateElements();
10039 FixedArrayBase* new_elements = from->elements(); 10039 FixedArrayBase* new_elements = from->elements();
10040 ElementsKind from_kind = from->GetElementsKind(); 10040 ElementsKind from_kind = from->GetElementsKind();
10041 MaybeObject* maybe_new_map; 10041 MaybeObject* maybe_new_map;
10042 maybe_new_map = to->GetElementsTransitionMap(isolate, from_kind); 10042 maybe_new_map = to->GetElementsTransitionMap(isolate, from_kind);
10043 Object* new_map; 10043 Object* new_map;
10044 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; 10044 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
10045 to->set_map_and_elements(Map::cast(new_map), new_elements); 10045 to->set_map_and_elements(Map::cast(new_map), new_elements);
10046 to->set_length(from->length()); 10046 to->set_length(from->length());
10047 Object* obj; 10047 Object* obj;
10048 { MaybeObject* maybe_obj = from->ResetElements(); 10048 { MaybeObject* maybe_obj = from->ResetElements();
10049 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 10049 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
10050 } 10050 }
10051 from->set_length(Smi::FromInt(0)); 10051 from->set_length(Smi::FromInt(0));
10052 to->ValidateElements(); 10052 to->ValidateElements();
10053 return to; 10053 return to;
10054 } 10054 }
10055 10055
10056 10056
10057 // How many elements does this object/array have? 10057 // How many elements does this object/array have?
10058 RUNTIME_FUNCTION(MaybeObject*, Runtime_EstimateNumberOfElements) { 10058 RUNTIME_FUNCTION(MaybeObject*, Runtime_EstimateNumberOfElements) {
10059 NoHandleAllocation ha(isolate); 10059 SealHandleScope shs(isolate);
10060 ASSERT(args.length() == 1); 10060 ASSERT(args.length() == 1);
10061 CONVERT_ARG_CHECKED(JSObject, object, 0); 10061 CONVERT_ARG_CHECKED(JSObject, object, 0);
10062 HeapObject* elements = object->elements(); 10062 HeapObject* elements = object->elements();
10063 if (elements->IsDictionary()) { 10063 if (elements->IsDictionary()) {
10064 int result = SeededNumberDictionary::cast(elements)->NumberOfElements(); 10064 int result = SeededNumberDictionary::cast(elements)->NumberOfElements();
10065 return Smi::FromInt(result); 10065 return Smi::FromInt(result);
10066 } else if (object->IsJSArray()) { 10066 } else if (object->IsJSArray()) {
10067 return JSArray::cast(object)->length(); 10067 return JSArray::cast(object)->length();
10068 } else { 10068 } else {
10069 return Smi::FromInt(FixedArray::cast(elements)->length()); 10069 return Smi::FromInt(FixedArray::cast(elements)->length());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
10108 } else { 10108 } else {
10109 ASSERT(array->HasFastSmiOrObjectElements() || 10109 ASSERT(array->HasFastSmiOrObjectElements() ||
10110 array->HasFastDoubleElements()); 10110 array->HasFastDoubleElements());
10111 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length()); 10111 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length());
10112 return *isolate->factory()->NewNumberFromUint(Min(actual_length, length)); 10112 return *isolate->factory()->NewNumberFromUint(Min(actual_length, length));
10113 } 10113 }
10114 } 10114 }
10115 10115
10116 10116
10117 RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) { 10117 RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) {
10118 NoHandleAllocation ha(isolate); 10118 SealHandleScope shs(isolate);
10119 ASSERT(args.length() == 3); 10119 ASSERT(args.length() == 3);
10120 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0); 10120 CONVERT_ARG_CHECKED(JSReceiver, receiver, 0);
10121 CONVERT_ARG_CHECKED(Name, name, 1); 10121 CONVERT_ARG_CHECKED(Name, name, 1);
10122 CONVERT_SMI_ARG_CHECKED(flag, 2); 10122 CONVERT_SMI_ARG_CHECKED(flag, 2);
10123 AccessorComponent component = flag == 0 ? ACCESSOR_GETTER : ACCESSOR_SETTER; 10123 AccessorComponent component = flag == 0 ? ACCESSOR_GETTER : ACCESSOR_SETTER;
10124 if (!receiver->IsJSObject()) return isolate->heap()->undefined_value(); 10124 if (!receiver->IsJSObject()) return isolate->heap()->undefined_value();
10125 return JSObject::cast(receiver)->LookupAccessor(name, component); 10125 return JSObject::cast(receiver)->LookupAccessor(name, component);
10126 } 10126 }
10127 10127
10128 10128
10129 #ifdef ENABLE_DEBUGGER_SUPPORT 10129 #ifdef ENABLE_DEBUGGER_SUPPORT
10130 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugBreak) { 10130 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugBreak) {
10131 NoHandleAllocation ha(isolate); 10131 SealHandleScope shs(isolate);
10132 ASSERT(args.length() == 0); 10132 ASSERT(args.length() == 0);
10133 return Execution::DebugBreakHelper(); 10133 return Execution::DebugBreakHelper();
10134 } 10134 }
10135 10135
10136 10136
10137 // Helper functions for wrapping and unwrapping stack frame ids. 10137 // Helper functions for wrapping and unwrapping stack frame ids.
10138 static Smi* WrapFrameId(StackFrame::Id id) { 10138 static Smi* WrapFrameId(StackFrame::Id id) {
10139 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4))); 10139 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4)));
10140 return Smi::FromInt(id >> 2); 10140 return Smi::FromInt(id >> 2);
10141 } 10141 }
10142 10142
10143 10143
10144 static StackFrame::Id UnwrapFrameId(int wrapped) { 10144 static StackFrame::Id UnwrapFrameId(int wrapped) {
10145 return static_cast<StackFrame::Id>(wrapped << 2); 10145 return static_cast<StackFrame::Id>(wrapped << 2);
10146 } 10146 }
10147 10147
10148 10148
10149 // Adds a JavaScript function as a debug event listener. 10149 // Adds a JavaScript function as a debug event listener.
10150 // args[0]: debug event listener function to set or null or undefined for 10150 // args[0]: debug event listener function to set or null or undefined for
10151 // clearing the event listener function 10151 // clearing the event listener function
10152 // args[1]: object supplied during callback 10152 // args[1]: object supplied during callback
10153 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDebugEventListener) { 10153 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDebugEventListener) {
10154 NoHandleAllocation ha(isolate); 10154 SealHandleScope shs(isolate);
10155 ASSERT(args.length() == 2); 10155 ASSERT(args.length() == 2);
10156 RUNTIME_ASSERT(args[0]->IsJSFunction() || 10156 RUNTIME_ASSERT(args[0]->IsJSFunction() ||
10157 args[0]->IsUndefined() || 10157 args[0]->IsUndefined() ||
10158 args[0]->IsNull()); 10158 args[0]->IsNull());
10159 Handle<Object> callback = args.at<Object>(0); 10159 Handle<Object> callback = args.at<Object>(0);
10160 Handle<Object> data = args.at<Object>(1); 10160 Handle<Object> data = args.at<Object>(1);
10161 isolate->debugger()->SetEventListener(callback, data); 10161 isolate->debugger()->SetEventListener(callback, data);
10162 10162
10163 return isolate->heap()->undefined_value(); 10163 return isolate->heap()->undefined_value();
10164 } 10164 }
10165 10165
10166 10166
10167 RUNTIME_FUNCTION(MaybeObject*, Runtime_Break) { 10167 RUNTIME_FUNCTION(MaybeObject*, Runtime_Break) {
10168 NoHandleAllocation ha(isolate); 10168 SealHandleScope shs(isolate);
10169 ASSERT(args.length() == 0); 10169 ASSERT(args.length() == 0);
10170 isolate->stack_guard()->DebugBreak(); 10170 isolate->stack_guard()->DebugBreak();
10171 return isolate->heap()->undefined_value(); 10171 return isolate->heap()->undefined_value();
10172 } 10172 }
10173 10173
10174 10174
10175 static MaybeObject* DebugLookupResultValue(Heap* heap, 10175 static MaybeObject* DebugLookupResultValue(Heap* heap,
10176 Object* receiver, 10176 Object* receiver,
10177 Name* name, 10177 Name* name,
10178 LookupResult* result, 10178 LookupResult* result,
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
10356 if (result.IsFound()) { 10356 if (result.IsFound()) {
10357 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL); 10357 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL);
10358 } 10358 }
10359 return isolate->heap()->undefined_value(); 10359 return isolate->heap()->undefined_value();
10360 } 10360 }
10361 10361
10362 10362
10363 // Return the property type calculated from the property details. 10363 // Return the property type calculated from the property details.
10364 // args[0]: smi with property details. 10364 // args[0]: smi with property details.
10365 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyTypeFromDetails) { 10365 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyTypeFromDetails) {
10366 NoHandleAllocation ha(isolate); 10366 SealHandleScope shs(isolate);
10367 ASSERT(args.length() == 1); 10367 ASSERT(args.length() == 1);
10368 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); 10368 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10369 return Smi::FromInt(static_cast<int>(details.type())); 10369 return Smi::FromInt(static_cast<int>(details.type()));
10370 } 10370 }
10371 10371
10372 10372
10373 // Return the property attribute calculated from the property details. 10373 // Return the property attribute calculated from the property details.
10374 // args[0]: smi with property details. 10374 // args[0]: smi with property details.
10375 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyAttributesFromDetails) { 10375 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyAttributesFromDetails) {
10376 NoHandleAllocation ha(isolate); 10376 SealHandleScope shs(isolate);
10377 ASSERT(args.length() == 1); 10377 ASSERT(args.length() == 1);
10378 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); 10378 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10379 return Smi::FromInt(static_cast<int>(details.attributes())); 10379 return Smi::FromInt(static_cast<int>(details.attributes()));
10380 } 10380 }
10381 10381
10382 10382
10383 // Return the property insertion index calculated from the property details. 10383 // Return the property insertion index calculated from the property details.
10384 // args[0]: smi with property details. 10384 // args[0]: smi with property details.
10385 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyIndexFromDetails) { 10385 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyIndexFromDetails) {
10386 NoHandleAllocation ha(isolate); 10386 SealHandleScope shs(isolate);
10387 ASSERT(args.length() == 1); 10387 ASSERT(args.length() == 1);
10388 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); 10388 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10389 // TODO(verwaest): Depends on the type of details. 10389 // TODO(verwaest): Depends on the type of details.
10390 return Smi::FromInt(details.dictionary_index()); 10390 return Smi::FromInt(details.dictionary_index());
10391 } 10391 }
10392 10392
10393 10393
10394 // Return property value from named interceptor. 10394 // Return property value from named interceptor.
10395 // args[0]: object 10395 // args[0]: object
10396 // args[1]: property name 10396 // args[1]: property name
(...skipping 17 matching lines...) Expand all
10414 ASSERT(args.length() == 2); 10414 ASSERT(args.length() == 2);
10415 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 10415 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
10416 RUNTIME_ASSERT(obj->HasIndexedInterceptor()); 10416 RUNTIME_ASSERT(obj->HasIndexedInterceptor());
10417 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]); 10417 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]);
10418 10418
10419 return obj->GetElementWithInterceptor(*obj, index); 10419 return obj->GetElementWithInterceptor(*obj, index);
10420 } 10420 }
10421 10421
10422 10422
10423 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckExecutionState) { 10423 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckExecutionState) {
10424 NoHandleAllocation ha(isolate); 10424 SealHandleScope shs(isolate);
10425 ASSERT(args.length() >= 1); 10425 ASSERT(args.length() >= 1);
10426 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 10426 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
10427 // Check that the break id is valid. 10427 // Check that the break id is valid.
10428 if (isolate->debug()->break_id() == 0 || 10428 if (isolate->debug()->break_id() == 0 ||
10429 break_id != isolate->debug()->break_id()) { 10429 break_id != isolate->debug()->break_id()) {
10430 return isolate->Throw( 10430 return isolate->Throw(
10431 isolate->heap()->illegal_execution_state_string()); 10431 isolate->heap()->illegal_execution_state_string());
10432 } 10432 }
10433 10433
10434 return isolate->heap()->true_value(); 10434 return isolate->heap()->true_value();
(...skipping 1880 matching lines...) Expand 10 before | Expand all | Expand 10 after
12315 } 12315 }
12316 12316
12317 12317
12318 // Helper function used by Runtime_DebugReferencedBy below. 12318 // Helper function used by Runtime_DebugReferencedBy below.
12319 static int DebugReferencedBy(HeapIterator* iterator, 12319 static int DebugReferencedBy(HeapIterator* iterator,
12320 JSObject* target, 12320 JSObject* target,
12321 Object* instance_filter, int max_references, 12321 Object* instance_filter, int max_references,
12322 FixedArray* instances, int instances_size, 12322 FixedArray* instances, int instances_size,
12323 JSFunction* arguments_function) { 12323 JSFunction* arguments_function) {
12324 Isolate* isolate = target->GetIsolate(); 12324 Isolate* isolate = target->GetIsolate();
12325 NoHandleAllocation ha(isolate); 12325 SealHandleScope shs(isolate);
12326 AssertNoAllocation no_alloc; 12326 DisallowHeapAllocation no_allocation;
12327 12327
12328 // Iterate the heap. 12328 // Iterate the heap.
12329 int count = 0; 12329 int count = 0;
12330 JSObject* last = NULL; 12330 JSObject* last = NULL;
12331 HeapObject* heap_obj = NULL; 12331 HeapObject* heap_obj = NULL;
12332 while (((heap_obj = iterator->next()) != NULL) && 12332 while (((heap_obj = iterator->next()) != NULL) &&
12333 (max_references == 0 || count < max_references)) { 12333 (max_references == 0 || count < max_references)) {
12334 // Only look at all JSObjects. 12334 // Only look at all JSObjects.
12335 if (heap_obj->IsJSObject()) { 12335 if (heap_obj->IsJSObject()) {
12336 // Skip context extension objects and argument arrays as these are 12336 // Skip context extension objects and argument arrays as these are
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
12384 // Return the number of referencing objects found. 12384 // Return the number of referencing objects found.
12385 return count; 12385 return count;
12386 } 12386 }
12387 12387
12388 12388
12389 // Scan the heap for objects with direct references to an object 12389 // Scan the heap for objects with direct references to an object
12390 // args[0]: the object to find references to 12390 // args[0]: the object to find references to
12391 // args[1]: constructor function for instances to exclude (Mirror) 12391 // args[1]: constructor function for instances to exclude (Mirror)
12392 // args[2]: the the maximum number of objects to return 12392 // args[2]: the the maximum number of objects to return
12393 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugReferencedBy) { 12393 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugReferencedBy) {
12394 NoHandleAllocation ha(isolate); 12394 SealHandleScope shs(isolate);
12395 ASSERT(args.length() == 3); 12395 ASSERT(args.length() == 3);
12396 12396
12397 // First perform a full GC in order to avoid references from dead objects. 12397 // First perform a full GC in order to avoid references from dead objects.
12398 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, 12398 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask,
12399 "%DebugReferencedBy"); 12399 "%DebugReferencedBy");
12400 // The heap iterator reserves the right to do a GC to make the heap iterable. 12400 // The heap iterator reserves the right to do a GC to make the heap iterable.
12401 // Due to the GC above we know it won't need to do that, but it seems cleaner 12401 // Due to the GC above we know it won't need to do that, but it seems cleaner
12402 // to get the heap iterator constructed before we start having unprotected 12402 // to get the heap iterator constructed before we start having unprotected
12403 // Object* locals that are not protected by handles. 12403 // Object* locals that are not protected by handles.
12404 12404
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
12448 return JSArray::cast(result)->SetContent(instances); 12448 return JSArray::cast(result)->SetContent(instances);
12449 } 12449 }
12450 12450
12451 12451
12452 // Helper function used by Runtime_DebugConstructedBy below. 12452 // Helper function used by Runtime_DebugConstructedBy below.
12453 static int DebugConstructedBy(HeapIterator* iterator, 12453 static int DebugConstructedBy(HeapIterator* iterator,
12454 JSFunction* constructor, 12454 JSFunction* constructor,
12455 int max_references, 12455 int max_references,
12456 FixedArray* instances, 12456 FixedArray* instances,
12457 int instances_size) { 12457 int instances_size) {
12458 AssertNoAllocation no_alloc; 12458 DisallowHeapAllocation no_allocation;
12459 12459
12460 // Iterate the heap. 12460 // Iterate the heap.
12461 int count = 0; 12461 int count = 0;
12462 HeapObject* heap_obj = NULL; 12462 HeapObject* heap_obj = NULL;
12463 while (((heap_obj = iterator->next()) != NULL) && 12463 while (((heap_obj = iterator->next()) != NULL) &&
12464 (max_references == 0 || count < max_references)) { 12464 (max_references == 0 || count < max_references)) {
12465 // Only look at all JSObjects. 12465 // Only look at all JSObjects.
12466 if (heap_obj->IsJSObject()) { 12466 if (heap_obj->IsJSObject()) {
12467 JSObject* obj = JSObject::cast(heap_obj); 12467 JSObject* obj = JSObject::cast(heap_obj);
12468 if (obj->map()->constructor() == constructor) { 12468 if (obj->map()->constructor() == constructor) {
12469 // Valid reference found add to instance array if supplied an update 12469 // Valid reference found add to instance array if supplied an update
12470 // count. 12470 // count.
12471 if (instances != NULL && count < instances_size) { 12471 if (instances != NULL && count < instances_size) {
12472 instances->set(count, obj); 12472 instances->set(count, obj);
12473 } 12473 }
12474 count++; 12474 count++;
12475 } 12475 }
12476 } 12476 }
12477 } 12477 }
12478 12478
12479 // Return the number of referencing objects found. 12479 // Return the number of referencing objects found.
12480 return count; 12480 return count;
12481 } 12481 }
12482 12482
12483 12483
12484 // Scan the heap for objects constructed by a specific function. 12484 // Scan the heap for objects constructed by a specific function.
12485 // args[0]: the constructor to find instances of 12485 // args[0]: the constructor to find instances of
12486 // args[1]: the the maximum number of objects to return 12486 // args[1]: the the maximum number of objects to return
12487 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) { 12487 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) {
12488 NoHandleAllocation ha(isolate); 12488 SealHandleScope shs(isolate);
12489 ASSERT(args.length() == 2); 12489 ASSERT(args.length() == 2);
12490 12490
12491 // First perform a full GC in order to avoid dead objects. 12491 // First perform a full GC in order to avoid dead objects.
12492 Heap* heap = isolate->heap(); 12492 Heap* heap = isolate->heap();
12493 heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, "%DebugConstructedBy"); 12493 heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, "%DebugConstructedBy");
12494 12494
12495 // Check parameters. 12495 // Check parameters.
12496 CONVERT_ARG_CHECKED(JSFunction, constructor, 0); 12496 CONVERT_ARG_CHECKED(JSFunction, constructor, 0);
12497 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); 12497 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]);
12498 RUNTIME_ASSERT(max_references >= 0); 12498 RUNTIME_ASSERT(max_references >= 0);
(...skipping 29 matching lines...) Expand all
12528 isolate->context()->native_context()->array_function()); 12528 isolate->context()->native_context()->array_function());
12529 if (!maybe_result->ToObject(&result)) return maybe_result; 12529 if (!maybe_result->ToObject(&result)) return maybe_result;
12530 } 12530 }
12531 return JSArray::cast(result)->SetContent(instances); 12531 return JSArray::cast(result)->SetContent(instances);
12532 } 12532 }
12533 12533
12534 12534
12535 // Find the effective prototype object as returned by __proto__. 12535 // Find the effective prototype object as returned by __proto__.
12536 // args[0]: the object to find the prototype for. 12536 // args[0]: the object to find the prototype for.
12537 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPrototype) { 12537 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPrototype) {
12538 NoHandleAllocation ha(isolate); 12538 SealHandleScope shs(isolate);
12539 ASSERT(args.length() == 1); 12539 ASSERT(args.length() == 1);
12540 CONVERT_ARG_CHECKED(JSObject, obj, 0); 12540 CONVERT_ARG_CHECKED(JSObject, obj, 0);
12541 return GetPrototypeSkipHiddenPrototypes(isolate, obj); 12541 return GetPrototypeSkipHiddenPrototypes(isolate, obj);
12542 } 12542 }
12543 12543
12544 12544
12545 // Patches script source (should be called upon BeforeCompile event). 12545 // Patches script source (should be called upon BeforeCompile event).
12546 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugSetScriptSource) { 12546 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugSetScriptSource) {
12547 HandleScope scope(isolate); 12547 HandleScope scope(isolate);
12548 ASSERT(args.length() == 2); 12548 ASSERT(args.length() == 2);
12549 12549
12550 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0); 12550 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0);
12551 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); 12551 CONVERT_ARG_HANDLE_CHECKED(String, source, 1);
12552 12552
12553 RUNTIME_ASSERT(script_wrapper->value()->IsScript()); 12553 RUNTIME_ASSERT(script_wrapper->value()->IsScript());
12554 Handle<Script> script(Script::cast(script_wrapper->value())); 12554 Handle<Script> script(Script::cast(script_wrapper->value()));
12555 12555
12556 int compilation_state = Smi::cast(script->compilation_state())->value(); 12556 int compilation_state = Smi::cast(script->compilation_state())->value();
12557 RUNTIME_ASSERT(compilation_state == Script::COMPILATION_STATE_INITIAL); 12557 RUNTIME_ASSERT(compilation_state == Script::COMPILATION_STATE_INITIAL);
12558 script->set_source(*source); 12558 script->set_source(*source);
12559 12559
12560 return isolate->heap()->undefined_value(); 12560 return isolate->heap()->undefined_value();
12561 } 12561 }
12562 12562
12563 12563
12564 RUNTIME_FUNCTION(MaybeObject*, Runtime_SystemBreak) { 12564 RUNTIME_FUNCTION(MaybeObject*, Runtime_SystemBreak) {
12565 NoHandleAllocation ha(isolate); 12565 SealHandleScope shs(isolate);
12566 ASSERT(args.length() == 0); 12566 ASSERT(args.length() == 0);
12567 CPU::DebugBreak(); 12567 CPU::DebugBreak();
12568 return isolate->heap()->undefined_value(); 12568 return isolate->heap()->undefined_value();
12569 } 12569 }
12570 12570
12571 12571
12572 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleFunction) { 12572 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugDisassembleFunction) {
12573 HandleScope scope(isolate); 12573 HandleScope scope(isolate);
12574 #ifdef DEBUG 12574 #ifdef DEBUG
12575 ASSERT(args.length() == 1); 12575 ASSERT(args.length() == 1);
(...skipping 17 matching lines...) Expand all
12593 if (!JSFunction::EnsureCompiled(func, KEEP_EXCEPTION)) { 12593 if (!JSFunction::EnsureCompiled(func, KEEP_EXCEPTION)) {
12594 return Failure::Exception(); 12594 return Failure::Exception();
12595 } 12595 }
12596 func->shared()->construct_stub()->PrintLn(); 12596 func->shared()->construct_stub()->PrintLn();
12597 #endif // DEBUG 12597 #endif // DEBUG
12598 return isolate->heap()->undefined_value(); 12598 return isolate->heap()->undefined_value();
12599 } 12599 }
12600 12600
12601 12601
12602 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) { 12602 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) {
12603 NoHandleAllocation ha(isolate); 12603 SealHandleScope shs(isolate);
12604 ASSERT(args.length() == 1); 12604 ASSERT(args.length() == 1);
12605 12605
12606 CONVERT_ARG_CHECKED(JSFunction, f, 0); 12606 CONVERT_ARG_CHECKED(JSFunction, f, 0);
12607 return f->shared()->inferred_name(); 12607 return f->shared()->inferred_name();
12608 } 12608 }
12609 12609
12610 12610
12611 static int FindSharedFunctionInfosForScript(HeapIterator* iterator, 12611 static int FindSharedFunctionInfosForScript(HeapIterator* iterator,
12612 Script* script, 12612 Script* script,
12613 FixedArray* buffer) { 12613 FixedArray* buffer) {
12614 AssertNoAllocation no_allocations; 12614 DisallowHeapAllocation no_allocation;
12615 int counter = 0; 12615 int counter = 0;
12616 int buffer_size = buffer->length(); 12616 int buffer_size = buffer->length();
12617 for (HeapObject* obj = iterator->next(); 12617 for (HeapObject* obj = iterator->next();
12618 obj != NULL; 12618 obj != NULL;
12619 obj = iterator->next()) { 12619 obj = iterator->next()) {
12620 ASSERT(obj != NULL); 12620 ASSERT(obj != NULL);
12621 if (!obj->IsSharedFunctionInfo()) { 12621 if (!obj->IsSharedFunctionInfo()) {
12622 continue; 12622 continue;
12623 } 12623 }
12624 SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj); 12624 SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj);
(...skipping 22 matching lines...) Expand all
12647 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); 12647 Handle<Script> script = Handle<Script>(Script::cast(script_value->value()));
12648 12648
12649 const int kBufferSize = 32; 12649 const int kBufferSize = 32;
12650 12650
12651 Handle<FixedArray> array; 12651 Handle<FixedArray> array;
12652 array = isolate->factory()->NewFixedArray(kBufferSize); 12652 array = isolate->factory()->NewFixedArray(kBufferSize);
12653 int number; 12653 int number;
12654 Heap* heap = isolate->heap(); 12654 Heap* heap = isolate->heap();
12655 { 12655 {
12656 heap->EnsureHeapIsIterable(); 12656 heap->EnsureHeapIsIterable();
12657 AssertNoAllocation no_allocations; 12657 DisallowHeapAllocation no_allocation;
12658 HeapIterator heap_iterator(heap); 12658 HeapIterator heap_iterator(heap);
12659 Script* scr = *script; 12659 Script* scr = *script;
12660 FixedArray* arr = *array; 12660 FixedArray* arr = *array;
12661 number = FindSharedFunctionInfosForScript(&heap_iterator, scr, arr); 12661 number = FindSharedFunctionInfosForScript(&heap_iterator, scr, arr);
12662 } 12662 }
12663 if (number > kBufferSize) { 12663 if (number > kBufferSize) {
12664 array = isolate->factory()->NewFixedArray(number); 12664 array = isolate->factory()->NewFixedArray(number);
12665 heap->EnsureHeapIsIterable(); 12665 heap->EnsureHeapIsIterable();
12666 AssertNoAllocation no_allocations; 12666 DisallowHeapAllocation no_allocation;
12667 HeapIterator heap_iterator(heap); 12667 HeapIterator heap_iterator(heap);
12668 Script* scr = *script; 12668 Script* scr = *script;
12669 FixedArray* arr = *array; 12669 FixedArray* arr = *array;
12670 FindSharedFunctionInfosForScript(&heap_iterator, scr, arr); 12670 FindSharedFunctionInfosForScript(&heap_iterator, scr, arr);
12671 } 12671 }
12672 12672
12673 Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(array); 12673 Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(array);
12674 result->set_length(Smi::FromInt(number)); 12674 result->set_length(Smi::FromInt(number));
12675 12675
12676 LiveEdit::WrapSharedFunctionInfos(result); 12676 LiveEdit::WrapSharedFunctionInfos(result);
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
12941 if (!pending_exception) { 12941 if (!pending_exception) {
12942 return *result; 12942 return *result;
12943 } else { 12943 } else {
12944 return Failure::Exception(); 12944 return Failure::Exception();
12945 } 12945 }
12946 } 12946 }
12947 12947
12948 12948
12949 // Sets a v8 flag. 12949 // Sets a v8 flag.
12950 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) { 12950 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) {
12951 NoHandleAllocation ha(isolate); 12951 SealHandleScope shs(isolate);
12952 CONVERT_ARG_CHECKED(String, arg, 0); 12952 CONVERT_ARG_CHECKED(String, arg, 0);
12953 SmartArrayPointer<char> flags = 12953 SmartArrayPointer<char> flags =
12954 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 12954 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
12955 FlagList::SetFlagsFromString(*flags, StrLength(*flags)); 12955 FlagList::SetFlagsFromString(*flags, StrLength(*flags));
12956 return isolate->heap()->undefined_value(); 12956 return isolate->heap()->undefined_value();
12957 } 12957 }
12958 12958
12959 12959
12960 // Performs a GC. 12960 // Performs a GC.
12961 // Presently, it only does a full GC. 12961 // Presently, it only does a full GC.
12962 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectGarbage) { 12962 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectGarbage) {
12963 NoHandleAllocation ha(isolate); 12963 SealHandleScope shs(isolate);
12964 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, "%CollectGarbage"); 12964 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, "%CollectGarbage");
12965 return isolate->heap()->undefined_value(); 12965 return isolate->heap()->undefined_value();
12966 } 12966 }
12967 12967
12968 12968
12969 // Gets the current heap usage. 12969 // Gets the current heap usage.
12970 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHeapUsage) { 12970 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHeapUsage) {
12971 NoHandleAllocation ha(isolate); 12971 SealHandleScope shs(isolate);
12972 int usage = static_cast<int>(isolate->heap()->SizeOfObjects()); 12972 int usage = static_cast<int>(isolate->heap()->SizeOfObjects());
12973 if (!Smi::IsValid(usage)) { 12973 if (!Smi::IsValid(usage)) {
12974 return *isolate->factory()->NewNumberFromInt(usage); 12974 return *isolate->factory()->NewNumberFromInt(usage);
12975 } 12975 }
12976 return Smi::FromInt(usage); 12976 return Smi::FromInt(usage);
12977 } 12977 }
12978 12978
12979 #endif // ENABLE_DEBUGGER_SUPPORT 12979 #endif // ENABLE_DEBUGGER_SUPPORT
12980 12980
12981 12981
12982 RUNTIME_FUNCTION(MaybeObject*, Runtime_ProfilerResume) { 12982 RUNTIME_FUNCTION(MaybeObject*, Runtime_ProfilerResume) {
12983 NoHandleAllocation ha(isolate); 12983 SealHandleScope shs(isolate);
12984 v8::V8::ResumeProfiler(); 12984 v8::V8::ResumeProfiler();
12985 return isolate->heap()->undefined_value(); 12985 return isolate->heap()->undefined_value();
12986 } 12986 }
12987 12987
12988 12988
12989 RUNTIME_FUNCTION(MaybeObject*, Runtime_ProfilerPause) { 12989 RUNTIME_FUNCTION(MaybeObject*, Runtime_ProfilerPause) {
12990 NoHandleAllocation ha(isolate); 12990 SealHandleScope shs(isolate);
12991 v8::V8::PauseProfiler(); 12991 v8::V8::PauseProfiler();
12992 return isolate->heap()->undefined_value(); 12992 return isolate->heap()->undefined_value();
12993 } 12993 }
12994 12994
12995 12995
12996 // Finds the script object from the script data. NOTE: This operation uses 12996 // Finds the script object from the script data. NOTE: This operation uses
12997 // heap traversal to find the function generated for the source position 12997 // heap traversal to find the function generated for the source position
12998 // for the requested break point. For lazily compiled functions several heap 12998 // for the requested break point. For lazily compiled functions several heap
12999 // traversals might be required rendering this operation as a rather slow 12999 // traversals might be required rendering this operation as a rather slow
13000 // operation. However for setting break points which is normally done through 13000 // operation. However for setting break points which is normally done through
13001 // some kind of user interaction the performance is not crucial. 13001 // some kind of user interaction the performance is not crucial.
13002 static Handle<Object> Runtime_GetScriptFromScriptName( 13002 static Handle<Object> Runtime_GetScriptFromScriptName(
13003 Handle<String> script_name) { 13003 Handle<String> script_name) {
13004 // Scan the heap for Script objects to find the script with the requested 13004 // Scan the heap for Script objects to find the script with the requested
13005 // script data. 13005 // script data.
13006 Handle<Script> script; 13006 Handle<Script> script;
13007 Heap* heap = script_name->GetHeap(); 13007 Heap* heap = script_name->GetHeap();
13008 heap->EnsureHeapIsIterable(); 13008 heap->EnsureHeapIsIterable();
13009 AssertNoAllocation no_allocation_during_heap_iteration; 13009 DisallowHeapAllocation no_allocation_during_heap_iteration;
13010 HeapIterator iterator(heap); 13010 HeapIterator iterator(heap);
13011 HeapObject* obj = NULL; 13011 HeapObject* obj = NULL;
13012 while (script.is_null() && ((obj = iterator.next()) != NULL)) { 13012 while (script.is_null() && ((obj = iterator.next()) != NULL)) {
13013 // If a script is found check if it has the script data requested. 13013 // If a script is found check if it has the script data requested.
13014 if (obj->IsScript()) { 13014 if (obj->IsScript()) {
13015 if (Script::cast(obj)->name()->IsString()) { 13015 if (Script::cast(obj)->name()->IsString()) {
13016 if (String::cast(Script::cast(obj)->name())->Equals(*script_name)) { 13016 if (String::cast(Script::cast(obj)->name())->Equals(*script_name)) {
13017 script = Handle<Script>(Script::cast(obj)); 13017 script = Handle<Script>(Script::cast(obj));
13018 } 13018 }
13019 } 13019 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
13100 } else { 13100 } else {
13101 RUNTIME_ASSERT(value->IsString()); 13101 RUNTIME_ASSERT(value->IsString());
13102 JSObject::SetHiddenProperty(error_object, key, value); 13102 JSObject::SetHiddenProperty(error_object, key, value);
13103 } 13103 }
13104 return *error_object; 13104 return *error_object;
13105 } 13105 }
13106 13106
13107 13107
13108 // Returns V8 version as a string. 13108 // Returns V8 version as a string.
13109 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetV8Version) { 13109 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetV8Version) {
13110 NoHandleAllocation ha(isolate); 13110 SealHandleScope shs(isolate);
13111 ASSERT_EQ(args.length(), 0); 13111 ASSERT_EQ(args.length(), 0);
13112 13112
13113 const char* version_string = v8::V8::GetVersion(); 13113 const char* version_string = v8::V8::GetVersion();
13114 13114
13115 return isolate->heap()->AllocateStringFromOneByte(CStrVector(version_string), 13115 return isolate->heap()->AllocateStringFromOneByte(CStrVector(version_string),
13116 NOT_TENURED); 13116 NOT_TENURED);
13117 } 13117 }
13118 13118
13119 13119
13120 RUNTIME_FUNCTION(MaybeObject*, Runtime_Abort) { 13120 RUNTIME_FUNCTION(MaybeObject*, Runtime_Abort) {
13121 NoHandleAllocation ha(isolate); 13121 SealHandleScope shs(isolate);
13122 ASSERT(args.length() == 2); 13122 ASSERT(args.length() == 2);
13123 OS::PrintError("abort: %s\n", 13123 OS::PrintError("abort: %s\n",
13124 reinterpret_cast<char*>(args[0]) + args.smi_at(1)); 13124 reinterpret_cast<char*>(args[0]) + args.smi_at(1));
13125 isolate->PrintStack(stderr); 13125 isolate->PrintStack(stderr);
13126 OS::Abort(); 13126 OS::Abort();
13127 UNREACHABLE(); 13127 UNREACHABLE();
13128 return NULL; 13128 return NULL;
13129 } 13129 }
13130 13130
13131 13131
13132 RUNTIME_FUNCTION(MaybeObject*, Runtime_FlattenString) { 13132 RUNTIME_FUNCTION(MaybeObject*, Runtime_FlattenString) {
13133 HandleScope scope(isolate); 13133 HandleScope scope(isolate);
13134 ASSERT(args.length() == 1); 13134 ASSERT(args.length() == 1);
13135 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); 13135 CONVERT_ARG_HANDLE_CHECKED(String, str, 0);
13136 FlattenString(str); 13136 FlattenString(str);
13137 return isolate->heap()->undefined_value(); 13137 return isolate->heap()->undefined_value();
13138 } 13138 }
13139 13139
13140 13140
13141 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) { 13141 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) {
13142 NoHandleAllocation ha(isolate); 13142 SealHandleScope shs(isolate);
13143 // This is only called from codegen, so checks might be more lax. 13143 // This is only called from codegen, so checks might be more lax.
13144 CONVERT_ARG_CHECKED(JSFunctionResultCache, cache, 0); 13144 CONVERT_ARG_CHECKED(JSFunctionResultCache, cache, 0);
13145 Object* key = args[1]; 13145 Object* key = args[1];
13146 13146
13147 int finger_index = cache->finger_index(); 13147 int finger_index = cache->finger_index();
13148 Object* o = cache->get(finger_index); 13148 Object* o = cache->get(finger_index);
13149 if (o == key) { 13149 if (o == key) {
13150 // The fastest case: hit the same place again. 13150 // The fastest case: hit the same place again.
13151 return cache->get(finger_index + 1); 13151 return cache->get(finger_index + 1);
13152 } 13152 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
13230 if (FLAG_verify_heap) { 13230 if (FLAG_verify_heap) {
13231 cache_handle->JSFunctionResultCacheVerify(); 13231 cache_handle->JSFunctionResultCacheVerify();
13232 } 13232 }
13233 #endif 13233 #endif
13234 13234
13235 return *value; 13235 return *value;
13236 } 13236 }
13237 13237
13238 13238
13239 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) { 13239 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) {
13240 NoHandleAllocation ha(isolate); 13240 SealHandleScope shs(isolate);
13241 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); 13241 CONVERT_ARG_CHECKED(JSMessageObject, message, 0);
13242 return Smi::FromInt(message->start_position()); 13242 return Smi::FromInt(message->start_position());
13243 } 13243 }
13244 13244
13245 13245
13246 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetScript) { 13246 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetScript) {
13247 NoHandleAllocation ha(isolate); 13247 SealHandleScope shs(isolate);
13248 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); 13248 CONVERT_ARG_CHECKED(JSMessageObject, message, 0);
13249 return message->script(); 13249 return message->script();
13250 } 13250 }
13251 13251
13252 13252
13253 #ifdef DEBUG 13253 #ifdef DEBUG
13254 // ListNatives is ONLY used by the fuzz-natives.js in debug mode 13254 // ListNatives is ONLY used by the fuzz-natives.js in debug mode
13255 // Exclude the code in release mode. 13255 // Exclude the code in release mode.
13256 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) { 13256 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) {
13257 HandleScope scope(isolate); 13257 HandleScope scope(isolate);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
13291 INLINE_RUNTIME_FUNCTION_LIST(ADD_ENTRY) 13291 INLINE_RUNTIME_FUNCTION_LIST(ADD_ENTRY)
13292 #undef ADD_ENTRY 13292 #undef ADD_ENTRY
13293 ASSERT_EQ(index, entry_count); 13293 ASSERT_EQ(index, entry_count);
13294 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); 13294 Handle<JSArray> result = factory->NewJSArrayWithElements(elements);
13295 return *result; 13295 return *result;
13296 } 13296 }
13297 #endif 13297 #endif
13298 13298
13299 13299
13300 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { 13300 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) {
13301 NoHandleAllocation ha(isolate); 13301 SealHandleScope shs(isolate);
13302 ASSERT(args.length() == 2); 13302 ASSERT(args.length() == 2);
13303 CONVERT_ARG_CHECKED(String, format, 0); 13303 CONVERT_ARG_CHECKED(String, format, 0);
13304 CONVERT_ARG_CHECKED(JSArray, elms, 1); 13304 CONVERT_ARG_CHECKED(JSArray, elms, 1);
13305 AssertNoAllocation no_gc; 13305 DisallowHeapAllocation no_gc;
13306 String::FlatContent format_content = format->GetFlatContent(); 13306 String::FlatContent format_content = format->GetFlatContent();
13307 RUNTIME_ASSERT(format_content.IsAscii()); 13307 RUNTIME_ASSERT(format_content.IsAscii());
13308 Vector<const uint8_t> chars = format_content.ToOneByteVector(); 13308 Vector<const uint8_t> chars = format_content.ToOneByteVector();
13309 isolate->logger()->LogRuntime(Vector<const char>::cast(chars), elms); 13309 isolate->logger()->LogRuntime(Vector<const char>::cast(chars), elms);
13310 return isolate->heap()->undefined_value(); 13310 return isolate->heap()->undefined_value();
13311 } 13311 }
13312 13312
13313 13313
13314 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) { 13314 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) {
13315 UNREACHABLE(); // implemented as macro in the parser 13315 UNREACHABLE(); // implemented as macro in the parser
(...skipping 24 matching lines...) Expand all
13340 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedIntElements) 13340 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedIntElements)
13341 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalFloatElements) 13341 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalFloatElements)
13342 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalDoubleElements) 13342 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalDoubleElements)
13343 // Properties test sitting with elements tests - not fooling anyone. 13343 // Properties test sitting with elements tests - not fooling anyone.
13344 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastProperties) 13344 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastProperties)
13345 13345
13346 #undef ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION 13346 #undef ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION
13347 13347
13348 13348
13349 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) { 13349 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) {
13350 NoHandleAllocation ha(isolate); 13350 SealHandleScope shs(isolate);
13351 ASSERT(args.length() == 2); 13351 ASSERT(args.length() == 2);
13352 CONVERT_ARG_CHECKED(JSObject, obj1, 0); 13352 CONVERT_ARG_CHECKED(JSObject, obj1, 0);
13353 CONVERT_ARG_CHECKED(JSObject, obj2, 1); 13353 CONVERT_ARG_CHECKED(JSObject, obj2, 1);
13354 return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); 13354 return isolate->heap()->ToBoolean(obj1->map() == obj2->map());
13355 } 13355 }
13356 13356
13357 13357
13358 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsObserved) { 13358 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsObserved) {
13359 NoHandleAllocation ha(isolate); 13359 SealHandleScope shs(isolate);
13360 ASSERT(args.length() == 1); 13360 ASSERT(args.length() == 1);
13361 13361
13362 if (!args[0]->IsJSReceiver()) return isolate->heap()->false_value(); 13362 if (!args[0]->IsJSReceiver()) return isolate->heap()->false_value();
13363 JSReceiver* obj = JSReceiver::cast(args[0]); 13363 JSReceiver* obj = JSReceiver::cast(args[0]);
13364 if (obj->IsJSGlobalProxy()) { 13364 if (obj->IsJSGlobalProxy()) {
13365 Object* proto = obj->GetPrototype(); 13365 Object* proto = obj->GetPrototype();
13366 if (proto->IsNull()) return isolate->heap()->false_value(); 13366 if (proto->IsNull()) return isolate->heap()->false_value();
13367 ASSERT(proto->IsJSGlobalObject()); 13367 ASSERT(proto->IsJSGlobalObject());
13368 obj = JSReceiver::cast(proto); 13368 obj = JSReceiver::cast(proto);
13369 } 13369 }
13370 return isolate->heap()->ToBoolean(obj->map()->is_observed()); 13370 return isolate->heap()->ToBoolean(obj->map()->is_observed());
13371 } 13371 }
13372 13372
13373 13373
13374 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) { 13374 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) {
13375 NoHandleAllocation ha(isolate); 13375 SealHandleScope shs(isolate);
13376 ASSERT(args.length() == 2); 13376 ASSERT(args.length() == 2);
13377 CONVERT_ARG_CHECKED(JSReceiver, obj, 0); 13377 CONVERT_ARG_CHECKED(JSReceiver, obj, 0);
13378 CONVERT_BOOLEAN_ARG_CHECKED(is_observed, 1); 13378 CONVERT_BOOLEAN_ARG_CHECKED(is_observed, 1);
13379 if (obj->IsJSGlobalProxy()) { 13379 if (obj->IsJSGlobalProxy()) {
13380 Object* proto = obj->GetPrototype(); 13380 Object* proto = obj->GetPrototype();
13381 if (proto->IsNull()) return isolate->heap()->undefined_value(); 13381 if (proto->IsNull()) return isolate->heap()->undefined_value();
13382 ASSERT(proto->IsJSGlobalObject()); 13382 ASSERT(proto->IsJSGlobalObject());
13383 obj = JSReceiver::cast(proto); 13383 obj = JSReceiver::cast(proto);
13384 } 13384 }
13385 ASSERT(!(obj->map()->is_observed() && obj->IsJSObject() && 13385 ASSERT(!(obj->map()->is_observed() && obj->IsJSObject() &&
(...skipping 10 matching lines...) Expand all
13396 Map* map; 13396 Map* map;
13397 if (!maybe->To(&map)) return maybe; 13397 if (!maybe->To(&map)) return maybe;
13398 map->set_is_observed(is_observed); 13398 map->set_is_observed(is_observed);
13399 obj->set_map(map); 13399 obj->set_map(map);
13400 } 13400 }
13401 return isolate->heap()->undefined_value(); 13401 return isolate->heap()->undefined_value();
13402 } 13402 }
13403 13403
13404 13404
13405 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetObserverDeliveryPending) { 13405 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetObserverDeliveryPending) {
13406 NoHandleAllocation ha(isolate); 13406 SealHandleScope shs(isolate);
13407 ASSERT(args.length() == 0); 13407 ASSERT(args.length() == 0);
13408 isolate->set_observer_delivery_pending(true); 13408 isolate->set_observer_delivery_pending(true);
13409 return isolate->heap()->undefined_value(); 13409 return isolate->heap()->undefined_value();
13410 } 13410 }
13411 13411
13412 13412
13413 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetObservationState) { 13413 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetObservationState) {
13414 NoHandleAllocation ha(isolate); 13414 SealHandleScope shs(isolate);
13415 ASSERT(args.length() == 0); 13415 ASSERT(args.length() == 0);
13416 return isolate->heap()->observation_state(); 13416 return isolate->heap()->observation_state();
13417 } 13417 }
13418 13418
13419 13419
13420 RUNTIME_FUNCTION(MaybeObject*, Runtime_ObservationWeakMapCreate) { 13420 RUNTIME_FUNCTION(MaybeObject*, Runtime_ObservationWeakMapCreate) {
13421 HandleScope scope(isolate); 13421 HandleScope scope(isolate);
13422 ASSERT(args.length() == 0); 13422 ASSERT(args.length() == 0);
13423 // TODO(adamk): Currently this runtime function is only called three times per 13423 // TODO(adamk): Currently this runtime function is only called three times per
13424 // isolate. If it's called more often, the map should be moved into the 13424 // isolate. If it's called more often, the map should be moved into the
13425 // strong root list. 13425 // strong root list.
13426 Handle<Map> map = 13426 Handle<Map> map =
13427 isolate->factory()->NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize); 13427 isolate->factory()->NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize);
13428 Handle<JSWeakMap> weakmap = 13428 Handle<JSWeakMap> weakmap =
13429 Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map)); 13429 Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map));
13430 return WeakMapInitialize(isolate, weakmap); 13430 return WeakMapInitialize(isolate, weakmap);
13431 } 13431 }
13432 13432
13433 13433
13434 RUNTIME_FUNCTION(MaybeObject*, Runtime_UnwrapGlobalProxy) { 13434 RUNTIME_FUNCTION(MaybeObject*, Runtime_UnwrapGlobalProxy) {
13435 NoHandleAllocation ha(isolate); 13435 SealHandleScope shs(isolate);
13436 ASSERT(args.length() == 1); 13436 ASSERT(args.length() == 1);
13437 Object* object = args[0]; 13437 Object* object = args[0];
13438 if (object->IsJSGlobalProxy()) { 13438 if (object->IsJSGlobalProxy()) {
13439 object = object->GetPrototype(isolate); 13439 object = object->GetPrototype(isolate);
13440 if (object->IsNull()) return isolate->heap()->undefined_value(); 13440 if (object->IsNull()) return isolate->heap()->undefined_value();
13441 } 13441 }
13442 return object; 13442 return object;
13443 } 13443 }
13444 13444
13445 13445
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
13522 // Handle last resort GC and make sure to allow future allocations 13522 // Handle last resort GC and make sure to allow future allocations
13523 // to grow the heap without causing GCs (if possible). 13523 // to grow the heap without causing GCs (if possible).
13524 isolate->counters()->gc_last_resort_from_js()->Increment(); 13524 isolate->counters()->gc_last_resort_from_js()->Increment();
13525 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 13525 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
13526 "Runtime::PerformGC"); 13526 "Runtime::PerformGC");
13527 } 13527 }
13528 } 13528 }
13529 13529
13530 13530
13531 } } // namespace v8::internal 13531 } } // namespace v8::internal
OLDNEW
« src/api.cc ('K') | « src/optimizing-compiler-thread.cc ('k') | src/safepoint-table.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698