OLD | NEW |
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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 #include "runtime.h" | 43 #include "runtime.h" |
44 #include "scopeinfo.h" | 44 #include "scopeinfo.h" |
45 #include "v8threads.h" | 45 #include "v8threads.h" |
46 #include "smart-pointer.h" | 46 #include "smart-pointer.h" |
47 #include "parser.h" | 47 #include "parser.h" |
48 | 48 |
49 namespace v8 { | 49 namespace v8 { |
50 namespace internal { | 50 namespace internal { |
51 | 51 |
52 | 52 |
53 #define RUNTIME_ASSERT(value) do { \ | 53 #define RUNTIME_ASSERT(value) \ |
54 if (!(value)) return IllegalOperation(); \ | 54 if (!(value)) return Top::ThrowIllegalOperation(); |
55 } while (false) | |
56 | 55 |
57 // Cast the given object to a value of the specified type and store | 56 // Cast the given object to a value of the specified type and store |
58 // it in a variable with the given name. If the object is not of the | 57 // it in a variable with the given name. If the object is not of the |
59 // expected type call IllegalOperation and return. | 58 // expected type call IllegalOperation and return. |
60 #define CONVERT_CHECKED(Type, name, obj) \ | 59 #define CONVERT_CHECKED(Type, name, obj) \ |
61 RUNTIME_ASSERT(obj->Is##Type()); \ | 60 RUNTIME_ASSERT(obj->Is##Type()); \ |
62 Type* name = Type::cast(obj); | 61 Type* name = Type::cast(obj); |
63 | 62 |
64 #define CONVERT_ARG_CHECKED(Type, name, index) \ | 63 #define CONVERT_ARG_CHECKED(Type, name, index) \ |
65 RUNTIME_ASSERT(args[index]->Is##Type()); \ | 64 RUNTIME_ASSERT(args[index]->Is##Type()); \ |
(...skipping 24 matching lines...) Expand all Loading... |
90 // a variable of the specified type with the given name. If the | 89 // a variable of the specified type with the given name. If the |
91 // object is not a Number call IllegalOperation and return. | 90 // object is not a Number call IllegalOperation and return. |
92 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ | 91 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ |
93 RUNTIME_ASSERT(obj->IsNumber()); \ | 92 RUNTIME_ASSERT(obj->IsNumber()); \ |
94 type name = NumberTo##Type(obj); | 93 type name = NumberTo##Type(obj); |
95 | 94 |
96 // Non-reentrant string buffer for efficient general use in this file. | 95 // Non-reentrant string buffer for efficient general use in this file. |
97 static StaticResource<StringInputBuffer> runtime_string_input_buffer; | 96 static StaticResource<StringInputBuffer> runtime_string_input_buffer; |
98 | 97 |
99 | 98 |
100 static Object* IllegalOperation() { | |
101 return Top::Throw(Heap::illegal_access_symbol()); | |
102 } | |
103 | |
104 | |
105 static Object* DeepCopyBoilerplate(JSObject* boilerplate) { | 99 static Object* DeepCopyBoilerplate(JSObject* boilerplate) { |
106 StackLimitCheck check; | 100 StackLimitCheck check; |
107 if (check.HasOverflowed()) return Top::StackOverflow(); | 101 if (check.HasOverflowed()) return Top::StackOverflow(); |
108 | 102 |
109 Object* result = Heap::CopyJSObject(boilerplate); | 103 Object* result = Heap::CopyJSObject(boilerplate); |
110 if (result->IsFailure()) return result; | 104 if (result->IsFailure()) return result; |
111 JSObject* copy = JSObject::cast(result); | 105 JSObject* copy = JSObject::cast(result); |
112 | 106 |
113 // Deep copy local properties. | 107 // Deep copy local properties. |
114 if (copy->HasFastProperties()) { | 108 if (copy->HasFastProperties()) { |
(...skipping 3582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3697 #endif | 3691 #endif |
3698 x = fmod(x, y); | 3692 x = fmod(x, y); |
3699 // NewNumberFromDouble may return a Smi instead of a Number object | 3693 // NewNumberFromDouble may return a Smi instead of a Number object |
3700 return Heap::NewNumberFromDouble(x); | 3694 return Heap::NewNumberFromDouble(x); |
3701 } | 3695 } |
3702 | 3696 |
3703 | 3697 |
3704 static Object* Runtime_StringAdd(Arguments args) { | 3698 static Object* Runtime_StringAdd(Arguments args) { |
3705 NoHandleAllocation ha; | 3699 NoHandleAllocation ha; |
3706 ASSERT(args.length() == 2); | 3700 ASSERT(args.length() == 2); |
3707 | |
3708 CONVERT_CHECKED(String, str1, args[0]); | 3701 CONVERT_CHECKED(String, str1, args[0]); |
3709 CONVERT_CHECKED(String, str2, args[1]); | 3702 CONVERT_CHECKED(String, str2, args[1]); |
3710 int len1 = str1->length(); | |
3711 int len2 = str2->length(); | |
3712 if (len1 == 0) return str2; | |
3713 if (len2 == 0) return str1; | |
3714 int length_sum = len1 + len2; | |
3715 // Make sure that an out of memory exception is thrown if the length | |
3716 // of the new cons string is too large to fit in a Smi. | |
3717 if (length_sum > Smi::kMaxValue || length_sum < 0) { | |
3718 Top::context()->mark_out_of_memory(); | |
3719 return Failure::OutOfMemoryException(); | |
3720 } | |
3721 return Heap::AllocateConsString(str1, str2); | 3703 return Heap::AllocateConsString(str1, str2); |
3722 } | 3704 } |
3723 | 3705 |
3724 | 3706 |
3725 template<typename sinkchar> | 3707 template<typename sinkchar> |
3726 static inline void StringBuilderConcatHelper(String* special, | 3708 static inline void StringBuilderConcatHelper(String* special, |
3727 sinkchar* sink, | 3709 sinkchar* sink, |
3728 FixedArray* fixed_array, | 3710 FixedArray* fixed_array, |
3729 int array_length) { | 3711 int array_length) { |
3730 int position = 0; | 3712 int position = 0; |
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4577 // extension object - introduced via eval. | 4559 // extension object - introduced via eval. |
4578 return top->global()->global_receiver(); | 4560 return top->global()->global_receiver(); |
4579 } | 4561 } |
4580 | 4562 |
4581 | 4563 |
4582 static ObjectPair LoadContextSlotHelper(Arguments args, bool throw_error) { | 4564 static ObjectPair LoadContextSlotHelper(Arguments args, bool throw_error) { |
4583 HandleScope scope; | 4565 HandleScope scope; |
4584 ASSERT(args.length() == 2); | 4566 ASSERT(args.length() == 2); |
4585 | 4567 |
4586 if (!args[0]->IsContext() || !args[1]->IsString()) { | 4568 if (!args[0]->IsContext() || !args[1]->IsString()) { |
4587 return MakePair(IllegalOperation(), NULL); | 4569 return MakePair(Top::ThrowIllegalOperation(), NULL); |
4588 } | 4570 } |
4589 Handle<Context> context = args.at<Context>(0); | 4571 Handle<Context> context = args.at<Context>(0); |
4590 Handle<String> name = args.at<String>(1); | 4572 Handle<String> name = args.at<String>(1); |
4591 | 4573 |
4592 int index; | 4574 int index; |
4593 PropertyAttributes attributes; | 4575 PropertyAttributes attributes; |
4594 ContextLookupFlags flags = FOLLOW_CHAINS; | 4576 ContextLookupFlags flags = FOLLOW_CHAINS; |
4595 Handle<Object> holder = | 4577 Handle<Object> holder = |
4596 context->Lookup(name, flags, &index, &attributes); | 4578 context->Lookup(name, flags, &index, &attributes); |
4597 | 4579 |
(...skipping 2920 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7518 } else { | 7500 } else { |
7519 // Handle last resort GC and make sure to allow future allocations | 7501 // Handle last resort GC and make sure to allow future allocations |
7520 // to grow the heap without causing GCs (if possible). | 7502 // to grow the heap without causing GCs (if possible). |
7521 Counters::gc_last_resort_from_js.Increment(); | 7503 Counters::gc_last_resort_from_js.Increment(); |
7522 Heap::CollectAllGarbage(); | 7504 Heap::CollectAllGarbage(); |
7523 } | 7505 } |
7524 } | 7506 } |
7525 | 7507 |
7526 | 7508 |
7527 } } // namespace v8::internal | 7509 } } // namespace v8::internal |
OLD | NEW |