# HG changeset patch # User Josef Eisl # Date 1399486005 -7200 # Node ID 9440ab398f49776d3dff4bc0cc3744177a1b86a2 # Parent b8bb788084954270fe84f34477d1560f3771d465 BaselineCompiler: implement genArrayLength(). diff -r b8bb78808495 -r 9440ab398f49 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java --- 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