MrShi
2 天以前 4eac422e52a4d28fb651b75d0f054697c7a2c0fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <nan.h>
#include "null.h"
 
namespace SassTypes
{
  Nan::Persistent<v8::Function> Null::constructor;
  bool Null::constructor_locked = false;
 
  Null::Null() {
      value = sass_make_null();
  }
 
  Null& Null::get_singleton() {
    static Null singleton_instance;
    return singleton_instance;
  }
 
  v8::Local<v8::Function> Null::get_constructor() {
    Nan::EscapableHandleScope scope;
    v8::Local<v8::Function> conslocal;
    if (constructor.IsEmpty()) {
      v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
 
      tpl->SetClassName(Nan::New("SassNull").ToLocalChecked());
      tpl->InstanceTemplate()->SetInternalFieldCount(1);
 
      conslocal = Nan::GetFunction(tpl).ToLocalChecked();
      constructor.Reset(conslocal);
 
      get_singleton().js_object.Reset(Nan::NewInstance(conslocal).ToLocalChecked());
      Nan::SetInternalFieldPointer(Nan::New(get_singleton().js_object), 0, &get_singleton());
      Nan::Set(conslocal, Nan::New("NULL").ToLocalChecked(), Nan::New(get_singleton().js_object));
 
      constructor_locked = true;
    } else {
      conslocal = Nan::New(constructor);
    }
 
    return scope.Escape(conslocal);
  }
 
  v8::Local<v8::Object> Null::get_js_object() {
    return Nan::New(this->js_object);
  }
 
  NAN_METHOD(Null::New) {
 
    if (info.IsConstructCall()) {
      if (constructor_locked) {
        return Nan::ThrowTypeError("Cannot instantiate SassNull");
      }
    }
    else {
      info.GetReturnValue().Set(get_singleton().get_js_object());
    }
  }
}