Hi Evgeny, In the full codegen, the current context is kept in a dedicated register.
Contexts form a linked list with the global context at the tail. The intermediate contexts are either function contexts corresponding a function's scope or with contexts corresponding to a with scope. There is a field in every context pointing to the enclosing function context---and for function contexts this field should point to the function context itself. The assert is firing when we try to generate code to initialize a function (or const) that has to go in the context, because it is possibly referenced from some inner scope. The assert checks that we don't try to do this with a 'with' or 'global' context, by checking that the value in the context register and that context's function context are identical. So, my guess is that the context chain is messed up somehow. Perhaps you do have a function context, but its enclosing function context has not been initialized to properly point to itself. Context initialization happens in the runtime function (which is platform independent) and also possibly in a platform-specific 'FastNewContext' stub. I'm not sure if this stub is implemented for MIPS, but if it is, I'd look there first to make sure it's properly initializing the new context and returning the proper context. ;; Kevin On Fri, Apr 29, 2011 at 12:05 PM, Evgeny Baskakov <[email protected] > wrote: > Hi all, > > I just started using the MIPS port of V8. So far I'm using the 'shell' > program to run JS code. Everything works fine unless the '--debug- > code' switch is enabled. With the switch, an "unexpected declaration > in current context" error error pops out (the full message text is > below). > > A brief evaluation revealed that it only happens when a nested JS > function accesses a variable that is defined in the enclosing function > body. For instance, when the nested function SetupArray.getFunction() > accesses the SetupArray.specialFunctions variable, in src/array.js. > > I do realize that the MIPS port is out of the official scope, but the > full-codegen part (which pops out the error) is very similar in all V8 > ports. So could someone point out what the reason could be? What > should be checked fist? > > Thanks. > > -- > > And here goes the full error message text: > > abort: Unexpected declaration in current context. > > ==== Stack trace ============================================ > > Security context: 0x2caa8991 <JS Object>#0# > 1: SetupArray [native array.js:1180] (this=0x2caa9391 <JS > Object>#1#) > 2: /* anonymous */ [native array.js:1249] (this=0x2caa9391 <JS > Object>#1#) > > ==== Details ================================================ > > [1]: SetupArray [native array.js:1180] (this=0x2caa9391 <JS > Object>#1#) { > // stack-allocated locals > var getFunction = 0x2cae8061 <undefined> > // heap-allocated locals > var a = 0x2cae8061 <undefined> > // expression stack (top to bottom) > [03] : 0 > [02] : 0 > [01] : 3301874 > --------- s o u r c e c o d e --------- > function SetupArray(){???%SetProperty($Array.prototype,"constructor", > $Array,2);???InstallFunctions($Array, > 2,$Array(?"isArray",ArrayIsArray?));??var a= > %SpecialArrayFunctions({});??function getFunction(b,c,d){?var g=c;? > if(a.hasOwnProperty(b)){?g=a[b];?}?if(!(typeof(d)==='undefined')){? > %FunctionSetLength(g,d);?}?return g... > > ----------------------------------------- > } > > [2]: /* anonymous */ [native array.js:1249] (this=0x2caa9391 <JS > Object>#1#) { > // stack-allocated locals > var .result = 0x2cae8061 <undefined> > // expression stack (top to bottom) > [01] : 0x2caa9391 <JS Object>#1# > --------- s o u r c e c o d e --------- > ???????????????????????????????????var visited_arrays=new > InternalArray();?????function GetSortedArrayKeys(a,b){?var c=b.length;? > var d=[];?for(var e=0;e<c;e++){?var f=b[e];?if(f<0){?var g=-1-f;?var > h=g+b[++e];?for(;g<h;g++){?var i=a[g];?if(!(typeof(i)==='undefined')|| > g in a){?d.push(g);?}?}?}else{??... > > ----------------------------------------- > } > > ==== Key ============================================ > > #0# 0x2caa8991: 0x2caa8991 <JS Object> > #1# 0x2caa9391: 0x2caa9391 <JS Object> > ===================== > > Aborted > > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
