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

Side by Side Diff: src/interpreter/bytecodes.cc

Issue 1379793004: [Interpreter] Add support for new local function context creation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_decl
Patch Set: Fix interpreter-assembler-unittest Created 5 years, 2 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/interpreter/bytecodes.h ('k') | src/interpreter/interpreter.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/bytecodes.h" 5 #include "src/interpreter/bytecodes.h"
6 6
7 #include "src/frames.h" 7 #include "src/frames.h"
8 #include "src/interpreter/bytecode-traits.h" 8 #include "src/interpreter/bytecode-traits.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 break; 218 break;
219 case interpreter::OperandType::kIdx16: { 219 case interpreter::OperandType::kIdx16: {
220 os << "[" << Bytecodes::ShortOperandFromBytes(operand_start) << "]"; 220 os << "[" << Bytecodes::ShortOperandFromBytes(operand_start) << "]";
221 break; 221 break;
222 } 222 }
223 case interpreter::OperandType::kImm8: 223 case interpreter::OperandType::kImm8:
224 os << "#" << static_cast<int>(static_cast<int8_t>(*operand_start)); 224 os << "#" << static_cast<int>(static_cast<int8_t>(*operand_start));
225 break; 225 break;
226 case interpreter::OperandType::kReg8: { 226 case interpreter::OperandType::kReg8: {
227 Register reg = Register::FromOperand(*operand_start); 227 Register reg = Register::FromOperand(*operand_start);
228 if (reg.is_parameter()) { 228 if (reg.is_function_context()) {
229 os << "<context>";
230 } else if (reg.is_function_closure()) {
231 os << "<closure>";
232 } else if (reg.is_parameter()) {
229 int parameter_index = reg.ToParameterIndex(parameter_count); 233 int parameter_index = reg.ToParameterIndex(parameter_count);
230 if (parameter_index == 0) { 234 if (parameter_index == 0) {
231 os << "<this>"; 235 os << "<this>";
232 } else { 236 } else {
233 os << "a" << parameter_index - 1; 237 os << "a" << parameter_index - 1;
234 } 238 }
235 } else { 239 } else {
236 os << "r" << reg.index(); 240 os << "r" << reg.index();
237 } 241 }
238 break; 242 break;
(...skipping 20 matching lines...) Expand all
259 } 263 }
260 264
261 265
262 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) { 266 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) {
263 return os << Bytecodes::OperandSizeToString(operand_size); 267 return os << Bytecodes::OperandSizeToString(operand_size);
264 } 268 }
265 269
266 270
267 static const int kLastParamRegisterIndex = 271 static const int kLastParamRegisterIndex =
268 -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; 272 -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize;
273 static const int kFunctionClosureRegisterIndex =
274 -InterpreterFrameConstants::kFunctionFromRegisterPointer / kPointerSize;
269 static const int kFunctionContextRegisterIndex = 275 static const int kFunctionContextRegisterIndex =
270 -InterpreterFrameConstants::kContextFromRegisterPointer / kPointerSize; 276 -InterpreterFrameConstants::kContextFromRegisterPointer / kPointerSize;
271 277
272 278
273 // Registers occupy range 0-127 in 8-bit value leaving 128 unused values. 279 // Registers occupy range 0-127 in 8-bit value leaving 128 unused values.
274 // Parameter indices are biased with the negative value kLastParamRegisterIndex 280 // Parameter indices are biased with the negative value kLastParamRegisterIndex
275 // for ease of access in the interpreter. 281 // for ease of access in the interpreter.
276 static const int kMaxParameterIndex = 128 + kLastParamRegisterIndex; 282 static const int kMaxParameterIndex = 128 + kLastParamRegisterIndex;
277 283
278 284
279 Register Register::FromParameterIndex(int index, int parameter_count) { 285 Register Register::FromParameterIndex(int index, int parameter_count) {
280 DCHECK_GE(index, 0); 286 DCHECK_GE(index, 0);
281 DCHECK_LT(index, parameter_count); 287 DCHECK_LT(index, parameter_count);
282 DCHECK_LE(parameter_count, kMaxParameterIndex + 1); 288 DCHECK_LE(parameter_count, kMaxParameterIndex + 1);
283 int register_index = kLastParamRegisterIndex - parameter_count + index + 1; 289 int register_index = kLastParamRegisterIndex - parameter_count + index + 1;
284 DCHECK_LT(register_index, 0); 290 DCHECK_LT(register_index, 0);
285 DCHECK_GE(register_index, Register::kMinRegisterIndex); 291 DCHECK_GE(register_index, Register::kMinRegisterIndex);
286 return Register(register_index); 292 return Register(register_index);
287 } 293 }
288 294
289 295
290 int Register::ToParameterIndex(int parameter_count) const { 296 int Register::ToParameterIndex(int parameter_count) const {
291 DCHECK(is_parameter()); 297 DCHECK(is_parameter());
292 return index() - kLastParamRegisterIndex + parameter_count - 1; 298 return index() - kLastParamRegisterIndex + parameter_count - 1;
293 } 299 }
294 300
295 301
302 Register Register::function_closure() {
303 return Register(kFunctionClosureRegisterIndex);
304 }
305
306
307 bool Register::is_function_closure() const {
308 return index() == kFunctionClosureRegisterIndex;
309 }
310
311
296 Register Register::function_context() { 312 Register Register::function_context() {
297 return Register(kFunctionContextRegisterIndex); 313 return Register(kFunctionContextRegisterIndex);
298 } 314 }
299 315
300 316
301 bool Register::is_function_context() const { 317 bool Register::is_function_context() const {
302 return index() == kFunctionContextRegisterIndex; 318 return index() == kFunctionContextRegisterIndex;
303 } 319 }
304 320
305 321
306 int Register::MaxParameterIndex() { return kMaxParameterIndex; } 322 int Register::MaxParameterIndex() { return kMaxParameterIndex; }
307 323
308 324
309 uint8_t Register::ToOperand() const { return static_cast<uint8_t>(-index_); } 325 uint8_t Register::ToOperand() const { return static_cast<uint8_t>(-index_); }
310 326
311 327
312 Register Register::FromOperand(uint8_t operand) { 328 Register Register::FromOperand(uint8_t operand) {
313 return Register(-static_cast<int8_t>(operand)); 329 return Register(-static_cast<int8_t>(operand));
314 } 330 }
315 331
316 } // namespace interpreter 332 } // namespace interpreter
317 } // namespace internal 333 } // namespace internal
318 } // namespace v8 334 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecodes.h ('k') | src/interpreter/interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698