Thanks for your help, its been a frustrating week, I could not figure
out why the exception pops up every time.
I Compiled the code with the flags that you gave me, again it compiles
without any problem, but I still get this exception when I try to run it...
Exception in thread "main" java.lang.VerifyError: (class: Hello, method:
<init> signature: ()V) Expecting to find unitialized object on stack
Attached are the jimple files and my java test case files.
Thanks in advance.
Amjad
Julian Tibble wrote:
> Hi Amjad,
>
> The best way for us to help you track down the source of the VerifyError
> would be for you to compile your test program with:
>
> abc -ext <your-extension> +soot -f J -soot <your-aspectj-test-files>
>
> The "+soot -f J -soot" option tells soot to output Jimple files, rather
> than Java class files. If you email us the .jimple file corresponding to
> the class that does not verify then that will give us a much better idea
> of what the problem is.
>
>
>
>> I still dont have a comprehensive idea on how to extract the runtime
>> info. I will very glad if I can get some pointers on this.
>>
>
> The dynamic part of thisJoinPoint is filled in automatically, based on
> the values of args(), target() etc. --- which are determined by how the
> getArgsContextValues(), getTargetContextValue() etc. methods are
> implemented in your BasicBlockShadowMatch class.
>
> The static information is encoded as a string - this string consisists
> of several parts fields separated by '-'.
> See abc/src/abc/eaj/weaving/matching/CastShadowMatch.java (makeSJPInfo)
> and abc/src/abc/eaj/weaving/matching/ExtendedSJPInfo.java
>
> At runtime, thisJoinPointStaticPart is constructed from this string, and
> the string is lazily decoded if and when the reflective information is
> used. The code for extracting a particular field is already implemented
> in SignatureImpl.java in the runtime sources.
>
> See CastSignatureImpl.java for an example of how to extend
> SignatureImpl.java to re-use this extraction code for picking out
> relevant information.
>
>
> Hope that helps.
> Please do continue to send any further questions to the abc-users list,
> Julian
>
>
public class World extends java.lang.Object
{
public static final World abc$perSingletonInstance;
private static java.lang.Throwable abc$initFailureCause;
public final void before$0(int, org.aspectj.lang.JoinPoint)
{
World this;
int id;
org.aspectj.lang.JoinPoint thisJoinPoint;
java.io.PrintStream $r0;
java.lang.StringBuffer $r1, $r2, $r3, $r4, $r5;
java.lang.String $r6, uniqueArgLocal4, uniqueArgLocal5;
this := @this: World;
id := @parameter0: int;
thisJoinPoint := @parameter1: org.aspectj.lang.JoinPoint;
$r0 = <java.lang.System: java.io.PrintStream err>;
$r1 = new java.lang.StringBuffer;
specialinvoke $r1.<java.lang.StringBuffer: void <init>()>();
uniqueArgLocal4 = "Entering Block --> ";
$r2 = virtualinvoke $r1.<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.String)>(uniqueArgLocal4);
$r3 = virtualinvoke $r2.<java.lang.StringBuffer: java.lang.StringBuffer append(int)>(id);
uniqueArgLocal5 = "at ";
$r4 = virtualinvoke $r3.<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.String)>(uniqueArgLocal5);
$r5 = virtualinvoke $r4.<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.Object)>(thisJoinPoint);
$r6 = virtualinvoke $r5.<java.lang.StringBuffer: java.lang.String toString()>();
virtualinvoke $r0.<java.io.PrintStream: void println(java.lang.String)>($r6);
return;
}
public void <init>()
{
World this;
this := @this: World;
specialinvoke this.<java.lang.Object: void <init>()>();
return;
}
public static World aspectOf() throws org.aspectj.lang.NoAspectBoundException
{
World theAspect;
org.aspectj.lang.NoAspectBoundException nabException;
java.lang.Throwable failureCause;
theAspect = <World: World abc$perSingletonInstance>;
if theAspect == null goto label0;
return theAspect;
label0:
nabException = new org.aspectj.lang.NoAspectBoundException;
failureCause = <World: java.lang.Throwable abc$initFailureCause>;
specialinvoke nabException.<org.aspectj.lang.NoAspectBoundException: void <init>(java.lang.String,java.lang.Throwable)>("World", failureCause);
throw nabException;
}
public static boolean hasAspect()
{
World theAspect$0;
theAspect$0 = <World: World abc$perSingletonInstance>;
if theAspect$0 == null goto label0;
return 1;
label0:
return 0;
}
static void <clinit>()
{
java.lang.Throwable catchLocal$1;
label0:
staticinvoke <World: void abc$postClinit()>();
label1:
goto label3;
label2:
catchLocal$1 := @caughtexception;
<World: java.lang.Throwable abc$initFailureCause> = catchLocal$1;
label3:
return;
catch java.lang.Throwable from label0 to label1 with label2;
}
private static void abc$postClinit()
{
World theAspect;
theAspect = new World;
specialinvoke theAspect.<World: void <init>()>();
<World: World abc$perSingletonInstance> = theAspect;
return;
}
}
import java.util.Random;
public class Hello {
public static void main(String[] args) {
Random randomGenerator = new Random();
int i=0;
int randomInt = randomGenerator.nextInt(100);
if (randomInt>=50)
System.out.println("Im in the TRUE part of the first if stmt " + randomInt);
else
System.out.println("Im in the FALSE part of the first if stmt " + randomInt);
for (i=1;i<=4;i++)
{
i=i+2;
System.out.println("value of i is "+i);
}
}
}
public class Hello extends java.lang.Object
{
private static final org.aspectj.lang.JoinPoint$StaticPart SJP0$BasicBlock$main;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP1$BasicBlock$main;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP2$BasicBlock$main;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP3$BasicBlock$main;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP4$BasicBlock$main;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP5$BasicBlock$main;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP6$BasicBlock$main;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP7$BasicBlock$IinitI;
private static final org.aspectj.lang.JoinPoint$StaticPart SJP8$BasicBlock$IclinitI;
public static void main(java.lang.String[])
{
java.lang.String[] args;
java.util.Random $r0;
int i, randomInt;
java.io.PrintStream $r1, $r6, $r11;
java.lang.StringBuffer $r2, $r3, $r4, $r7, $r8, $r9, $r12, $r13, $r14;
java.lang.String $r5, $r10, $r15;
org.aspectj.lang.JoinPoint thisJoinPoint$3, thisJoinPoint$17, thisJoinPoint$31, thisJoinPoint$45, thisJoinPoint$59, thisJoinPoint$73, thisJoinPoint$87;
org.aspectj.lang.JoinPoint$StaticPart pointcutlocal$4, pointcutlocal$18, pointcutlocal$32, pointcutlocal$46, pointcutlocal$60, pointcutlocal$74, pointcutlocal$88;
java.lang.Object[] argsvals$11, argsvals$25, argsvals$39, argsvals$53, argsvals$67, argsvals$81, argsvals$95;
java.lang.Integer pointcutlocal$13, pointcutlocal$27, pointcutlocal$41, pointcutlocal$55, pointcutlocal$69, pointcutlocal$83, pointcutlocal$97;
World theAspect$World;
pointcutlocal$4 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP0$BasicBlock$main>;
argsvals$11 = newarray (java.lang.Object)[1];
pointcutlocal$13 = new java.lang.Integer;
specialinvoke pointcutlocal$13.<java.lang.Integer: void <init>(int)>(0);
argsvals$11[0] = pointcutlocal$13;
thisJoinPoint$3 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$4, null, null, argsvals$11);
theAspect$World = staticinvoke <World: World aspectOf()>();
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(0, thisJoinPoint$3);
args := @parameter0: java.lang.String[];
$r0 = new java.util.Random;
specialinvoke $r0.<java.util.Random: void <init>()>();
randomInt = virtualinvoke $r0.<java.util.Random: int nextInt(int)>(100);
if randomInt < 50 goto label0;
pointcutlocal$18 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP1$BasicBlock$main>;
argsvals$25 = newarray (java.lang.Object)[1];
pointcutlocal$27 = new java.lang.Integer;
specialinvoke pointcutlocal$27.<java.lang.Integer: void <init>(int)>(1);
argsvals$25[0] = pointcutlocal$27;
thisJoinPoint$17 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$18, null, null, argsvals$25);
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(1, thisJoinPoint$17);
$r1 = <java.lang.System: java.io.PrintStream out>;
$r2 = new java.lang.StringBuffer;
specialinvoke $r2.<java.lang.StringBuffer: void <init>()>();
$r3 = virtualinvoke $r2.<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.String)>("Im in the TRUE part of the first if stmt ");
$r4 = virtualinvoke $r3.<java.lang.StringBuffer: java.lang.StringBuffer append(int)>(randomInt);
$r5 = virtualinvoke $r4.<java.lang.StringBuffer: java.lang.String toString()>();
virtualinvoke $r1.<java.io.PrintStream: void println(java.lang.String)>($r5);
goto label1;
label0:
pointcutlocal$32 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP2$BasicBlock$main>;
argsvals$39 = newarray (java.lang.Object)[1];
pointcutlocal$41 = new java.lang.Integer;
specialinvoke pointcutlocal$41.<java.lang.Integer: void <init>(int)>(2);
argsvals$39[0] = pointcutlocal$41;
thisJoinPoint$31 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$32, null, null, argsvals$39);
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(2, thisJoinPoint$31);
$r6 = <java.lang.System: java.io.PrintStream out>;
$r7 = new java.lang.StringBuffer;
specialinvoke $r7.<java.lang.StringBuffer: void <init>()>();
$r8 = virtualinvoke $r7.<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.String)>("Im in the FALSE part of the first if stmt ");
$r9 = virtualinvoke $r8.<java.lang.StringBuffer: java.lang.StringBuffer append(int)>(randomInt);
$r10 = virtualinvoke $r9.<java.lang.StringBuffer: java.lang.String toString()>();
virtualinvoke $r6.<java.io.PrintStream: void println(java.lang.String)>($r10);
label1:
pointcutlocal$46 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP3$BasicBlock$main>;
argsvals$53 = newarray (java.lang.Object)[1];
pointcutlocal$55 = new java.lang.Integer;
specialinvoke pointcutlocal$55.<java.lang.Integer: void <init>(int)>(3);
argsvals$53[0] = pointcutlocal$55;
thisJoinPoint$45 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$46, null, null, argsvals$53);
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(3, thisJoinPoint$45);
i = 1;
label2:
pointcutlocal$60 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP4$BasicBlock$main>;
argsvals$67 = newarray (java.lang.Object)[1];
pointcutlocal$69 = new java.lang.Integer;
specialinvoke pointcutlocal$69.<java.lang.Integer: void <init>(int)>(4);
argsvals$67[0] = pointcutlocal$69;
thisJoinPoint$59 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$60, null, null, argsvals$67);
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(4, thisJoinPoint$59);
if i > 4 goto label3;
pointcutlocal$74 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP5$BasicBlock$main>;
argsvals$81 = newarray (java.lang.Object)[1];
pointcutlocal$83 = new java.lang.Integer;
specialinvoke pointcutlocal$83.<java.lang.Integer: void <init>(int)>(5);
argsvals$81[0] = pointcutlocal$83;
thisJoinPoint$73 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$74, null, null, argsvals$81);
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(5, thisJoinPoint$73);
i = i + 2;
$r11 = <java.lang.System: java.io.PrintStream out>;
$r12 = new java.lang.StringBuffer;
specialinvoke $r12.<java.lang.StringBuffer: void <init>()>();
$r13 = virtualinvoke $r12.<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.String)>("value of i is ");
$r14 = virtualinvoke $r13.<java.lang.StringBuffer: java.lang.StringBuffer append(int)>(i);
$r15 = virtualinvoke $r14.<java.lang.StringBuffer: java.lang.String toString()>();
virtualinvoke $r11.<java.io.PrintStream: void println(java.lang.String)>($r15);
i = i + 1;
goto label2;
label3:
pointcutlocal$88 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP6$BasicBlock$main>;
argsvals$95 = newarray (java.lang.Object)[1];
pointcutlocal$97 = new java.lang.Integer;
specialinvoke pointcutlocal$97.<java.lang.Integer: void <init>(int)>(6);
argsvals$95[0] = pointcutlocal$97;
thisJoinPoint$87 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$88, null, null, argsvals$95);
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(6, thisJoinPoint$87);
return;
}
public void <init>()
{
Hello this;
org.aspectj.lang.JoinPoint thisJoinPoint$101;
org.aspectj.lang.JoinPoint$StaticPart pointcutlocal$102;
java.lang.Object[] argsvals$109;
java.lang.Integer pointcutlocal$111;
World theAspect$World;
pointcutlocal$102 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP7$BasicBlock$IinitI>;
argsvals$109 = newarray (java.lang.Object)[1];
pointcutlocal$111 = new java.lang.Integer;
specialinvoke pointcutlocal$111.<java.lang.Integer: void <init>(int)>(0);
argsvals$109[0] = pointcutlocal$111;
thisJoinPoint$101 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$102, null, null, argsvals$109);
theAspect$World = staticinvoke <World: World aspectOf()>();
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(0, thisJoinPoint$101);
this := @this: Hello;
specialinvoke this.<java.lang.Object: void <init>()>();
return;
}
static void <clinit>()
{
java.lang.Class $r0;
bbs.runtime.reflect.BbsFactory $r1;
bbs.lang.reflect.BasicBlockSignature $r2, $r4, $r6, $r8, $r10, $r12, $r14, $r16, $r18;
org.aspectj.lang.JoinPoint$StaticPart $r3, $r5, $r7, $r9, $r11, $r13, $r15, $r17, $r19, pointcutlocal$116;
org.aspectj.lang.JoinPoint thisJoinPoint$115;
java.lang.Object[] argsvals$123;
java.lang.Integer pointcutlocal$125;
World theAspect$World;
$r0 = staticinvoke <java.lang.Class: java.lang.Class forName(java.lang.String)>("Hello");
$r1 = new bbs.runtime.reflect.BbsFactory;
specialinvoke $r1.<bbs.runtime.reflect.BbsFactory: void <init>(java.lang.String,java.lang.Class)>("Hello.java", $r0);
$r2 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r3 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r2, 5, 25, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP0$BasicBlock$main> = $r3;
$r4 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r5 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r4, 10, 4, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP1$BasicBlock$main> = $r5;
$r6 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r7 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r6, 12, 4, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP2$BasicBlock$main> = $r7;
$r8 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r9 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r8, 13, 7, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP3$BasicBlock$main> = $r9;
$r10 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r11 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r10, 13, 11, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP4$BasicBlock$main> = $r11;
$r12 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r13 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r12, 15, 3, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP5$BasicBlock$main> = $r13;
$r14 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r15 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r14, -1, -1, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP6$BasicBlock$main> = $r15;
$r16 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r17 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r16, -1, -1, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP7$BasicBlock$IinitI> = $r17;
$r18 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: bbs.lang.reflect.BasicBlockSignature makeBasicBlockSig(java.lang.String)>("---Hello-");
$r19 = virtualinvoke $r1.<bbs.runtime.reflect.BbsFactory: org.aspectj.lang.JoinPoint$StaticPart makeSJP(java.lang.String,org.aspectj.lang.Signature,int,int,int)>("BasicBlock", $r18, 3, 7, -1);
<Hello: org.aspectj.lang.JoinPoint$StaticPart SJP8$BasicBlock$IclinitI> = $r19;
pointcutlocal$116 = <Hello: org.aspectj.lang.JoinPoint$StaticPart SJP8$BasicBlock$IclinitI>;
argsvals$123 = newarray (java.lang.Object)[1];
pointcutlocal$125 = new java.lang.Integer;
specialinvoke pointcutlocal$125.<java.lang.Integer: void <init>(int)>(0);
argsvals$123[0] = pointcutlocal$125;
thisJoinPoint$115 = staticinvoke <org.aspectbench.runtime.reflect.Factory: org.aspectj.lang.JoinPoint makeJP(org.aspectj.lang.JoinPoint$StaticPart,java.lang.Object,java.lang.Object,java.lang.Object[])>(pointcutlocal$116, null, null, argsvals$123);
theAspect$World = staticinvoke <World: World aspectOf()>();
virtualinvoke theAspect$World.<World: void before$0(int,org.aspectj.lang.JoinPoint)>(0, thisJoinPoint$115);
return;
}
}
public aspect World {
/**** int id: returns the id of the basic block ****/
before(int id) : block() && !within(World) && args(id)
{
System.err.println("Entering Block --> "+id + "at " +thisJoinPoint);
}
}
Received on Wed Apr 16 2008 - 21:22:02 BST
This archive was generated by hypermail 2.2.0 : Fri Apr 18 2008 - 00:50:11 BST