Index: src/liveedit.cc |
diff --git a/src/liveedit.cc b/src/liveedit.cc |
index f35315438d7a4ef25200eed645b2469b34d9a09e..2a3aafc1f1daa355d817f3d0031315844a4d748f 100644 |
--- a/src/liveedit.cc |
+++ b/src/liveedit.cc |
@@ -635,6 +635,21 @@ static Handle<JSValue> WrapInJSValue(Handle<Object> object) { |
} |
+static Handle<SharedFunctionInfo> UnwrapSharedFunctionInfoFromJSValue( |
+ Handle<JSValue> jsValue) { |
+ Object* shared = jsValue->value(); |
+ CHECK(shared->IsSharedFunctionInfo()); |
+ return Handle<SharedFunctionInfo>(SharedFunctionInfo::cast(shared)); |
+} |
+ |
+ |
+static int GetArrayLength(Handle<JSArray> array) { |
+ Object* length = array->length(); |
+ CHECK(length->IsSmi()); |
+ return Smi::cast(length)->value(); |
+} |
+ |
+ |
// Simple helper class that creates more or less typed structures over |
// JSArray object. This is an adhoc method of passing structures from C++ |
// to JavaScript. |
@@ -777,9 +792,7 @@ class SharedInfoWrapper : public JSArrayBasedStruct<SharedInfoWrapper> { |
Object* element = this->GetField(kSharedInfoOffset_); |
CHECK(element->IsJSValue()); |
Handle<JSValue> value_wrapper(JSValue::cast(element)); |
- Handle<Object> raw_result = UnwrapJSValue(value_wrapper); |
- CHECK(raw_result->IsSharedFunctionInfo()); |
- return Handle<SharedFunctionInfo>::cast(raw_result); |
+ return UnwrapSharedFunctionInfoFromJSValue(value_wrapper); |
} |
private: |
@@ -915,7 +928,7 @@ JSArray* LiveEdit::GatherCompileInfo(Handle<Script> script, |
void LiveEdit::WrapSharedFunctionInfos(Handle<JSArray> array) { |
HandleScope scope; |
- int len = Smi::cast(array->length())->value(); |
+ int len = GetArrayLength(array); |
for (int i = 0; i < len; i++) { |
Handle<SharedFunctionInfo> info( |
SharedFunctionInfo::cast(array->GetElementNoExceptionThrown(i))); |
@@ -1132,7 +1145,7 @@ MaybeObject* LiveEdit::FunctionSourceUpdated( |
void LiveEdit::SetFunctionScript(Handle<JSValue> function_wrapper, |
Handle<Object> script_handle) { |
Handle<SharedFunctionInfo> shared_info = |
- Handle<SharedFunctionInfo>::cast(UnwrapJSValue(function_wrapper)); |
+ UnwrapSharedFunctionInfoFromJSValue(function_wrapper); |
CHECK(script_handle->IsScript() || script_handle->IsUndefined()); |
shared_info->set_script(*script_handle); |
@@ -1152,19 +1165,22 @@ void LiveEdit::SetFunctionScript(Handle<JSValue> function_wrapper, |
static int TranslatePosition(int original_position, |
Handle<JSArray> position_change_array) { |
int position_diff = 0; |
- int array_len = Smi::cast(position_change_array->length())->value(); |
+ int array_len = GetArrayLength(position_change_array); |
// TODO(635): binary search may be used here |
for (int i = 0; i < array_len; i += 3) { |
Object* element = position_change_array->GetElementNoExceptionThrown(i); |
+ CHECK(element->IsSmi()); |
int chunk_start = Smi::cast(element)->value(); |
if (original_position < chunk_start) { |
break; |
} |
element = position_change_array->GetElementNoExceptionThrown(i + 1); |
+ CHECK(element->IsSmi()); |
int chunk_end = Smi::cast(element)->value(); |
// Position mustn't be inside a chunk. |
ASSERT(original_position >= chunk_end); |
element = position_change_array->GetElementNoExceptionThrown(i + 2); |
+ CHECK(element->IsSmi()); |
int chunk_changed_end = Smi::cast(element)->value(); |
position_diff = chunk_changed_end - chunk_end; |
} |
@@ -1293,7 +1309,6 @@ static Handle<Code> PatchPositionsInCode( |
MaybeObject* LiveEdit::PatchFunctionPositions( |
Handle<JSArray> shared_info_array, Handle<JSArray> position_change_array) { |
- |
if (!SharedInfoWrapper::IsInstance(shared_info_array)) { |
return Isolate::Current()->ThrowIllegalOperation(); |
} |
@@ -1383,11 +1398,11 @@ void LiveEdit::ReplaceRefToNestedFunction( |
Handle<JSValue> subst_function_wrapper) { |
Handle<SharedFunctionInfo> parent_shared = |
- Handle<SharedFunctionInfo>::cast(UnwrapJSValue(parent_function_wrapper)); |
+ UnwrapSharedFunctionInfoFromJSValue(parent_function_wrapper); |
Handle<SharedFunctionInfo> orig_shared = |
- Handle<SharedFunctionInfo>::cast(UnwrapJSValue(orig_function_wrapper)); |
+ UnwrapSharedFunctionInfoFromJSValue(orig_function_wrapper); |
Handle<SharedFunctionInfo> subst_shared = |
- Handle<SharedFunctionInfo>::cast(UnwrapJSValue(subst_function_wrapper)); |
+ UnwrapSharedFunctionInfoFromJSValue(subst_function_wrapper); |
for (RelocIterator it(parent_shared->code()); !it.done(); it.next()) { |
if (it.rinfo()->rmode() == RelocInfo::EMBEDDED_OBJECT) { |
@@ -1410,12 +1425,13 @@ static bool CheckActivation(Handle<JSArray> shared_info_array, |
Handle<JSFunction> function( |
JSFunction::cast(JavaScriptFrame::cast(frame)->function())); |
- int len = Smi::cast(shared_info_array->length())->value(); |
+ int len = GetArrayLength(shared_info_array); |
for (int i = 0; i < len; i++) { |
- JSValue* wrapper = |
- JSValue::cast(shared_info_array->GetElementNoExceptionThrown(i)); |
- Handle<SharedFunctionInfo> shared( |
- SharedFunctionInfo::cast(wrapper->value())); |
+ Object* element = shared_info_array->GetElementNoExceptionThrown(i); |
+ CHECK(element->IsJSValue()); |
+ Handle<JSValue> jsvalue(JSValue::cast(element)); |
+ Handle<SharedFunctionInfo> shared = |
+ UnwrapSharedFunctionInfoFromJSValue(jsvalue); |
if (function->shared() == *shared || IsInlined(*function, *shared)) { |
SetElementNonStrict(result, i, Handle<Smi>(Smi::FromInt(status))); |
@@ -1723,7 +1739,7 @@ static const char* DropActivationsInActiveThread( |
return message; |
} |
- int array_len = Smi::cast(shared_info_array->length())->value(); |
+ int array_len = GetArrayLength(shared_info_array); |
// Replace "blocked on active" with "replaced on active" status. |
for (int i = 0; i < array_len; i++) { |
@@ -1765,7 +1781,7 @@ class InactiveThreadActivationsChecker : public ThreadVisitor { |
Handle<JSArray> LiveEdit::CheckAndDropActivations( |
Handle<JSArray> shared_info_array, bool do_drop, Zone* zone) { |
- int len = Smi::cast(shared_info_array->length())->value(); |
+ int len = GetArrayLength(shared_info_array); |
Handle<JSArray> result = FACTORY->NewJSArray(len); |