therubyracer-st 0.11.0beta5-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +23 -0
 - data/.travis.yml +10 -0
 - data/Changelog.md +242 -0
 - data/Gemfile +15 -0
 - data/README.md +185 -0
 - data/Rakefile +58 -0
 - data/benchmarks.rb +217 -0
 - data/ext/v8/accessor.cc +181 -0
 - data/ext/v8/array.cc +26 -0
 - data/ext/v8/backref.cc +54 -0
 - data/ext/v8/build.rb +53 -0
 - data/ext/v8/constants.cc +34 -0
 - data/ext/v8/constraints.cc +52 -0
 - data/ext/v8/context.cc +130 -0
 - data/ext/v8/date.cc +18 -0
 - data/ext/v8/exception.cc +38 -0
 - data/ext/v8/extconf.rb +23 -0
 - data/ext/v8/external.cc +43 -0
 - data/ext/v8/function.cc +58 -0
 - data/ext/v8/gc.cc +43 -0
 - data/ext/v8/handles.cc +34 -0
 - data/ext/v8/heap.cc +31 -0
 - data/ext/v8/init.cc +39 -0
 - data/ext/v8/invocation.cc +86 -0
 - data/ext/v8/locker.cc +77 -0
 - data/ext/v8/message.cc +51 -0
 - data/ext/v8/object.cc +334 -0
 - data/ext/v8/primitive.cc +8 -0
 - data/ext/v8/rr.cc +83 -0
 - data/ext/v8/rr.h +883 -0
 - data/ext/v8/script.cc +80 -0
 - data/ext/v8/signature.cc +18 -0
 - data/ext/v8/stack.cc +75 -0
 - data/ext/v8/string.cc +47 -0
 - data/ext/v8/template.cc +175 -0
 - data/ext/v8/trycatch.cc +86 -0
 - data/ext/v8/v8.cc +87 -0
 - data/ext/v8/value.cc +239 -0
 - data/lib/v8.rb +36 -0
 - data/lib/v8/access.rb +5 -0
 - data/lib/v8/access/indices.rb +40 -0
 - data/lib/v8/access/invocation.rb +47 -0
 - data/lib/v8/access/names.rb +65 -0
 - data/lib/v8/array.rb +26 -0
 - data/lib/v8/context.rb +243 -0
 - data/lib/v8/conversion.rb +35 -0
 - data/lib/v8/conversion/array.rb +11 -0
 - data/lib/v8/conversion/class.rb +120 -0
 - data/lib/v8/conversion/code.rb +38 -0
 - data/lib/v8/conversion/fundamental.rb +11 -0
 - data/lib/v8/conversion/hash.rb +11 -0
 - data/lib/v8/conversion/indentity.rb +31 -0
 - data/lib/v8/conversion/method.rb +26 -0
 - data/lib/v8/conversion/object.rb +28 -0
 - data/lib/v8/conversion/primitive.rb +7 -0
 - data/lib/v8/conversion/proc.rb +5 -0
 - data/lib/v8/conversion/reference.rb +16 -0
 - data/lib/v8/conversion/string.rb +12 -0
 - data/lib/v8/conversion/symbol.rb +7 -0
 - data/lib/v8/conversion/time.rb +13 -0
 - data/lib/v8/error.rb +25 -0
 - data/lib/v8/error/protect.rb +20 -0
 - data/lib/v8/error/try.rb +15 -0
 - data/lib/v8/function.rb +28 -0
 - data/lib/v8/helper.rb +30 -0
 - data/lib/v8/object.rb +79 -0
 - data/lib/v8/util/weakcell.rb +29 -0
 - data/lib/v8/version.rb +3 -0
 - data/spec/c/array_spec.rb +17 -0
 - data/spec/c/constants_spec.rb +20 -0
 - data/spec/c/exception_spec.rb +26 -0
 - data/spec/c/external_spec.rb +9 -0
 - data/spec/c/function_spec.rb +46 -0
 - data/spec/c/handles_spec.rb +35 -0
 - data/spec/c/locker_spec.rb +38 -0
 - data/spec/c/object_spec.rb +46 -0
 - data/spec/c/script_spec.rb +28 -0
 - data/spec/c/string_spec.rb +16 -0
 - data/spec/c/template_spec.rb +30 -0
 - data/spec/c/trycatch_spec.rb +51 -0
 - data/spec/mem/blunt_spec.rb +42 -0
 - data/spec/redjs_spec.rb +10 -0
 - data/spec/spec_helper.rb +45 -0
 - data/spec/threading_spec.rb +52 -0
 - data/spec/v8/context_spec.rb +19 -0
 - data/spec/v8/conversion_spec.rb +9 -0
 - data/spec/v8/error_spec.rb +21 -0
 - data/spec/v8/function_spec.rb +9 -0
 - data/spec/v8/object_spec.rb +15 -0
 - data/thefrontside.png +0 -0
 - data/therubyracer.gemspec +20 -0
 - data/vendor/v8.dll +0 -0
 - metadata +161 -0
 
    
        data/ext/v8/script.cc
    ADDED
    
    | 
         @@ -0,0 +1,80 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "rr.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            namespace rr {
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            void Script::Init() {
         
     | 
| 
      
 6 
     | 
    
         
            +
              ClassBuilder("Script").
         
     | 
| 
      
 7 
     | 
    
         
            +
                defineSingletonMethod("New", &New).
         
     | 
| 
      
 8 
     | 
    
         
            +
                defineMethod("Run", &Run).
         
     | 
| 
      
 9 
     | 
    
         
            +
                store(&Class);
         
     | 
| 
      
 10 
     | 
    
         
            +
              ClassBuilder("ScriptOrigin").
         
     | 
| 
      
 11 
     | 
    
         
            +
                defineSingletonMethod("new", &ScriptOrigin::initialize).
         
     | 
| 
      
 12 
     | 
    
         
            +
                store(&ScriptOrigin::Class);
         
     | 
| 
      
 13 
     | 
    
         
            +
              ClassBuilder("ScriptData").
         
     | 
| 
      
 14 
     | 
    
         
            +
                defineSingletonMethod("PreCompile", &ScriptData::PreCompile).
         
     | 
| 
      
 15 
     | 
    
         
            +
                defineSingletonMethod("New", &ScriptData::New).
         
     | 
| 
      
 16 
     | 
    
         
            +
                defineMethod("Length", &ScriptData::Length).
         
     | 
| 
      
 17 
     | 
    
         
            +
                defineMethod("Data", &ScriptData::Data).
         
     | 
| 
      
 18 
     | 
    
         
            +
                defineMethod("HasError", &ScriptData::HasError).
         
     | 
| 
      
 19 
     | 
    
         
            +
                store(&ScriptData::Class);
         
     | 
| 
      
 20 
     | 
    
         
            +
            }
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            VALUE ScriptOrigin::initialize(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 23 
     | 
    
         
            +
              VALUE name; VALUE line_offset; VALUE column_offset;
         
     | 
| 
      
 24 
     | 
    
         
            +
              rb_scan_args(argc, argv, "12", &name, &line_offset, &column_offset);
         
     | 
| 
      
 25 
     | 
    
         
            +
              v8::Handle<v8::Integer> loff = v8::Integer::New(RTEST(line_offset) ? NUM2INT(line_offset) : 0);
         
     | 
| 
      
 26 
     | 
    
         
            +
              v8::Handle<v8::Integer> coff = v8::Integer::New(RTEST(column_offset) ? NUM2INT(column_offset) : 0);
         
     | 
| 
      
 27 
     | 
    
         
            +
              return ScriptOrigin(new v8::ScriptOrigin(*String(name), loff, coff));
         
     | 
| 
      
 28 
     | 
    
         
            +
            }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            VALUE ScriptData::PreCompile(VALUE self, VALUE input, VALUE length) {
         
     | 
| 
      
 31 
     | 
    
         
            +
            #ifdef HAVE_RUBY_ENCODING_H
         
     | 
| 
      
 32 
     | 
    
         
            +
              if (!rb_equal(rb_enc_from_encoding(rb_utf8_encoding()), rb_obj_encoding(input))) {
         
     | 
| 
      
 33 
     | 
    
         
            +
                rb_warn("ScriptData::Precompile only accepts UTF-8 encoded source, not: %s", RSTRING_PTR(rb_inspect(rb_obj_encoding(input))));
         
     | 
| 
      
 34 
     | 
    
         
            +
              }
         
     | 
| 
      
 35 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 36 
     | 
    
         
            +
              return ScriptData(v8::ScriptData::PreCompile(RSTRING_PTR(input), NUM2INT(length)));
         
     | 
| 
      
 37 
     | 
    
         
            +
            }
         
     | 
