Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: src/runtime/runtime-debug.cc

Issue 1126103006: Provide accessor for object internal properties that doesn't require debugger to be active (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/runtime/runtime.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/compiler.h" 9 #include "src/compiler.h"
10 #include "src/debug.h" 10 #include "src/debug.h"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 94
95 case LookupIterator::DATA: 95 case LookupIterator::DATA:
96 return it->GetDataValue(); 96 return it->GetDataValue();
97 } 97 }
98 } 98 }
99 99
100 return it->isolate()->factory()->undefined_value(); 100 return it->isolate()->factory()->undefined_value();
101 } 101 }
102 102
103 103
104 static Handle<Object> DebugGetProperty(Handle<Object> object,
105 Handle<Name> name) {
106 LookupIterator it(object, name);
107 return DebugGetProperty(&it);
108 }
109
110
111 template <class IteratorType>
112 static MaybeHandle<JSArray> GetIteratorInternalProperties(
113 Isolate* isolate, Handle<IteratorType> object) {
114 Factory* factory = isolate->factory();
115 Handle<IteratorType> iterator = Handle<IteratorType>::cast(object);
116 RUNTIME_ASSERT_HANDLIFIED(iterator->kind()->IsSmi(), JSArray);
117 const char* kind = NULL;
118 switch (Smi::cast(iterator->kind())->value()) {
119 case IteratorType::kKindKeys:
120 kind = "keys";
121 break;
122 case IteratorType::kKindValues:
123 kind = "values";
124 break;
125 case IteratorType::kKindEntries:
126 kind = "entries";
127 break;
128 default:
129 RUNTIME_ASSERT_HANDLIFIED(false, JSArray);
130 }
131
132 Handle<FixedArray> result = factory->NewFixedArray(2 * 3);
133 result->set(0, *factory->NewStringFromAsciiChecked("[[IteratorHasMore]]"));
134 result->set(1, isolate->heap()->ToBoolean(iterator->HasMore()));
135
136 result->set(2, *factory->NewStringFromAsciiChecked("[[IteratorIndex]]"));
137 result->set(3, iterator->index());
138
139 result->set(4, *factory->NewStringFromAsciiChecked("[[IteratorKind]]"));
140 result->set(5, *factory->NewStringFromAsciiChecked(kind));
141 return factory->NewJSArrayWithElements(result);
142 }
143
144
145 MaybeHandle<JSArray> Runtime::GetInternalProperties(Isolate* isolate,
146 Handle<Object> object) {
147 Factory* factory = isolate->factory();
148 if (object->IsJSFunction()) {
149 Handle<JSFunction> function = Handle<JSFunction>::cast(object);
150 if (function->shared()->bound()) {
151 RUNTIME_ASSERT_HANDLIFIED(function->function_bindings()->IsFixedArray(),
152 JSArray);
153
154 Handle<FixedArray> bindings(function->function_bindings());
155
156 Handle<FixedArray> result = factory->NewFixedArray(2 * 3);
157 result->set(0, *factory->NewStringFromAsciiChecked("[[TargetFunction]]"));
158 result->set(1, bindings->get(JSFunction::kBoundFunctionIndex));
159
160 result->set(2, *factory->NewStringFromAsciiChecked("[[BoundThis]]"));
161 result->set(3, bindings->get(JSFunction::kBoundThisIndex));
162
163 Handle<FixedArray> arguments = factory->NewFixedArray(
164 bindings->length() - JSFunction::kBoundArgumentsStartIndex);
165 bindings->CopyTo(
166 JSFunction::kBoundArgumentsStartIndex, *arguments, 0,
167 bindings->length() - JSFunction::kBoundArgumentsStartIndex);
168 result->set(4, *factory->NewStringFromAsciiChecked("[[BoundArgs]]"));
169 result->set(5, *factory->NewJSArrayWithElements(arguments));
170 return factory->NewJSArrayWithElements(result);
171 }
172 } else if (object->IsJSMapIterator()) {
173 Handle<JSMapIterator> iterator = Handle<JSMapIterator>::cast(object);
174 return GetIteratorInternalProperties(isolate, iterator);
175 } else if (object->IsJSSetIterator()) {
176 Handle<JSSetIterator> iterator = Handle<JSSetIterator>::cast(object);
177 return GetIteratorInternalProperties(isolate, iterator);
178 } else if (object->IsJSGeneratorObject()) {
179 Handle<JSGeneratorObject> generator =
180 Handle<JSGeneratorObject>::cast(object);
181
182 const char* status = "suspended";
183 if (generator->is_closed()) {
184 status = "closed";
185 } else if (generator->is_executing()) {
186 status = "running";
187 } else {
188 DCHECK(generator->is_suspended());
189 }
190
191 Handle<FixedArray> result = factory->NewFixedArray(2 * 3);
192 result->set(0, *factory->NewStringFromAsciiChecked("[[GeneratorStatus]]"));
193 result->set(1, *factory->NewStringFromAsciiChecked(status));
194
195 result->set(2,
196 *factory->NewStringFromAsciiChecked("[[GeneratorFunction]]"));
197 result->set(3, generator->function());
198
199 result->set(4,
200 *factory->NewStringFromAsciiChecked("[[GeneratorReceiver]]"));
201 result->set(5, generator->receiver());
202 return factory->NewJSArrayWithElements(result);
203 } else if (Object::IsPromise(object)) {
204 Handle<JSObject> promise = Handle<JSObject>::cast(object);
205
206 Handle<Object> status_obj =
207 DebugGetProperty(promise, isolate->promise_status());
208 RUNTIME_ASSERT_HANDLIFIED(status_obj->IsSmi(), JSArray);
209 const char* status = "rejected";
210 int status_val = Handle<Smi>::cast(status_obj)->value();
211 switch (status_val) {
212 case +1:
213 status = "resolved";
214 break;
215 case 0:
216 status = "pending";
217 break;
218 default:
219 DCHECK_EQ(-1, status_val);
220 }
221
222 Handle<FixedArray> result = factory->NewFixedArray(2 * 2);
223 result->set(0, *factory->NewStringFromAsciiChecked("[[PromiseStatus]]"));
224 result->set(1, *factory->NewStringFromAsciiChecked(status));
225
226 Handle<Object> value_obj =
227 DebugGetProperty(promise, isolate->promise_value());
228 result->set(2, *factory->NewStringFromAsciiChecked("[[PromiseValue]]"));
229 result->set(3, *value_obj);
230 return factory->NewJSArrayWithElements(result);
231 } else if (object->IsJSValue()) {
232 Handle<JSValue> js_value = Handle<JSValue>::cast(object);
233
234 Handle<FixedArray> result = factory->NewFixedArray(2);
235 result->set(0, *factory->NewStringFromAsciiChecked("[[PrimitiveValue]]"));
236 result->set(1, js_value->value());
237 return factory->NewJSArrayWithElements(result);
238 }
239 return factory->NewJSArray(0);
240 }
241
242
243 RUNTIME_FUNCTION(Runtime_DebugGetInternalProperties) {
244 HandleScope scope(isolate);
245 DCHECK(args.length() == 1);
246 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0);
247 Handle<JSArray> result;
248 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
249 isolate, result, Runtime::GetInternalProperties(isolate, obj));
250 return *result;
251 }
252
253
104 // Get debugger related details for an object property, in the following format: 254 // Get debugger related details for an object property, in the following format:
105 // 0: Property value 255 // 0: Property value
106 // 1: Property details 256 // 1: Property details
107 // 2: Property value is exception 257 // 2: Property value is exception
108 // 3: Getter function if defined 258 // 3: Getter function if defined
109 // 4: Setter function if defined 259 // 4: Setter function if defined
110 // Items 2-4 are only filled if the property has either a getter or a setter. 260 // Items 2-4 are only filled if the property has either a getter or a setter.
111 RUNTIME_FUNCTION(Runtime_DebugGetPropertyDetails) { 261 RUNTIME_FUNCTION(Runtime_DebugGetPropertyDetails) {
112 HandleScope scope(isolate); 262 HandleScope scope(isolate);
113 263
(...skipping 2862 matching lines...) Expand 10 before | Expand all | Expand 10 after
2976 return Smi::FromInt(isolate->debug()->is_active()); 3126 return Smi::FromInt(isolate->debug()->is_active());
2977 } 3127 }
2978 3128
2979 3129
2980 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) { 3130 RUNTIME_FUNCTION(Runtime_DebugBreakInOptimizedCode) {
2981 UNIMPLEMENTED(); 3131 UNIMPLEMENTED();
2982 return NULL; 3132 return NULL;
2983 } 3133 }
2984 } 3134 }
2985 } // namespace v8::internal 3135 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime/runtime.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698