Mercurial > hg > truffle
changeset 15559:9440ab398f49
BaselineCompiler: implement genArrayLength().
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Wed, 07 May 2014 20:06:45 +0200 |
parents | b8bb78808495 |
children | db5e9c70d829 |
files | graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java |
diffstat | 1 files changed, 28 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Wed May 07 20:05:20 2014 +0200 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Wed May 07 20:06:45 2014 +0200 @@ -484,8 +484,7 @@ @Override protected void emitNullCheck(Value receiver) { - // TODO Auto-generated method stub - throw GraalInternalError.unimplemented("Auto-generated method stub"); + gen.emitNullCheck(receiver, createFrameState(frameState)); } @Override @@ -500,9 +499,33 @@ long displacement = lirBuilder.getArrayLengthOffset(); Value address = gen.emitAddress(array, displacement, Value.ILLEGAL, 0); PlatformKind readKind = gen.getPlatformKind(StampFactory.forKind(Kind.Int)); - LIRFrameState state = null; - gen.emitLoad(readKind, address, state); - throw GraalInternalError.unimplemented("Auto-generated method stub"); + LIRFrameState state = createFrameState(frameState); + return gen.emitLoad(readKind, address, state); + } + + private LIRFrameState createFrameState(BaselineFrameStateBuilder state) { + LabelRef exceptionEdge = null; + BytecodeFrame caller = null; + boolean duringCall = false; + int numLocals = state.localsSize(); + int numStack = state.stackSize(); + int numLocks = state.lockDepth(); + Value[] values = new Value[numLocals + numStack + numLocks]; + + for (int i = 0; i < numLocals; i++) { + values[i] = state.localAt(i); + } + + for (int i = 0; i < numStack; i++) { + values[numLocals + i] = state.stackAt(i); + } + + for (int i = 0; i < numStack; i++) { + values[numLocals + numStack + i] = state.lockAt(i); + } + + BytecodeFrame frame = new BytecodeFrame(caller, method, bci(), state.rethrowException(), duringCall, values, numLocals, numStack, numLocks); + return new LIRFrameState(frame, null, exceptionEdge); } @Override