aboutsummaryrefslogtreecommitdiff
path: root/files/es/cómo_incrustar_el_motor_javascript/index.html
blob: d938b252b82a85ef3fb8a7b2f329b0133a49c34c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
---
title: Cómo incrustar el motor Javascript
slug: Cómo_incrustar_el_motor_Javascript
tags:
  - páginas_a_traducir
translation_of: Mozilla/Projects/SpiderMonkey/How_to_embed_the_JavaScript_engine
---
<p>Ver tambien <a href="/En/SpiderMonkey/JSAPI_User_Guide" title="En/SpiderMonkey/JSAPI_User_Guide">JSAPI User Guide</a>. En particular, tiene mas y mejores ejemplos de codigo.</p>
<h2 id="A_Bare_Bones_Tutorial" name="A_Bare_Bones_Tutorial">Un esqueleto de Tutorial</h2>
<h4 id="How_to_start_up_the_VM_and_Execute_a_Script" name="How_to_start_up_the_VM_and_Execute_a_Script">Comprobación para iniciar una maquina virtual y ejecutar un script sin ningún error:</h4>
<ul>
 <li>null retorna de JS_ funciones que retornan punteros.</li>
 <li>false retorna de JS_ funciones que retornan booleanos.</li>
</ul>
<p>(los errores son convencionalmente guardados en una variable JSBool llamada ok).</p>
<pre>JSRuntime *rt;
JSContext *cx;
JSObject *global;
JSClass global_class = {
	"global",0,
	JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,
	JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub
};

/*
 * Siempre necesitará:
 *        un runtime por proceso,
 *        un contexto por hilo,
 *        un objeto global por contexto,
 *        clases estandard (ej. fecha).
 */
rt = JS_NewRuntime(0x100000);
cx = JS_NewContext(rt, 0x1000);
global = JS_NewObject(cx, &amp;global_class, NULL, NULL);
JS_InitStandardClasses(cx, global);

/*
 * Ahora suponga que el script contiene algún JS para evaluar, por decir "22/7" como una
 * mala aproximación para la función matematica Math.PI, o algo mas largo, como esto:
* "(function fact(n){if (n &lt;= 1) return 1; return n * fact(n-1)})(5)"
 * para calcular 5!
 */
char *script = "...";
jsval rval;
JSString *str;
JSBool ok;

ok = JS_EvaluateScript(cx, global, script, strlen(script),
					   filename, lineno, &amp;rval);
str = JS_ValueToString(cx, rval);
printf("script result: %s\n", JS_GetStringBytes(str));
</pre>
<h4 id="How_to_call_C_functions_from_JavaScript" name="How_to_call_C_functions_from_JavaScript">Como llamar funciones de C desde JavaScript</h4>
<p>Suponga que la función en C sea llamada <code>doit</code> y le gustaria que al menos 2 parametros sean llamados (si el llamado suministra menos, el motor JS deberia asegurar que lo indefinido sea pasado por lo faltante): </p>
<pre class="eval">#define DOIT_MINARGS 2

static JSBool
doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
    /*
     * Look in argv for argc actual parameters, set *rval to return a
     * value to the caller.
     */
    ...
}
</pre>
<p>Entonces para la conexión con JS, debe escribir:</p>
<pre class="eval">ok = <a href="/en/SpiderMonkey/JSAPI_Reference/JS_DefineFunction" title="en/SpiderMonkey/JSAPI_Reference/JS_DefineFunction">JS_DefineFunction</a>(cx, global, "doit", doit, DOIT_MINARGS, 0);
</pre>
<p>O, si tenia una serie de funciones nativas para definir, las pondria probablemente en una tabla:</p>
<pre class="eval">static <a href="/En/SpiderMonkey/JSAPI_Reference/JSFunctionSpec" title="en/JSFunctionSpec">JSFunctionSpec</a> my_functions[] = {
    {"doit", doit, DOIT_MINARGS, 0, 0},
    etc...
    {0,0,0,0,0},
};
</pre>
<p>(Al final, todos los ceros especificados en la función terminan la tabla), y decir:</p>
<pre class="eval">ok = <a href="/en/SpiderMonkey/JSAPI_Reference/JS_DefineFunctions" title="en/SpiderMonkey/JSAPI_Reference/JS_DefineFunctions">JS_DefineFunctions</a>(cx, global, my_functions);
</pre>
<h4 id="How_to_call_JavaScript_functions_from_C" name="How_to_call_JavaScript_functions_from_C">Como llamar funciones de JavaScript  desde C</h4>
<p>Say the click event is for the top-most or focused UI element at position (x, y):</p>
<pre class="eval">JSObject *target, *event;
jsval argv[1], rval;

/*
 * Find event target and make event object to represent this click.
 * Pass cx to NewEventObject so JS_NewObject can be called.
 */
target = FindEventTargetAt(cx, global, x, y);
event = NewEventObject(cx, "click", x, y);
argv[0] = <a href="/en/SpiderMonkey/JSAPI_Reference/OBJECT_TO_JSVAL" title="en/SpiderMonkey/JSAPI_Reference/OBJECT_TO_JSVAL">OBJECT_TO_JSVAL</a>(event);

/* To emulate the DOM, you might want to try "onclick" too. */
ok = <a href="/en/SpiderMonkey/JSAPI_Reference/JS_CallFunctionName" title="en/SpiderMonkey/JSAPI_Reference/JS_CallFunctionName">JS_CallFunctionName</a>(cx, target, "onClick", 1, argv, &amp;rval);

/* Now test rval to see whether we should cancel the event. */
if (<a href="/en/SpiderMonkey/JSAPI_Reference/JSVAL_IS_BOOLEAN" title="en/SpiderMonkey/JSAPI_Reference/JSVAL_IS_BOOLEAN">JSVAL_IS_BOOLEAN</a>(rval) &amp;&amp; !<a href="/en/SpiderMonkey/JSAPI_Reference/JSVAL_TO_BOOLEAN" title="en/SpiderMonkey/JSAPI_Reference/JSVAL_TO_BOOLEAN">JSVAL_TO_BOOLEAN</a>(rval))
    CancelEvent(event);
</pre>
<p>Again, I've elided error checking (such as testing for <code>!ok</code> after the call), and I've faked up some C event management routines that emulate the DOM's convention of canceling an event if its handler returns false.</p>
<div class="originaldocinfo">
 <h2 id="Original_Document_Information" name="Original_Document_Information">Original Document Information</h2>
 <ul>
  <li>Author: Brendan Eich</li>
  <li>Last Updated Date: 21 February, 2000</li>
 </ul>
</div>
<p> </p>