| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 } | 128 } |
| 129 | 129 |
| 130 | 130 |
| 131 static Object* Runtime_CreateObjectLiteralBoilerplate(Arguments args) { | 131 static Object* Runtime_CreateObjectLiteralBoilerplate(Arguments args) { |
| 132 HandleScope scope; | 132 HandleScope scope; |
| 133 ASSERT(args.length() == 3); | 133 ASSERT(args.length() == 3); |
| 134 // Copy the arguments. | 134 // Copy the arguments. |
| 135 Handle<FixedArray> literals = args.at<FixedArray>(0); | 135 Handle<FixedArray> literals = args.at<FixedArray>(0); |
| 136 int literals_index = Smi::cast(args[1])->value(); | 136 int literals_index = Smi::cast(args[1])->value(); |
| 137 Handle<FixedArray> constant_properties = args.at<FixedArray>(2); | 137 Handle<FixedArray> constant_properties = args.at<FixedArray>(2); |
| 138 |
| 139 // Get the global context from the literals array. This is the |
| 140 // context in which the function was created and we use the object |
| 141 // function from this context to create the object literal. We do |
| 142 // not use the object function from the current global context |
| 143 // because this might be the object function from another context |
| 144 // which we should not have access to. |
| 138 Handle<Context> context = | 145 Handle<Context> context = |
| 139 Handle<Context>(JSFunction::GlobalContextFromLiterals(*literals)); | 146 Handle<Context>(JSFunction::GlobalContextFromLiterals(*literals)); |
| 140 | 147 |
| 141 bool is_result_from_cache; | 148 bool is_result_from_cache; |
| 142 Handle<Map> map = ComputeObjectLiteralMap(context, | 149 Handle<Map> map = ComputeObjectLiteralMap(context, |
| 143 constant_properties, | 150 constant_properties, |
| 144 is_result_from_cache); | 151 is_result_from_cache); |
| 145 | 152 |
| 146 // Get the object function from the literals array. This is the | |
| 147 // object function from the context in which the function was | |
| 148 // created. We do not use the object function from the current | |
| 149 // global context because this might be the object function from | |
| 150 // another context which we should not have access to. | |
| 151 Handle<JSObject> boilerplate = Factory::NewJSObjectFromMap(map); | 153 Handle<JSObject> boilerplate = Factory::NewJSObjectFromMap(map); |
| 152 { // Add the constant propeties to the boilerplate. | 154 { // Add the constant propeties to the boilerplate. |
| 153 int length = constant_properties->length(); | 155 int length = constant_properties->length(); |
| 154 OptimizedObjectForAddingMultipleProperties opt(boilerplate, | 156 OptimizedObjectForAddingMultipleProperties opt(boilerplate, |
| 155 !is_result_from_cache); | 157 !is_result_from_cache); |
| 156 for (int index = 0; index < length; index +=2) { | 158 for (int index = 0; index < length; index +=2) { |
| 157 Handle<Object> key(constant_properties->get(index+0)); | 159 Handle<Object> key(constant_properties->get(index+0)); |
| 158 Handle<Object> value(constant_properties->get(index+1)); | 160 Handle<Object> value(constant_properties->get(index+1)); |
| 159 uint32_t element_index = 0; | 161 uint32_t element_index = 0; |
| 160 if (key->IsSymbol()) { | 162 if (key->IsSymbol()) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 182 literals->set(literals_index, *boilerplate); | 184 literals->set(literals_index, *boilerplate); |
| 183 | 185 |
| 184 return *boilerplate; | 186 return *boilerplate; |
| 185 } | 187 } |
| 186 | 188 |
| 187 | 189 |
| 188 static Object* Runtime_CreateArrayLiteral(Arguments args) { | 190 static Object* Runtime_CreateArrayLiteral(Arguments args) { |
| 189 // Takes a FixedArray of elements containing the literal elements of | 191 // Takes a FixedArray of elements containing the literal elements of |
| 190 // the array literal and produces JSArray with those elements. | 192 // the array literal and produces JSArray with those elements. |
| 191 // Additionally takes the literals array of the surrounding function | 193 // Additionally takes the literals array of the surrounding function |
| 192 // which contains the Array function to use for creating the array | 194 // which contains the context from which to get the Array function |
| 193 // literal. | 195 // to use for creating the array literal. |
| 194 ASSERT(args.length() == 2); | 196 ASSERT(args.length() == 2); |
| 195 CONVERT_CHECKED(FixedArray, elements, args[0]); | 197 CONVERT_CHECKED(FixedArray, elements, args[0]); |
| 196 CONVERT_CHECKED(FixedArray, literals, args[1]); | 198 CONVERT_CHECKED(FixedArray, literals, args[1]); |
| 197 JSFunction* constructor = | 199 JSFunction* constructor = |
| 198 JSFunction::GlobalContextFromLiterals(literals)->array_function(); | 200 JSFunction::GlobalContextFromLiterals(literals)->array_function(); |
| 199 // Create the JSArray. | 201 // Create the JSArray. |
| 200 Object* object = Heap::AllocateJSObject(constructor); | 202 Object* object = Heap::AllocateJSObject(constructor); |
| 201 if (object->IsFailure()) return object; | 203 if (object->IsFailure()) return object; |
| 202 | 204 |
| 203 // Copy the elements. | 205 // Copy the elements. |
| (...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 | 722 |
| 721 | 723 |
| 722 static Object* Runtime_MaterializeRegExpLiteral(Arguments args) { | 724 static Object* Runtime_MaterializeRegExpLiteral(Arguments args) { |
| 723 HandleScope scope; | 725 HandleScope scope; |
| 724 ASSERT(args.length() == 4); | 726 ASSERT(args.length() == 4); |
| 725 CONVERT_ARG_CHECKED(FixedArray, literals, 0); | 727 CONVERT_ARG_CHECKED(FixedArray, literals, 0); |
| 726 int index = Smi::cast(args[1])->value(); | 728 int index = Smi::cast(args[1])->value(); |
| 727 Handle<String> pattern = args.at<String>(2); | 729 Handle<String> pattern = args.at<String>(2); |
| 728 Handle<String> flags = args.at<String>(3); | 730 Handle<String> flags = args.at<String>(3); |
| 729 | 731 |
| 730 // Get the RegExp function from the literals array. This is the | 732 // Get the RegExp function from the context in the literals array. |
| 731 // RegExp function from the context in which the function was | 733 // This is the RegExp function from the context in which the |
| 732 // created. We do not use the RegExp function from the current | 734 // function was created. We do not use the RegExp function from the |
| 733 // global context because this might be the RegExp function from | 735 // current global context because this might be the RegExp function |
| 734 // another context which we should not have access to. | 736 // from another context which we should not have access to. |
| 735 Handle<JSFunction> constructor = | 737 Handle<JSFunction> constructor = |
| 736 Handle<JSFunction>( | 738 Handle<JSFunction>( |
| 737 JSFunction::GlobalContextFromLiterals(*literals)->regexp_function()); | 739 JSFunction::GlobalContextFromLiterals(*literals)->regexp_function()); |
| 738 // Compute the regular expression literal. | 740 // Compute the regular expression literal. |
| 739 bool has_pending_exception; | 741 bool has_pending_exception; |
| 740 Handle<Object> regexp = | 742 Handle<Object> regexp = |
| 741 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags, | 743 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags, |
| 742 &has_pending_exception); | 744 &has_pending_exception); |
| 743 if (has_pending_exception) { | 745 if (has_pending_exception) { |
| 744 ASSERT(Top::has_pending_exception()); | 746 ASSERT(Top::has_pending_exception()); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); | 850 Handle<JSFunction> fun = Handle<JSFunction>::cast(code); |
| 849 SetExpectedNofProperties(target, fun->shared()->expected_nof_properties()); | 851 SetExpectedNofProperties(target, fun->shared()->expected_nof_properties()); |
| 850 if (!fun->is_compiled() && !CompileLazy(fun, KEEP_EXCEPTION)) { | 852 if (!fun->is_compiled() && !CompileLazy(fun, KEEP_EXCEPTION)) { |
| 851 return Failure::Exception(); | 853 return Failure::Exception(); |
| 852 } | 854 } |
| 853 // Set the code, formal parameter count, and the length of the target | 855 // Set the code, formal parameter count, and the length of the target |
| 854 // function. | 856 // function. |
| 855 target->set_code(fun->code()); | 857 target->set_code(fun->code()); |
| 856 target->shared()->set_length(fun->shared()->length()); | 858 target->shared()->set_length(fun->shared()->length()); |
| 857 target->shared()->set_formal_parameter_count( | 859 target->shared()->set_formal_parameter_count( |
| 858 fun->shared()->formal_parameter_count()); | 860 fun->shared()->formal_parameter_count()); |
| 859 // Set the source code of the target function. | 861 // Set the source code of the target function. |
| 860 target->shared()->set_script(fun->shared()->script()); | 862 target->shared()->set_script(fun->shared()->script()); |
| 861 target->shared()->set_start_position(fun->shared()->start_position()); | 863 target->shared()->set_start_position(fun->shared()->start_position()); |
| 862 target->shared()->set_end_position(fun->shared()->end_position()); | 864 target->shared()->set_end_position(fun->shared()->end_position()); |
| 863 context = Handle<Context>(fun->context()); | 865 context = Handle<Context>(fun->context()); |
| 864 | 866 |
| 865 // Make sure we get a fresh copy of the literal vector to avoid | 867 // Make sure we get a fresh copy of the literal vector to avoid |
| 866 // cross context contamination. | 868 // cross context contamination. |
| 867 int number_of_literals = fun->NumberOfLiterals(); | 869 int number_of_literals = fun->NumberOfLiterals(); |
| 868 Handle<FixedArray> literals = | 870 Handle<FixedArray> literals = |
| (...skipping 4153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5022 | 5024 |
| 5023 void Runtime::PerformGC(Object* result) { | 5025 void Runtime::PerformGC(Object* result) { |
| 5024 Failure* failure = Failure::cast(result); | 5026 Failure* failure = Failure::cast(result); |
| 5025 // Try to do a garbage collection; ignore it if it fails. The C | 5027 // Try to do a garbage collection; ignore it if it fails. The C |
| 5026 // entry stub will throw an out-of-memory exception in that case. | 5028 // entry stub will throw an out-of-memory exception in that case. |
| 5027 Heap::CollectGarbage(failure->requested(), failure->allocation_space()); | 5029 Heap::CollectGarbage(failure->requested(), failure->allocation_space()); |
| 5028 } | 5030 } |
| 5029 | 5031 |
| 5030 | 5032 |
| 5031 } } // namespace v8::internal | 5033 } } // namespace v8::internal |
| OLD | NEW |