| OLD | NEW |
| 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 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 if (JSObject::cast(*boilerplate)->elements()->map() == | 666 if (JSObject::cast(*boilerplate)->elements()->map() == |
| 667 isolate->heap()->fixed_cow_array_map()) { | 667 isolate->heap()->fixed_cow_array_map()) { |
| 668 isolate->counters()->cow_arrays_created_runtime()->Increment(); | 668 isolate->counters()->cow_arrays_created_runtime()->Increment(); |
| 669 } | 669 } |
| 670 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); | 670 return isolate->heap()->CopyJSObject(JSObject::cast(*boilerplate)); |
| 671 } | 671 } |
| 672 | 672 |
| 673 | 673 |
| 674 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSProxy) { | 674 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSProxy) { |
| 675 ASSERT(args.length() == 2); | 675 ASSERT(args.length() == 2); |
| 676 Object* handler = args[0]; | 676 CONVERT_ARG_CHECKED(JSReceiver, handler, 0); |
| 677 Object* prototype = args[1]; | 677 Object* prototype = args[1]; |
| 678 Object* used_prototype = | 678 Object* used_prototype = |
| 679 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value(); | 679 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value(); |
| 680 return isolate->heap()->AllocateJSProxy(handler, used_prototype); | 680 return isolate->heap()->AllocateJSProxy(handler, used_prototype); |
| 681 } | 681 } |
| 682 | 682 |
| 683 | 683 |
| 684 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSFunctionProxy) { | 684 RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSFunctionProxy) { |
| 685 ASSERT(args.length() == 4); | 685 ASSERT(args.length() == 4); |
| 686 Object* handler = args[0]; | 686 CONVERT_ARG_CHECKED(JSReceiver, handler, 0); |
| 687 Object* call_trap = args[1]; | 687 Object* call_trap = args[1]; |
| 688 Object* construct_trap = args[2]; | 688 RUNTIME_ASSERT(call_trap->IsJSFunction() || call_trap->IsJSFunctionProxy()); |
| 689 CONVERT_ARG_CHECKED(JSFunction, construct_trap, 2); |
| 689 Object* prototype = args[3]; | 690 Object* prototype = args[3]; |
| 690 Object* used_prototype = | 691 Object* used_prototype = |
| 691 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value(); | 692 prototype->IsJSReceiver() ? prototype : isolate->heap()->null_value(); |
| 692 return isolate->heap()->AllocateJSFunctionProxy( | 693 return isolate->heap()->AllocateJSFunctionProxy( |
| 693 handler, call_trap, construct_trap, used_prototype); | 694 handler, call_trap, construct_trap, used_prototype); |
| 694 } | 695 } |
| 695 | 696 |
| 696 | 697 |
| 697 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSProxy) { | 698 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSProxy) { |
| 698 ASSERT(args.length() == 1); | 699 ASSERT(args.length() == 1); |
| (...skipping 1360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2059 f->shared()->set_name_should_print_as_anonymous(true); | 2060 f->shared()->set_name_should_print_as_anonymous(true); |
| 2060 return isolate->heap()->undefined_value(); | 2061 return isolate->heap()->undefined_value(); |
| 2061 } | 2062 } |
| 2062 | 2063 |
| 2063 | 2064 |
| 2064 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) { | 2065 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) { |
| 2065 NoHandleAllocation ha; | 2066 NoHandleAllocation ha; |
| 2066 ASSERT(args.length() == 1); | 2067 ASSERT(args.length() == 1); |
| 2067 | 2068 |
| 2068 CONVERT_ARG_CHECKED(JSFunction, f, 0); | 2069 CONVERT_ARG_CHECKED(JSFunction, f, 0); |
| 2069 Object* obj = f->RemovePrototype(); | 2070 f->RemovePrototype(); |
| 2070 if (obj->IsFailure()) return obj; | |
| 2071 | 2071 |
| 2072 return isolate->heap()->undefined_value(); | 2072 return isolate->heap()->undefined_value(); |
| 2073 } | 2073 } |
| 2074 | 2074 |
| 2075 | 2075 |
| 2076 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) { | 2076 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) { |
| 2077 HandleScope scope(isolate); | 2077 HandleScope scope(isolate); |
| 2078 ASSERT(args.length() == 1); | 2078 ASSERT(args.length() == 1); |
| 2079 | 2079 |
| 2080 CONVERT_ARG_CHECKED(JSFunction, fun, 0); | 2080 CONVERT_ARG_CHECKED(JSFunction, fun, 0); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2300 } | 2300 } |
| 2301 return isolate->heap()->empty_string(); | 2301 return isolate->heap()->empty_string(); |
| 2302 } | 2302 } |
| 2303 | 2303 |
| 2304 | 2304 |
| 2305 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) { | 2305 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) { |
| 2306 NoHandleAllocation ha; | 2306 NoHandleAllocation ha; |
| 2307 ASSERT(args.length() == 2); | 2307 ASSERT(args.length() == 2); |
| 2308 | 2308 |
| 2309 CONVERT_ARG_CHECKED(String, subject, 0); | 2309 CONVERT_ARG_CHECKED(String, subject, 0); |
| 2310 Object* index = args[1]; | 2310 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]); |
| 2311 RUNTIME_ASSERT(index->IsNumber()); | |
| 2312 | |
| 2313 uint32_t i = 0; | |
| 2314 if (index->IsSmi()) { | |
| 2315 int value = Smi::cast(index)->value(); | |
| 2316 if (value < 0) return isolate->heap()->nan_value(); | |
| 2317 i = value; | |
| 2318 } else { | |
| 2319 ASSERT(index->IsHeapNumber()); | |
| 2320 double value = HeapNumber::cast(index)->value(); | |
| 2321 i = static_cast<uint32_t>(DoubleToInteger(value)); | |
| 2322 } | |
| 2323 | 2311 |
| 2324 // Flatten the string. If someone wants to get a char at an index | 2312 // Flatten the string. If someone wants to get a char at an index |
| 2325 // in a cons string, it is likely that more indices will be | 2313 // in a cons string, it is likely that more indices will be |
| 2326 // accessed. | 2314 // accessed. |
| 2327 Object* flat; | 2315 Object* flat; |
| 2328 { MaybeObject* maybe_flat = subject->TryFlatten(); | 2316 { MaybeObject* maybe_flat = subject->TryFlatten(); |
| 2329 if (!maybe_flat->ToObject(&flat)) return maybe_flat; | 2317 if (!maybe_flat->ToObject(&flat)) return maybe_flat; |
| 2330 } | 2318 } |
| 2331 subject = String::cast(flat); | 2319 subject = String::cast(flat); |
| 2332 | 2320 |
| (...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3282 return StringReplaceRegExpWithEmptyString<SeqTwoByteString>( | 3270 return StringReplaceRegExpWithEmptyString<SeqTwoByteString>( |
| 3283 isolate, subject, regexp, last_match_info); | 3271 isolate, subject, regexp, last_match_info); |
| 3284 } | 3272 } |
| 3285 } | 3273 } |
| 3286 | 3274 |
| 3287 return StringReplaceRegExpWithString( | 3275 return StringReplaceRegExpWithString( |
| 3288 isolate, subject, regexp, replacement, last_match_info); | 3276 isolate, subject, regexp, replacement, last_match_info); |
| 3289 } | 3277 } |
| 3290 | 3278 |
| 3291 | 3279 |
| 3292 Handle<String> Runtime::StringReplaceOneCharWithString(Isolate* isolate, | 3280 Handle<String> StringReplaceOneCharWithString(Isolate* isolate, |
| 3293 Handle<String> subject, | 3281 Handle<String> subject, |
| 3294 Handle<String> search, | 3282 Handle<String> search, |
| 3295 Handle<String> replace, | 3283 Handle<String> replace, |
| 3296 bool* found, | 3284 bool* found, |
| 3297 int recursion_limit) { | 3285 int recursion_limit) { |
| 3298 if (recursion_limit == 0) return Handle<String>::null(); | 3286 if (recursion_limit == 0) return Handle<String>::null(); |
| 3299 if (subject->IsConsString()) { | 3287 if (subject->IsConsString()) { |
| 3300 ConsString* cons = ConsString::cast(*subject); | 3288 ConsString* cons = ConsString::cast(*subject); |
| 3301 Handle<String> first = Handle<String>(cons->first()); | 3289 Handle<String> first = Handle<String>(cons->first()); |
| 3302 Handle<String> second = Handle<String>(cons->second()); | 3290 Handle<String> second = Handle<String>(cons->second()); |
| 3303 Handle<String> new_first = | 3291 Handle<String> new_first = |
| 3304 StringReplaceOneCharWithString(isolate, | 3292 StringReplaceOneCharWithString(isolate, |
| 3305 first, | 3293 first, |
| 3306 search, | 3294 search, |
| 3307 replace, | 3295 replace, |
| 3308 found, | 3296 found, |
| 3309 recursion_limit - 1); | 3297 recursion_limit - 1); |
| 3310 if (*found) return isolate->factory()->NewConsString(new_first, second); | 3298 if (*found) return isolate->factory()->NewConsString(new_first, second); |
| 3311 if (new_first.is_null()) return new_first; | 3299 if (new_first.is_null()) return new_first; |
| 3312 | 3300 |
| 3313 Handle<String> new_second = | 3301 Handle<String> new_second = |
| 3314 StringReplaceOneCharWithString(isolate, | 3302 StringReplaceOneCharWithString(isolate, |
| 3315 second, | 3303 second, |
| 3316 search, | 3304 search, |
| 3317 replace, | 3305 replace, |
| 3318 found, | 3306 found, |
| 3319 recursion_limit - 1); | 3307 recursion_limit - 1); |
| 3320 if (*found) return isolate->factory()->NewConsString(first, new_second); | 3308 if (*found) return isolate->factory()->NewConsString(first, new_second); |
| 3321 if (new_second.is_null()) return new_second; | 3309 if (new_second.is_null()) return new_second; |
| 3322 | 3310 |
| 3323 return subject; | 3311 return subject; |
| 3324 } else { | 3312 } else { |
| 3325 int index = StringMatch(isolate, subject, search, 0); | 3313 int index = Runtime::StringMatch(isolate, subject, search, 0); |
| 3326 if (index == -1) return subject; | 3314 if (index == -1) return subject; |
| 3327 *found = true; | 3315 *found = true; |
| 3328 Handle<String> first = isolate->factory()->NewSubString(subject, 0, index); | 3316 Handle<String> first = isolate->factory()->NewSubString(subject, 0, index); |
| 3329 Handle<String> cons1 = isolate->factory()->NewConsString(first, replace); | 3317 Handle<String> cons1 = isolate->factory()->NewConsString(first, replace); |
| 3330 Handle<String> second = | 3318 Handle<String> second = |
| 3331 isolate->factory()->NewSubString(subject, index + 1, subject->length()); | 3319 isolate->factory()->NewSubString(subject, index + 1, subject->length()); |
| 3332 return isolate->factory()->NewConsString(cons1, second); | 3320 return isolate->factory()->NewConsString(cons1, second); |
| 3333 } | 3321 } |
| 3334 } | 3322 } |
| 3335 | 3323 |
| 3336 | 3324 |
| 3337 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceOneCharWithString) { | 3325 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceOneCharWithString) { |
| 3338 ASSERT(args.length() == 3); | 3326 ASSERT(args.length() == 3); |
| 3339 HandleScope scope(isolate); | 3327 HandleScope scope(isolate); |
| 3340 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); | 3328 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); |
| 3341 CONVERT_ARG_HANDLE_CHECKED(String, search, 1); | 3329 CONVERT_ARG_HANDLE_CHECKED(String, search, 1); |
| 3342 CONVERT_ARG_HANDLE_CHECKED(String, replace, 2); | 3330 CONVERT_ARG_HANDLE_CHECKED(String, replace, 2); |
| 3343 | 3331 |
| 3344 // If the cons string tree is too deep, we simply abort the recursion and | 3332 // If the cons string tree is too deep, we simply abort the recursion and |
| 3345 // retry with a flattened subject string. | 3333 // retry with a flattened subject string. |
| 3346 const int kRecursionLimit = 0x1000; | 3334 const int kRecursionLimit = 0x1000; |
| 3347 bool found = false; | 3335 bool found = false; |
| 3348 Handle<String> result = | 3336 Handle<String> result = StringReplaceOneCharWithString(isolate, |
| 3349 Runtime::StringReplaceOneCharWithString(isolate, | 3337 subject, |
| 3350 subject, | 3338 search, |
| 3351 search, | 3339 replace, |
| 3352 replace, | 3340 &found, |
| 3353 &found, | 3341 kRecursionLimit); |
| 3354 kRecursionLimit); | |
| 3355 if (!result.is_null()) return *result; | 3342 if (!result.is_null()) return *result; |
| 3356 return *Runtime::StringReplaceOneCharWithString(isolate, | 3343 return *StringReplaceOneCharWithString(isolate, |
| 3357 FlattenGetString(subject), | 3344 FlattenGetString(subject), |
| 3358 search, | 3345 search, |
| 3359 replace, | 3346 replace, |
| 3360 &found, | 3347 &found, |
| 3361 kRecursionLimit); | 3348 kRecursionLimit); |
| 3362 } | 3349 } |
| 3363 | 3350 |
| 3364 | 3351 |
| 3365 // Perform string match of pattern on subject, starting at start index. | 3352 // Perform string match of pattern on subject, starting at start index. |
| 3366 // Caller must ensure that 0 <= start_index <= sub->length(), | 3353 // Caller must ensure that 0 <= start_index <= sub->length(), |
| 3367 // and should check that pat->length() + start_index <= sub->length(). | 3354 // and should check that pat->length() + start_index <= sub->length(). |
| 3368 int Runtime::StringMatch(Isolate* isolate, | 3355 int Runtime::StringMatch(Isolate* isolate, |
| 3369 Handle<String> sub, | 3356 Handle<String> sub, |
| 3370 Handle<String> pat, | 3357 Handle<String> pat, |
| 3371 int start_index) { | 3358 int start_index) { |
| (...skipping 5485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8857 ASSERT(args.length() == 1); | 8844 ASSERT(args.length() == 1); |
| 8858 | 8845 |
| 8859 Handle<Object> name(args[0], isolate); | 8846 Handle<Object> name(args[0], isolate); |
| 8860 Handle<Object> reference_error = | 8847 Handle<Object> reference_error = |
| 8861 isolate->factory()->NewReferenceError("not_defined", | 8848 isolate->factory()->NewReferenceError("not_defined", |
| 8862 HandleVector(&name, 1)); | 8849 HandleVector(&name, 1)); |
| 8863 return isolate->Throw(*reference_error); | 8850 return isolate->Throw(*reference_error); |
| 8864 } | 8851 } |
| 8865 | 8852 |
| 8866 | 8853 |
| 8854 RUNTIME_FUNCTION(MaybeObject*, Runtime_ThrowNotDateError) { |
| 8855 HandleScope scope(isolate); |
| 8856 ASSERT(args.length() == 0); |
| 8857 return isolate->Throw(*isolate->factory()->NewTypeError( |
| 8858 "not_date_object", HandleVector<Object>(NULL, 0))); |
| 8859 } |
| 8860 |
| 8861 |
| 8862 |
| 8867 RUNTIME_FUNCTION(MaybeObject*, Runtime_StackGuard) { | 8863 RUNTIME_FUNCTION(MaybeObject*, Runtime_StackGuard) { |
| 8868 ASSERT(args.length() == 0); | 8864 ASSERT(args.length() == 0); |
| 8869 | 8865 |
| 8870 // First check if this is a real stack overflow. | 8866 // First check if this is a real stack overflow. |
| 8871 if (isolate->stack_guard()->IsStackOverflow()) { | 8867 if (isolate->stack_guard()->IsStackOverflow()) { |
| 8872 NoHandleAllocation na; | 8868 NoHandleAllocation na; |
| 8873 return isolate->StackOverflow(); | 8869 return isolate->StackOverflow(); |
| 8874 } | 8870 } |
| 8875 | 8871 |
| 8876 return Execution::HandleStackGuardInterrupt(isolate); | 8872 return Execution::HandleStackGuardInterrupt(isolate); |
| (...skipping 3376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12253 | 12249 |
| 12254 // For a script finds all SharedFunctionInfo's in the heap that points | 12250 // For a script finds all SharedFunctionInfo's in the heap that points |
| 12255 // to this script. Returns JSArray of SharedFunctionInfo wrapped | 12251 // to this script. Returns JSArray of SharedFunctionInfo wrapped |
| 12256 // in OpaqueReferences. | 12252 // in OpaqueReferences. |
| 12257 RUNTIME_FUNCTION(MaybeObject*, | 12253 RUNTIME_FUNCTION(MaybeObject*, |
| 12258 Runtime_LiveEditFindSharedFunctionInfosForScript) { | 12254 Runtime_LiveEditFindSharedFunctionInfosForScript) { |
| 12259 ASSERT(args.length() == 1); | 12255 ASSERT(args.length() == 1); |
| 12260 HandleScope scope(isolate); | 12256 HandleScope scope(isolate); |
| 12261 CONVERT_ARG_CHECKED(JSValue, script_value, 0); | 12257 CONVERT_ARG_CHECKED(JSValue, script_value, 0); |
| 12262 | 12258 |
| 12263 | 12259 RUNTIME_ASSERT(script_value->value()->IsScript()); |
| 12264 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); | 12260 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); |
| 12265 | 12261 |
| 12266 const int kBufferSize = 32; | 12262 const int kBufferSize = 32; |
| 12267 | 12263 |
| 12268 Handle<FixedArray> array; | 12264 Handle<FixedArray> array; |
| 12269 array = isolate->factory()->NewFixedArray(kBufferSize); | 12265 array = isolate->factory()->NewFixedArray(kBufferSize); |
| 12270 int number; | 12266 int number; |
| 12271 { | 12267 { |
| 12272 isolate->heap()->EnsureHeapIsIterable(); | 12268 isolate->heap()->EnsureHeapIsIterable(); |
| 12273 AssertNoAllocation no_allocations; | 12269 AssertNoAllocation no_allocations; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 12299 // The source of the actual script is not used, however it is important that | 12295 // The source of the actual script is not used, however it is important that |
| 12300 // all generated code keeps references to this particular instance of script. | 12296 // all generated code keeps references to this particular instance of script. |
| 12301 // Returns a JSArray of compilation infos. The array is ordered so that | 12297 // Returns a JSArray of compilation infos. The array is ordered so that |
| 12302 // each function with all its descendant is always stored in a continues range | 12298 // each function with all its descendant is always stored in a continues range |
| 12303 // with the function itself going first. The root function is a script function. | 12299 // with the function itself going first. The root function is a script function. |
| 12304 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) { | 12300 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) { |
| 12305 ASSERT(args.length() == 2); | 12301 ASSERT(args.length() == 2); |
| 12306 HandleScope scope(isolate); | 12302 HandleScope scope(isolate); |
| 12307 CONVERT_ARG_CHECKED(JSValue, script, 0); | 12303 CONVERT_ARG_CHECKED(JSValue, script, 0); |
| 12308 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); | 12304 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); |
| 12305 |
| 12306 RUNTIME_ASSERT(script->value()->IsScript()); |
| 12309 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); | 12307 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); |
| 12310 | 12308 |
| 12311 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); | 12309 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); |
| 12312 | 12310 |
| 12313 if (isolate->has_pending_exception()) { | 12311 if (isolate->has_pending_exception()) { |
| 12314 return Failure::Exception(); | 12312 return Failure::Exception(); |
| 12315 } | 12313 } |
| 12316 | 12314 |
| 12317 return result; | 12315 return result; |
| 12318 } | 12316 } |
| (...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13287 // Handle last resort GC and make sure to allow future allocations | 13285 // Handle last resort GC and make sure to allow future allocations |
| 13288 // to grow the heap without causing GCs (if possible). | 13286 // to grow the heap without causing GCs (if possible). |
| 13289 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13287 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13290 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, | 13288 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, |
| 13291 "Runtime::PerformGC"); | 13289 "Runtime::PerformGC"); |
| 13292 } | 13290 } |
| 13293 } | 13291 } |
| 13294 | 13292 |
| 13295 | 13293 |
| 13296 } } // namespace v8::internal | 13294 } } // namespace v8::internal |
| OLD | NEW |