Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/llv8-constants.cc
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,11 @@ void JSFunction::Load() {
}


void JSDate::Load() {
kValueOffset = LoadConstant("class_JSDate__value__Object");
};


void SharedInfo::Load() {
kNameOffset = LoadConstant("class_SharedFunctionInfo__name__Object");
kInferredNameOffset =
Expand Down Expand Up @@ -434,6 +439,7 @@ void Types::Load() {
kJSArrayBufferType = LoadConstant("type_JSArrayBuffer__JS_ARRAY_BUFFER_TYPE");
kJSTypedArrayType = LoadConstant("type_JSTypedArray__JS_TYPED_ARRAY_TYPE");
kJSRegExpType = LoadConstant("type_JSRegExp__JS_REGEXP_TYPE");
kJSDateType = LoadConstant("type_JSDate__JS_DATE_TYPE");
}

} // namespace constants
Expand Down
11 changes: 11 additions & 0 deletions src/llv8-constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,16 @@ class JSRegExp : public Module {
void Load();
};

class JSDate : public Module {
public:
MODULE_DEFAULT_METHODS(JSDate);

int64_t kValueOffset;

protected:
void Load();
};

class SharedInfo : public Module {
public:
MODULE_DEFAULT_METHODS(SharedInfo);
Expand Down Expand Up @@ -414,6 +424,7 @@ class Types : public Module {
int64_t kJSArrayBufferType;
int64_t kJSTypedArrayType;
int64_t kJSRegExpType;
int64_t kJSDateType;

protected:
void Load();
Expand Down
2 changes: 2 additions & 0 deletions src/llv8-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,8 @@ ACCESSOR(HeapNumber, GetValue, heap_number()->kValueOffset, double)

ACCESSOR(JSArray, Length, js_array()->kLengthOffset, Smi)

ACCESSOR(JSDate, GetValue, js_date()->kValueOffset, Value)

int64_t String::Representation(Error& err) {
int64_t type = GetType(err);
if (err.Fail()) return -1;
Expand Down
45 changes: 41 additions & 4 deletions src/llv8.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ void LLV8::Load(SBTarget target) {
js_array_buffer.Assign(target, &common);
js_array_buffer_view.Assign(target, &common);
js_regexp.Assign(target, &common);
js_date.Assign(target, &common);
descriptor_array.Assign(target, &common);
name_dictionary.Assign(target, &common);
frame.Assign(target, &common);
Expand Down Expand Up @@ -286,6 +287,36 @@ std::string JSFunction::Inspect(bool detailed, Error& err) {
return res + ">";
}

std::string JSDate::Inspect(Error& err) {
std::string pre = "<JSDate: ";

Value val = GetValue(err);

Smi smi(val);
if (smi.Check()) {
std::string s = smi.ToString(err);
if (err.Fail()) {
return pre + ">";
}

return pre + s + ">";
}

HeapNumber hn(val);
if (hn.Check()) {
std::string s = hn.ToString(true, err);
if (err.Fail()) {
return pre + ">";
}
return pre + s + ">";
}

double d = static_cast<double>(val.raw());
char buf[128];
snprintf(buf, sizeof(buf), "%f", d);

return pre + ">";
}

std::string SharedFunctionInfo::GetPostfix(Error& err) {
Script script = GetScript(err);
Expand Down Expand Up @@ -409,7 +440,7 @@ std::string HeapObject::ToString(Error& err) {

if (type == v8()->types()->kHeapNumberType) {
HeapNumber n(this);
return n.ToString(err);
return n.ToString(false, err);
}

if (type < v8()->types()->kFirstNonstringType) {
Expand Down Expand Up @@ -483,6 +514,11 @@ std::string HeapObject::Inspect(bool detailed, Error& err) {
return pre + view.Inspect(err);
}

if (type == v8()->types()->kJSDateType) {
JSDate date(this);
return pre + date.Inspect(err);
}

return pre + "<unknown>";
}

Expand All @@ -500,16 +536,17 @@ std::string Smi::Inspect(Error& err) {
}


std::string HeapNumber::ToString(Error& err) {
std::string HeapNumber::ToString(bool whole, Error& err) {
char buf[128];
snprintf(buf, sizeof(buf), "%f", GetValue(err));
const char* fmt = whole ? "%.0lf" : "%f";
snprintf(buf, sizeof(buf), fmt, GetValue(err));
err = Error::Ok();
return buf;
}


std::string HeapNumber::Inspect(Error& err) {
return "<Number: " + ToString(err) + ">";
return "<Number: " + ToString(true, err) + ">";
}


Expand Down
13 changes: 12 additions & 1 deletion src/llv8.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ class HeapNumber : public HeapObject {

inline double GetValue(Error& err);

std::string ToString(Error& err);
std::string ToString(bool whole, Error& err);
std::string Inspect(Error& err);
};

Expand Down Expand Up @@ -236,6 +236,15 @@ class JSRegExp : public JSObject {
V8_VALUE_DEFAULT_METHODS(JSRegExp, JSObject);
};

class JSDate : public JSObject {
public:
V8_VALUE_DEFAULT_METHODS(JSDate, JSObject);

inline Value GetValue(Error& err);

std::string Inspect(Error& err);
};

class FixedArrayBase : public HeapObject {
public:
V8_VALUE_DEFAULT_METHODS(FixedArrayBase, HeapObject);
Expand Down Expand Up @@ -394,6 +403,7 @@ class LLV8 {
constants::JSArrayBuffer js_array_buffer;
constants::JSArrayBufferView js_array_buffer_view;
constants::JSRegExp js_regexp;
constants::JSDate js_date;
constants::DescriptorArray descriptor_array;
constants::NameDictionary name_dictionary;
constants::Frame frame;
Expand Down Expand Up @@ -425,6 +435,7 @@ class LLV8 {
friend class JSArrayBuffer;
friend class JSArrayBufferView;
friend class JSRegExp;
friend class JSDate;
};

#undef V8_VALUE_DEFAULT_METHODS
Expand Down