From: kmillikin@chromium.org Date: Mon, 2 Jan 2012 15:22:21 +0000 (+0000) Subject: Make Runtime_Apply safer. X-Git-Tag: upstream/4.7.83~17672 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b75beff3fc04268482282232ae0c71a36064beb2;p=platform%2Fupstream%2Fv8.git Make Runtime_Apply safer. There is a call to Object::GetElement that could conceivably cause a GC. Handlify all raw pointer local variables. R=vegorov@chromium.org BUG= TEST= Review URL: http://codereview.chromium.org/8952028 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10319 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/runtime.cc b/src/runtime.cc index fb46114..811d72d 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -1,4 +1,4 @@ -// Copyright 2011 the V8 project authors. All rights reserved. +// Copyright 2012 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: @@ -8707,14 +8707,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) { RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) { HandleScope scope(isolate); ASSERT(args.length() == 5); - CONVERT_CHECKED(JSReceiver, fun, args[0]); - Object* receiver = args[1]; - CONVERT_CHECKED(JSObject, arguments, args[2]); - CONVERT_CHECKED(Smi, shift, args[3]); - CONVERT_CHECKED(Smi, arity, args[4]); - - int offset = shift->value(); - int argc = arity->value(); + CONVERT_ARG_CHECKED(JSReceiver, fun, 0); + Handle receiver = args.at(1); + CONVERT_ARG_CHECKED(JSObject, arguments, 2); + CONVERT_SMI_ARG_CHECKED(offset, 3); + CONVERT_SMI_ARG_CHECKED(argc, 4); ASSERT(offset >= 0); ASSERT(argc >= 0); @@ -8730,17 +8727,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Apply) { } for (int i = 0; i < argc; ++i) { - MaybeObject* maybe = arguments->GetElement(offset + i); - Object* object; - if (!maybe->To(&object)) return maybe; - argv[i] = Handle(object); + argv[i] = Object::GetElement(arguments, offset + i); } bool threw; - Handle hfun(fun); - Handle hreceiver(receiver); Handle result = - Execution::Call(hfun, hreceiver, argc, argv, &threw, true); + Execution::Call(fun, receiver, argc, argv, &threw, true); if (threw) return Failure::Exception(); return *result;