| Index: samples/shell.cc | 
| =================================================================== | 
| --- samples/shell.cc	(revision 3427) | 
| +++ samples/shell.cc	(working copy) | 
| @@ -24,14 +24,20 @@ | 
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| +#define V8_TEST | 
|  | 
| +#ifdef V8_TEST | 
| +#define WIN32 | 
| +#include <../src/v8.h> | 
| +#include <../src/v8-global-context.h> | 
| +#else | 
| #include <v8.h> | 
| #include <fcntl.h> | 
| #include <string.h> | 
| #include <stdio.h> | 
| #include <stdlib.h> | 
| +#endif | 
|  | 
| - | 
| void RunShell(v8::Handle<v8::Context> context); | 
| bool ExecuteString(v8::Handle<v8::String> source, | 
| v8::Handle<v8::Value> name, | 
| @@ -47,7 +53,6 @@ | 
|  | 
|  | 
| int RunMain(int argc, char* argv[]) { | 
| -  v8::V8::SetFlagsFromCommandLine(&argc, argv, true); | 
| v8::HandleScope handle_scope; | 
| // Create a template for the global object. | 
| v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); | 
| @@ -102,11 +107,56 @@ | 
| return 0; | 
| } | 
|  | 
| +#ifdef V8_TEST | 
| +v8::AllowSeveralV8InstancesInProcess v8_please; | 
|  | 
| +class V8Runner: public v8::internal::Thread { | 
| + public: | 
| +  V8Runner(int argc, char* argv[]) | 
| +    :argc_(argc), argv_(argv) { | 
| +  } | 
| + | 
| +  int result() const { return result_; } | 
| + private: | 
| +  int argc_; | 
| +  char** const argv_; | 
| +  int result_; | 
| + | 
| +  virtual void Run() { | 
| +    v8::V8ContextProvider v8_context_provider; | 
| +    v8::V8ContextBinder v8_context_binder(v8_context_provider); | 
| +    result_ = RunMain(argc_, argv_); | 
| +    v8::V8::Dispose(); | 
| +  } | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(V8Runner); | 
| +}; | 
| +#endif | 
| + | 
| int main(int argc, char* argv[]) { | 
| +  v8::V8::SetFlagsFromCommandLine(&argc, argv, true); | 
| +#ifdef V8_TEST | 
| +  const int kAdditionalParallelThreads = 0; | 
| +  V8Runner** runners = new V8Runner*[kAdditionalParallelThreads]; | 
| +  for (int i = 0; i < kAdditionalParallelThreads; ++i) { | 
| +    runners[i] = new V8Runner(argc, argv); | 
| +    runners[i]->Start(); | 
| +  } | 
| +#endif | 
| + | 
| int result = RunMain(argc, argv); | 
| v8::V8::Dispose(); | 
| -  return result; | 
| + | 
| +  bool allResultsTheSame = true; | 
| +#ifdef V8_TEST | 
| +  for (int i = 0; i < kAdditionalParallelThreads; ++i) { | 
| +    runners[i]->Join(); | 
| +    if (result != runners[i]->result()) { | 
| +      allResultsTheSame = false; | 
| +    } | 
| +  } | 
| +#endif | 
| +  return allResultsTheSame ? result : -1; | 
| } | 
|  | 
|  | 
|  |