| 
      
 38 
     | 
    
         
            +
            VALUE ScriptData::New(VALUE self, VALUE data, VALUE length) {
         
     | 
| 
      
 39 
     | 
    
         
            +
              return ScriptData(v8::ScriptData::New(RSTRING_PTR(data), NUM2INT(length)));
         
     | 
| 
      
 40 
     | 
    
         
            +
            }
         
     | 
| 
      
 41 
     | 
    
         
            +
            VALUE ScriptData::Length(VALUE self) {
         
     | 
| 
      
 42 
     | 
    
         
            +
              return ScriptData(self)->Length();
         
     | 
| 
      
 43 
     | 
    
         
            +
            }
         
     | 
| 
      
 44 
     | 
    
         
            +
            VALUE ScriptData::Data(VALUE self) {
         
     | 
| 
      
 45 
     | 
    
         
            +
              ScriptData data(self);
         
     | 
| 
      
 46 
     | 
    
         
            +
            #ifdef HAVE_RUBY_ENCODING_H
         
     | 
| 
      
 47 
     | 
    
         
            +
              return rb_enc_str_new(data->Data(), data->Length(), rb_enc_find("BINARY"));
         
     | 
| 
      
 48 
     | 
    
         
            +
            #else
         
     | 
| 
      
 49 
     | 
    
         
            +
              return rb_str_new(data->Data(), data->Length());
         
     | 
| 
      
 50 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 51 
     | 
    
         
            +
            }
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            VALUE ScriptData::HasError(VALUE self) {
         
     | 
| 
      
 54 
     | 
    
         
            +
              return ScriptData(self)->HasError();
         
     | 
| 
      
 55 
     | 
    
         
            +
            }
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            VALUE Script::New(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 58 
     | 
    
         
            +
              VALUE source; VALUE origin; VALUE pre_data; VALUE script_data;
         
     | 
| 
      
 59 
     | 
    
         
            +
              rb_scan_args(argc, argv, "13", &source, &origin, &pre_data, &script_data);
         
     | 
| 
      
 60 
     | 
    
         
            +
              if (argc == 2) {
         
     | 
| 
      
 61 
     | 
    
         
            +
                VALUE filename = origin;
         
     | 
| 
      
 62 
     | 
    
         
            +
                return Script(v8::Script::New(String(source), Value(filename)));
         
     | 
| 
      
 63 
     | 
    
         
            +
              } else {
         
     | 
| 
      
 64 
     | 
    
         
            +
                return Script(v8::Script::New(String(source), ScriptOrigin(origin), ScriptData(pre_data), String(script_data)));
         
     | 
| 
      
 65 
     | 
    
         
            +
              }
         
     | 
| 
      
 66 
     | 
    
         
            +
            }
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
            VALUE Script::Run(VALUE self) {
         
     | 
| 
      
 69 
     | 
    
         
            +
              return Value(Script(self)->Run());
         
     | 
| 
      
 70 
     | 
    
         
            +
            }
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
            template <> void Pointer<v8::ScriptData>::unwrap(VALUE value) {
         
     | 
| 
      
 73 
     | 
    
         
            +
              Data_Get_Struct(value, class v8::ScriptData, pointer);
         
     | 
| 
      
 74 
     | 
    
         
            +
            }
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
            template <> void Pointer<v8::ScriptOrigin>::unwrap(VALUE value) {
         
     | 
| 
      
 77 
     | 
    
         
            +
              Data_Get_Struct(value, class v8::ScriptOrigin, pointer);
         
     | 
| 
      
 78 
     | 
    
         
            +
            }
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            } //namespace rr
         
     | 
    
        data/ext/v8/signature.cc
    ADDED
    
    | 
         @@ -0,0 +1,18 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "rr.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            namespace rr {
         
     | 
