| Index: src/v8c.cc
|
| diff --git a/src/v8c.cc b/src/v8c.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0b560b74fd7ebb74bb5b25362205227d95928506
|
| --- /dev/null
|
| +++ b/src/v8c.cc
|
| @@ -0,0 +1,164 @@
|
| +#define BUILDING_V8C
|
| +#include "../include/v8.h"
|
| +#include "../include/v8c.h"
|
| +
|
| +template<typename T>
|
| +static V8Handle unwrap_handle(v8::Handle<T> handle) {
|
| + return *handle;
|
| +}
|
| +
|
| +template<typename T>
|
| +static v8::Handle<T> wrap_handle(V8Handle handle) {
|
| + return v8::Handle<T>(reinterpret_cast<T*>(handle));
|
| +}
|
| +
|
| +extern "C" {
|
| +
|
| +bool v8_handle_is_empty(V8Handle handle) {
|
| + return wrap_handle<void>(handle).IsEmpty();
|
| +}
|
| +
|
| +v8::HandleScope* v8_handle_scope_new() {
|
| + return new v8::HandleScope();
|
| +}
|
| +
|
| +void v8_handle_scope_free(V8HandleScope* hs) {
|
| + delete hs;
|
| +}
|
| +
|
| +V8Handle v8_script_compile(V8Handle code) {
|
| + return unwrap_handle(v8::Script::Compile(wrap_handle<v8::String>(code)));
|
| +}
|
| +
|
| +V8Handle v8_script_run(V8Handle script) {
|
| + return unwrap_handle(wrap_handle<v8::Script>(script)->Run());
|
| +}
|
| +
|
| +V8Handle v8_string_new_utf8(const char* data, int length) {
|
| + return unwrap_handle(v8::String::New(data, length));
|
| +}
|
| +
|
| +int v8_string_length(V8Handle h) {
|
| + return wrap_handle<v8::String>(h)->Length();
|
| +}
|
| +
|
| +V8StringUtf8Value* v8_string_utf8_value_new(V8Handle handle) {
|
| + return new v8::String::Utf8Value(wrap_handle<v8::Value>(handle));
|
| +}
|
| +
|
| +int v8_string_utf8_value_length(V8StringUtf8Value* utf8) {
|
| + return utf8->length();
|
| +}
|
| +
|
| +char* v8_string_utf8_value_chars(V8StringUtf8Value* utf8) {
|
| + return **utf8;
|
| +}
|
| +
|
| +void v8_string_utf8_value_free(V8StringUtf8Value* utf8) {
|
| + delete utf8;
|
| +}
|
| +
|
| +void v8_template_set(V8Handle tmpl, V8Handle name, V8Handle value) {
|
| + wrap_handle<v8::Template>(tmpl)->Set(wrap_handle<v8::String>(name),
|
| + wrap_handle<v8::Data>(value));
|
| +}
|
| +
|
| +int v8_arguments_length(const V8Arguments* args) {
|
| + return args->Length();
|
| +}
|
| +
|
| +V8Handle v8_arguments_get(const V8Arguments* args, int i) {
|
| + return unwrap_handle((*args)[i]);
|
| +}
|
| +
|
| +struct V8InvocationCallbackData {
|
| + V8InvocationCallback callback;
|
| + // TODO: void* data.
|
| +};
|
| +
|
| +static v8::Handle<v8::Value> v8_invocation_callback(const v8::Arguments& args) {
|
| + v8::Local<v8::External> data = v8::Local<v8::External>::Cast(args.Data());
|
| + V8InvocationCallbackData* callback_data =
|
| + static_cast<V8InvocationCallbackData*>(data->Value());
|
| + return wrap_handle<v8::Value>(callback_data->callback(&args));
|
| +}
|
| +
|
| +V8Handle v8_function_template_new(V8InvocationCallback callback) {
|
| + // XXX this leaks. We need to somehow tie this lifetime to the
|
| + // function template's lifetime?
|
| + V8InvocationCallbackData* callback_data = new V8InvocationCallbackData;
|
| + callback_data->callback = callback;
|
| + return unwrap_handle(
|
| + v8::FunctionTemplate::New(v8_invocation_callback,
|
| + v8::External::New(callback_data)));
|
| +}
|
| +
|
| +V8Handle v8_object_template_new() {
|
| + return unwrap_handle(v8::ObjectTemplate::New());
|
| +}
|
| +
|
| +V8Handle v8_undefined() {
|
| + return unwrap_handle(v8::Undefined());
|
| +}
|
| +
|
| +V8Handle v8_null() {
|
| + return unwrap_handle(v8::Null());
|
| +}
|
| +
|
| +V8Handle v8_true() {
|
| + return unwrap_handle(v8::True());
|
| +}
|
| +
|
| +V8Handle v8_false() {
|
| + return unwrap_handle(v8::False());
|
| +}
|
| +
|
| +void v8_set_flags_from_command_line(int* argc, char** argv,
|
| + bool remove_flags) {
|
| + v8::V8::SetFlagsFromCommandLine(argc, argv, remove_flags);
|
| +}
|
| +
|
| +V8TryCatch* v8_try_catch_new() {
|
| + return new V8TryCatch;
|
| +}
|
| +
|
| +void v8_try_catch_free(V8TryCatch* try_catch) {
|
| + delete try_catch;
|
| +}
|
| +
|
| +bool v8_try_catch_has_caught(V8TryCatch* try_catch) {
|
| + return try_catch->HasCaught();
|
| +}
|
| +
|
| +V8Handle v8_try_catch_exception(V8TryCatch* try_catch) {
|
| + return unwrap_handle(try_catch->Exception());
|
| +}
|
| +
|
| +V8Handle v8_try_catch_get_message(V8TryCatch* try_catch) {
|
| + return unwrap_handle(try_catch->Message());
|
| +}
|
| +
|
| +void v8_try_catch_reset(V8TryCatch* try_catch) {
|
| + try_catch->Reset();
|
| +}
|
| +
|
| +void v8_try_catch_set_verbose(V8TryCatch* try_catch, bool value) {
|
| + try_catch->SetVerbose(value);
|
| +}
|
| +
|
| +V8Handle v8_context_new(V8ExtensionConfiguration extensions,
|
| + V8Handle global_template) {
|
| + return unwrap_handle(
|
| + v8::Context::New(extensions,
|
| + wrap_handle<v8::ObjectTemplate>(global_template)));
|
| +}
|
| +
|
| +void v8_context_enter(V8Handle context) {
|
| + wrap_handle<v8::Context>(context)->Enter();
|
| +}
|
| +
|
| +void v8_context_exit(V8Handle context) {
|
| + wrap_handle<v8::Context>(context)->Exit();
|
| +}
|
| +
|
| +} // extern "C"
|
|
|