V8: shell.cc (original) (raw)

A simple shell that takes a list of expressions on the command-line and executes them.

#include <assert.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

bool report_exceptions);

static bool run_shell;

int main(int argc, char* argv[]) {

run_shell = (argc == 1);

int result;

{

fprintf(stderr, "Error creating context\n");

return 1;

}

result = RunMain(isolate, context, platform.get(), argc, argv);

if (run_shell) RunShell(isolate, context, platform.get());

}

return result;

}

return *value ? *value : "";

}

}

bool first = true;

for (int i = 0; i < info.Length(); i++) {

if (first) {

first = false;

} else {

printf(" ");

}

const char* cstr = ToCString(str);

printf("%s", cstr);

}

printf("\n");

fflush(stdout);

}

if (info.Length() != 1) {

return;

}

if (*file == nullptr) {

return;

}

if (!ReadFile(info.GetIsolate(), *file).ToLocal(&source)) {

return;

}

}

for (int i = 0; i < info.Length(); i++) {

if (*file == nullptr) {

return;

}

if (!ReadFile(info.GetIsolate(), *file).ToLocal(&source)) {

return;

}

if (!ExecuteString(info.GetIsolate(), source, info[i], false, false)) {

return;

}

}

}

int exit_code =

fflush(stdout);

fflush(stderr);

exit(exit_code);

}

.ToLocalChecked());

}

FILE* file = fopen(name, "rb");

if (file == nullptr) return {};

fseek(file, 0, SEEK_END);

size_t size = ftell(file);

rewind(file);

char* chars = new char[size + 1];

chars[size] = '\0';

for (size_t i = 0; i < size;) {

i += fread(&chars[i], 1, size - i, file);

if (ferror(file)) {

fclose(file);

return {};

}

}

fclose(file);

delete[] chars;

return result;

}

v8::Platform* platform, int argc, char* argv[]) {

for (int i = 1; i < argc; i++) {

const char* str = argv[i];

if (strcmp(str, "--shell") == 0) {

run_shell = true;

} else if (strcmp(str, "-f") == 0) {

continue;

} else if (strncmp(str, "--", 2) == 0) {

fprintf(stderr,

"Warning: unknown flag %s.\nTry --help for options\n", str);

} else if (strcmp(str, "-e") == 0 && i + 1 < argc) {

bool success;

{

return 1;

}

success = ExecuteString(isolate, source, file_name, false, true);

}

if (!success) return 1;

} else {

bool success;

{

if (!ReadFile(isolate, str).ToLocal(&source)) {

fprintf(stderr, "Error reading '%s'\n", str);

continue;

}

success = ExecuteString(isolate, source, file_name, false, true);

}

if (!success) return 1;

}

}

return 0;

}

static const int kBufferSize = 256;

while (true) {

char buffer[kBufferSize];

fprintf(stderr, "> ");

char* str = fgets(buffer, kBufferSize, stdin);

if (str == nullptr) break;

{

ExecuteString(isolate,

name, true, true);

}

}

fprintf(stderr, "\n");

}

bool report_exceptions) {

if (report_exceptions)

ReportException(isolate, &try_catch);

return false;

} else {

if (!script->Run(context).ToLocal(&result)) {

assert(try_catch.HasCaught());

if (report_exceptions)

ReportException(isolate, &try_catch);

return false;

} else {

assert(!try_catch.HasCaught());

if (print_result && !result->IsUndefined()) {

const char* cstr = ToCString(str);

printf("%s\n", cstr);

}

return true;

}

}

}

const char* exception_string = ToCString(exception);

fprintf(stderr, "%s\n", exception_string);

} else {

message->GetScriptOrigin().ResourceName());

const char* filename_string = ToCString(filename);

int linenum = message->GetLineNumber(context).FromJust();

fprintf(stderr, "%s:%i: %s\n", filename_string, linenum, exception_string);

isolate, message->GetSourceLine(context).ToLocalChecked());

const char* sourceline_string = ToCString(sourceline);

fprintf(stderr, "%s\n", sourceline_string);

int start = message->GetStartColumn(context).FromJust();

for (int i = 0; i < start; i++) {

fprintf(stderr, " ");

}

int end = message->GetEndColumn(context).FromJust();

for (int i = start; i < end; i++) {

fprintf(stderr, "^");

}

fprintf(stderr, "\n");