| 
      
 4 
     | 
    
         
            +
              void Signature::Init() {
         
     | 
| 
      
 5 
     | 
    
         
            +
                ClassBuilder("Signature").
         
     | 
| 
      
 6 
     | 
    
         
            +
                  defineMethod("New", &New).
         
     | 
| 
      
 7 
     | 
    
         
            +
                  store(&Class);
         
     | 
| 
      
 8 
     | 
    
         
            +
              }
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              VALUE Signature::New(int argc, VALUE args[], VALUE self) {
         
     | 
| 
      
 11 
     | 
    
         
            +
                VALUE receiver; VALUE argv;
         
     | 
| 
      
 12 
     | 
    
         
            +
                rb_scan_args(argc, args, "02", &receiver, &argv);
         
     | 
| 
      
 13 
     | 
    
         
            +
                FunctionTemplate recv(receiver);
         
     | 
| 
      
 14 
     | 
    
         
            +
                int length = RARRAY_LENINT(argv);
         
     | 
| 
      
 15 
     | 
    
         
            +
                FunctionTemplate::array<FunctionTemplate> types(argv);
         
     | 
| 
      
 16 
     | 
    
         
            +
                return Signature(v8::Signature::New(recv, length, types));
         
     | 
| 
      
 17 
     | 
    
         
            +
              }
         
     | 
| 
      
 18 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/v8/stack.cc
    ADDED
    
    | 
         @@ -0,0 +1,75 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "rr.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            namespace rr {
         
     | 
| 
      
 4 
     | 
    
         
            +
              void Stack::Init() {
         
     | 
| 
      
 5 
     | 
    
         
            +
                ClassBuilder("StackTrace").
         
     | 
| 
      
 6 
     | 
    
         
            +
                  defineSingletonMethod("kLineNumber", &Trace::kLineNumber).
         
     | 
| 
      
 7 
     | 
    
         
            +
                  defineSingletonMethod("kColumnOffset", &Trace::kColumnOffset).
         
     | 
| 
      
 8 
     | 
    
         
            +
                  defineSingletonMethod("kScriptName", &Trace::kScriptName).
         
     | 
| 
      
 9 
     | 
    
         
            +
                  defineSingletonMethod("kFunctionName", &Trace::kFunctionName).
         
     | 
| 
      
 10 
     | 
    
         
            +
                  defineSingletonMethod("kIsEval", &Trace::kIsEval).
         
     | 
| 
      
 11 
     | 
    
         
            +
                  defineSingletonMethod("kIsConstructor", &Trace::kIsConstructor).
         
     | 
| 
      
 12 
     | 
    
         
            +
                  defineSingletonMethod("kScriptNameOrSourceURL", &Trace::kScriptNameOrSourceURL).
         
     | 
| 
      
 13 
     | 
    
         
            +
                  defineSingletonMethod("kOverview", &Trace::kOverview).
         
     | 
| 
      
 14 
     | 
    
         
            +
                  defineSingletonMethod("kDetailed", &Trace::kDetailed).
         
     | 
| 
      
 15 
     | 
    
         
            +
                  defineSingletonMethod("CurrentStackTrace", &Trace::CurrentStackTrace).
         
     | 
| 
      
 16 
     | 
    
         
            +
                  defineMethod("GetFrame", &Trace::GetFrame).
         
     | 
| 
      
 17 
     | 
    
         
            +
                  defineMethod("GetFrameCount", &Trace::GetFrameCount).
         
     | 
| 
      
 18 
     | 
    
         
            +
                  defineMethod("AsArray", &Trace::AsArray).
         
     | 
| 
      
 19 
     | 
    
         
            +
                  store(&Trace::Class);
         
     | 
| 
      
 20 
     | 
    
         
            +
                ClassBuilder("StackFrame").
         
     | 
| 
      
 21 
     | 
    
         
            +
                  defineMethod("GetLineNumber", &Frame::GetLineNumber).
         
     | 
| 
      
 22 
     | 
    
         
            +
                  defineMethod("GetColumn", &Frame::GetColumn).
         
     | 
| 
      
 23 
     | 
    
         
            +
                  defineMethod("GetScriptName", &Frame::GetScriptName).
         
     | 
| 
      
 24 
     | 
    
         
            +
                  defineMethod("GetScriptNameOrSourceURL", &Frame::GetScriptNameOrSourceURL).
         
     | 
| 
      
 25 
     | 
    
         
            +
                  defineMethod("IsEval", &Frame::IsEval).
         
     | 
| 
      
 26 
     | 
    
         
            +
                  defineMethod("IsConstructor", &Frame::IsConstructor).
         
     | 
| 
      
 27 
     | 
    
         
            +
                  store(&Frame::Class);
         
     | 
| 
      
 28 
     | 
    
         
            +
              }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              VALUE Stack::Trace::GetFrame(VALUE self, VALUE index) {
         
     | 
| 
      
 31 
     | 
    
         
            +
                return Frame(Trace(self)->GetFrame(NUM2UINT(index)));
         
     | 
| 
      
 32 
     | 
    
         
            +
              }
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
              VALUE Stack::Trace::GetFrameCount(VALUE self) {
         
     | 
| 
      
 35 
     | 
    
         
            +
                return INT2FIX(Trace(self)->GetFrameCount());
         
     | 
| 
      
 36 
     | 
    
         
            +
              }
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              VALUE Stack::Trace::AsArray(VALUE self) {
         
     | 
| 
      
 39 
     | 
    
         
            +
                return Array(Trace(self)->AsArray());
         
     | 
| 
      
 40 
     | 
    
         
            +
              }
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              VALUE Stack::Trace::CurrentStackTrace(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 43 
     | 
    
         
            +
                VALUE frame_limit; VALUE options;
         
     | 
| 
      
 44 
     | 
    
         
            +
                rb_scan_args(argc, argv, "11", &frame_limit, &options);
         
     | 
| 
      
 45 
     | 
    
         
            +
                return Trace(v8::StackTrace::CurrentStackTrace(NUM2INT(frame_limit), StackTraceOptions(options)));
         
     | 
| 
      
 46 
     | 
    
         
            +
              }
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
              VALUE Stack::Frame::GetLineNumber(VALUE self) {
         
     | 
| 
      
 49 
     | 
    
         
            +
                return INT2FIX(Frame(self)->GetLineNumber());
         
     | 
| 
      
 50 
     | 
    
         
            +
              }
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
              VALUE Stack::Frame::GetColumn(VALUE self) {
         
     | 
| 
      
 53 
     | 
    
         
            +
                return INT2FIX(Frame(self)->GetColumn());
         
     | 
| 
      
 54 
     | 
    
         
            +
              }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              VALUE Stack::Frame::GetScriptName(VALUE self) {
         
     | 
| 
      
 57 
     | 
    
         
            +
                return String(Frame(self)->GetScriptName());
         
     | 
| 
      
 58 
     | 
    
         
            +
              }
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              VALUE Stack::Frame::GetScriptNameOrSourceURL(VALUE self) {
         
     | 
| 
      
 61 
     | 
    
         
            +
                return String(Frame(self)->GetScriptNameOrSourceURL());
         
     | 
| 
      
 62 
     | 
    
         
            +
              }
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
              VALUE Stack::Frame::GetFunctionName(VALUE self) {
         
     | 
| 
      
 65 
     | 
    
         
            +
                return String(Frame(self)->GetFunctionName());
         
     | 
| 
      
 66 
     | 
    
         
            +
              }
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
              VALUE Stack::Frame::IsEval(VALUE self) {
         
     | 
| 
      
 69 
     | 
    
         
            +
                return Bool(Frame(self)->IsEval());
         
     | 
| 
      
 70 
     | 
    
         
            +
              }
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
              VALUE Stack::Frame::IsConstructor(VALUE self) {
         
     | 
| 
      
 73 
     | 
    
         
            +
                return Bool(Frame(self)->IsConstructor());
         
     | 
| 
      
 74 
     | 
    
         
            +
              }
         
     | 
