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

Side by Side Diff: src/runtime.cc

Issue 126268: Avoid needless creation of handles in regexp runtime routines and use... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 NoHandleAllocation ha; 515 NoHandleAllocation ha;
516 ASSERT(args.length() == 0); 516 ASSERT(args.length() == 0);
517 JavaScriptFrameIterator it; 517 JavaScriptFrameIterator it;
518 return Heap::ToBoolean(it.frame()->IsConstructor()); 518 return Heap::ToBoolean(it.frame()->IsConstructor());
519 } 519 }
520 520
521 521
522 static Object* Runtime_RegExpCompile(Arguments args) { 522 static Object* Runtime_RegExpCompile(Arguments args) {
523 HandleScope scope; 523 HandleScope scope;
524 ASSERT(args.length() == 3); 524 ASSERT(args.length() == 3);
525 CONVERT_CHECKED(JSRegExp, raw_re, args[0]); 525 CONVERT_ARG_CHECKED(JSRegExp, re, 0);
526 Handle<JSRegExp> re(raw_re); 526 CONVERT_ARG_CHECKED(String, pattern, 1);
527 CONVERT_CHECKED(String, raw_pattern, args[1]); 527 CONVERT_ARG_CHECKED(String, flags, 2);
528 Handle<String> pattern(raw_pattern);
529 CONVERT_CHECKED(String, raw_flags, args[2]);
530 Handle<String> flags(raw_flags);
531 Handle<Object> result = RegExpImpl::Compile(re, pattern, flags); 528 Handle<Object> result = RegExpImpl::Compile(re, pattern, flags);
532 if (result.is_null()) return Failure::Exception(); 529 if (result.is_null()) return Failure::Exception();
533 return *result; 530 return *result;
534 } 531 }
535 532
536 533
537 static Object* Runtime_CreateApiFunction(Arguments args) { 534 static Object* Runtime_CreateApiFunction(Arguments args) {
538 HandleScope scope; 535 HandleScope scope;
539 ASSERT(args.length() == 1); 536 ASSERT(args.length() == 1);
540 CONVERT_CHECKED(FunctionTemplateInfo, raw_data, args[0]); 537 CONVERT_ARG_CHECKED(FunctionTemplateInfo, data, 0);
541 Handle<FunctionTemplateInfo> data(raw_data);
542 return *Factory::CreateApiFunction(data); 538 return *Factory::CreateApiFunction(data);
543 } 539 }
544 540
545 541
546 static Object* Runtime_IsTemplate(Arguments args) { 542 static Object* Runtime_IsTemplate(Arguments args) {
547 ASSERT(args.length() == 1); 543 ASSERT(args.length() == 1);
548 Object* arg = args[0]; 544 Object* arg = args[0];
549 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo(); 545 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo();
550 return Heap::ToBoolean(result); 546 return Heap::ToBoolean(result);
551 } 547 }
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
1059 } 1055 }
1060 } 1056 }
1061 1057
1062 return *value; 1058 return *value;
1063 } 1059 }
1064 1060
1065 1061
1066 static Object* Runtime_RegExpExec(Arguments args) { 1062 static Object* Runtime_RegExpExec(Arguments args) {
1067 HandleScope scope; 1063 HandleScope scope;
1068 ASSERT(args.length() == 4); 1064 ASSERT(args.length() == 4);
1069 CONVERT_CHECKED(JSRegExp, raw_regexp, args[0]); 1065 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0);
1070 Handle<JSRegExp> regexp(raw_regexp); 1066 CONVERT_ARG_CHECKED(String, subject, 1);
1071 CONVERT_CHECKED(String, raw_subject, args[1]);
1072 Handle<String> subject(raw_subject);
1073 // Due to the way the JS files are constructed this must be less than the 1067 // Due to the way the JS files are constructed this must be less than the
1074 // length of a string, i.e. it is always a Smi. We check anyway for security. 1068 // length of a string, i.e. it is always a Smi. We check anyway for security.
1075 CONVERT_CHECKED(Smi, index, args[2]); 1069 CONVERT_CHECKED(Smi, index, args[2]);
1076 CONVERT_CHECKED(JSArray, raw_last_match_info, args[3]); 1070 CONVERT_ARG_CHECKED(JSArray, last_match_info, 3);
1077 Handle<JSArray> last_match_info(raw_last_match_info);
1078 RUNTIME_ASSERT(last_match_info->HasFastElements()); 1071 RUNTIME_ASSERT(last_match_info->HasFastElements());
1079 RUNTIME_ASSERT(index->value() >= 0); 1072 RUNTIME_ASSERT(index->value() >= 0);
1080 RUNTIME_ASSERT(index->value() <= subject->length()); 1073 RUNTIME_ASSERT(index->value() <= subject->length());
1081 Handle<Object> result = RegExpImpl::Exec(regexp, 1074 Handle<Object> result = RegExpImpl::Exec(regexp,
1082 subject, 1075 subject,
1083 index->value(), 1076 index->value(),
1084 last_match_info); 1077 last_match_info);
1085 if (result.is_null()) return Failure::Exception(); 1078 if (result.is_null()) return Failure::Exception();
1086 return *result; 1079 return *result;
1087 } 1080 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 // the API. 1203 // the API.
1211 return !f->shared()->function_data()->IsUndefined() ? Heap::true_value() 1204 return !f->shared()->function_data()->IsUndefined() ? Heap::true_value()
1212 : Heap::false_value(); 1205 : Heap::false_value();
1213 } 1206 }
1214 1207
1215 1208
1216 static Object* Runtime_SetCode(Arguments args) { 1209 static Object* Runtime_SetCode(Arguments args) {
1217 HandleScope scope; 1210 HandleScope scope;
1218 ASSERT(args.length() == 2); 1211 ASSERT(args.length() == 2);
1219 1212
1220 CONVERT_CHECKED(JSFunction, raw_target, args[0]); 1213 CONVERT_ARG_CHECKED(JSFunction, target, 0);
1221 Handle<JSFunction> target(raw_target);
1222 Handle<Object> code = args.at<Object>(1); 1214 Handle<Object> code = args.at<Object>(1);
1223 1215
1224 Handle<Context> context(target->context()); 1216 Handle<Context> context(target->context());
1225 1217
1226 if (!code->IsNull()) { 1218 if (!code->IsNull()) {
1227 RUNTIME_ASSERT(code->IsJSFunction()); 1219 RUNTIME_ASSERT(code->IsJSFunction());
1228 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); 1220 Handle<JSFunction> fun = Handle<JSFunction>::cast(code);
1229 SetExpectedNofProperties(target, fun->shared()->expected_nof_properties()); 1221 SetExpectedNofProperties(target, fun->shared()->expected_nof_properties());
1230 if (!fun->is_compiled() && !CompileLazy(fun, KEEP_EXCEPTION)) { 1222 if (!fun->is_compiled() && !CompileLazy(fun, KEEP_EXCEPTION)) {
1231 return Failure::Exception(); 1223 return Failure::Exception();
(...skipping 1733 matching lines...) Expand 10 before | Expand all | Expand 10 after
2965 } 2957 }
2966 2958
2967 PropertyAttributes att = object->GetLocalPropertyAttribute(key); 2959 PropertyAttributes att = object->GetLocalPropertyAttribute(key);
2968 return Heap::ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0); 2960 return Heap::ToBoolean(att != ABSENT && (att & DONT_ENUM) == 0);
2969 } 2961 }
2970 2962
2971 2963
2972 static Object* Runtime_GetPropertyNames(Arguments args) { 2964 static Object* Runtime_GetPropertyNames(Arguments args) {
2973 HandleScope scope; 2965 HandleScope scope;
2974 ASSERT(args.length() == 1); 2966 ASSERT(args.length() == 1);
2975 2967 CONVERT_ARG_CHECKED(JSObject, object, 0);
2976 CONVERT_CHECKED(JSObject, raw_object, args[0]);
2977 Handle<JSObject> object(raw_object);
2978 return *GetKeysFor(object); 2968 return *GetKeysFor(object);
2979 } 2969 }
2980 2970
2981 2971
2982 // Returns either a FixedArray as Runtime_GetPropertyNames, 2972 // Returns either a FixedArray as Runtime_GetPropertyNames,
2983 // or, if the given object has an enum cache that contains 2973 // or, if the given object has an enum cache that contains
2984 // all enumerable properties of the object and its prototypes 2974 // all enumerable properties of the object and its prototypes
2985 // have none, the map of the object. This is used to speed up 2975 // have none, the map of the object. This is used to speed up
2986 // the check for deletions during a for-in. 2976 // the check for deletions during a for-in.
2987 static Object* Runtime_GetPropertyNamesFast(Arguments args) { 2977 static Object* Runtime_GetPropertyNamesFast(Arguments args) {
(...skipping 3668 matching lines...) Expand 10 before | Expand all | Expand 10 after
6656 6646
6657 // Convert to JS array and return. 6647 // Convert to JS array and return.
6658 return *Factory::NewJSArrayWithElements(details); 6648 return *Factory::NewJSArrayWithElements(details);
6659 } 6649 }
6660 6650
6661 6651
6662 static Object* Runtime_GetBreakLocations(Arguments args) { 6652 static Object* Runtime_GetBreakLocations(Arguments args) {
6663 HandleScope scope; 6653 HandleScope scope;
6664 ASSERT(args.length() == 1); 6654 ASSERT(args.length() == 1);
6665 6655
6666 CONVERT_ARG_CHECKED(JSFunction, raw_fun, 0); 6656 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
6667 Handle<SharedFunctionInfo> shared(raw_fun->shared()); 6657 Handle<SharedFunctionInfo> shared(fun->shared());
6668 // Find the number of break points 6658 // Find the number of break points
6669 Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared); 6659 Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared);
6670 if (break_locations->IsUndefined()) return Heap::undefined_value(); 6660 if (break_locations->IsUndefined()) return Heap::undefined_value();
6671 // Return array as JS array 6661 // Return array as JS array
6672 return *Factory::NewJSArrayWithElements( 6662 return *Factory::NewJSArrayWithElements(
6673 Handle<FixedArray>::cast(break_locations)); 6663 Handle<FixedArray>::cast(break_locations));
6674 } 6664 }
6675 6665
6676 6666
6677 // Set a break point in a function 6667 // Set a break point in a function
6678 // args[0]: function 6668 // args[0]: function
6679 // args[1]: number: break source position (within the function source) 6669 // args[1]: number: break source position (within the function source)
6680 // args[2]: number: break point object 6670 // args[2]: number: break point object
6681 static Object* Runtime_SetFunctionBreakPoint(Arguments args) { 6671 static Object* Runtime_SetFunctionBreakPoint(Arguments args) {
6682 HandleScope scope; 6672 HandleScope scope;
6683 ASSERT(args.length() == 3); 6673 ASSERT(args.length() == 3);
6684 CONVERT_ARG_CHECKED(JSFunction, raw_fun, 0); 6674 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
6685 Handle<SharedFunctionInfo> shared(raw_fun->shared()); 6675 Handle<SharedFunctionInfo> shared(fun->shared());
6686 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); 6676 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
6687 RUNTIME_ASSERT(source_position >= 0); 6677 RUNTIME_ASSERT(source_position >= 0);
6688 Handle<Object> break_point_object_arg = args.at<Object>(2); 6678 Handle<Object> break_point_object_arg = args.at<Object>(2);
6689 6679
6690 // Set break point. 6680 // Set break point.
6691 Debug::SetBreakPoint(shared, source_position, break_point_object_arg); 6681 Debug::SetBreakPoint(shared, source_position, break_point_object_arg);
6692 6682
6693 return Heap::undefined_value(); 6683 return Heap::undefined_value();
6694 } 6684 }
6695 6685
(...skipping 813 matching lines...) Expand 10 before | Expand all | Expand 10 after
7509 } else { 7499 } else {
7510 // Handle last resort GC and make sure to allow future allocations 7500 // Handle last resort GC and make sure to allow future allocations
7511 // to grow the heap without causing GCs (if possible). 7501 // to grow the heap without causing GCs (if possible).
7512 Counters::gc_last_resort_from_js.Increment(); 7502 Counters::gc_last_resort_from_js.Increment();
7513 Heap::CollectAllGarbage(); 7503 Heap::CollectAllGarbage();
7514 } 7504 }
7515 } 7505 }
7516 7506
7517 7507
7518 } } // namespace v8::internal 7508 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698