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 7227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7238 context, | 7238 context, |
7239 true, | 7239 true, |
7240 validate); | 7240 validate); |
7241 if (shared.is_null()) return Failure::Exception(); | 7241 if (shared.is_null()) return Failure::Exception(); |
7242 Handle<JSFunction> fun = | 7242 Handle<JSFunction> fun = |
7243 Factory::NewFunctionFromSharedFunctionInfo(shared, context, NOT_TENURED); | 7243 Factory::NewFunctionFromSharedFunctionInfo(shared, context, NOT_TENURED); |
7244 return *fun; | 7244 return *fun; |
7245 } | 7245 } |
7246 | 7246 |
7247 | 7247 |
| 7248 static ObjectPair CompileGlobalEval(Handle<String> source, |
| 7249 Handle<Object> receiver) { |
| 7250 // Deal with a normal eval call with a string argument. Compile it |
| 7251 // and return the compiled function bound in the local context. |
| 7252 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( |
| 7253 source, |
| 7254 Handle<Context>(Top::context()), |
| 7255 Top::context()->IsGlobalContext(), |
| 7256 Compiler::DONT_VALIDATE_JSON); |
| 7257 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); |
| 7258 Handle<JSFunction> compiled = Factory::NewFunctionFromSharedFunctionInfo( |
| 7259 shared, |
| 7260 Handle<Context>(Top::context()), |
| 7261 NOT_TENURED); |
| 7262 return MakePair(*compiled, *receiver); |
| 7263 } |
| 7264 |
| 7265 |
7248 static ObjectPair Runtime_ResolvePossiblyDirectEval(Arguments args) { | 7266 static ObjectPair Runtime_ResolvePossiblyDirectEval(Arguments args) { |
7249 ASSERT(args.length() == 3); | 7267 ASSERT(args.length() == 3); |
7250 if (!args[0]->IsJSFunction()) { | 7268 if (!args[0]->IsJSFunction()) { |
7251 return MakePair(Top::ThrowIllegalOperation(), NULL); | 7269 return MakePair(Top::ThrowIllegalOperation(), NULL); |
7252 } | 7270 } |
7253 | 7271 |
7254 HandleScope scope; | 7272 HandleScope scope; |
7255 Handle<JSFunction> callee = args.at<JSFunction>(0); | 7273 Handle<JSFunction> callee = args.at<JSFunction>(0); |
7256 Handle<Object> receiver; // Will be overwritten. | 7274 Handle<Object> receiver; // Will be overwritten. |
7257 | 7275 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7303 return MakePair(*callee, *receiver); | 7321 return MakePair(*callee, *receiver); |
7304 } | 7322 } |
7305 | 7323 |
7306 // 'eval' is bound in the global context, but it may have been overwritten. | 7324 // 'eval' is bound in the global context, but it may have been overwritten. |
7307 // Compare it to the builtin 'GlobalEval' function to make sure. | 7325 // Compare it to the builtin 'GlobalEval' function to make sure. |
7308 if (*callee != Top::global_context()->global_eval_fun() || | 7326 if (*callee != Top::global_context()->global_eval_fun() || |
7309 !args[1]->IsString()) { | 7327 !args[1]->IsString()) { |
7310 return MakePair(*callee, Top::context()->global()->global_receiver()); | 7328 return MakePair(*callee, Top::context()->global()->global_receiver()); |
7311 } | 7329 } |
7312 | 7330 |
7313 // Deal with a normal eval call with a string argument. Compile it | 7331 return CompileGlobalEval(args.at<String>(1), args.at<Object>(2)); |
7314 // and return the compiled function bound in the local context. | 7332 } |
7315 Handle<String> source = args.at<String>(1); | 7333 |
7316 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 7334 |
7317 source, | 7335 static ObjectPair Runtime_ResolvePossiblyDirectEvalNoLookup(Arguments args) { |
7318 Handle<Context>(Top::context()), | 7336 ASSERT(args.length() == 3); |
7319 Top::context()->IsGlobalContext(), | 7337 if (!args[0]->IsJSFunction()) { |
7320 Compiler::DONT_VALIDATE_JSON); | 7338 return MakePair(Top::ThrowIllegalOperation(), NULL); |
7321 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); | 7339 } |
7322 callee = Factory::NewFunctionFromSharedFunctionInfo( | 7340 |
7323 shared, | 7341 HandleScope scope; |
7324 Handle<Context>(Top::context()), | 7342 Handle<JSFunction> callee = args.at<JSFunction>(0); |
7325 NOT_TENURED); | 7343 |
7326 return MakePair(*callee, args[2]); | 7344 // 'eval' is bound in the global context, but it may have been overwritten. |
| 7345 // Compare it to the builtin 'GlobalEval' function to make sure. |
| 7346 if (*callee != Top::global_context()->global_eval_fun() || |
| 7347 !args[1]->IsString()) { |
| 7348 return MakePair(*callee, Top::context()->global()->global_receiver()); |
| 7349 } |
| 7350 |
| 7351 return CompileGlobalEval(args.at<String>(1), args.at<Object>(2)); |
7327 } | 7352 } |
7328 | 7353 |
7329 | 7354 |
7330 static Object* Runtime_SetNewFunctionAttributes(Arguments args) { | 7355 static Object* Runtime_SetNewFunctionAttributes(Arguments args) { |
7331 // This utility adjusts the property attributes for newly created Function | 7356 // This utility adjusts the property attributes for newly created Function |
7332 // object ("new Function(...)") by changing the map. | 7357 // object ("new Function(...)") by changing the map. |
7333 // All it does is changing the prototype property to enumerable | 7358 // All it does is changing the prototype property to enumerable |
7334 // as specified in ECMA262, 15.3.5.2. | 7359 // as specified in ECMA262, 15.3.5.2. |
7335 HandleScope scope; | 7360 HandleScope scope; |
7336 ASSERT(args.length() == 1); | 7361 ASSERT(args.length() == 1); |
(...skipping 2967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10304 } else { | 10329 } else { |
10305 // Handle last resort GC and make sure to allow future allocations | 10330 // Handle last resort GC and make sure to allow future allocations |
10306 // to grow the heap without causing GCs (if possible). | 10331 // to grow the heap without causing GCs (if possible). |
10307 Counters::gc_last_resort_from_js.Increment(); | 10332 Counters::gc_last_resort_from_js.Increment(); |
10308 Heap::CollectAllGarbage(false); | 10333 Heap::CollectAllGarbage(false); |
10309 } | 10334 } |
10310 } | 10335 } |
10311 | 10336 |
10312 | 10337 |
10313 } } // namespace v8::internal | 10338 } } // namespace v8::internal |
OLD | NEW |