History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/com/sun/script/javascript/RhinoTopLevel.java (1 of 18352 files). Show all

Unified · Split

java/pkg/com/sun/script/javascript/RhinoTopLevel.java+156−0
@@ -0,0 +1,156 @@
1/*
2 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.script.javascript;
27
28import sun.org.mozilla.javascript.internal.*;
29import javax.script.*;
30
31/**
32 * This class serves as top level scope for Rhino. This class adds
33 * 3 top level functions (bindings, scope, sync) and two constructors
34 * (JSAdapter, JavaAdapter).
35 *
36 * @author A. Sundararajan
37 * @since 1.6
38 */
39public final class RhinoTopLevel extends ImporterTopLevel {
40 RhinoTopLevel(Context cx, RhinoScriptEngine engine) {
41 super(cx);
42 this.engine = engine;
43
44
45 // initialize JSAdapter lazily. Reduces footprint & startup time.
46 new LazilyLoadedCtor(this, "JSAdapter",
47 "com.sun.script.javascript.JSAdapter",
48 false);
49
50 /*
51 * initialize JavaAdapter. We can't lazy initialize this because
52 * lazy initializer attempts to define a new property. But, JavaAdapter
53 * is an exisiting property that we overwrite.
54 */
55 JavaAdapter.init(cx, this, false);
56
57 // add top level functions
58 String names[] = { "bindings", "scope", "sync" };
59 defineFunctionProperties(names, RhinoTopLevel.class,
60 ScriptableObject.DONTENUM);
61 }
62
63 /**
64 * The bindings function takes a JavaScript scope object
65 * of type ExternalScriptable and returns the underlying Bindings
66 * instance.
67 *
68 * var page = scope(pageBindings);
69 * with (page) {
70 * // code that uses page scope
71 * }
72 * var b = bindings(page);
73 * // operate on bindings here.
74 */
75 public static Object bindings(Context cx, Scriptable thisObj, Object[] args,
76 Function funObj) {
77 if (args.length == 1) {
78 Object arg = args[0];
79 if (arg instanceof Wrapper) {
80 arg = ((Wrapper)arg).unwrap();
81 }
82 if (arg instanceof ExternalScriptable) {
83 ScriptContext ctx = ((ExternalScriptable)arg).getContext();
84 Bindings bind = ctx.getBindings(ScriptContext.ENGINE_SCOPE);
85 return Context.javaToJS(bind,
86 ScriptableObject.getTopLevelScope(thisObj));
87 }
88 }
89 return cx.getUndefinedValue();
90 }
91
92 /**
93 * The scope function creates a new JavaScript scope object
94 * with given Bindings object as backing store. This can be used
95 * to create a script scope based on arbitrary Bindings instance.
96 * For example, in webapp scenario, a 'page' level Bindings instance
97 * may be wrapped as a scope and code can be run in JavaScripe 'with'
98 * statement:
99 *
100 * var page = scope(pageBindings);
101 * with (page) {
102 * // code that uses page scope
103 * }
104 */
105 public static Object scope(Context cx, Scriptable thisObj, Object[] args,
106 Function funObj) {
107 if (args.length == 1) {
108 Object arg = args[0];
109 if (arg instanceof Wrapper) {
110 arg = ((Wrapper)arg).unwrap();
111 }
112 if (arg instanceof Bindings) {
113 ScriptContext ctx = new SimpleScriptContext();
114 ctx.setBindings((Bindings)arg, ScriptContext.ENGINE_SCOPE);
115 Scriptable res = new ExternalScriptable(ctx);
116 res.setPrototype(ScriptableObject.getObjectPrototype(thisObj));
117 res.setParentScope(ScriptableObject.getTopLevelScope(thisObj));
118 return res;
119 }
120 }
121 return cx.getUndefinedValue();
122 }
123
124 /**
125 * The sync function creates a synchronized function (in the sense
126 * of a Java synchronized method) from an existing function. The
127 * new function synchronizes on the <code>this</code> object of
128 * its invocation.
129 * js> var o = { f : sync(function(x) {
130 * print("entry");
131 * Packages.java.lang.Thread.sleep(x*1000);
132 * print("exit");
133 * })};
134 * js> thread(function() {o.f(5);});
135 * entry
136 * js> thread(function() {o.f(5);});
137 * js>
138 * exit
139 * entry
140 * exit
141 */
142 public static Object sync(Context cx, Scriptable thisObj, Object[] args,
143 Function funObj) {
144 if (args.length == 1 && args[0] instanceof Function) {
145 return new Synchronizer((Function)args[0]);
146 } else {
147 throw Context.reportRuntimeError("wrong argument(s) for sync");
148 }
149 }
150
151 RhinoScriptEngine getScriptEngine() {
152 return engine;
153 }
154
155 private RhinoScriptEngine engine;
156}