From 7f119dc35ab6331d01897440f1802c66ab03eeaa Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Wed, 16 Jul 2008 15:40:35 -0700 Subject: [PATCH] Enable CALLNAME and add test case for it so we can call global functions. --- js/src/jstracer.cpp | 18 +++++++++++++++++- js/src/trace-test.js | 10 +++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/js/src/jstracer.cpp b/js/src/jstracer.cpp index 559b480b329..a4a0b1186de 100644 --- a/js/src/jstracer.cpp +++ b/js/src/jstracer.cpp @@ -1973,7 +1973,23 @@ bool TraceRecorder::record_JSOP_SETELEM() bool TraceRecorder::record_JSOP_CALLNAME() { - return false; + JSObject* obj = cx->fp->scopeChain; + if (obj != globalObj) + return false; + + LIns* obj_ins = lir->insLoadi(lir->insLoadi(cx_ins, offsetof(JSContext, fp)), + offsetof(JSStackFrame, scopeChain)); + JSObject* obj2; + JSPropCacheEntry* entry; + if (!test_property_cache(obj, obj_ins, obj2, entry)) + ABORT_TRACE("missed prop"); + + if (!PCVAL_IS_OBJECT(entry->vword)) + ABORT_TRACE("PCE not object"); + + stack(0, lir->insImmPtr(PCVAL_TO_OBJECT(entry->vword))); + stack(1, obj_ins); + return true; } JSBool diff --git a/js/src/trace-test.js b/js/src/trace-test.js index a1ecb354cda..e5d5d6513f6 100644 --- a/js/src/trace-test.js +++ b/js/src/trace-test.js @@ -211,9 +211,12 @@ function mod() } test("mod", mod(), "4.5,0,42,4,NaN"); +function global_func() { + return 1; +} function call() { - var q1 = 0, q2 = 0; + var q1 = 0, q2 = 0, q3 = 0; function f1() { return 1; } @@ -223,8 +226,9 @@ function call() for (var i = 0; i < 100; ++i) { q1 += f1(); q2 += f2(f1); + q3 += global_func(); } - var ret = [q1, q2]; + var ret = [q1, q2, q3]; return ret; } -test("call", call(), "100,100"); +test("call", call(), "100,100,100");