| 
      
 75 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/v8/string.cc
    ADDED
    
    | 
         @@ -0,0 +1,47 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "rr.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            namespace rr {
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            void String::Init() {
         
     | 
| 
      
 6 
     | 
    
         
            +
              ClassBuilder("String", Primitive::Class).
         
     | 
| 
      
 7 
     | 
    
         
            +
                defineSingletonMethod("New", &New).
         
     | 
| 
      
 8 
     | 
    
         
            +
                defineSingletonMethod("NewSymbol", &NewSymbol).
         
     | 
| 
      
 9 
     | 
    
         
            +
                defineSingletonMethod("Concat", &Concat).
         
     | 
| 
      
 10 
     | 
    
         
            +
                defineMethod("Utf8Value", &Utf8Value).
         
     | 
| 
      
 11 
     | 
    
         
            +
                store(&Class);
         
     | 
| 
      
 12 
     | 
    
         
            +
            }
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            VALUE String::New(VALUE StringClass, VALUE string) {
         
     | 
| 
      
 15 
     | 
    
         
            +
              return String(v8::String::New(RSTRING_PTR(string), (int)RSTRING_LEN(string)));
         
     | 
| 
      
 16 
     | 
    
         
            +
            }
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            VALUE String::NewSymbol(VALUE self, VALUE string) {
         
     | 
| 
      
 19 
     | 
    
         
            +
              return String(v8::String::NewSymbol(RSTRING_PTR(string), (int)RSTRING_LEN(string)));
         
     | 
| 
      
 20 
     | 
    
         
            +
            }
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            VALUE String::Utf8Value(VALUE self) {
         
     | 
| 
      
 23 
     | 
    
         
            +
              String str(self);
         
     | 
| 
      
 24 
     | 
    
         
            +
              #ifdef HAVE_RUBY_ENCODING_H
         
     | 
| 
      
 25 
     | 
    
         
            +
              return rb_enc_str_new(*v8::String::Utf8Value(*str), str->Utf8Length(), rb_enc_find("utf-8"));
         
     | 
| 
      
 26 
     | 
    
         
            +
              #else
         
     | 
| 
      
 27 
     | 
    
         
            +
              return rb_str_new(*v8::String::Utf8Value(*str), str->Utf8Length());
         
     | 
| 
      
 28 
     | 
    
         
            +
              #endif
         
     | 
| 
      
 29 
     | 
    
         
            +
            }
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            VALUE String::Concat(VALUE self, VALUE left, VALUE right) {
         
     | 
| 
      
 32 
     | 
    
         
            +
              return String(v8::String::Concat(String(left), String(right)));
         
     | 
| 
      
 33 
     | 
    
         
            +
            }
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            String::operator v8::Handle<v8::String>() const {
         
     | 
| 
      
 36 
     | 
    
         
            +
              switch (TYPE(value)) {
         
     | 
| 
      
 37 
     | 
    
         
            +
              case T_STRING:
         
     | 
| 
      
 38 
     | 
    
         
            +
                return v8::String::New(RSTRING_PTR(value), (int)RSTRING_LEN(value));
         
     | 
| 
      
 39 
     | 
    
         
            +
              case T_DATA:
         
     | 
| 
      
 40 
     | 
    
         
            +
                return Ref<v8::String>::operator v8::Handle<v8::String>();
         
     | 
| 
      
 41 
     | 
    
         
            +
              default:
         
     | 
| 
      
 42 
     | 
    
         
            +
                VALUE string = rb_funcall(value, rb_intern("to_s"), 0);
         
     | 
| 
      
 43 
     | 
    
         
            +
                return v8::String::New(RSTRING_PTR(string), (int)RSTRING_LEN(string));
         
     | 
| 
      
 44 
     | 
    
         
            +
              }
         
     | 
| 
      
 45 
     | 
    
         
            +
            }
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            } //namespace rr
         
     | 
    
        data/ext/v8/template.cc
    ADDED
    
    | 
         @@ -0,0 +1,175 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "rr.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            namespace rr {
         
     | 
