Initial commit
[yaffs-website] / node_modules / node-sass / src / sass_types / boolean.cpp
1 #include <nan.h>
2 #include "boolean.h"
3
4 namespace SassTypes
5 {
6   Nan::Persistent<v8::Function> Boolean::constructor;
7   bool Boolean::constructor_locked = false;
8
9   Boolean::Boolean(bool v) : value(v) {}
10
11   Boolean& Boolean::get_singleton(bool v) {
12     static Boolean instance_false(false), instance_true(true);
13     return v ? instance_true : instance_false;
14   }
15
16   v8::Local<v8::Function> Boolean::get_constructor() {
17     Nan::EscapableHandleScope scope;
18     v8::Local<v8::Function> conslocal; 
19     if (constructor.IsEmpty()) {
20       v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
21
22       tpl->SetClassName(Nan::New("SassBoolean").ToLocalChecked());
23       tpl->InstanceTemplate()->SetInternalFieldCount(1);
24       Nan::SetPrototypeTemplate(tpl, "getValue", Nan::New<v8::FunctionTemplate>(GetValue));
25
26       conslocal = Nan::GetFunction(tpl).ToLocalChecked();
27       constructor.Reset(conslocal);
28
29       get_singleton(false).js_object.Reset(Nan::NewInstance(conslocal).ToLocalChecked());
30       Nan::SetInternalFieldPointer(Nan::New(get_singleton(false).js_object), 0, &get_singleton(false));
31       Nan::Set(conslocal, Nan::New("FALSE").ToLocalChecked(), Nan::New(get_singleton(false).js_object));
32
33       get_singleton(true).js_object.Reset(Nan::NewInstance(conslocal).ToLocalChecked());
34       Nan::SetInternalFieldPointer(Nan::New(get_singleton(true).js_object), 0, &get_singleton(true));
35       Nan::Set(conslocal, Nan::New("TRUE").ToLocalChecked(), Nan::New(get_singleton(true).js_object));
36
37       constructor_locked = true;
38     } else {
39       conslocal = Nan::New(constructor);
40     }
41
42     return scope.Escape(conslocal);
43   }
44
45   Sass_Value* Boolean::get_sass_value() {
46     return sass_make_boolean(value);
47   }
48
49   v8::Local<v8::Object> Boolean::get_js_object() {
50     return Nan::New(this->js_object);
51   }
52
53   NAN_METHOD(Boolean::New) {
54
55     if (info.IsConstructCall()) {
56       if (constructor_locked) {
57         return Nan::ThrowTypeError("Cannot instantiate SassBoolean");
58       }
59     }
60     else {
61       if (info.Length() != 1 || !info[0]->IsBoolean()) {
62         return Nan::ThrowTypeError("Expected one boolean argument");
63       }
64
65       info.GetReturnValue().Set(get_singleton(Nan::To<bool>(info[0]).FromJust()).get_js_object());
66     }
67   }
68
69   NAN_METHOD(Boolean::GetValue) {
70     Boolean *out;
71     if ((out = static_cast<Boolean*>(Factory::unwrap(info.This())))) { 
72       info.GetReturnValue().Set(Nan::New(out->value));
73     }
74   }
75 }