SpiderMonkey: Как я могу получить имя текущего JSObject от c? - PullRequest
1 голос
/ 13 октября 2010

кто-то спросил , как получить значение свойства JSObject из c . Это мне немного помогло.

Но кто-нибудь знает, как получить текущее имя объекта JavaScript из c?

пример:

var foo={prop:'bar'};

тогда где-нибудь, например, в jsapi.cpp:

JS_somemethod(JSContext *cx, JSObject *obj){

//how do i get the name 'foo' (or the current alias) here if *obj points to the foo (or whatever alias name) object?

}

Спасибо за подсказки и ответы!

Ответы [ 2 ]

1 голос
/ 09 января 2012

Хорошо, просто для того, чтобы документировать разъяснение вопроса из вашего комментария, я повторю его здесь:

Может быть, я вкратце расскажу вам о своей цели: для интеграции новой системы безопасности в веб-браузеры мне нужно выяснить, к чему обращаются во время обычной сессии на веб-сайте. Моя цель - получить что-то вроде журнала, какие объекты доступны и как (читать, писать, выполнять). например: window.alert (x) window.foo.bar (w) ... вы теперь зачем мне нужны имена переменных? может у тебя есть другая идея?

Просто сказать это заранее, это довольно сложно в целом. Вам доступно несколько вариантов, каждый из которых несколько сложен:

  1. Используйте API отладки, либо через классный новый API объекта отладчика , либо через jsdbgapi.cpp (сложный и немного грубый интерфейс, который использует firebug). Вы можете использовать функциональные возможности отладчика, чтобы перехватывать все обращения к свойствам, вызовы функций и локальные ссылки для выгрузки интересных свойств объектов.
  2. Если вас интересует только способ доступа к вашим (определенным пользователем) объектам, вы можете использовать Proxies , которые обертывают ваши объекты и сбрасывают доступ, выполняемый на их. Несколько более мощная и низкоуровневая версия прокси-серверов фактически используется в браузере для реализации наших функций безопасности. (Кроме того, большая часть функций прокси доступна для созданных пользователем объектов в JSAPI через наш мета-объектный протокол, но прокси являются лишь более чистой версией той же функциональности.)
  3. Измените цикл интерпретатора в jsinterp.cpp. Большая исследовательская работа отключает JIT и инструментирует цикл интерпретатора, потому что это вполне понятно, если вы работали над реализацией языка раньше. К сожалению, сначала не всегда легко перевести то, что вы хотите сделать, в инструментарий цикла интерпретатора, даже если у вас есть опыт работы с языковыми реализациями.

Объект отладчика - определенно мой любимый вариант из тех, что я перечислил здесь. Если вы придерживаетесь этого подхода и в конечном итоге застряли, не стесняйтесь посетить #jsapi в irc.mozilla.org и попытаться овладеть jorendorff или jimb, они а) потрясающие и б) создатели объекта отладчика.

0 голосов
/ 13 октября 2010

Не слишком внимательно изучая API, я скажу, что, хотя в некоторых очень простых случаях это возможно, вы этого не хотите. Вот почему:

В Javascript, как и в большинстве языков, переменные указывают на значения. Переменные не являются самими значениями. Объект никак не связан с именем foo.

Например, вы можете сделать

var foo = {prop: 'bar'};
var fooo = foo;
var foooo = foo;
var quux = {q: foo, r: foo, s: [foo]};

Все эти foo теперь точно такие же; какую ты хочешь вернуть? Для этого нет вызова API, потому что это слишком неоднозначно и не очень полезно.

Однако, если вы действительно хотите найти одну глобальных переменных, содержащих значение, вы можете попробовать перебрать ключи глобального объекта и проверить их на наличие значения.

for(var key in this){
  if(this[key] == myval){
    var myname = key;
  }
}

Вы должны были бы перевести это в ваши вызовы API или поместить его в функцию и вызвать , который через API.

Более простым и простым решением было бы выяснить, что вы хотите делать с foo позже, и передать функцию обратного вызова, которая сделает это, например, с JS_CallFunction .

tl; др: Предыдущий абзац.

...