| 
      
 4 
     | 
    
         
            +
              void Template::Init() {
         
     | 
| 
      
 5 
     | 
    
         
            +
                ClassBuilder("Template").
         
     | 
| 
      
 6 
     | 
    
         
            +
                  defineMethod("Set", &Set);
         
     | 
| 
      
 7 
     | 
    
         
            +
                ObjectTemplate::Init();
         
     | 
| 
      
 8 
     | 
    
         
            +
                FunctionTemplate::Init();
         
     | 
| 
      
 9 
     | 
    
         
            +
              }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              VALUE Template::Set(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 12 
     | 
    
         
            +
                VALUE name; VALUE value; VALUE attributes;
         
     | 
| 
      
 13 
     | 
    
         
            +
                rb_scan_args(argc, argv, "21", &name, &value, &attributes);
         
     | 
| 
      
 14 
     | 
    
         
            +
                Void(Template(self)->Set(*String(name), *Value(value), PropertyAttribute(attributes)));
         
     | 
| 
      
 15 
     | 
    
         
            +
              }
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              void ObjectTemplate::Init() {
         
     | 
| 
      
 18 
     | 
    
         
            +
                ClassBuilder("ObjectTemplate", "Template").
         
     | 
| 
      
 19 
     | 
    
         
            +
                  defineSingletonMethod("New", &New).
         
     | 
| 
      
 20 
     | 
    
         
            +
                  defineMethod("NewInstance", &NewInstance).
         
     | 
| 
      
 21 
     | 
    
         
            +
                  defineMethod("SetAccessor", &SetAccessor).
         
     | 
| 
      
 22 
     | 
    
         
            +
                  defineMethod("SetNamedPropertyHandler", &SetNamedPropertyHandler).
         
     | 
| 
      
 23 
     | 
    
         
            +
                  defineMethod("SetIndexedPropertyHandler", &SetIndexedPropertyHandler).
         
     | 
| 
      
 24 
     | 
    
         
            +
                  defineMethod("SetCallAsFunctionHandler", &SetCallAsFunctionHandler).
         
     | 
| 
      
 25 
     | 
    
         
            +
                  defineMethod("MarkAsUndetectable", &MarkAsUndetectable).
         
     | 
| 
      
 26 
     | 
    
         
            +
                  defineMethod("SetAccessCheckCallbacks", &SetAccessCheckCallbacks).
         
     | 
| 
      
 27 
     | 
    
         
            +
                  defineMethod("InternalFieldCount", &InternalFieldCount).
         
     | 
| 
      
 28 
     | 
    
         
            +
                  defineMethod("SetInternalFieldCount", &SetInternalFieldCount).
         
     | 
| 
      
 29 
     | 
    
         
            +
                  store(&Class);
         
     | 
| 
      
 30 
     | 
    
         
            +
              }
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              VALUE ObjectTemplate::New(VALUE self) {
         
     | 
| 
      
 33 
     | 
    
         
            +
                return ObjectTemplate(v8::ObjectTemplate::New());
         
     | 
| 
      
 34 
     | 
    
         
            +
              }
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              VALUE ObjectTemplate::NewInstance(VALUE self) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                return Object(ObjectTemplate(self)->NewInstance());
         
     | 
