1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <stdio.h>
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <stdlib.h>
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <string.h>
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "include/libplatform/libplatform.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "include/v8.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochusing namespace v8;
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint main(int argc, char* argv[]) {
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Initialize V8.
1613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V8::InitializeICUDefaultLocation(argv[0]);
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V8::InitializeExternalStartupData(argv[0]);
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Platform* platform = platform::CreateDefaultPlatform();
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V8::InitializePlatform(platform);
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V8::Initialize();
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Create a new Isolate and make it the current one.
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate::CreateParams create_params;
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  create_params.array_buffer_allocator =
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      v8::ArrayBuffer::Allocator::NewDefaultAllocator();
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate = Isolate::New(create_params);
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  {
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Isolate::Scope isolate_scope(isolate);
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Create a stack-allocated handle scope.
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    HandleScope handle_scope(isolate);
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Create a new context.
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Local<Context> context = Context::New(isolate);
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Enter the context for compiling and running the hello world script.
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Context::Scope context_scope(context);
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Create a string containing the JavaScript source code.
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Local<String> source =
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        String::NewFromUtf8(isolate, "'Hello' + ', World!'",
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                            NewStringType::kNormal).ToLocalChecked();
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Compile the source code.
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Local<Script> script = Script::Compile(context, source).ToLocalChecked();
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Run the script to get the result.
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Local<Value> result = script->Run(context).ToLocalChecked();
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Convert the result to an UTF8 string and print it.
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    String::Utf8Value utf8(result);
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    printf("%s\n", *utf8);
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Dispose the isolate and tear down V8.
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  isolate->Dispose();
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V8::Dispose();
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V8::ShutdownPlatform();
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  delete platform;
60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  delete create_params.array_buffer_allocator;
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return 0;
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
63