if (try_catch->StackTrace(context).ToLocal(&stack_trace_string) &&

stack_trace_string->IsString() &&

const char* err = ToCString(stack_trace);

fprintf(stderr, "%s\n", err);

}

}

}

static Allocator * NewDefaultAllocator()

Definition: v8-context.h:421

static Local< Context > New(Isolate *isolate, ExtensionConfiguration *extensions=nullptr, MaybeLocal< ObjectTemplate > global_template=MaybeLocal< ObjectTemplate >(), MaybeLocal< Value > global_object=MaybeLocal< Value >(), DeserializeInternalFieldsCallback internal_fields_deserializer=DeserializeInternalFieldsCallback(), MicrotaskQueue *microtask_queue=nullptr, DeserializeContextDataCallback context_data_deserializer=DeserializeContextDataCallback(), DeserializeAPIWrapperCallback api_wrapper_deserializer=DeserializeAPIWrapperCallback())

Definition: v8-function-callback.h:121

ReturnValue< T > GetReturnValue() const

Definition: v8-function-callback.h:646

Isolate * GetIsolate() const

Definition: v8-function-callback.h:641

int Length() const

Definition: v8-function-callback.h:656

static Local< FunctionTemplate > New(Isolate *isolate, FunctionCallback callback=nullptr, Local< Value > data=Local< Value >(), Local< Signature > signature=Local< Signature >(), int length=0, ConstructorBehavior behavior=ConstructorBehavior::kAllow, SideEffectType side_effect_type=SideEffectType::kHasSideEffect, const CFunction *c_function=nullptr, uint16_t instance_type=0, uint16_t allowed_receiver_instance_type_range_start=0, uint16_t allowed_receiver_instance_type_range_end=0)

Definition: v8-persistent-handle.h:349

Definition: v8-local-handle.h:119

Definition: v8-isolate.h:377

Definition: v8-isolate.h:291

static Isolate * New(const CreateParams &params)

Local< Value > ThrowError(const char(&message)[N])

Definition: v8-isolate.h:1135

Local< Context > GetCurrentContext()

Definition: v8-local-handle.h:366

Local< S > As() const

Definition: v8-local-handle.h:439

Definition: v8-local-handle.h:734

static Local< ObjectTemplate > New(Isolate *isolate, Local< FunctionTemplate > constructor=Local< FunctionTemplate >())

Local< T > Get(Isolate *isolate) const

Definition: v8-persistent-handle.h:115

Definition: v8-platform.h:1180

Definition: v8-message.h:63

static MaybeLocal< Script > Compile(Local< Context > context, Local< String > source, ScriptOrigin *origin=nullptr)

Definition: v8-primitive.h:595

Definition: v8-primitive.h:124

static MaybeLocal< String > NewFromUtf8(Isolate *isolate, const char *data, NewStringType type=NewStringType::kNormal, int length=-1)

static Local< String > NewFromUtf8Literal(Isolate *isolate, const char(&literal)[N], NewStringType type=NewStringType::kNormal)

Definition: v8-primitive.h:474

Definition: v8-exception.h:138

Local< v8::Message > Message() const

static MaybeLocal< Value > StackTrace(Local< Context > context, Local< Value > exception)

Local< Value > Exception() const

static void InitializePlatform(Platform *platform)

static const char * GetVersion()

static bool InitializeICUDefaultLocation(const char *exec_path, const char *icu_data_file=nullptr)

static bool Initialize()

Definition: v8-initialization.h:108

static void SetFlagsFromCommandLine(int *argc, char **argv, bool remove_flags)

static void DisposePlatform()

static void InitializeExternalStartupData(const char *directory_path)

bool IsEmpty() const

Definition: v8-handle-base.h:60

std::unique_ptr< v8::Platform > NewDefaultPlatform(int thread_pool_size=0, IdleTaskSupport idle_task_support=IdleTaskSupport::kDisabled, InProcessStackDumping in_process_stack_dumping=InProcessStackDumping::kDisabled, std::unique_ptr< v8::TracingController > tracing_controller={}, PriorityMode priority_mode=PriorityMode::kDontApply)

bool PumpMessageLoop(v8::Platform *platform, v8::Isolate *isolate, MessageLoopBehavior behavior=MessageLoopBehavior::kDoNotWait)

Definition: v8-isolate.h:296

ArrayBuffer::Allocator * array_buffer_allocator

Definition: v8-isolate.h:343