| 
      
 38 
     | 
    
         
            +
              }
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              VALUE ObjectTemplate::SetAccessor(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 41 
     | 
    
         
            +
                VALUE name; VALUE get; VALUE set; VALUE data; VALUE settings; VALUE attribs;
         
     | 
| 
      
 42 
     | 
    
         
            +
                rb_scan_args(argc, argv, "24", &name, &get, &set, &data, &settings, &attribs);
         
     | 
| 
      
 43 
     | 
    
         
            +
                Accessor accessor(get, set, data);
         
     | 
| 
      
 44 
     | 
    
         
            +
                ObjectTemplate(self)->SetAccessor(
         
     | 
| 
      
 45 
     | 
    
         
            +
                  String(name),
         
     | 
| 
      
 46 
     | 
    
         
            +
                  accessor.accessorGetter(),
         
     | 
| 
      
 47 
     | 
    
         
            +
                  accessor.accessorSetter(),
         
     | 
| 
      
 48 
     | 
    
         
            +
                  accessor,
         
     | 
| 
      
 49 
     | 
    
         
            +
                  AccessControl(settings),
         
     | 
| 
      
 50 
     | 
    
         
            +
                  PropertyAttribute(attribs)
         
     | 
| 
      
 51 
     | 
    
         
            +
                );
         
     | 
| 
      
 52 
     | 
    
         
            +
                Void();
         
     | 
| 
      
 53 
     | 
    
         
            +
              }
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
              VALUE ObjectTemplate::SetNamedPropertyHandler(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 56 
     | 
    
         
            +
                VALUE get; VALUE set; VALUE query; VALUE deleter; VALUE enumerator; VALUE data;
         
     | 
| 
      
 57 
     | 
    
         
            +
                rb_scan_args(argc, argv, "15", &get, &set, &query, &deleter, &enumerator, &data);
         
     | 
| 
      
 58 
     | 
    
         
            +
                Accessor accessor(get,set,query,deleter,enumerator,data);
         
     | 
| 
      
 59 
     | 
    
         
            +
                ObjectTemplate(self)->SetNamedPropertyHandler(
         
     | 
| 
      
 60 
     | 
    
         
            +
                  accessor.namedPropertyGetter(),
         
     | 
| 
      
 61 
     | 
    
         
            +
                  accessor.namedPropertySetter(),
         
     | 
| 
      
 62 
     | 
    
         
            +
                  accessor.namedPropertyQuery(),
         
     | 
| 
      
 63 
     | 
    
         
            +
                  accessor.namedPropertyDeleter(),
         
     | 
| 
      
 64 
     | 
    
         
            +
                  accessor.namedPropertyEnumerator(),
         
     | 
| 
      
 65 
     | 
    
         
            +
                  accessor
         
     | 
| 
      
 66 
     | 
    
         
            +
                );
         
     | 
| 
      
 67 
     | 
    
         
            +
                Void();
         
     | 
| 
      
 68 
     | 
    
         
            +
              }
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
               VALUE ObjectTemplate::SetIndexedPropertyHandler(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 71 
     | 
    
         
            +
                 VALUE get; VALUE set; VALUE query; VALUE deleter; VALUE enumerator; VALUE data;
         
     | 
| 
      
 72 
     | 
    
         
            +
                 rb_scan_args(argc, argv, "15", &get, &set, &query, &deleter, &enumerator, &data);
         
     | 
| 
      
 73 
     | 
    
         
            +
                 Accessor accessor(get,set,query,deleter,enumerator,data);
         
     | 
| 
      
 74 
     | 
    
         
            +
                 ObjectTemplate(self)->SetIndexedPropertyHandler(
         
     | 
| 
      
 75 
     | 
    
         
            +
                   accessor.indexedPropertyGetter(),
         
     | 
| 
      
 76 
     | 
    
         
            +
                   accessor.indexedPropertySetter(),
         
     | 
| 
      
 77 
     | 
    
         
            +
                   accessor.indexedPropertyQuery(),
         
     | 
| 
      
 78 
     | 
    
         
            +
                   accessor.indexedPropertyDeleter(),
         
     | 
| 
      
 79 
     | 
    
         
            +
                   accessor.indexedPropertyEnumerator(),
         
     | 
| 
      
 80 
     | 
    
         
            +
                   accessor
         
     | 
| 
      
 81 
     | 
    
         
            +
                 );
         
     | 
| 
      
 82 
     | 
    
         
            +
                 Void();
         
     | 
| 
      
 83 
     | 
    
         
            +
               }
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
               VALUE ObjectTemplate::SetCallAsFunctionHandler(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 86 
     | 
    
         
            +
                 VALUE callback; VALUE data;
         
     | 
| 
      
 87 
     | 
    
         
            +
                 rb_scan_args(argc, argv, "11", &callback, &data);
         
     | 
| 
      
 88 
     | 
    
         
            +
                 Invocation invocation(callback, data);
         
     | 
| 
      
 89 
     | 
    
         
            +
                 Void(ObjectTemplate(self)->SetCallAsFunctionHandler(invocation, invocation));
         
     | 
| 
      
 90 
     | 
    
         
            +
               }
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
               VALUE ObjectTemplate::MarkAsUndetectable(VALUE self) {
         
     | 
| 
      
 93 
     | 
    
         
            +
                 Void(ObjectTemplate(self)->MarkAsUndetectable());
         
     | 
| 
      
 94 
     | 
    
         
            +
               }
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
               VALUE ObjectTemplate::SetAccessCheckCallbacks(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 98 
     | 
    
         
            +
                 VALUE named_handler; VALUE indexed_handler; VALUE data; VALUE turned_on_by_default;
         
     | 
| 
      
 99 
     | 
    
         
            +
                 rb_scan_args(argc, argv, "22", &named_handler, &indexed_handler, &data, &turned_on_by_default);
         
     | 
| 
      
 100 
     | 
    
         
            +
                 return not_implemented("ObjectTemplate::SetAccessCheckCallbacks");
         
     | 
| 
      
 101 
     | 
    
         
            +
               }
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
               VALUE ObjectTemplate::InternalFieldCount(VALUE self) {
         
     | 
| 
      
 104 
     | 
    
         
            +
                 return INT2FIX(ObjectTemplate(self)->InternalFieldCount());
         
     | 
| 
      
 105 
     | 
    
         
            +
               }
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
               VALUE ObjectTemplate::SetInternalFieldCount(VALUE self, VALUE count) {
         
     | 
| 
      
 108 
     | 
    
         
            +
                 Void(ObjectTemplate(self)->SetInternalFieldCount(NUM2INT(count)));
         
     | 
| 
      
 109 
     | 
    
         
            +
               }
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
              void FunctionTemplate::Init() {
         
     | 
| 
      
 112 
     | 
    
         
            +
                ClassBuilder("FunctionTemplate", "Template").
         
     | 
| 
      
 113 
     | 
    
         
            +
                  defineSingletonMethod("New", &New).
         
     | 
| 
      
 114 
     | 
    
         
            +
                  defineMethod("GetFunction", &GetFunction).
         
     | 
| 
      
 115 
     | 
    
         
            +
                  defineMethod("SetCallHandler", &SetCallHandler).
         
     | 
| 
      
 116 
     | 
    
         
            +
                  defineMethod("InstanceTemplate", &InstanceTemplate).
         
     | 
| 
      
 117 
     | 
    
         
            +
                  defineMethod("Inherit", &Inherit).
         
     | 
| 
      
 118 
     | 
    
         
            +
                  defineMethod("PrototypeTemplate", &PrototypeTemplate).
         
     | 
| 
      
 119 
     | 
    
         
            +
                  defineMethod("SetClassName", &SetClassName).
         
     | 
| 
      
 120 
     | 
    
         
            +
                  defineMethod("SetHiddenPrototype", &SetHiddenPrototype).
         
     | 
| 
      
 121 
     | 
    
         
            +
                  defineMethod("ReadOnlyPrototype", &ReadOnlyPrototype).
         
     | 
| 
      
 122 
     | 
    
         
            +
                  defineMethod("HasInstance", &HasInstance).
         
     | 
| 
      
 123 
     | 
    
         
            +
                  store(&Class);
         
     | 
| 
      
 124 
     | 
    
         
            +
              }
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
              VALUE FunctionTemplate::New(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 127 
     | 
    
         
            +
                VALUE code; VALUE data; VALUE signature;
         
     | 
| 
      
 128 
     | 
    
         
            +
                rb_scan_args(argc, argv, "03", &code, &data, &signature);
         
     | 
| 
      
 129 
     | 
    
         
            +
                if (RTEST(code)) {
         
     | 
| 
      
 130 
     | 
    
         
            +
                  Invocation invocation(code, data);
         
     | 
| 
      
 131 
     | 
    
         
            +
                  return FunctionTemplate(v8::FunctionTemplate::New(invocation, invocation, Signature(signature)));
         
     | 
| 
      
 132 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 133 
     | 
    
         
            +
                  return FunctionTemplate(v8::FunctionTemplate::New());
         
     | 
| 
      
 134 
     | 
    
         
            +
                }
         
     | 
| 
      
 135 
     | 
    
         
            +
              }
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
              VALUE FunctionTemplate::GetFunction(VALUE self) {
         
     | 
| 
      
 138 
     | 
    
         
            +
                return Function(FunctionTemplate(self)->GetFunction());
         
     | 
| 
      
 139 
     | 
    
         
            +
              }
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
              VALUE FunctionTemplate::SetCallHandler(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 142 
     | 
    
         
            +
                VALUE code; VALUE data;
         
     | 
| 
      
 143 
     | 
    
         
            +
                rb_scan_args(argc, argv, "11", &code, &data);
         
     | 
| 
      
 144 
     | 
    
         
            +
                Invocation invocation(code, data);
         
     | 
| 
      
 145 
     | 
    
         
            +
                Void(FunctionTemplate(self)->SetCallHandler(invocation, invocation));
         
     | 
| 
      
 146 
     | 
    
         
            +
              }
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
              VALUE FunctionTemplate::InstanceTemplate(VALUE self) {
         
     | 
| 
      
 149 
     | 
    
         
            +
                return ObjectTemplate(FunctionTemplate(self)->InstanceTemplate());
         
     | 
| 
      
 150 
     | 
    
         
            +
              }
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
      
 152 
     | 
    
         
            +
              VALUE FunctionTemplate::Inherit(VALUE self, VALUE parent) {
         
     | 
| 
      
 153 
     | 
    
         
            +
                Void(FunctionTemplate(self)->Inherit(FunctionTemplate(parent)));
         
     | 
| 
      
 154 
     | 
    
         
            +
              }
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
              VALUE FunctionTemplate::PrototypeTemplate(VALUE self) {
         
     | 
| 
      
 157 
     | 
    
         
            +
                return ObjectTemplate(FunctionTemplate(self)->PrototypeTemplate());
         
     | 
| 
      
 158 
     | 
    
         
            +
              }
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
              VALUE FunctionTemplate::SetClassName(VALUE self, VALUE name) {
         
     | 
| 
      
 161 
     | 
    
         
            +
                Void(FunctionTemplate(self)->SetClassName(String(name)));
         
     | 
| 
      
 162 
     | 
    
         
            +
              }
         
     | 
| 
      
 163 
     | 
    
         
            +
             
     | 
| 
      
 164 
     | 
    
         
            +
              VALUE FunctionTemplate::SetHiddenPrototype(VALUE self, VALUE value) {
         
     | 
| 
      
 165 
     | 
    
         
            +
                Void(FunctionTemplate(self)->SetHiddenPrototype(Bool(value)));
         
     | 
| 
      
 166 
     | 
    
         
            +
              }
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
              VALUE FunctionTemplate::ReadOnlyPrototype(VALUE self) {
         
     | 
| 
      
 169 
     | 
    
         
            +
                Void(FunctionTemplate(self)->ReadOnlyPrototype());
         
     | 
| 
      
 170 
     | 
    
         
            +
              }
         
     | 
| 
      
 171 
     | 
    
         
            +
             
     | 
| 
      
 172 
     | 
    
         
            +
              VALUE FunctionTemplate::HasInstance(VALUE self, VALUE object) {
         
     | 
| 
      
 173 
     | 
    
         
            +
                return Bool(FunctionTemplate(self)->HasInstance(Value(object)));
         
     | 
| 
      
 174 
     | 
    
         
            +
              }
         
     | 
| 
      
 175 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/v8/trycatch.cc
    ADDED
    
    | 
         @@ -0,0 +1,86 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include "rr.h"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            namespace rr {
         
     | 
| 
      
 4 
     | 
    
         
            +
              VALUE TryCatch::Class;
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              void TryCatch::Init() {
         
     | 
| 
      
 7 
     | 
    
         
            +
                ClassBuilder("TryCatch").
         
     | 
| 
      
 8 
     | 
    
         
            +
                  defineMethod("HasCaught", &HasCaught).
         
     | 
| 
      
 9 
     | 
    
         
            +
                  defineMethod("CanContinue", &CanContinue).
         
     | 
| 
      
 10 
     | 
    
         
            +
                  defineMethod("ReThrow", &ReThrow).
         
     | 
| 
      
 11 
     | 
    
         
            +
                  defineMethod("Exception", &Exception).
         
     | 
| 
      
 12 
     | 
    
         
            +
                  defineMethod("StackTrace", &StackTrace).
         
     | 
| 
      
 13 
     | 
    
         
            +
                  defineMethod("Message", &Message).
         
     | 
| 
      
 14 
     | 
    
         
            +
                  defineMethod("Reset", &Reset).
         
     | 
| 
      
 15 
     | 
    
         
            +
                  defineMethod("SetVerbose", &SetVerbose).
         
     | 
| 
      
 16 
     | 
    
         
            +
                  defineMethod("SetCaptureMessage", &SetCaptureMessage).
         
     | 
| 
      
 17 
     | 
    
         
            +
                  store(&Class);
         
     | 
| 
      
 18 
     | 
    
         
            +
                VALUE v8 = rb_define_module("V8");
         
     | 
| 
      
 19 
     | 
    
         
            +
                VALUE c = rb_define_module_under(v8, "C");
         
     | 
| 
      
 20 
     | 
    
         
            +
                rb_define_singleton_method(c, "TryCatch", (VALUE (*)(...))&doTryCatch, -1);
         
     | 
| 
      
 21 
     | 
    
         
            +
              }
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              TryCatch::TryCatch() : impl(new v8::TryCatch()), allocated(true) {}
         
     | 
| 
      
 24 
     | 
    
         
            +
              TryCatch::TryCatch(VALUE value) : allocated(false) {
         
     | 
| 
      
 25 
     | 
    
         
            +
                Data_Get_Struct(value, class v8::TryCatch, impl);
         
     | 
| 
      
 26 
     | 
    
         
            +
              }
         
     | 
| 
      
 27 
     | 
    
         
            +
              TryCatch::~TryCatch() {
         
     | 
| 
      
 28 
     | 
    
         
            +
                if (this->allocated) {
         
     | 
| 
      
 29 
     | 
    
         
            +
                  delete this->impl;
         
     | 
| 
      
 30 
     | 
    
         
            +
                }
         
     | 
| 
      
 31 
     | 
    
         
            +
              }
         
     | 
| 
      
 32 
     | 
    
         
            +
              TryCatch::operator VALUE() {
         
     | 
| 
      
 33 
     | 
    
         
            +
                return Data_Wrap_Struct(Class, 0, 0, impl);
         
     | 
| 
      
 34 
     | 
    
         
            +
              }
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              VALUE TryCatch::HasCaught(VALUE self) {
         
     | 
| 
      
 37 
     | 
    
         
            +
                return Bool(TryCatch(self)->HasCaught());
         
     | 
| 
      
 38 
     | 
    
         
            +
              }
         
     | 
| 
      
 39 
     | 
    
         
            +
              VALUE TryCatch::CanContinue(VALUE self) {
         
     | 
| 
      
 40 
     | 
    
         
            +
                return Bool(TryCatch(self)->CanContinue());
         
     | 
| 
      
 41 
     | 
    
         
            +
              }
         
     | 
| 
      
 42 
     | 
    
         
            +
              VALUE TryCatch::ReThrow(VALUE self) {
         
     | 
| 
      
 43 
     | 
    
         
            +
                return Value(TryCatch(self)->ReThrow());
         
     | 
| 
      
 44 
     | 
    
         
            +
              }
         
     | 
| 
      
 45 
     | 
    
         
            +
              VALUE TryCatch::Exception(VALUE self) {
         
     | 
| 
      
 46 
     | 
    
         
            +
                return Value(TryCatch(self)->Exception());
         
     | 
| 
      
 47 
     | 
    
         
            +
              }
         
     | 
| 
      
 48 
     | 
    
         
            +
              VALUE TryCatch::StackTrace(VALUE self) {
         
     | 
| 
      
 49 
     | 
    
         
            +
                return Value(TryCatch(self)->StackTrace());
         
     | 
| 
      
 50 
     | 
    
         
            +
              }
         
     | 
| 
      
 51 
     | 
    
         
            +
              VALUE TryCatch::Message(VALUE self) {
         
     | 
| 
      
 52 
     | 
    
         
            +
                return rr::Message(TryCatch(self)->Message());
         
     | 
| 
      
 53 
     | 
    
         
            +
              }
         
     | 
| 
      
 54 
     | 
    
         
            +
              VALUE TryCatch::Reset(VALUE self) {
         
     | 
| 
      
 55 
     | 
    
         
            +
                Void(TryCatch(self)->Reset());
         
     | 
| 
      
 56 
     | 
    
         
            +
              }
         
     | 
| 
      
 57 
     | 
    
         
            +
              VALUE TryCatch::SetVerbose(VALUE self, VALUE value) {
         
     | 
| 
      
 58 
     | 
    
         
            +
                Void(TryCatch(self)->SetVerbose(Bool(value)));
         
     | 
| 
      
 59 
     | 
    
         
            +
              }
         
     | 
| 
      
 60 
     | 
    
         
            +
              VALUE TryCatch::SetCaptureMessage(VALUE self, VALUE value) {
         
     | 
| 
      
 61 
     | 
    
         
            +
                Void(TryCatch(self)->SetCaptureMessage(Bool(value)));
         
     | 
| 
      
 62 
     | 
    
         
            +
              }
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
              VALUE TryCatch::doTryCatch(int argc, VALUE argv[], VALUE self) {
         
     | 
| 
      
 65 
     | 
    
         
            +
                if (!rb_block_given_p()) {
         
     | 
| 
      
 66 
     | 
    
         
            +
                  return Qnil;
         
     | 
| 
      
 67 
     | 
    
         
            +
                }
         
     | 
| 
      
 68 
     | 
    
         
            +
                int state = 0;
         
     | 
| 
      
 69 
     | 
    
         
            +
                VALUE code;
         
     | 
| 
      
 70 
     | 
    
         
            +
                rb_scan_args(argc,argv,"00&", &code);
         
     | 
| 
      
 71 
     | 
    
         
            +
                VALUE result = setupAndCall(&state, code);
         
     | 
| 
      
 72 
     | 
    
         
            +
                if (state != 0) {
         
     | 
| 
      
 73 
     | 
    
         
            +
                  rb_jump_tag(state);
         
     | 
| 
      
 74 
     | 
    
         
            +
                }
         
     | 
| 
      
 75 
     | 
    
         
            +
                return result;
         
     | 
| 
      
 76 
     | 
    
         
            +
              }
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
              VALUE TryCatch::setupAndCall(int* state, VALUE code) {
         
     | 
| 
      
 79 
     | 
    
         
            +
                return rb_protect(&doCall, code, state);
         
     | 
| 
      
 80 
     | 
    
         
            +
              }
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
              VALUE TryCatch::doCall(VALUE code) {
         
     | 
| 
      
 83 
     | 
    
         
            +
                TryCatch trycatch;
         
     | 
| 
      
 84 
     | 
    
         
            +
                return rb_funcall(code, rb_intern("call"), 1, (VALUE)trycatch);
         
     | 
| 
      
 85 
     | 
    
         
            +
              }
         
     | 
| 
      
 86 
     | 
    
         
            +
            }
         
     |