Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell11
提交
c2de1264
D
dragonwell11
项目概览
openanolis
/
dragonwell11
通知
7
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell11
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c2de1264
编写于
3月 25, 2014
作者:
L
lana
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
546942fa
cb989316
变更
80
展开全部
隐藏空白更改
内联
并排
Showing
80 changed file
with
2763 addition
and
896 deletion
+2763
-896
nashorn/make/BuildNashorn.gmk
nashorn/make/BuildNashorn.gmk
+1
-1
nashorn/make/build.xml
nashorn/make/build.xml
+6
-0
nashorn/make/project.properties
nashorn/make/project.properties
+1
-1
nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java
...rn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java
+33
-34
nashorn/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java
...orn/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java
+11
-11
nashorn/src/jdk/nashorn/internal/codegen/Attr.java
nashorn/src/jdk/nashorn/internal/codegen/Attr.java
+6
-3
nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java
nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java
+2
-2
nashorn/src/jdk/nashorn/internal/codegen/SharedScopeCall.java
...orn/src/jdk/nashorn/internal/codegen/SharedScopeCall.java
+1
-1
nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java
nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java
+14
-2
nashorn/src/jdk/nashorn/internal/objects/AccessorPropertyDescriptor.java
.../nashorn/internal/objects/AccessorPropertyDescriptor.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java
...orn/src/jdk/nashorn/internal/objects/ArrayBufferView.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/DataPropertyDescriptor.java
.../jdk/nashorn/internal/objects/DataPropertyDescriptor.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/GenericPropertyDescriptor.java
...k/nashorn/internal/objects/GenericPropertyDescriptor.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/Global.java
nashorn/src/jdk/nashorn/internal/objects/Global.java
+155
-99
nashorn/src/jdk/nashorn/internal/objects/NativeArray.java
nashorn/src/jdk/nashorn/internal/objects/NativeArray.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeArrayBuffer.java
...n/src/jdk/nashorn/internal/objects/NativeArrayBuffer.java
+14
-5
nashorn/src/jdk/nashorn/internal/objects/NativeBoolean.java
nashorn/src/jdk/nashorn/internal/objects/NativeBoolean.java
+14
-9
nashorn/src/jdk/nashorn/internal/objects/NativeDataView.java
nashorn/src/jdk/nashorn/internal/objects/NativeDataView.java
+1015
-0
nashorn/src/jdk/nashorn/internal/objects/NativeDate.java
nashorn/src/jdk/nashorn/internal/objects/NativeDate.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeError.java
nashorn/src/jdk/nashorn/internal/objects/NativeError.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeEvalError.java
...orn/src/jdk/nashorn/internal/objects/NativeEvalError.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeJSAdapter.java
...orn/src/jdk/nashorn/internal/objects/NativeJSAdapter.java
+3
-7
nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java
.../src/jdk/nashorn/internal/objects/NativeJavaImporter.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeNumber.java
nashorn/src/jdk/nashorn/internal/objects/NativeNumber.java
+14
-9
nashorn/src/jdk/nashorn/internal/objects/NativeRangeError.java
...rn/src/jdk/nashorn/internal/objects/NativeRangeError.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeReferenceError.java
...rc/jdk/nashorn/internal/objects/NativeReferenceError.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java
nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeRegExpExecResult.java
.../jdk/nashorn/internal/objects/NativeRegExpExecResult.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeString.java
nashorn/src/jdk/nashorn/internal/objects/NativeString.java
+14
-9
nashorn/src/jdk/nashorn/internal/objects/NativeSyntaxError.java
...n/src/jdk/nashorn/internal/objects/NativeSyntaxError.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeTypeError.java
...orn/src/jdk/nashorn/internal/objects/NativeTypeError.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/NativeURIError.java
nashorn/src/jdk/nashorn/internal/objects/NativeURIError.java
+1
-5
nashorn/src/jdk/nashorn/internal/objects/PrototypeObject.java
...orn/src/jdk/nashorn/internal/objects/PrototypeObject.java
+0
-4
nashorn/src/jdk/nashorn/internal/objects/ScriptFunctionImpl.java
.../src/jdk/nashorn/internal/objects/ScriptFunctionImpl.java
+17
-35
nashorn/src/jdk/nashorn/internal/parser/Parser.java
nashorn/src/jdk/nashorn/internal/parser/Parser.java
+1
-0
nashorn/src/jdk/nashorn/internal/runtime/AccessorProperty.java
...rn/src/jdk/nashorn/internal/runtime/AccessorProperty.java
+8
-4
nashorn/src/jdk/nashorn/internal/runtime/Context.java
nashorn/src/jdk/nashorn/internal/runtime/Context.java
+109
-61
nashorn/src/jdk/nashorn/internal/runtime/DebuggerSupport.java
...orn/src/jdk/nashorn/internal/runtime/DebuggerSupport.java
+2
-2
nashorn/src/jdk/nashorn/internal/runtime/ECMAErrors.java
nashorn/src/jdk/nashorn/internal/runtime/ECMAErrors.java
+29
-28
nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java
...jdk/nashorn/internal/runtime/FinalScriptFunctionData.java
+13
-17
nashorn/src/jdk/nashorn/internal/runtime/GlobalObject.java
nashorn/src/jdk/nashorn/internal/runtime/GlobalObject.java
+0
-244
nashorn/src/jdk/nashorn/internal/runtime/JSONFunctions.java
nashorn/src/jdk/nashorn/internal/runtime/JSONFunctions.java
+11
-10
nashorn/src/jdk/nashorn/internal/runtime/JSType.java
nashorn/src/jdk/nashorn/internal/runtime/JSType.java
+5
-4
nashorn/src/jdk/nashorn/internal/runtime/ListAdapter.java
nashorn/src/jdk/nashorn/internal/runtime/ListAdapter.java
+7
-6
nashorn/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
...n/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
+1
-2
nashorn/src/jdk/nashorn/internal/runtime/ParserException.java
...orn/src/jdk/nashorn/internal/runtime/ParserException.java
+2
-1
nashorn/src/jdk/nashorn/internal/runtime/Property.java
nashorn/src/jdk/nashorn/internal/runtime/Property.java
+15
-1
nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
...horn/internal/runtime/RecompilableScriptFunctionData.java
+54
-40
nashorn/src/jdk/nashorn/internal/runtime/ScriptFunction.java
nashorn/src/jdk/nashorn/internal/runtime/ScriptFunction.java
+25
-24
nashorn/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java
.../src/jdk/nashorn/internal/runtime/ScriptFunctionData.java
+49
-27
nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java
nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java
+54
-45
nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java
nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java
+1
-1
nashorn/src/jdk/nashorn/internal/runtime/SetMethodCreator.java
...rn/src/jdk/nashorn/internal/runtime/SetMethodCreator.java
+4
-20
nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java
...rc/jdk/nashorn/internal/runtime/UserAccessorProperty.java
+3
-2
nashorn/src/jdk/nashorn/internal/runtime/WithObject.java
nashorn/src/jdk/nashorn/internal/runtime/WithObject.java
+6
-1
nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java
...rn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java
+2
-2
nashorn/src/jdk/nashorn/internal/runtime/arrays/ByteBufferArrayData.java
.../nashorn/internal/runtime/arrays/ByteBufferArrayData.java
+3
-2
nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java
...dk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java
+2
-2
nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java
...dk/nashorn/internal/runtime/arrays/SealedArrayFilter.java
+2
-2
nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
...internal/runtime/linker/JavaAdapterBytecodeGenerator.java
+13
-9
nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
...k/nashorn/internal/runtime/linker/JavaAdapterFactory.java
+3
-3
nashorn/src/jdk/nashorn/internal/runtime/linker/NashornGuards.java
...rc/jdk/nashorn/internal/runtime/linker/NashornGuards.java
+60
-0
nashorn/src/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java
...shorn/internal/runtime/linker/NashornPrimitiveLinker.java
+2
-2
nashorn/src/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java
.../jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java
+21
-4
nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties
...dk/nashorn/internal/runtime/resources/Messages.properties
+4
-0
nashorn/src/jdk/nashorn/tools/Shell.java
nashorn/src/jdk/nashorn/tools/Shell.java
+10
-9
nashorn/test/script/basic/JDK-8034055.js
nashorn/test/script/basic/JDK-8034055.js
+55
-0
nashorn/test/script/basic/JDK-8034055.js.EXPECTED
nashorn/test/script/basic/JDK-8034055.js.EXPECTED
+16
-0
nashorn/test/script/basic/dataview_endian.js
nashorn/test/script/basic/dataview_endian.js
+70
-0
nashorn/test/script/basic/dataview_getset.js
nashorn/test/script/basic/dataview_getset.js
+93
-0
nashorn/test/script/basic/dataview_new.js
nashorn/test/script/basic/dataview_new.js
+71
-0
nashorn/test/src/jdk/nashorn/api/scripting/ScopeTest.java
nashorn/test/src/jdk/nashorn/api/scripting/ScopeTest.java
+316
-0
nashorn/test/src/jdk/nashorn/api/scripting/resources/func.js
nashorn/test/src/jdk/nashorn/api/scripting/resources/func.js
+42
-0
nashorn/test/src/jdk/nashorn/api/scripting/resources/gettersetter.js
...t/src/jdk/nashorn/api/scripting/resources/gettersetter.js
+38
-0
nashorn/test/src/jdk/nashorn/api/scripting/resources/witheval.js
.../test/src/jdk/nashorn/api/scripting/resources/witheval.js
+60
-0
nashorn/test/src/jdk/nashorn/internal/codegen/CompilerTest.java
...n/test/src/jdk/nashorn/internal/codegen/CompilerTest.java
+3
-2
nashorn/test/src/jdk/nashorn/internal/performance/PerformanceWrapper.java
.../jdk/nashorn/internal/performance/PerformanceWrapper.java
+2
-2
nashorn/test/src/jdk/nashorn/internal/runtime/ContextTest.java
...rn/test/src/jdk/nashorn/internal/runtime/ContextTest.java
+3
-2
nashorn/test/src/jdk/nashorn/internal/runtime/NoPersistenceCachingTest.java
...dk/nashorn/internal/runtime/NoPersistenceCachingTest.java
+133
-0
nashorn/test/src/jdk/nashorn/internal/test/framework/SharedContextEvaluator.java
...shorn/internal/test/framework/SharedContextEvaluator.java
+3
-3
未找到文件。
nashorn/make/BuildNashorn.gmk
浏览文件 @
c2de1264
...
...
@@ -77,7 +77,7 @@ $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN)
$(RM) -rf $(@D)/jdk $(@D)/netscape
$(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/
$(FIXPATH) $(JAVA) \
-
cp
"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \
-
Xbootclasspath/p:
"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \
jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D)
$(TOUCH) $@
...
...
nashorn/make/build.xml
浏览文件 @
c2de1264
...
...
@@ -125,6 +125,7 @@
<compilerarg
value=
"-Xlint:unchecked"
/>
<compilerarg
value=
"-Xlint:deprecation"
/>
<compilerarg
value=
"-XDignore.symbol.file"
/>
<compilerarg
value=
"-Xdiags:verbose"
/>
</javac>
<copy
todir=
"${build.classes.dir}/META-INF/services"
>
<fileset
dir=
"${meta.inf.dir}/services/"
/>
...
...
@@ -243,6 +244,7 @@
<compilerarg
value=
"-J-Djava.ext.dirs="
/>
<compilerarg
value=
"-Xlint:unchecked"
/>
<compilerarg
value=
"-Xlint:deprecation"
/>
<compilerarg
value=
"-Xdiags:verbose"
/>
</javac>
<copy
todir=
"${build.test.classes.dir}/META-INF/services"
>
...
...
@@ -253,6 +255,10 @@
<fileset
dir=
"${test.src.dir}/jdk/nashorn/internal/runtime/resources"
/>
</copy>
<copy
todir=
"${build.test.classes.dir}/jdk/nashorn/api/scripting/resources"
>
<fileset
dir=
"${test.src.dir}/jdk/nashorn/api/scripting/resources"
/>
</copy>
<!-- tests that check nashorn internals and internal API -->
<jar
jarfile=
"${nashorn.internal.tests.jar}"
>
<fileset
dir=
"${build.test.classes.dir}"
excludes=
"**/api/**"
/>
...
...
nashorn/make/project.properties
浏览文件 @
c2de1264
...
...
@@ -206,7 +206,7 @@ test262-test-sys-prop.test.failed.list.file=${build.dir}/test/failedTests
# test262 test frameworks
test262-test-sys-prop.test.js.framework
=
\
--class-cache-size=0
\
--class-cache-size=
1
0
\
--no-java
\
--no-typed-arrays
\
-timezone=PST
\
...
...
nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java
浏览文件 @
c2de1264
...
...
@@ -57,9 +57,9 @@ import javax.script.ScriptEngine;
import
javax.script.ScriptEngineFactory
;
import
javax.script.ScriptException
;
import
javax.script.SimpleBindings
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.Context
;
import
jdk.nashorn.internal.runtime.ErrorManager
;
import
jdk.nashorn.internal.runtime.GlobalObject
;
import
jdk.nashorn.internal.runtime.Property
;
import
jdk.nashorn.internal.runtime.ScriptFunction
;
import
jdk.nashorn.internal.runtime.ScriptObject
;
...
...
@@ -99,7 +99,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
private
final
boolean
_global_per_engine
;
// This is the initial default Nashorn global object.
// This is used as "shared" global if above option is true.
private
final
ScriptObject
global
;
private
final
Global
global
;
// initialized bit late to be made 'final'.
// Property object for "context" property of global object.
private
volatile
Property
contextProperty
;
...
...
@@ -264,7 +264,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
public
Object
__noSuchProperty__
(
final
Object
self
,
final
ScriptContext
ctxt
,
final
String
name
)
{
if
(
ctxt
!=
null
)
{
final
int
scope
=
ctxt
.
getAttributesScope
(
name
);
final
ScriptObject
ctxtGlobal
=
getNashornGlobalFrom
(
ctxt
);
final
Global
ctxtGlobal
=
getNashornGlobalFrom
(
ctxt
);
if
(
scope
!=
-
1
)
{
return
ScriptObjectMirror
.
unwrap
(
ctxt
.
getAttribute
(
name
,
scope
),
ctxtGlobal
);
}
...
...
@@ -317,7 +317,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
}
ScriptObject
realSelf
=
null
;
ScriptObject
realGlobal
=
null
;
Global
realGlobal
=
null
;
if
(
thiz
==
null
)
{
// making interface out of global functions
realSelf
=
realGlobal
=
getNashornGlobalFrom
(
context
);
...
...
@@ -346,7 +346,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
}
try
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
realGlobal
);
try
{
if
(
globalChanged
)
{
...
...
@@ -371,7 +371,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
}
// Retrieve nashorn Global object for a given ScriptContext object
private
ScriptObject
getNashornGlobalFrom
(
final
ScriptContext
ctxt
)
{
private
Global
getNashornGlobalFrom
(
final
ScriptContext
ctxt
)
{
if
(
_global_per_engine
)
{
// shared single global object for all ENGINE_SCOPE Bindings
return
global
;
...
...
@@ -380,18 +380,18 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
final
Bindings
bindings
=
ctxt
.
getBindings
(
ScriptContext
.
ENGINE_SCOPE
);
// is this Nashorn's own Bindings implementation?
if
(
bindings
instanceof
ScriptObjectMirror
)
{
final
ScriptObject
sobj
=
globalFromMirror
((
ScriptObjectMirror
)
bindings
);
if
(
sobj
!=
null
)
{
return
sobj
;
final
Global
glob
=
globalFromMirror
((
ScriptObjectMirror
)
bindings
);
if
(
glob
!=
null
)
{
return
glob
;
}
}
// Arbitrary user Bindings implementation. Look for NASHORN_GLOBAL in it!
Object
scope
=
bindings
.
get
(
NASHORN_GLOBAL
);
if
(
scope
instanceof
ScriptObjectMirror
)
{
final
ScriptObject
sobj
=
globalFromMirror
((
ScriptObjectMirror
)
scope
);
if
(
sobj
!=
null
)
{
return
sobj
;
final
Global
glob
=
globalFromMirror
((
ScriptObjectMirror
)
scope
);
if
(
glob
!=
null
)
{
return
glob
;
}
}
...
...
@@ -399,14 +399,14 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
// Create new global instance mirror and associate with the Bindings.
final
ScriptObjectMirror
mirror
=
createGlobalMirror
(
ctxt
);
bindings
.
put
(
NASHORN_GLOBAL
,
mirror
);
return
mirror
.
get
ScriptObject
();
return
mirror
.
get
HomeGlobal
();
}
// Retrieve nashorn Global object from a given ScriptObjectMirror
private
ScriptObject
globalFromMirror
(
final
ScriptObjectMirror
mirror
)
{
private
Global
globalFromMirror
(
final
ScriptObjectMirror
mirror
)
{
ScriptObject
sobj
=
mirror
.
getScriptObject
();
if
(
sobj
instanceof
Global
Object
&&
isOfContext
(
sobj
,
nashornContext
))
{
return
sobj
;
if
(
sobj
instanceof
Global
&&
isOfContext
((
Global
)
sobj
,
nashornContext
))
{
return
(
Global
)
sobj
;
}
return
null
;
...
...
@@ -414,15 +414,15 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
// Create a new ScriptObjectMirror wrapping a newly created Nashorn Global object
private
ScriptObjectMirror
createGlobalMirror
(
final
ScriptContext
ctxt
)
{
final
ScriptObject
newGlobal
=
createNashornGlobal
(
ctxt
);
final
Global
newGlobal
=
createNashornGlobal
(
ctxt
);
return
new
ScriptObjectMirror
(
newGlobal
,
newGlobal
);
}
// Create a new Nashorn Global object
private
ScriptObject
createNashornGlobal
(
final
ScriptContext
ctxt
)
{
final
ScriptObject
newGlobal
=
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
ScriptObject
>()
{
private
Global
createNashornGlobal
(
final
ScriptContext
ctxt
)
{
final
Global
newGlobal
=
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
Global
>()
{
@Override
public
ScriptObject
run
()
{
public
Global
run
()
{
try
{
return
nashornContext
.
newGlobal
();
}
catch
(
final
RuntimeException
e
)
{
...
...
@@ -460,7 +460,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
}
// scripts should see "context" and "engine" as variables in the given global object
private
void
setContextVariables
(
final
ScriptObject
ctxtGlobal
,
final
ScriptContext
ctxt
)
{
private
void
setContextVariables
(
final
Global
ctxtGlobal
,
final
ScriptContext
ctxt
)
{
// set "context" global variable via contextProperty - because this
// property is non-writable
contextProperty
.
setObjectValue
(
ctxtGlobal
,
ctxtGlobal
,
ctxt
,
false
);
...
...
@@ -470,7 +470,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
}
// if no arguments passed, expose it
if
(!
(
args
instanceof
ScriptObject
))
{
args
=
((
GlobalObject
)
ctxtGlobal
)
.
wrapAsObject
(
args
);
args
=
ctxtGlobal
.
wrapAsObject
(
args
);
ctxtGlobal
.
set
(
"arguments"
,
args
,
false
);
}
}
...
...
@@ -478,7 +478,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
private
Object
invokeImpl
(
final
Object
selfObject
,
final
String
name
,
final
Object
...
args
)
throws
ScriptException
,
NoSuchMethodException
{
name
.
getClass
();
// null check
ScriptObject
invokeGlobal
=
null
;
Global
invokeGlobal
=
null
;
ScriptObjectMirror
selfMirror
=
null
;
if
(
selfObject
instanceof
ScriptObjectMirror
)
{
selfMirror
=
(
ScriptObjectMirror
)
selfObject
;
...
...
@@ -489,7 +489,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
}
else
if
(
selfObject
instanceof
ScriptObject
)
{
// invokeMethod called from script code - in which case we may get 'naked' ScriptObject
// Wrap it with oldGlobal to make a ScriptObjectMirror for the same.
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
invokeGlobal
=
oldGlobal
;
if
(
oldGlobal
==
null
)
{
throw
new
IllegalArgumentException
(
getMessage
(
"no.current.nashorn.global"
));
...
...
@@ -502,7 +502,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
selfMirror
=
(
ScriptObjectMirror
)
ScriptObjectMirror
.
wrap
(
selfObject
,
oldGlobal
);
}
else
if
(
selfObject
==
null
)
{
// selfObject is null => global function call
final
ScriptObject
ctxtGlobal
=
getNashornGlobalFrom
(
context
);
final
Global
ctxtGlobal
=
getNashornGlobalFrom
(
context
);
invokeGlobal
=
ctxtGlobal
;
selfMirror
=
(
ScriptObjectMirror
)
ScriptObjectMirror
.
wrap
(
ctxtGlobal
,
ctxtGlobal
);
}
...
...
@@ -532,11 +532,11 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
return
evalImpl
(
script
,
ctxt
,
getNashornGlobalFrom
(
ctxt
));
}
private
Object
evalImpl
(
final
ScriptFunction
script
,
final
ScriptContext
ctxt
,
final
ScriptObject
ctxtGlobal
)
throws
ScriptException
{
private
Object
evalImpl
(
final
ScriptFunction
script
,
final
ScriptContext
ctxt
,
final
Global
ctxtGlobal
)
throws
ScriptException
{
if
(
script
==
null
)
{
return
null
;
}
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
ctxtGlobal
);
try
{
if
(
globalChanged
)
{
...
...
@@ -558,7 +558,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
}
}
private
static
void
throwAsScriptException
(
final
Exception
e
,
final
ScriptObject
global
)
throws
ScriptException
{
private
static
void
throwAsScriptException
(
final
Exception
e
,
final
Global
global
)
throws
ScriptException
{
if
(
e
instanceof
ScriptException
)
{
throw
(
ScriptException
)
e
;
}
else
if
(
e
instanceof
NashornException
)
{
...
...
@@ -582,7 +582,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
return
new
CompiledScript
()
{
@Override
public
Object
eval
(
final
ScriptContext
ctxt
)
throws
ScriptException
{
final
ScriptObject
globalObject
=
getNashornGlobalFrom
(
ctxt
);
final
Global
globalObject
=
getNashornGlobalFrom
(
ctxt
);
// Are we running the script in the correct global?
if
(
func
.
getScope
()
==
globalObject
)
{
return
evalImpl
(
func
,
ctxt
,
globalObject
);
...
...
@@ -602,8 +602,8 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
return
compileImpl
(
source
,
getNashornGlobalFrom
(
ctxt
));
}
private
ScriptFunction
compileImpl
(
final
Source
source
,
final
ScriptObject
newGlobal
)
throws
ScriptException
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
private
ScriptFunction
compileImpl
(
final
Source
source
,
final
Global
newGlobal
)
throws
ScriptException
{
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
newGlobal
);
try
{
if
(
globalChanged
)
{
...
...
@@ -641,8 +641,7 @@ public final class NashornScriptEngine extends AbstractScriptEngine implements C
return
true
;
}
private
static
boolean
isOfContext
(
final
ScriptObject
global
,
final
Context
context
)
{
assert
global
instanceof
GlobalObject:
"Not a Global object"
;
return
((
GlobalObject
)
global
).
isOfContext
(
context
);
private
static
boolean
isOfContext
(
final
Global
global
,
final
Context
context
)
{
return
global
.
isOfContext
(
context
);
}
}
nashorn/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java
浏览文件 @
c2de1264
...
...
@@ -42,10 +42,10 @@ import java.util.Map;
import
java.util.Set
;
import
java.util.concurrent.Callable
;
import
javax.script.Bindings
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.arrays.ArrayData
;
import
jdk.nashorn.internal.runtime.ConsString
;
import
jdk.nashorn.internal.runtime.Context
;
import
jdk.nashorn.internal.runtime.GlobalObject
;
import
jdk.nashorn.internal.runtime.JSType
;
import
jdk.nashorn.internal.runtime.ScriptFunction
;
import
jdk.nashorn.internal.runtime.ScriptObject
;
...
...
@@ -64,7 +64,7 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
private
static
final
AccessControlContext
GET_CONTEXT_ACC_CTXT
=
getContextAccCtxt
();
private
final
ScriptObject
sobj
;
private
final
ScriptObject
global
;
private
final
Global
global
;
private
final
boolean
strict
;
@Override
...
...
@@ -95,7 +95,7 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
@Override
public
Object
call
(
final
Object
thiz
,
final
Object
...
args
)
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
try
{
...
...
@@ -125,7 +125,7 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
@Override
public
Object
newObject
(
final
Object
...
args
)
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
try
{
...
...
@@ -171,7 +171,7 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
public
Object
callMember
(
final
String
functionName
,
final
Object
...
args
)
{
functionName
.
getClass
();
// null check
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
try
{
...
...
@@ -642,7 +642,7 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
*/
public
static
Object
wrap
(
final
Object
obj
,
final
Object
homeGlobal
)
{
if
(
obj
instanceof
ScriptObject
)
{
return
homeGlobal
instanceof
ScriptObject
?
new
ScriptObjectMirror
((
ScriptObject
)
obj
,
(
ScriptObject
)
homeGlobal
)
:
obj
;
return
homeGlobal
instanceof
Global
?
new
ScriptObjectMirror
((
ScriptObject
)
obj
,
(
Global
)
homeGlobal
)
:
obj
;
}
if
(
obj
instanceof
ConsString
)
{
return
obj
.
toString
();
...
...
@@ -710,13 +710,13 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
// package-privates below this.
ScriptObjectMirror
(
final
ScriptObject
sobj
,
final
ScriptObject
global
)
{
ScriptObjectMirror
(
final
ScriptObject
sobj
,
final
Global
global
)
{
assert
sobj
!=
null
:
"ScriptObjectMirror on null!"
;
assert
global
instanceof
GlobalObject
:
"global is not a GlobalObject
"
;
assert
global
!=
null
:
"home Global is null
"
;
this
.
sobj
=
sobj
;
this
.
global
=
global
;
this
.
strict
=
((
GlobalObject
)
global
)
.
isStrictContext
();
this
.
strict
=
global
.
isStrictContext
();
}
// accessors for script engine
...
...
@@ -724,7 +724,7 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
return
sobj
;
}
ScriptObject
getHomeGlobal
()
{
Global
getHomeGlobal
()
{
return
global
;
}
...
...
@@ -734,7 +734,7 @@ public final class ScriptObjectMirror extends AbstractJSObject implements Bindin
// internals only below this.
private
<
V
>
V
inGlobal
(
final
Callable
<
V
>
callable
)
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
if
(
globalChanged
)
{
Context
.
setGlobal
(
global
);
...
...
nashorn/src/jdk/nashorn/internal/codegen/Attr.java
浏览文件 @
c2de1264
...
...
@@ -375,10 +375,11 @@ final class Attr extends NodeOperatorVisitor<LexicalContext> {
* @return Symbol for given name or null for redefinition.
*/
private
Symbol
defineSymbol
(
final
Block
block
,
final
String
name
,
final
int
symbolFlags
)
{
int
flags
=
symbolFlags
;
Symbol
symbol
=
findSymbol
(
block
,
name
);
// Locate symbol.
int
flags
=
symbolFlags
;
Symbol
symbol
=
findSymbol
(
block
,
name
);
// Locate symbol.
boolean
isGlobal
=
(
flags
&
KINDMASK
)
==
IS_GLOBAL
;
if
(
(
flags
&
KINDMASK
)
==
IS_GLOBAL
)
{
if
(
isGlobal
)
{
flags
|=
IS_SCOPE
;
}
...
...
@@ -414,6 +415,8 @@ final class Attr extends NodeOperatorVisitor<LexicalContext> {
// Determine where to create it.
if
((
flags
&
Symbol
.
KINDMASK
)
==
IS_VAR
&&
((
flags
&
IS_INTERNAL
)
==
IS_INTERNAL
||
(
flags
&
IS_LET
)
==
IS_LET
))
{
symbolBlock
=
block
;
//internal vars are always defined in the block closest to them
}
else
if
(
isGlobal
)
{
symbolBlock
=
lc
.
getOutermostFunction
().
getBody
();
}
else
{
symbolBlock
=
lc
.
getFunctionBody
(
function
);
}
...
...
nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java
浏览文件 @
c2de1264
...
...
@@ -685,7 +685,7 @@ final class CodeGenerator extends NodeOperatorVisitor<CodeGeneratorLexicalContex
private
void
scopeCall
(
final
IdentNode
node
,
final
int
flags
)
{
load
(
node
,
Type
.
OBJECT
);
// Type.OBJECT as foo() makes no sense if foo == 3
// ScriptFunction will see CALLSITE_SCOPE and will bind scope accordingly.
method
.
load
Null
();
//the 'this'
method
.
load
Undefined
(
Type
.
OBJECT
);
//the 'this' object
method
.
dynamicCall
(
callNodeType
,
2
+
loadArgs
(
args
),
flags
);
}
...
...
@@ -818,7 +818,7 @@ final class CodeGenerator extends NodeOperatorVisitor<CodeGeneratorLexicalContex
protected
boolean
enterDefault
(
final
Node
node
)
{
// Load up function.
load
(
function
,
Type
.
OBJECT
);
//TODO, e.g. booleans can be used as functions
method
.
load
Null
(
);
// ScriptFunction will figure out the correct this when it sees CALLSITE_SCOPE
method
.
load
Undefined
(
Type
.
OBJECT
);
// ScriptFunction will figure out the correct this when it sees CALLSITE_SCOPE
method
.
dynamicCall
(
callNodeType
,
2
+
loadArgs
(
args
),
getCallSiteFlags
()
|
CALLSITE_SCOPE
);
return
false
;
...
...
nashorn/src/jdk/nashorn/internal/codegen/SharedScopeCall.java
浏览文件 @
c2de1264
...
...
@@ -156,7 +156,7 @@ class SharedScopeCall {
if
(
isCall
)
{
method
.
convert
(
Type
.
OBJECT
);
// ScriptFunction will see CALLSITE_SCOPE and will bind scope accordingly.
method
.
load
Null
(
);
method
.
load
Undefined
(
Type
.
OBJECT
);
int
slot
=
2
;
for
(
final
Type
type
:
paramTypes
)
{
method
.
load
(
type
,
slot
++);
...
...
nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java
浏览文件 @
c2de1264
...
...
@@ -164,11 +164,11 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
public
static
final
int
HAS_EVAL
=
1
<<
5
;
/** Does a nested function contain eval? If it does, then all variables in this function might be get/set by it. */
public
static
final
int
HAS_NESTED_EVAL
=
1
<<
6
;
public
static
final
int
HAS_NESTED_EVAL
=
1
<<
6
;
/** Does this function have any blocks that create a scope? This is used to determine if the function needs to
* have a local variable slot for the scope symbol. */
public
static
final
int
HAS_SCOPE_BLOCK
=
1
<<
7
;
public
static
final
int
HAS_SCOPE_BLOCK
=
1
<<
7
;
/**
* Flag this function as one that defines the identifier "arguments" as a function parameter or nested function
...
...
@@ -197,6 +197,9 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
/** Can this function be specialized? */
public
static
final
int
CAN_SPECIALIZE
=
1
<<
14
;
/** Does this function use the "this" keyword? */
public
static
final
int
USES_THIS
=
1
<<
15
;
/** Does this function or any nested functions contain an eval? */
private
static
final
int
HAS_DEEP_EVAL
=
HAS_EVAL
|
HAS_NESTED_EVAL
;
...
...
@@ -590,6 +593,15 @@ public final class FunctionNode extends LexicalContextExpression implements Flag
return
needsParentScope
()
||
needsSelfSymbol
()
||
isSplit
()
||
(
needsArguments
()
&&
!
isStrict
());
}
/**
* Return {@code true} if this function makes use of the {@code this} object.
*
* @return true if function uses {@code this} object
*/
public
boolean
usesThis
()
{
return
getFlag
(
USES_THIS
);
}
/**
* Get the identifier for this function, this is its symbol.
* @return the identifier as an IdentityNode
...
...
nashorn/src/jdk/nashorn/internal/objects/AccessorPropertyDescriptor.java
浏览文件 @
c2de1264
...
...
@@ -67,12 +67,8 @@ public final class AccessorPropertyDescriptor extends ScriptObject implements Pr
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
AccessorPropertyDescriptor
(
final
boolean
configurable
,
final
boolean
enumerable
,
final
Object
get
,
final
Object
set
,
final
Global
global
)
{
super
(
global
.
getObjectPrototype
(),
getInitialMap
()
);
super
(
global
.
getObjectPrototype
(),
$nasgenmap
$
);
this
.
configurable
=
configurable
;
this
.
enumerable
=
enumerable
;
this
.
get
=
get
;
...
...
nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java
浏览文件 @
c2de1264
...
...
@@ -42,12 +42,8 @@ abstract class ArrayBufferView extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
private
ArrayBufferView
(
final
NativeArrayBuffer
buffer
,
final
int
byteOffset
,
final
int
elementLength
,
final
Global
global
)
{
super
(
getInitialMap
()
);
super
(
$nasgenmap
$
);
checkConstructorArgs
(
buffer
,
byteOffset
,
elementLength
);
this
.
setProto
(
getPrototype
(
global
));
this
.
setArray
(
factory
().
createArrayData
(
buffer
,
byteOffset
,
elementLength
));
...
...
nashorn/src/jdk/nashorn/internal/objects/DataPropertyDescriptor.java
浏览文件 @
c2de1264
...
...
@@ -64,12 +64,8 @@ public final class DataPropertyDescriptor extends ScriptObject implements Proper
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
DataPropertyDescriptor
(
final
boolean
configurable
,
final
boolean
enumerable
,
final
boolean
writable
,
final
Object
value
,
final
Global
global
)
{
super
(
global
.
getObjectPrototype
(),
getInitialMap
()
);
super
(
global
.
getObjectPrototype
(),
$nasgenmap
$
);
this
.
configurable
=
configurable
;
this
.
enumerable
=
enumerable
;
this
.
writable
=
writable
;
...
...
nashorn/src/jdk/nashorn/internal/objects/GenericPropertyDescriptor.java
浏览文件 @
c2de1264
...
...
@@ -55,12 +55,8 @@ public final class GenericPropertyDescriptor extends ScriptObject implements Pro
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
GenericPropertyDescriptor
(
final
boolean
configurable
,
final
boolean
enumerable
,
final
Global
global
)
{
super
(
global
.
getObjectPrototype
(),
getInitialMap
()
);
super
(
global
.
getObjectPrototype
(),
$nasgenmap
$
);
this
.
configurable
=
configurable
;
this
.
enumerable
=
enumerable
;
}
...
...
nashorn/src/jdk/nashorn/internal/objects/Global.java
浏览文件 @
c2de1264
...
...
@@ -33,11 +33,8 @@ import java.io.IOException;
import
java.io.PrintWriter
;
import
java.lang.invoke.MethodHandle
;
import
java.lang.invoke.MethodHandles
;
import
java.lang.ref.ReferenceQueue
;
import
java.lang.ref.SoftReference
;
import
java.lang.reflect.Field
;
import
java.util.Arrays
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.Callable
;
...
...
@@ -51,7 +48,6 @@ import jdk.nashorn.internal.objects.annotations.ScriptClass;
import
jdk.nashorn.internal.runtime.ConsString
;
import
jdk.nashorn.internal.runtime.Context
;
import
jdk.nashorn.internal.runtime.GlobalFunctions
;
import
jdk.nashorn.internal.runtime.GlobalObject
;
import
jdk.nashorn.internal.runtime.JSType
;
import
jdk.nashorn.internal.runtime.NativeJavaPackage
;
import
jdk.nashorn.internal.runtime.PropertyDescriptor
;
...
...
@@ -59,10 +55,10 @@ import jdk.nashorn.internal.runtime.PropertyMap;
import
jdk.nashorn.internal.runtime.Scope
;
import
jdk.nashorn.internal.runtime.ScriptEnvironment
;
import
jdk.nashorn.internal.runtime.ScriptFunction
;
import
jdk.nashorn.internal.runtime.ScriptFunctionData
;
import
jdk.nashorn.internal.runtime.ScriptObject
;
import
jdk.nashorn.internal.runtime.ScriptRuntime
;
import
jdk.nashorn.internal.runtime.ScriptingFunctions
;
import
jdk.nashorn.internal.runtime.Source
;
import
jdk.nashorn.internal.runtime.arrays.ArrayData
;
import
jdk.nashorn.internal.runtime.linker.Bootstrap
;
import
jdk.nashorn.internal.runtime.linker.InvokeByName
;
...
...
@@ -73,7 +69,7 @@ import jdk.nashorn.internal.scripts.JO;
* Representation of global scope.
*/
@ScriptClass
(
"Global"
)
public
final
class
Global
extends
ScriptObject
implements
GlobalObject
,
Scope
{
public
final
class
Global
extends
ScriptObject
implements
Scope
{
private
final
InvokeByName
TO_STRING
=
new
InvokeByName
(
"toString"
,
ScriptObject
.
class
);
private
final
InvokeByName
VALUE_OF
=
new
InvokeByName
(
"valueOf"
,
ScriptObject
.
class
);
...
...
@@ -229,6 +225,10 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
@Property
(
name
=
"ArrayBuffer"
,
attributes
=
Attribute
.
NOT_ENUMERABLE
)
public
volatile
Object
arrayBuffer
;
/** DataView object */
@Property
(
name
=
"DataView"
,
attributes
=
Attribute
.
NOT_ENUMERABLE
)
public
volatile
Object
dataView
;
/** TypedArray (int8) */
@Property
(
name
=
"Int8Array"
,
attributes
=
Attribute
.
NOT_ENUMERABLE
)
public
volatile
Object
int8Array
;
...
...
@@ -355,6 +355,7 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
private
ScriptObject
builtinJavaImporter
;
private
ScriptObject
builtinJavaApi
;
private
ScriptObject
builtinArrayBuffer
;
private
ScriptObject
builtinDataView
;
private
ScriptObject
builtinInt8Array
;
private
ScriptObject
builtinUint8Array
;
private
ScriptObject
builtinUint8ClampedArray
;
...
...
@@ -373,9 +374,6 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
// Flag to indicate that a split method issued a return statement
private
int
splitState
=
-
1
;
// class cache
private
ClassCache
classCache
;
// Used to store the last RegExp result to support deprecated RegExp constructor properties
private
RegExpResult
lastRegExpResult
;
...
...
@@ -426,11 +424,6 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
super
(
checkAndGetMap
(
context
));
this
.
context
=
context
;
this
.
setIsScope
();
final
int
cacheSize
=
context
.
getEnv
().
_class_cache_size
;
if
(
cacheSize
>
0
)
{
classCache
=
new
ClassCache
(
cacheSize
);
}
}
/**
...
...
@@ -439,11 +432,9 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
* @return the global singleton
*/
public
static
Global
instance
()
{
ScriptObject
global
=
Context
.
getGlobal
();
if
(!
(
global
instanceof
Global
))
{
throw
new
IllegalStateException
(
"no current global instance"
);
}
return
(
Global
)
global
;
Global
global
=
Context
.
getGlobal
();
global
.
getClass
();
// null check
return
global
;
}
/**
...
...
@@ -464,19 +455,30 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
return
instance
().
getContext
();
}
//
GlobalObject interface implementation
//
Runtime interface to Global
@Override
/**
* Is this global of the given Context?
* @param ctxt the context
* @return true if this global belongs to the given Context
*/
public
boolean
isOfContext
(
final
Context
ctxt
)
{
return
this
.
context
==
ctxt
;
}
@Override
/**
* Does this global belong to a strict Context?
* @return true if this global belongs to a strict Context
*/
public
boolean
isStrictContext
()
{
return
context
.
getEnv
().
_strict
;
}
@Override
/**
* Initialize standard builtin objects like "Object", "Array", "Function" etc.
* as well as our extension builtin objects like "Java", "JSAdapter" as properties
* of the global scope object.
*/
public
void
initBuiltinObjects
()
{
if
(
this
.
builtinObject
!=
null
)
{
// already initialized, just return
...
...
@@ -486,12 +488,26 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
init
();
}
@Override
/**
* Create a new ScriptFunction object
*
* @param name function name
* @param handle invocation handle for function
* @param scope the scope
* @param strict are we in strict mode
*
* @return new script function
*/
public
ScriptFunction
newScriptFunction
(
final
String
name
,
final
MethodHandle
handle
,
final
ScriptObject
scope
,
final
boolean
strict
)
{
return
new
ScriptFunctionImpl
(
name
,
handle
,
scope
,
null
,
strict
,
false
,
true
);
return
new
ScriptFunctionImpl
(
name
,
handle
,
scope
,
null
,
strict
?
ScriptFunctionData
.
IS_STRICT_CONSTRUCTOR
:
ScriptFunctionData
.
IS_CONSTRUCTOR
);
}
@Override
/**
* Wrap a Java object as corresponding script object
*
* @param obj object to wrap
* @return wrapped object
*/
public
Object
wrapAsObject
(
final
Object
obj
)
{
if
(
obj
instanceof
Boolean
)
{
return
new
NativeBoolean
((
Boolean
)
obj
,
this
);
...
...
@@ -513,7 +529,14 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
}
}
@Override
/**
* Lookup helper for JS primitive types
*
* @param request the link request for the dynamic call site.
* @param self self reference
*
* @return guarded invocation
*/
public
GuardedInvocation
primitiveLookup
(
final
LinkRequest
request
,
final
Object
self
)
{
if
(
self
instanceof
String
||
self
instanceof
ConsString
)
{
return
NativeString
.
lookupPrimitive
(
request
,
self
);
...
...
@@ -525,12 +548,23 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
throw
new
IllegalArgumentException
(
"Unsupported primitive: "
+
self
);
}
@Override
/**
* Create a new empty script object
*
* @return the new ScriptObject
*/
public
ScriptObject
newObject
()
{
return
new
JO
(
getObjectPrototype
(),
JO
.
getInitialMap
());
}
@Override
/**
* Default value of given type
*
* @param sobj script object
* @param typeHint type hint
*
* @return default value
*/
public
Object
getDefaultValue
(
final
ScriptObject
sobj
,
final
Class
<?>
typeHint
)
{
// When the [[DefaultValue]] internal method of O is called with no hint,
// then it behaves as if the hint were Number, unless O is a Date object
...
...
@@ -590,7 +624,12 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
return
UNDEFINED
;
}
@Override
/**
* Is the given ScriptObject an ECMAScript Error object?
*
* @param sobj the object being checked
* @return true if sobj is an Error object
*/
public
boolean
isError
(
final
ScriptObject
sobj
)
{
final
ScriptObject
errorProto
=
getErrorPrototype
();
ScriptObject
proto
=
sobj
.
getProto
();
...
...
@@ -603,52 +642,108 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
return
false
;
}
@Override
/**
* Create a new ECMAScript Error object.
*
* @param msg error message
* @return newly created Error object
*/
public
ScriptObject
newError
(
final
String
msg
)
{
return
new
NativeError
(
msg
,
this
);
}
@Override
/**
* Create a new ECMAScript EvalError object.
*
* @param msg error message
* @return newly created EvalError object
*/
public
ScriptObject
newEvalError
(
final
String
msg
)
{
return
new
NativeEvalError
(
msg
,
this
);
}
@Override
/**
* Create a new ECMAScript RangeError object.
*
* @param msg error message
* @return newly created RangeError object
*/
public
ScriptObject
newRangeError
(
final
String
msg
)
{
return
new
NativeRangeError
(
msg
,
this
);
}
@Override
/**
* Create a new ECMAScript ReferenceError object.
*
* @param msg error message
* @return newly created ReferenceError object
*/
public
ScriptObject
newReferenceError
(
final
String
msg
)
{
return
new
NativeReferenceError
(
msg
,
this
);
}
@Override
/**
* Create a new ECMAScript SyntaxError object.
*
* @param msg error message
* @return newly created SyntaxError object
*/
public
ScriptObject
newSyntaxError
(
final
String
msg
)
{
return
new
NativeSyntaxError
(
msg
,
this
);
}
@Override
/**
* Create a new ECMAScript TypeError object.
*
* @param msg error message
* @return newly created TypeError object
*/
public
ScriptObject
newTypeError
(
final
String
msg
)
{
return
new
NativeTypeError
(
msg
,
this
);
}
@Override
/**
* Create a new ECMAScript URIError object.
*
* @param msg error message
* @return newly created URIError object
*/
public
ScriptObject
newURIError
(
final
String
msg
)
{
return
new
NativeURIError
(
msg
,
this
);
}
@Override
/**
* Create a new ECMAScript GenericDescriptor object.
*
* @param configurable is the property configurable?
* @param enumerable is the property enumerable?
* @return newly created GenericDescriptor object
*/
public
PropertyDescriptor
newGenericDescriptor
(
final
boolean
configurable
,
final
boolean
enumerable
)
{
return
new
GenericPropertyDescriptor
(
configurable
,
enumerable
,
this
);
}
@Override
/**
* Create a new ECMAScript DatePropertyDescriptor object.
*
* @param value of the data property
* @param configurable is the property configurable?
* @param enumerable is the property enumerable?
* @return newly created DataPropertyDescriptor object
*/
public
PropertyDescriptor
newDataDescriptor
(
final
Object
value
,
final
boolean
configurable
,
final
boolean
enumerable
,
final
boolean
writable
)
{
return
new
DataPropertyDescriptor
(
configurable
,
enumerable
,
writable
,
value
,
this
);
}
@Override
/**
* Create a new ECMAScript AccessorPropertyDescriptor object.
*
* @param get getter function of the user accessor property
* @param set setter function of the user accessor property
* @param configurable is the property configurable?
* @param enumerable is the property enumerable?
* @return newly created AccessorPropertyDescriptor object
*/
public
PropertyDescriptor
newAccessorDescriptor
(
final
Object
get
,
final
Object
set
,
final
boolean
configurable
,
final
boolean
enumerable
)
{
final
AccessorPropertyDescriptor
desc
=
new
AccessorPropertyDescriptor
(
configurable
,
enumerable
,
get
==
null
?
UNDEFINED
:
get
,
set
==
null
?
UNDEFINED
:
set
,
this
);
...
...
@@ -664,62 +759,6 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
}
/**
* Cache for compiled script classes.
*/
@SuppressWarnings
(
"serial"
)
private
static
class
ClassCache
extends
LinkedHashMap
<
Source
,
ClassReference
>
{
private
final
int
size
;
private
final
ReferenceQueue
<
Class
<?>>
queue
;
ClassCache
(
int
size
)
{
super
(
size
,
0.75f
,
true
);
this
.
size
=
size
;
this
.
queue
=
new
ReferenceQueue
<>();
}
void
cache
(
final
Source
source
,
final
Class
<?>
clazz
)
{
put
(
source
,
new
ClassReference
(
clazz
,
queue
,
source
));
}
@Override
protected
boolean
removeEldestEntry
(
final
Map
.
Entry
<
Source
,
ClassReference
>
eldest
)
{
return
size
()
>
size
;
}
@Override
public
ClassReference
get
(
Object
key
)
{
for
(
ClassReference
ref
;
(
ref
=
(
ClassReference
)
queue
.
poll
())
!=
null
;
)
{
remove
(
ref
.
source
);
}
return
super
.
get
(
key
);
}
}
private
static
class
ClassReference
extends
SoftReference
<
Class
<?>>
{
private
final
Source
source
;
ClassReference
(
final
Class
<?>
clazz
,
final
ReferenceQueue
<
Class
<?>>
queue
,
final
Source
source
)
{
super
(
clazz
,
queue
);
this
.
source
=
source
;
}
}
// Class cache management
@Override
public
Class
<?>
findCachedClass
(
final
Source
source
)
{
assert
classCache
!=
null
:
"Class cache used without being initialized"
;
ClassReference
ref
=
classCache
.
get
(
source
);
return
ref
!=
null
?
ref
.
get
()
:
null
;
}
@Override
public
void
cacheClass
(
final
Source
source
,
final
Class
<?>
clazz
)
{
assert
classCache
!=
null
:
"Class cache used without being initialized"
;
classCache
.
cache
(
source
,
clazz
);
}
private
static
<
T
>
T
getLazilyCreatedValue
(
final
Object
key
,
final
Callable
<
T
>
creator
,
final
Map
<
Object
,
T
>
map
)
{
final
T
obj
=
map
.
get
(
key
);
if
(
obj
!=
null
)
{
...
...
@@ -737,14 +776,25 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
private
final
Map
<
Object
,
InvokeByName
>
namedInvokers
=
new
ConcurrentHashMap
<>();
@Override
/**
* Get cached InvokeByName object for the given key
* @param key key to be associated with InvokeByName object
* @param creator if InvokeByName is absent 'creator' is called to make one (lazy init)
* @return InvokeByName object associated with the key.
*/
public
InvokeByName
getInvokeByName
(
final
Object
key
,
final
Callable
<
InvokeByName
>
creator
)
{
return
getLazilyCreatedValue
(
key
,
creator
,
namedInvokers
);
}
private
final
Map
<
Object
,
MethodHandle
>
dynamicInvokers
=
new
ConcurrentHashMap
<>();
@Override
/**
* Get cached dynamic method handle for the given key
* @param key key to be associated with dynamic method handle
* @param creator if method handle is absent 'creator' is called to make one (lazy init)
* @return dynamic method handle associated with the key.
*/
public
MethodHandle
getDynamicInvoker
(
final
Object
key
,
final
Callable
<
MethodHandle
>
creator
)
{
return
getLazilyCreatedValue
(
key
,
creator
,
dynamicInvokers
);
}
...
...
@@ -933,6 +983,10 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
return
ScriptFunction
.
getPrototype
(
builtinArrayBuffer
);
}
ScriptObject
getDataViewPrototype
()
{
return
ScriptFunction
.
getPrototype
(
builtinDataView
);
}
ScriptObject
getInt8ArrayPrototype
()
{
return
ScriptFunction
.
getPrototype
(
builtinInt8Array
);
}
...
...
@@ -1701,6 +1755,7 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
private
void
initTypedArray
()
{
this
.
builtinArrayBuffer
=
initConstructor
(
"ArrayBuffer"
);
this
.
builtinDataView
=
initConstructor
(
"DataView"
);
this
.
builtinInt8Array
=
initConstructor
(
"Int8Array"
);
this
.
builtinUint8Array
=
initConstructor
(
"Uint8Array"
);
this
.
builtinUint8ClampedArray
=
initConstructor
(
"Uint8ClampedArray"
);
...
...
@@ -1741,6 +1796,7 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
this
.
typeError
=
this
.
builtinTypeError
;
this
.
uriError
=
this
.
builtinURIError
;
this
.
arrayBuffer
=
this
.
builtinArrayBuffer
;
this
.
dataView
=
this
.
builtinDataView
;
this
.
int8Array
=
this
.
builtinInt8Array
;
this
.
uint8Array
=
this
.
builtinUint8Array
;
this
.
uint8ClampedArray
=
this
.
builtinUint8ClampedArray
;
...
...
@@ -1838,7 +1894,7 @@ public final class Global extends ScriptObject implements GlobalObject, Scope {
anon
.
deleteOwnProperty
(
anon
.
getMap
().
findProperty
(
"prototype"
));
// use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3
this
.
typeErrorThrower
=
new
ScriptFunctionImpl
(
"TypeErrorThrower"
,
Lookup
.
TYPE_ERROR_THROWER_GETTER
,
null
,
null
,
false
,
false
,
false
);
this
.
typeErrorThrower
=
new
ScriptFunctionImpl
(
"TypeErrorThrower"
,
Lookup
.
TYPE_ERROR_THROWER_GETTER
,
null
,
null
,
0
);
typeErrorThrower
.
setPrototype
(
UNDEFINED
);
// Non-constructor built-in functions do not have "prototype" property
typeErrorThrower
.
deleteOwnProperty
(
typeErrorThrower
.
getMap
().
findProperty
(
"prototype"
));
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeArray.java
浏览文件 @
c2de1264
...
...
@@ -156,10 +156,6 @@ public final class NativeArray extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
/*
* Constructors.
*/
...
...
@@ -208,7 +204,7 @@ public final class NativeArray extends ScriptObject {
}
NativeArray
(
final
ArrayData
arrayData
,
final
Global
global
)
{
super
(
global
.
getArrayPrototype
(),
getInitialMap
()
);
super
(
global
.
getArrayPrototype
(),
$nasgenmap
$
);
this
.
setArray
(
arrayData
);
this
.
setIsArray
();
}
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeArrayBuffer.java
浏览文件 @
c2de1264
...
...
@@ -25,6 +25,7 @@
package
jdk.nashorn.internal.objects
;
import
java.nio.ByteBuffer
;
import
java.util.Arrays
;
import
jdk.nashorn.internal.objects.annotations.Attribute
;
import
jdk.nashorn.internal.objects.annotations.Constructor
;
...
...
@@ -43,10 +44,6 @@ final class NativeArrayBuffer extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@Constructor
(
arity
=
1
)
public
static
Object
constructor
(
final
boolean
newObj
,
final
Object
self
,
final
Object
...
args
)
{
if
(
args
.
length
==
0
)
{
...
...
@@ -57,7 +54,7 @@ final class NativeArrayBuffer extends ScriptObject {
}
protected
NativeArrayBuffer
(
final
byte
[]
byteArray
,
final
Global
global
)
{
super
(
global
.
getArrayBufferPrototype
(),
getInitialMap
()
);
super
(
global
.
getArrayBufferPrototype
(),
$nasgenmap
$
);
this
.
buffer
=
byteArray
;
}
...
...
@@ -128,4 +125,16 @@ final class NativeArrayBuffer extends ScriptObject {
public
int
getByteLength
()
{
return
buffer
.
length
;
}
ByteBuffer
getBuffer
()
{
return
ByteBuffer
.
wrap
(
buffer
);
}
ByteBuffer
getBuffer
(
final
int
offset
)
{
return
ByteBuffer
.
wrap
(
buffer
,
offset
,
buffer
.
length
-
offset
);
}
ByteBuffer
getBuffer
(
final
int
offset
,
final
int
length
)
{
return
ByteBuffer
.
wrap
(
buffer
,
offset
,
length
);
}
}
nashorn/src/jdk/nashorn/internal/objects/NativeBoolean.java
浏览文件 @
c2de1264
...
...
@@ -30,6 +30,7 @@ import static jdk.nashorn.internal.lookup.Lookup.MH;
import
java.lang.invoke.MethodHandle
;
import
java.lang.invoke.MethodHandles
;
import
java.lang.invoke.MethodType
;
import
jdk.internal.dynalink.linker.GuardedInvocation
;
import
jdk.internal.dynalink.linker.LinkRequest
;
import
jdk.nashorn.internal.objects.annotations.Attribute
;
...
...
@@ -50,22 +51,21 @@ import jdk.nashorn.internal.runtime.linker.PrimitiveLookup;
public
final
class
NativeBoolean
extends
ScriptObject
{
private
final
boolean
value
;
final
static
MethodHandle
WRAPFILTER
=
findWrapFilter
();
// Method handle to create an object wrapper for a primitive boolean
private
static
final
MethodHandle
WRAPFILTER
=
findOwnMH
(
"wrapFilter"
,
MH
.
type
(
NativeBoolean
.
class
,
Object
.
class
));
// Method handle to retrieve the Boolean prototype object
private
static
final
MethodHandle
PROTOFILTER
=
findOwnMH
(
"protoFilter"
,
MH
.
type
(
Object
.
class
,
Object
.
class
));
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
private
NativeBoolean
(
final
boolean
value
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
this
.
value
=
value
;
}
NativeBoolean
(
final
boolean
flag
,
final
Global
global
)
{
this
(
flag
,
global
.
getBooleanPrototype
(),
getInitialMap
()
);
this
(
flag
,
global
.
getBooleanPrototype
(),
$nasgenmap
$
);
}
NativeBoolean
(
final
boolean
flag
)
{
...
...
@@ -164,7 +164,7 @@ public final class NativeBoolean extends ScriptObject {
* @return Link to be invoked at call site.
*/
public
static
GuardedInvocation
lookupPrimitive
(
final
LinkRequest
request
,
final
Object
receiver
)
{
return
PrimitiveLookup
.
lookupPrimitive
(
request
,
Boolean
.
class
,
new
NativeBoolean
((
Boolean
)
receiver
),
WRAPFILTER
);
return
PrimitiveLookup
.
lookupPrimitive
(
request
,
Boolean
.
class
,
new
NativeBoolean
((
Boolean
)
receiver
),
WRAPFILTER
,
PROTOFILTER
);
}
/**
...
...
@@ -178,7 +178,12 @@ public final class NativeBoolean extends ScriptObject {
return
new
NativeBoolean
((
Boolean
)
receiver
);
}
private
static
MethodHandle
findWrapFilter
()
{
return
MH
.
findStatic
(
MethodHandles
.
lookup
(),
NativeBoolean
.
class
,
"wrapFilter"
,
MH
.
type
(
NativeBoolean
.
class
,
Object
.
class
));
@SuppressWarnings
(
"unused"
)
private
static
Object
protoFilter
(
final
Object
object
)
{
return
Global
.
instance
().
getBooleanPrototype
();
}
private
static
MethodHandle
findOwnMH
(
final
String
name
,
final
MethodType
type
)
{
return
MH
.
findStatic
(
MethodHandles
.
lookup
(),
NativeBoolean
.
class
,
name
,
type
);
}
}
nashorn/src/jdk/nashorn/internal/objects/NativeDataView.java
0 → 100644
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/src/jdk/nashorn/internal/objects/NativeDate.java
浏览文件 @
c2de1264
...
...
@@ -114,10 +114,6 @@ public final class NativeDate extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
private
NativeDate
(
final
double
time
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
final
ScriptEnvironment
env
=
Global
.
getEnv
();
...
...
@@ -127,7 +123,7 @@ public final class NativeDate extends ScriptObject {
}
NativeDate
(
final
double
time
,
final
Global
global
)
{
this
(
time
,
global
.
getDatePrototype
(),
getInitialMap
()
);
this
(
time
,
global
.
getDatePrototype
(),
$nasgenmap
$
);
}
private
NativeDate
(
final
double
time
)
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeError.java
浏览文件 @
c2de1264
...
...
@@ -92,10 +92,6 @@ public final class NativeError extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@SuppressWarnings
(
"LeakingThisInConstructor"
)
private
NativeError
(
final
Object
msg
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
...
...
@@ -108,7 +104,7 @@ public final class NativeError extends ScriptObject {
}
NativeError
(
final
Object
msg
,
final
Global
global
)
{
this
(
msg
,
global
.
getErrorPrototype
(),
getInitialMap
()
);
this
(
msg
,
global
.
getErrorPrototype
(),
$nasgenmap
$
);
}
private
NativeError
(
final
Object
msg
)
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeEvalError.java
浏览文件 @
c2de1264
...
...
@@ -62,10 +62,6 @@ public final class NativeEvalError extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@SuppressWarnings
(
"LeakingThisInConstructor"
)
private
NativeEvalError
(
final
Object
msg
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
...
...
@@ -78,7 +74,7 @@ public final class NativeEvalError extends ScriptObject {
}
NativeEvalError
(
final
Object
msg
,
final
Global
global
)
{
this
(
msg
,
global
.
getEvalErrorPrototype
(),
getInitialMap
()
);
this
(
msg
,
global
.
getEvalErrorPrototype
(),
$nasgenmap
$
);
}
private
NativeEvalError
(
final
Object
msg
)
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeJSAdapter.java
浏览文件 @
c2de1264
...
...
@@ -146,10 +146,6 @@ public final class NativeJSAdapter extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
NativeJSAdapter
(
final
Object
overrides
,
final
ScriptObject
adaptee
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
this
.
adaptee
=
wrapAdaptee
(
adaptee
);
...
...
@@ -577,7 +573,7 @@ public final class NativeJSAdapter extends ScriptObject {
proto
=
global
.
getJSAdapterPrototype
();
}
return
new
NativeJSAdapter
(
overrides
,
(
ScriptObject
)
adaptee
,
(
ScriptObject
)
proto
,
getInitialMap
()
);
return
new
NativeJSAdapter
(
overrides
,
(
ScriptObject
)
adaptee
,
(
ScriptObject
)
proto
,
$nasgenmap
$
);
}
@Override
...
...
@@ -622,7 +618,7 @@ public final class NativeJSAdapter extends ScriptObject {
case
"getMethod"
:
final
FindProperty
find
=
adaptee
.
findProperty
(
__call__
,
true
);
if
(
find
!=
null
)
{
final
Object
value
=
getObjectValue
(
find
);
final
Object
value
=
find
.
getObjectValue
(
);
if
(
value
instanceof
ScriptFunction
)
{
final
ScriptFunctionImpl
func
=
(
ScriptFunctionImpl
)
value
;
// TODO: It's a shame we need to produce a function bound to this and name, when we'd only need it bound
...
...
@@ -691,7 +687,7 @@ public final class NativeJSAdapter extends ScriptObject {
final
MethodType
type
=
desc
.
getMethodType
();
if
(
findData
!=
null
)
{
final
String
name
=
desc
.
getNameTokenCount
()
>
2
?
desc
.
getNameToken
(
2
)
:
null
;
final
Object
value
=
getObjectValue
(
findData
);
final
Object
value
=
findData
.
getObjectValue
(
);
if
(
value
instanceof
ScriptFunction
)
{
final
ScriptFunction
func
=
(
ScriptFunction
)
value
;
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java
浏览文件 @
c2de1264
...
...
@@ -60,17 +60,13 @@ public final class NativeJavaImporter extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
private
NativeJavaImporter
(
final
Object
[]
args
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
this
.
args
=
args
;
}
private
NativeJavaImporter
(
final
Object
[]
args
,
final
Global
global
)
{
this
(
args
,
global
.
getJavaImporterPrototype
(),
getInitialMap
()
);
this
(
args
,
global
.
getJavaImporterPrototype
(),
$nasgenmap
$
);
}
private
NativeJavaImporter
(
final
Object
[]
args
)
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeNumber.java
浏览文件 @
c2de1264
...
...
@@ -34,6 +34,7 @@ import static jdk.nashorn.internal.lookup.Lookup.MH;
import
java.lang.invoke.MethodHandle
;
import
java.lang.invoke.MethodHandles
;
import
java.lang.invoke.MethodType
;
import
java.text.NumberFormat
;
import
java.util.Locale
;
import
jdk.internal.dynalink.linker.GuardedInvocation
;
...
...
@@ -57,7 +58,10 @@ import jdk.nashorn.internal.runtime.linker.PrimitiveLookup;
@ScriptClass
(
"Number"
)
public
final
class
NativeNumber
extends
ScriptObject
{
static
final
MethodHandle
WRAPFILTER
=
findWrapFilter
();
// Method handle to create an object wrapper for a primitive number
private
static
final
MethodHandle
WRAPFILTER
=
findOwnMH
(
"wrapFilter"
,
MH
.
type
(
NativeNumber
.
class
,
Object
.
class
));
// Method handle to retrieve the Number prototype object
private
static
final
MethodHandle
PROTOFILTER
=
findOwnMH
(
"protoFilter"
,
MH
.
type
(
Object
.
class
,
Object
.
class
));
/** ECMA 15.7.3.2 largest positive finite value */
@Property
(
attributes
=
Attribute
.
NON_ENUMERABLE_CONSTANT
,
where
=
Where
.
CONSTRUCTOR
)
...
...
@@ -86,10 +90,6 @@ public final class NativeNumber extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
private
NativeNumber
(
final
double
value
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
this
.
value
=
value
;
...
...
@@ -98,7 +98,7 @@ public final class NativeNumber extends ScriptObject {
}
NativeNumber
(
final
double
value
,
final
Global
global
)
{
this
(
value
,
global
.
getNumberPrototype
(),
getInitialMap
()
);
this
(
value
,
global
.
getNumberPrototype
(),
$nasgenmap
$
);
}
private
NativeNumber
(
final
double
value
)
{
...
...
@@ -322,7 +322,7 @@ public final class NativeNumber extends ScriptObject {
* @return Link to be invoked at call site.
*/
public
static
GuardedInvocation
lookupPrimitive
(
final
LinkRequest
request
,
final
Object
receiver
)
{
return
PrimitiveLookup
.
lookupPrimitive
(
request
,
Number
.
class
,
new
NativeNumber
(((
Number
)
receiver
).
doubleValue
()),
WRAPFILTER
);
return
PrimitiveLookup
.
lookupPrimitive
(
request
,
Number
.
class
,
new
NativeNumber
(((
Number
)
receiver
).
doubleValue
()),
WRAPFILTER
,
PROTOFILTER
);
}
@SuppressWarnings
(
"unused"
)
...
...
@@ -330,6 +330,11 @@ public final class NativeNumber extends ScriptObject {
return
new
NativeNumber
(((
Number
)
receiver
).
doubleValue
());
}
@SuppressWarnings
(
"unused"
)
private
static
Object
protoFilter
(
final
Object
object
)
{
return
Global
.
instance
().
getNumberPrototype
();
}
private
static
double
getNumberValue
(
final
Object
self
)
{
if
(
self
instanceof
Number
)
{
return
((
Number
)
self
).
doubleValue
();
...
...
@@ -378,7 +383,7 @@ public final class NativeNumber extends ScriptObject {
return
str
;
}
private
static
MethodHandle
find
WrapFilter
(
)
{
return
MH
.
findStatic
(
MethodHandles
.
lookup
(),
NativeNumber
.
class
,
"wrapFilter"
,
MH
.
type
(
NativeNumber
.
class
,
Object
.
class
)
);
private
static
MethodHandle
find
OwnMH
(
final
String
name
,
final
MethodType
type
)
{
return
MH
.
findStatic
(
MethodHandles
.
lookup
(),
NativeNumber
.
class
,
name
,
type
);
}
}
nashorn/src/jdk/nashorn/internal/objects/NativeRangeError.java
浏览文件 @
c2de1264
...
...
@@ -62,10 +62,6 @@ public final class NativeRangeError extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@SuppressWarnings
(
"LeakingThisInConstructor"
)
private
NativeRangeError
(
final
Object
msg
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
...
...
@@ -78,7 +74,7 @@ public final class NativeRangeError extends ScriptObject {
}
NativeRangeError
(
final
Object
msg
,
final
Global
global
)
{
this
(
msg
,
global
.
getRangeErrorPrototype
(),
getInitialMap
()
);
this
(
msg
,
global
.
getRangeErrorPrototype
(),
$nasgenmap
$
);
}
private
NativeRangeError
(
final
Object
msg
)
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeReferenceError.java
浏览文件 @
c2de1264
...
...
@@ -62,10 +62,6 @@ public final class NativeReferenceError extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@SuppressWarnings
(
"LeakingThisInConstructor"
)
private
NativeReferenceError
(
final
Object
msg
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
super
(
proto
,
map
);
...
...
@@ -78,7 +74,7 @@ public final class NativeReferenceError extends ScriptObject {
}
NativeReferenceError
(
final
Object
msg
,
final
Global
global
)
{
this
(
msg
,
global
.
getReferenceErrorPrototype
(),
getInitialMap
()
);
this
(
msg
,
global
.
getReferenceErrorPrototype
(),
$nasgenmap
$
);
}
private
NativeReferenceError
(
final
Object
msg
)
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java
浏览文件 @
c2de1264
...
...
@@ -70,12 +70,8 @@ public final class NativeRegExp extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
private
NativeRegExp
(
final
Global
global
)
{
super
(
global
.
getRegExpPrototype
(),
getInitialMap
()
);
super
(
global
.
getRegExpPrototype
(),
$nasgenmap
$
);
this
.
globalObject
=
global
;
}
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeRegExpExecResult.java
浏览文件 @
c2de1264
...
...
@@ -53,12 +53,8 @@ public final class NativeRegExpExecResult extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
NativeRegExpExecResult
(
final
RegExpResult
result
,
final
Global
global
)
{
super
(
global
.
getArrayPrototype
(),
getInitialMap
()
);
super
(
global
.
getArrayPrototype
(),
$nasgenmap
$
);
setIsArray
();
this
.
setArray
(
ArrayData
.
allocate
(
result
.
getGroups
().
clone
()));
this
.
index
=
result
.
getIndex
();
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeString.java
浏览文件 @
c2de1264
...
...
@@ -32,6 +32,7 @@ import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
import
java.lang.invoke.MethodHandle
;
import
java.lang.invoke.MethodHandles
;
import
java.lang.invoke.MethodType
;
import
java.text.Collator
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
...
...
@@ -69,21 +70,20 @@ public final class NativeString extends ScriptObject {
private
final
CharSequence
value
;
static
final
MethodHandle
WRAPFILTER
=
findWrapFilter
();
// Method handle to create an object wrapper for a primitive string
private
static
final
MethodHandle
WRAPFILTER
=
findOwnMH
(
"wrapFilter"
,
MH
.
type
(
NativeString
.
class
,
Object
.
class
));
// Method handle to retrieve the String prototype object
private
static
final
MethodHandle
PROTOFILTER
=
findOwnMH
(
"protoFilter"
,
MH
.
type
(
Object
.
class
,
Object
.
class
));
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
private
NativeString
(
final
CharSequence
value
)
{
this
(
value
,
Global
.
instance
());
}
NativeString
(
final
CharSequence
value
,
final
Global
global
)
{
this
(
value
,
global
.
getStringPrototype
(),
getInitialMap
()
);
this
(
value
,
global
.
getStringPrototype
(),
$nasgenmap
$
);
}
private
NativeString
(
final
CharSequence
value
,
final
ScriptObject
proto
,
final
PropertyMap
map
)
{
...
...
@@ -1199,7 +1199,7 @@ public final class NativeString extends ScriptObject {
*/
public
static
GuardedInvocation
lookupPrimitive
(
final
LinkRequest
request
,
final
Object
receiver
)
{
final
MethodHandle
guard
=
NashornGuards
.
getInstanceOf2Guard
(
String
.
class
,
ConsString
.
class
);
return
PrimitiveLookup
.
lookupPrimitive
(
request
,
guard
,
new
NativeString
((
CharSequence
)
receiver
),
WRAPFILTER
);
return
PrimitiveLookup
.
lookupPrimitive
(
request
,
guard
,
new
NativeString
((
CharSequence
)
receiver
),
WRAPFILTER
,
PROTOFILTER
);
}
@SuppressWarnings
(
"unused"
)
...
...
@@ -1207,6 +1207,11 @@ public final class NativeString extends ScriptObject {
return
new
NativeString
((
CharSequence
)
receiver
);
}
@SuppressWarnings
(
"unused"
)
private
static
Object
protoFilter
(
final
Object
object
)
{
return
Global
.
instance
().
getStringPrototype
();
}
private
static
CharSequence
getCharSequence
(
final
Object
self
)
{
if
(
self
instanceof
String
||
self
instanceof
ConsString
)
{
return
(
CharSequence
)
self
;
...
...
@@ -1254,7 +1259,7 @@ public final class NativeString extends ScriptObject {
return
key
>=
0
&&
key
<
value
.
length
();
}
private
static
MethodHandle
find
WrapFilter
(
)
{
return
MH
.
findStatic
(
MethodHandles
.
lookup
(),
NativeString
.
class
,
"wrapFilter"
,
MH
.
type
(
NativeString
.
class
,
Object
.
class
)
);
private
static
MethodHandle
find
OwnMH
(
final
String
name
,
final
MethodType
type
)
{
return
MH
.
findStatic
(
MethodHandles
.
lookup
(),
NativeString
.
class
,
name
,
type
);
}
}
nashorn/src/jdk/nashorn/internal/objects/NativeSyntaxError.java
浏览文件 @
c2de1264
...
...
@@ -62,13 +62,9 @@ public final class NativeSyntaxError extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@SuppressWarnings
(
"LeakingThisInConstructor"
)
NativeSyntaxError
(
final
Object
msg
,
final
Global
global
)
{
super
(
global
.
getSyntaxErrorPrototype
(),
getInitialMap
()
);
super
(
global
.
getSyntaxErrorPrototype
(),
$nasgenmap
$
);
if
(
msg
!=
UNDEFINED
)
{
this
.
instMessage
=
JSType
.
toString
(
msg
);
}
else
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeTypeError.java
浏览文件 @
c2de1264
...
...
@@ -62,13 +62,9 @@ public final class NativeTypeError extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@SuppressWarnings
(
"LeakingThisInConstructor"
)
NativeTypeError
(
final
Object
msg
,
final
Global
global
)
{
super
(
global
.
getTypeErrorPrototype
(),
getInitialMap
()
);
super
(
global
.
getTypeErrorPrototype
(),
$nasgenmap
$
);
if
(
msg
!=
UNDEFINED
)
{
this
.
instMessage
=
JSType
.
toString
(
msg
);
}
else
{
...
...
nashorn/src/jdk/nashorn/internal/objects/NativeURIError.java
浏览文件 @
c2de1264
...
...
@@ -61,13 +61,9 @@ public final class NativeURIError extends ScriptObject {
// initialized by nasgen
private
static
PropertyMap
$nasgenmap
$
;
static
PropertyMap
getInitialMap
()
{
return
$nasgenmap
$
;
}
@SuppressWarnings
(
"LeakingThisInConstructor"
)
NativeURIError
(
final
Object
msg
,
final
Global
global
)
{
super
(
global
.
getURIErrorPrototype
(),
getInitialMap
()
);
super
(
global
.
getURIErrorPrototype
(),
$nasgenmap
$
);
if
(
msg
!=
UNDEFINED
)
{
this
.
instMessage
=
JSType
.
toString
(
msg
);
}
else
{
...
...
nashorn/src/jdk/nashorn/internal/objects/PrototypeObject.java
浏览文件 @
c2de1264
...
...
@@ -57,10 +57,6 @@ public class PrototypeObject extends ScriptObject {
map
$
=
PropertyMap
.
newMap
(
properties
);
}
static
PropertyMap
getInitialMap
()
{
return
map
$
;
}
private
PrototypeObject
(
final
Global
global
,
final
PropertyMap
map
)
{
super
(
global
.
getObjectPrototype
(),
map
!=
map
$
?
map
.
addAll
(
map
$
)
:
map
$
);
}
...
...
nashorn/src/jdk/nashorn/internal/objects/ScriptFunctionImpl.java
浏览文件 @
c2de1264
...
...
@@ -55,27 +55,11 @@ public class ScriptFunctionImpl extends ScriptFunction {
// property map for non-strict, non-bound functions.
private
static
final
PropertyMap
map
$
;
static
PropertyMap
getInitialMap
()
{
return
map
$
;
}
static
PropertyMap
getInitialAnonymousMap
()
{
return
AnonymousFunction
.
getInitialMap
();
}
static
PropertyMap
getInitialStrictMap
()
{
return
strictmodemap
$
;
}
static
PropertyMap
getInitialBoundMap
()
{
return
boundfunctionmap
$
;
}
// Marker object for lazily initialized prototype object
private
static
final
Object
LAZY_PROTOTYPE
=
new
Object
();
private
ScriptFunctionImpl
(
final
String
name
,
final
MethodHandle
invokeHandle
,
final
MethodHandle
[]
specs
,
final
Global
global
)
{
super
(
name
,
invokeHandle
,
getInitialMap
(),
null
,
specs
,
false
,
true
,
true
);
super
(
name
,
invokeHandle
,
map
$
,
null
,
specs
,
ScriptFunctionData
.
IS_BUILTIN_CONSTRUCTOR
);
init
(
global
);
}
...
...
@@ -92,7 +76,7 @@ public class ScriptFunctionImpl extends ScriptFunction {
}
private
ScriptFunctionImpl
(
final
String
name
,
final
MethodHandle
invokeHandle
,
final
PropertyMap
map
,
final
MethodHandle
[]
specs
,
final
Global
global
)
{
super
(
name
,
invokeHandle
,
map
.
addAll
(
getInitialMap
()),
null
,
specs
,
false
,
true
,
true
);
super
(
name
,
invokeHandle
,
map
.
addAll
(
map
$
),
null
,
specs
,
ScriptFunctionData
.
IS_BUILTIN_CONSTRUCTOR
);
init
(
global
);
}
...
...
@@ -109,8 +93,8 @@ public class ScriptFunctionImpl extends ScriptFunction {
this
(
name
,
invokeHandle
,
map
,
specs
,
Global
.
instance
());
}
private
ScriptFunctionImpl
(
final
String
name
,
final
MethodHandle
methodHandle
,
final
ScriptObject
scope
,
final
MethodHandle
[]
specs
,
final
boolean
isStrict
,
final
boolean
isBuiltin
,
final
boolean
isConstructor
,
final
Global
global
)
{
super
(
name
,
methodHandle
,
getMap
(
global
,
isStrict
),
scope
,
specs
,
isStrict
,
isBuiltin
,
isConstructor
);
private
ScriptFunctionImpl
(
final
String
name
,
final
MethodHandle
methodHandle
,
final
ScriptObject
scope
,
final
MethodHandle
[]
specs
,
final
int
flags
,
final
Global
global
)
{
super
(
name
,
methodHandle
,
getMap
(
isStrict
(
flags
)),
scope
,
specs
,
flags
);
init
(
global
);
}
...
...
@@ -121,16 +105,14 @@ public class ScriptFunctionImpl extends ScriptFunction {
* @param methodHandle handle for invocation
* @param scope scope object
* @param specs specialized versions of this method, if available, null otherwise
* @param isStrict are we in strict mode
* @param isBuiltin is this a built-in function
* @param isConstructor can the function be used as a constructor (most can; some built-ins are restricted).
* @param flags {@link ScriptFunctionData} flags
*/
ScriptFunctionImpl
(
final
String
name
,
final
MethodHandle
methodHandle
,
final
ScriptObject
scope
,
final
MethodHandle
[]
specs
,
final
boolean
isStrict
,
final
boolean
isBuiltin
,
final
boolean
isConstructor
)
{
this
(
name
,
methodHandle
,
scope
,
specs
,
isStrict
,
isBuiltin
,
isConstructor
,
Global
.
instance
());
ScriptFunctionImpl
(
final
String
name
,
final
MethodHandle
methodHandle
,
final
ScriptObject
scope
,
final
MethodHandle
[]
specs
,
final
int
flags
)
{
this
(
name
,
methodHandle
,
scope
,
specs
,
flags
,
Global
.
instance
());
}
private
ScriptFunctionImpl
(
final
RecompilableScriptFunctionData
data
,
final
ScriptObject
scope
,
final
Global
global
)
{
super
(
data
,
getMap
(
global
,
data
.
isStrict
()),
scope
);
super
(
data
,
getMap
(
data
.
isStrict
()),
scope
);
init
(
global
);
}
...
...
@@ -150,7 +132,7 @@ public class ScriptFunctionImpl extends ScriptFunction {
* @param global the global object
*/
ScriptFunctionImpl
(
final
ScriptFunctionData
data
,
final
Global
global
)
{
super
(
data
,
getInitialBoundMap
()
,
null
);
super
(
data
,
boundfunctionmap
$
,
null
);
init
(
global
);
}
...
...
@@ -173,9 +155,13 @@ public class ScriptFunctionImpl extends ScriptFunction {
return
newMap
;
}
private
static
boolean
isStrict
(
final
int
flags
)
{
return
(
flags
&
ScriptFunctionData
.
IS_STRICT
)
!=
0
;
}
// Choose the map based on strict mode!
private
static
PropertyMap
getMap
(
final
Global
global
,
final
boolean
strict
)
{
return
strict
?
getInitialStrictMap
()
:
getInitialMap
()
;
private
static
PropertyMap
getMap
(
final
boolean
strict
)
{
return
strict
?
strictmodemap
$
:
map
$
;
}
private
static
PropertyMap
createBoundFunctionMap
(
final
PropertyMap
strictModeMap
)
{
...
...
@@ -189,12 +175,8 @@ public class ScriptFunctionImpl extends ScriptFunction {
private
static
class
AnonymousFunction
extends
ScriptFunctionImpl
{
private
static
final
PropertyMap
anonmap
$
=
PropertyMap
.
newMap
();
static
PropertyMap
getInitialMap
()
{
return
anonmap
$
;
}
AnonymousFunction
(
final
Global
global
)
{
super
(
""
,
GlobalFunctions
.
ANONYMOUS
,
getInitialAnonymousMap
()
,
null
);
super
(
""
,
GlobalFunctions
.
ANONYMOUS
,
anonmap
$
,
null
);
}
}
...
...
@@ -211,7 +193,7 @@ public class ScriptFunctionImpl extends ScriptFunction {
* @return new ScriptFunction
*/
static
ScriptFunction
makeFunction
(
final
String
name
,
final
MethodHandle
methodHandle
,
final
MethodHandle
[]
specs
)
{
final
ScriptFunctionImpl
func
=
new
ScriptFunctionImpl
(
name
,
methodHandle
,
null
,
specs
,
false
,
true
,
false
);
final
ScriptFunctionImpl
func
=
new
ScriptFunctionImpl
(
name
,
methodHandle
,
null
,
specs
,
ScriptFunctionData
.
IS_BUILTIN
);
func
.
setPrototype
(
UNDEFINED
);
// Non-constructor built-in functions do not have "prototype" property
func
.
deleteOwnProperty
(
func
.
getMap
().
findProperty
(
"prototype"
));
...
...
nashorn/src/jdk/nashorn/internal/parser/Parser.java
浏览文件 @
c2de1264
...
...
@@ -1799,6 +1799,7 @@ loop:
case
THIS:
final
String
name
=
type
.
getName
();
next
();
lc
.
setFlag
(
lc
.
getCurrentFunction
(),
FunctionNode
.
USES_THIS
);
return
new
IdentNode
(
primaryToken
,
finish
,
name
);
case
IDENT:
final
IdentNode
ident
=
getIdent
();
...
...
nashorn/src/jdk/nashorn/internal/runtime/AccessorProperty.java
浏览文件 @
c2de1264
...
...
@@ -141,10 +141,12 @@ public final class AccessorProperty extends Property {
private
Class
<?>
currentType
;
/**
* Delegate constructor. This is used when adding properties to the Global scope, which
* is necessary for outermost levels in a script (the ScriptObject is represented by
* a JO-prefixed ScriptObject class, but the properties need to be in the Global scope
* and are thus rebound with that as receiver
* Delegate constructor for bound properties. This is used for properties created by
* {@link ScriptRuntime#mergeScope} and the Nashorn {@code Object.bindProperties} method.
* The former is used to add a script's defined globals to the current global scope while
* still storing them in a JO-prefixed ScriptObject class.
*
* <p>All properties created by this constructor have the {@link #IS_BOUND} flag set.</p>
*
* @param property accessor property to rebind
* @param delegate delegate object to rebind receiver to
...
...
@@ -157,6 +159,8 @@ public final class AccessorProperty extends Property {
this
.
objectGetter
=
bindTo
(
property
.
ensureObjectGetter
(),
delegate
);
this
.
objectSetter
=
bindTo
(
property
.
ensureObjectSetter
(),
delegate
);
// Properties created this way are bound to a delegate
this
.
flags
|=
IS_BOUND
;
setCurrentType
(
property
.
getCurrentType
());
}
...
...
nashorn/src/jdk/nashorn/internal/runtime/Context.java
浏览文件 @
c2de1264
...
...
@@ -36,6 +36,8 @@ import java.io.IOException;
import
java.io.PrintWriter
;
import
java.lang.invoke.MethodHandle
;
import
java.lang.invoke.MethodHandles
;
import
java.lang.ref.ReferenceQueue
;
import
java.lang.ref.SoftReference
;
import
java.lang.reflect.Modifier
;
import
java.net.MalformedURLException
;
import
java.net.URL
;
...
...
@@ -46,6 +48,7 @@ import java.security.CodeSource;
import
java.security.Permissions
;
import
java.security.PrivilegedAction
;
import
java.security.ProtectionDomain
;
import
java.util.LinkedHashMap
;
import
java.util.Map
;
import
java.util.concurrent.atomic.AtomicLong
;
import
jdk.internal.org.objectweb.asm.ClassReader
;
...
...
@@ -153,16 +156,19 @@ public final class Context {
/** Is Context global debug mode enabled ? */
public
static
final
boolean
DEBUG
=
Options
.
getBooleanProperty
(
"nashorn.debug"
);
private
static
final
ThreadLocal
<
ScriptObject
>
currentGlobal
=
new
ThreadLocal
<>();
private
static
final
ThreadLocal
<
Global
>
currentGlobal
=
new
ThreadLocal
<>();
// class cache
private
ClassCache
classCache
;
/**
* Get the current global scope
* @return the current global scope
*/
public
static
ScriptObject
getGlobal
()
{
public
static
Global
getGlobal
()
{
// This class in a package.access protected package.
// Trusted code only can call this method.
return
getGlobalTrusted
();
return
currentGlobal
.
get
();
}
/**
...
...
@@ -171,10 +177,19 @@ public final class Context {
*/
public
static
void
setGlobal
(
final
ScriptObject
global
)
{
if
(
global
!=
null
&&
!(
global
instanceof
Global
))
{
throw
new
IllegalArgumentException
(
"
global is not an instance of G
lobal!"
);
throw
new
IllegalArgumentException
(
"
not a g
lobal!"
);
}
setGlobal
((
Global
)
global
);
}
setGlobalTrusted
(
global
);
/**
* Set the current global scope
* @param global the global scope
*/
public
static
void
setGlobal
(
final
Global
global
)
{
// This class in a package.access protected package.
// Trusted code only can call this method.
currentGlobal
.
set
(
global
);
}
/**
...
...
@@ -195,7 +210,7 @@ public final class Context {
* @return error writer of the current context
*/
public
static
PrintWriter
getCurrentErr
()
{
final
ScriptObject
global
=
getGlobal
Trusted
();
final
ScriptObject
global
=
getGlobal
();
return
(
global
!=
null
)?
global
.
getContext
().
getErr
()
:
new
PrintWriter
(
System
.
err
);
}
...
...
@@ -348,6 +363,11 @@ public final class Context {
this
.
classPathLoader
=
null
;
}
final
int
cacheSize
=
env
.
_class_cache_size
;
if
(
cacheSize
>
0
)
{
classCache
=
new
ClassCache
(
cacheSize
);
}
// print version info if asked.
if
(
env
.
_version
)
{
getErr
().
println
(
"nashorn "
+
Version
.
version
());
...
...
@@ -395,7 +415,7 @@ public final class Context {
* @return the property map of the current global scope
*/
public
static
PropertyMap
getGlobalMap
()
{
return
Context
.
getGlobal
Trusted
().
getMap
();
return
Context
.
getGlobal
().
getMap
();
}
/**
...
...
@@ -425,7 +445,7 @@ public final class Context {
final
String
file
=
(
location
==
UNDEFINED
||
location
==
null
)
?
"<eval>"
:
location
.
toString
();
final
Source
source
=
new
Source
(
file
,
string
);
final
boolean
directEval
=
location
!=
UNDEFINED
;
// is this direct 'eval' call or indirectly invoked eval?
final
ScriptObject
global
=
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
ScriptObject
scope
=
initialScope
;
...
...
@@ -457,7 +477,7 @@ public final class Context {
// in the caller's environment. A new environment is created!
if
(
strictFlag
)
{
// Create a new scope object
final
ScriptObject
strictEvalScope
=
((
GlobalObject
)
global
)
.
newObject
();
final
ScriptObject
strictEvalScope
=
global
.
newObject
();
// bless it as a "scope"
strictEvalScope
.
setIsScope
();
...
...
@@ -582,10 +602,10 @@ public final class Context {
* @throws IOException if source cannot be found or loaded
*/
public
Object
loadWithNewGlobal
(
final
Object
from
,
final
Object
...
args
)
throws
IOException
{
final
ScriptObject
oldGlobal
=
getGlobalTrusted
();
final
ScriptObject
newGlobal
=
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
ScriptObject
>()
{
final
Global
oldGlobal
=
getGlobal
();
final
Global
newGlobal
=
AccessController
.
doPrivileged
(
new
PrivilegedAction
<
Global
>()
{
@Override
public
ScriptObject
run
()
{
public
Global
run
()
{
try
{
return
newGlobal
();
}
catch
(
final
RuntimeException
e
)
{
...
...
@@ -598,17 +618,17 @@ public final class Context {
},
CREATE_GLOBAL_ACC_CTXT
);
// initialize newly created Global instance
initGlobal
(
newGlobal
);
setGlobal
Trusted
(
newGlobal
);
setGlobal
(
newGlobal
);
final
Object
[]
wrapped
=
args
==
null
?
ScriptRuntime
.
EMPTY_ARRAY
:
ScriptObjectMirror
.
wrapArray
(
args
,
oldGlobal
);
newGlobal
.
put
(
"arguments"
,
((
GlobalObject
)
newGlobal
)
.
wrapAsObject
(
wrapped
),
env
.
_strict
);
newGlobal
.
put
(
"arguments"
,
newGlobal
.
wrapAsObject
(
wrapped
),
env
.
_strict
);
try
{
// wrap objects from newGlobal's world as mirrors - but if result
// is from oldGlobal's world, unwrap it!
return
ScriptObjectMirror
.
unwrap
(
ScriptObjectMirror
.
wrap
(
load
(
newGlobal
,
from
),
newGlobal
),
oldGlobal
);
}
finally
{
setGlobal
Trusted
(
oldGlobal
);
setGlobal
(
oldGlobal
);
}
}
...
...
@@ -637,7 +657,7 @@ public final class Context {
* Checks that the given Class can be accessed from no permissions context.
*
* @param clazz Class object
* @throw SecurityException if not accessible
* @throw
s
SecurityException if not accessible
*/
public
static
void
checkPackageAccess
(
final
Class
<?>
clazz
)
{
final
SecurityManager
sm
=
System
.
getSecurityManager
();
...
...
@@ -654,12 +674,12 @@ public final class Context {
* Checks that the given package name can be accessed from no permissions context.
*
* @param pkgName package name
* @throw SecurityException if not accessible
* @throw
s
SecurityException if not accessible
*/
public
static
void
checkPackageAccess
(
final
String
pkgName
)
{
final
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
checkPackageAccess
(
sm
,
pkgName
.
endsWith
(
"."
)?
pkgName
:
pkgName
+
"."
);
checkPackageAccess
(
sm
,
pkgName
.
endsWith
(
"."
)
?
pkgName
:
pkgName
+
"."
);
}
}
...
...
@@ -783,7 +803,7 @@ public final class Context {
*
* @return the initialized global scope object.
*/
public
ScriptObject
createGlobal
()
{
public
Global
createGlobal
()
{
return
initGlobal
(
newGlobal
());
}
...
...
@@ -791,7 +811,7 @@ public final class Context {
* Create a new uninitialized global scope object
* @return the global script object
*/
public
ScriptObject
newGlobal
()
{
public
Global
newGlobal
()
{
return
new
Global
(
this
);
}
...
...
@@ -801,20 +821,16 @@ public final class Context {
* @param global the global
* @return the initialized global scope object.
*/
public
ScriptObject
initGlobal
(
final
ScriptObject
global
)
{
if
(!
(
global
instanceof
GlobalObject
))
{
throw
new
IllegalArgumentException
(
"not a global object!"
);
}
public
Global
initGlobal
(
final
Global
global
)
{
// Need only minimal global object, if we are just compiling.
if
(!
env
.
_compile_only
)
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobalTrusted
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
try
{
Context
.
setGlobal
Trusted
(
global
);
Context
.
setGlobal
(
global
);
// initialize global scope with builtin global objects
((
GlobalObject
)
global
)
.
initBuiltinObjects
();
global
.
initBuiltinObjects
();
}
finally
{
Context
.
setGlobal
Trusted
(
oldGlobal
);
Context
.
setGlobal
(
oldGlobal
);
}
}
...
...
@@ -822,30 +838,15 @@ public final class Context {
}
/**
* Trusted variants - package-private
*/
/**
* Return the current global scope
* @return current global scope
*/
static
ScriptObject
getGlobalTrusted
()
{
return
currentGlobal
.
get
();
}
/**
* Set the current global scope
* Trusted variant - package-private
*/
static
void
setGlobalTrusted
(
ScriptObject
global
)
{
currentGlobal
.
set
(
global
);
}
/**
* Return the current global's context
* @return current global's context
*/
static
Context
getContextTrusted
()
{
return
Context
.
getGlobalTrusted
(
).
getContext
();
return
((
ScriptObject
)
Context
.
getGlobal
()
).
getContext
();
}
/**
...
...
@@ -914,7 +915,7 @@ public final class Context {
}
// Package as a JavaScript function and pass function back to shell.
return
((
GlobalObject
)
Context
.
getGlobalTrusted
()
).
newScriptFunction
(
RUN_SCRIPT
.
symbolName
(),
runMethodHandle
,
scope
,
strict
);
return
Context
.
getGlobal
(
).
newScriptFunction
(
RUN_SCRIPT
.
symbolName
(),
runMethodHandle
,
scope
,
strict
);
}
private
ScriptFunction
compileScript
(
final
Source
source
,
final
ScriptObject
scope
,
final
ErrorManager
errMan
)
{
...
...
@@ -925,16 +926,10 @@ public final class Context {
// start with no errors, no warnings.
errMan
.
reset
();
GlobalObject
global
=
null
;
Class
<?>
script
;
if
(
env
.
_class_cache_size
>
0
)
{
global
=
(
GlobalObject
)
Context
.
getGlobalTrusted
();
script
=
global
.
findCachedClass
(
source
);
if
(
script
!=
null
)
{
Compiler
.
LOG
.
fine
(
"Code cache hit for "
,
source
,
" avoiding recompile."
);
return
script
;
}
Class
<?>
script
=
findCachedClass
(
source
);
if
(
script
!=
null
)
{
Compiler
.
LOG
.
fine
(
"Code cache hit for "
,
source
,
" avoiding recompile."
);
return
script
;
}
final
FunctionNode
functionNode
=
new
Parser
(
env
,
source
,
errMan
,
strict
).
parse
();
...
...
@@ -963,10 +958,7 @@ public final class Context {
final
FunctionNode
newFunctionNode
=
compiler
.
compile
(
functionNode
);
script
=
compiler
.
install
(
newFunctionNode
);
if
(
global
!=
null
)
{
global
.
cacheClass
(
source
,
script
);
}
cacheClass
(
source
,
script
);
return
script
;
}
...
...
@@ -988,4 +980,60 @@ public final class Context {
private
long
getUniqueScriptId
()
{
return
uniqueScriptId
.
getAndIncrement
();
}
/**
* Cache for compiled script classes.
*/
@SuppressWarnings
(
"serial"
)
private
static
class
ClassCache
extends
LinkedHashMap
<
Source
,
ClassReference
>
{
private
final
int
size
;
private
final
ReferenceQueue
<
Class
<?>>
queue
;
ClassCache
(
int
size
)
{
super
(
size
,
0.75f
,
true
);
this
.
size
=
size
;
this
.
queue
=
new
ReferenceQueue
<>();
}
void
cache
(
final
Source
source
,
final
Class
<?>
clazz
)
{
put
(
source
,
new
ClassReference
(
clazz
,
queue
,
source
));
}
@Override
protected
boolean
removeEldestEntry
(
final
Map
.
Entry
<
Source
,
ClassReference
>
eldest
)
{
return
size
()
>
size
;
}
@Override
public
ClassReference
get
(
Object
key
)
{
for
(
ClassReference
ref
;
(
ref
=
(
ClassReference
)
queue
.
poll
())
!=
null
;
)
{
remove
(
ref
.
source
);
}
return
super
.
get
(
key
);
}
}
private
static
class
ClassReference
extends
SoftReference
<
Class
<?>>
{
private
final
Source
source
;
ClassReference
(
final
Class
<?>
clazz
,
final
ReferenceQueue
<
Class
<?>>
queue
,
final
Source
source
)
{
super
(
clazz
,
queue
);
this
.
source
=
source
;
}
}
// Class cache management
private
Class
<?>
findCachedClass
(
final
Source
source
)
{
ClassReference
ref
=
classCache
==
null
?
null
:
classCache
.
get
(
source
);
return
ref
!=
null
?
ref
.
get
()
:
null
;
}
private
void
cacheClass
(
final
Source
source
,
final
Class
<?>
clazz
)
{
if
(
classCache
!=
null
)
{
classCache
.
cache
(
source
,
clazz
);
}
}
}
nashorn/src/jdk/nashorn/internal/runtime/DebuggerSupport.java
浏览文件 @
c2de1264
...
...
@@ -75,7 +75,7 @@ final class DebuggerSupport {
* @return context global.
*/
static
Object
getGlobal
()
{
return
Context
.
getGlobal
Trusted
();
return
Context
.
getGlobal
();
}
/**
...
...
@@ -87,7 +87,7 @@ final class DebuggerSupport {
* @return Result of eval as string, or, an exception or null depending on returnException.
*/
static
Object
eval
(
final
ScriptObject
scope
,
final
Object
self
,
final
String
string
,
final
boolean
returnException
)
{
final
ScriptObject
global
=
Context
.
getGlobal
Trusted
();
final
ScriptObject
global
=
Context
.
getGlobal
();
final
ScriptObject
initialScope
=
scope
!=
null
?
scope
:
global
;
final
Object
callThis
=
self
!=
null
?
self
:
global
;
final
Context
context
=
global
.
getContext
();
...
...
nashorn/src/jdk/nashorn/internal/runtime/ECMAErrors.java
浏览文件 @
c2de1264
...
...
@@ -31,6 +31,7 @@ import java.util.ResourceBundle;
import
jdk.nashorn.api.scripting.NashornException
;
import
jdk.nashorn.internal.scripts.JS
;
import
jdk.nashorn.internal.codegen.CompilerConstants
;
import
jdk.nashorn.internal.objects.Global
;
/**
* Helper class to throw various standard "ECMA error" exceptions such as Error, ReferenceError, TypeError etc.
...
...
@@ -66,7 +67,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
asEcmaException
(
final
ParserException
e
)
{
return
asEcmaException
(
Context
.
getGlobal
Trusted
(),
e
);
return
asEcmaException
(
Context
.
getGlobal
(),
e
);
}
/**
...
...
@@ -78,11 +79,11 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
asEcmaException
(
final
ScriptObject
global
,
final
ParserException
e
)
{
public
static
ECMAException
asEcmaException
(
final
Global
global
,
final
ParserException
e
)
{
final
JSErrorType
errorType
=
e
.
getErrorType
();
assert
errorType
!=
null
:
"error type for "
+
e
+
" was null"
;
final
Global
Object
globalObj
=
(
GlobalObject
)
global
;
final
Global
globalObj
=
global
;
final
String
msg
=
e
.
getMessage
();
// translate to ECMAScript Error object using error type
...
...
@@ -116,7 +117,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
syntaxError
(
final
String
msgId
,
final
String
...
args
)
{
return
syntaxError
(
Context
.
getGlobal
Trusted
(),
msgId
,
args
);
return
syntaxError
(
Context
.
getGlobal
(),
msgId
,
args
);
}
/**
...
...
@@ -128,7 +129,7 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
syntaxError
(
final
ScriptObject
global
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
syntaxError
(
final
Global
global
,
final
String
msgId
,
final
String
...
args
)
{
return
syntaxError
(
global
,
null
,
msgId
,
args
);
}
...
...
@@ -142,7 +143,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
syntaxError
(
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
return
syntaxError
(
Context
.
getGlobal
Trusted
(),
cause
,
msgId
,
args
);
return
syntaxError
(
Context
.
getGlobal
(),
cause
,
msgId
,
args
);
}
/**
...
...
@@ -155,9 +156,9 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
syntaxError
(
final
ScriptObject
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
syntaxError
(
final
Global
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
final
String
msg
=
getMessage
(
"syntax.error."
+
msgId
,
args
);
return
error
(
((
GlobalObject
)
global
)
.
newSyntaxError
(
msg
),
cause
);
return
error
(
global
.
newSyntaxError
(
msg
),
cause
);
}
/**
...
...
@@ -169,7 +170,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
typeError
(
final
String
msgId
,
final
String
...
args
)
{
return
typeError
(
Context
.
getGlobal
Trusted
(),
msgId
,
args
);
return
typeError
(
Context
.
getGlobal
(),
msgId
,
args
);
}
/**
...
...
@@ -181,7 +182,7 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
typeError
(
final
ScriptObject
global
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
typeError
(
final
Global
global
,
final
String
msgId
,
final
String
...
args
)
{
return
typeError
(
global
,
null
,
msgId
,
args
);
}
...
...
@@ -195,7 +196,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
typeError
(
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
return
typeError
(
Context
.
getGlobal
Trusted
(),
cause
,
msgId
,
args
);
return
typeError
(
Context
.
getGlobal
(),
cause
,
msgId
,
args
);
}
/**
...
...
@@ -208,9 +209,9 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
typeError
(
final
ScriptObject
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
typeError
(
final
Global
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
final
String
msg
=
getMessage
(
"type.error."
+
msgId
,
args
);
return
error
(
((
GlobalObject
)
global
)
.
newTypeError
(
msg
),
cause
);
return
error
(
global
.
newTypeError
(
msg
),
cause
);
}
/**
...
...
@@ -222,7 +223,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
rangeError
(
final
String
msgId
,
final
String
...
args
)
{
return
rangeError
(
Context
.
getGlobal
Trusted
(),
msgId
,
args
);
return
rangeError
(
Context
.
getGlobal
(),
msgId
,
args
);
}
/**
...
...
@@ -234,7 +235,7 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
rangeError
(
final
ScriptObject
global
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
rangeError
(
final
Global
global
,
final
String
msgId
,
final
String
...
args
)
{
return
rangeError
(
global
,
null
,
msgId
,
args
);
}
...
...
@@ -248,7 +249,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
rangeError
(
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
return
rangeError
(
Context
.
getGlobal
Trusted
(),
cause
,
msgId
,
args
);
return
rangeError
(
Context
.
getGlobal
(),
cause
,
msgId
,
args
);
}
/**
...
...
@@ -261,9 +262,9 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
rangeError
(
final
ScriptObject
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
rangeError
(
final
Global
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
final
String
msg
=
getMessage
(
"range.error."
+
msgId
,
args
);
return
error
(
((
GlobalObject
)
global
)
.
newRangeError
(
msg
),
cause
);
return
error
(
global
.
newRangeError
(
msg
),
cause
);
}
/**
...
...
@@ -275,7 +276,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
referenceError
(
final
String
msgId
,
final
String
...
args
)
{
return
referenceError
(
Context
.
getGlobal
Trusted
(),
msgId
,
args
);
return
referenceError
(
Context
.
getGlobal
(),
msgId
,
args
);
}
/**
...
...
@@ -287,7 +288,7 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
referenceError
(
final
ScriptObject
global
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
referenceError
(
final
Global
global
,
final
String
msgId
,
final
String
...
args
)
{
return
referenceError
(
global
,
null
,
msgId
,
args
);
}
...
...
@@ -301,7 +302,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
referenceError
(
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
return
referenceError
(
Context
.
getGlobal
Trusted
(),
cause
,
msgId
,
args
);
return
referenceError
(
Context
.
getGlobal
(),
cause
,
msgId
,
args
);
}
/**
...
...
@@ -314,9 +315,9 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
referenceError
(
final
ScriptObject
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
referenceError
(
final
Global
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
final
String
msg
=
getMessage
(
"reference.error."
+
msgId
,
args
);
return
error
(
((
GlobalObject
)
global
)
.
newReferenceError
(
msg
),
cause
);
return
error
(
global
.
newReferenceError
(
msg
),
cause
);
}
/**
...
...
@@ -328,7 +329,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
uriError
(
final
String
msgId
,
final
String
...
args
)
{
return
uriError
(
Context
.
getGlobal
Trusted
(),
msgId
,
args
);
return
uriError
(
Context
.
getGlobal
(),
msgId
,
args
);
}
/**
...
...
@@ -340,7 +341,7 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
uriError
(
final
ScriptObject
global
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
uriError
(
final
Global
global
,
final
String
msgId
,
final
String
...
args
)
{
return
uriError
(
global
,
null
,
msgId
,
args
);
}
...
...
@@ -354,7 +355,7 @@ public final class ECMAErrors {
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
uriError
(
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
return
uriError
(
Context
.
getGlobal
Trusted
(),
cause
,
msgId
,
args
);
return
uriError
(
Context
.
getGlobal
(),
cause
,
msgId
,
args
);
}
/**
...
...
@@ -367,9 +368,9 @@ public final class ECMAErrors {
*
* @return the resulting {@link ECMAException}
*/
public
static
ECMAException
uriError
(
final
ScriptObject
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
public
static
ECMAException
uriError
(
final
Global
global
,
final
Throwable
cause
,
final
String
msgId
,
final
String
...
args
)
{
final
String
msg
=
getMessage
(
"uri.error."
+
msgId
,
args
);
return
error
(
((
GlobalObject
)
global
)
.
newURIError
(
msg
),
cause
);
return
error
(
global
.
newURIError
(
msg
),
cause
);
}
/**
...
...
nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java
浏览文件 @
c2de1264
...
...
@@ -38,31 +38,27 @@ final class FinalScriptFunctionData extends ScriptFunctionData {
/**
* Constructor - used for bind
*
* @param name name
* @param arity arity
* @param functions precompiled code
* @param isStrict strict
* @param isBuiltin builtin
* @param isConstructor constructor
* @param name name
* @param arity arity
* @param functions precompiled code
* @param flags {@link ScriptFunctionData} flags
*/
FinalScriptFunctionData
(
final
String
name
,
int
arity
,
CompiledFunctions
functions
,
final
boolean
isStrict
,
final
boolean
isBuiltin
,
final
boolean
isConstructor
)
{
super
(
name
,
arity
,
isStrict
,
isBuiltin
,
isConstructor
);
FinalScriptFunctionData
(
final
String
name
,
final
int
arity
,
final
CompiledFunctions
functions
,
final
int
flags
)
{
super
(
name
,
arity
,
flags
);
code
.
addAll
(
functions
);
}
/**
* Constructor - used from ScriptFunction. This assumes that we have code alr
ae
dy for the
* Constructor - used from ScriptFunction. This assumes that we have code alr
ea
dy for the
* method (typically a native method) and possibly specializations.
*
* @param name name
* @param mh method handle for generic version of method
* @param specs specializations
* @param isStrict strict
* @param isBuiltin builtin
* @param isConstructor constructor
* @param name name
* @param mh method handle for generic version of method
* @param specs specializations
* @param flags {@link ScriptFunctionData} flags
*/
FinalScriptFunctionData
(
final
String
name
,
final
MethodHandle
mh
,
final
MethodHandle
[]
specs
,
final
boolean
isStrict
,
final
boolean
isBuiltin
,
final
boolean
isConstructor
)
{
super
(
name
,
arity
(
mh
),
isStrict
,
isBuiltin
,
isConstructor
);
FinalScriptFunctionData
(
final
String
name
,
final
MethodHandle
mh
,
final
MethodHandle
[]
specs
,
final
int
flags
)
{
super
(
name
,
arity
(
mh
),
flags
);
addInvoker
(
mh
);
if
(
specs
!=
null
)
{
...
...
nashorn/src/jdk/nashorn/internal/runtime/GlobalObject.java
已删除
100644 → 0
浏览文件 @
546942fa
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package
jdk.nashorn.internal.runtime
;
import
java.lang.invoke.MethodHandle
;
import
java.util.concurrent.Callable
;
import
jdk.internal.dynalink.linker.GuardedInvocation
;
import
jdk.internal.dynalink.linker.LinkRequest
;
import
jdk.nashorn.internal.runtime.linker.InvokeByName
;
/**
* Runtime interface to the global scope objects.
*/
public
interface
GlobalObject
{
/**
* Is this global of the given Context?
* @param ctxt the context
* @return true if this global belongs to the given Context
*/
public
boolean
isOfContext
(
final
Context
ctxt
);
/**
* Does this global belong to a strict Context?
* @return true if this global belongs to a strict Context
*/
public
boolean
isStrictContext
();
/**
* Initialize standard builtin objects like "Object", "Array", "Function" etc.
* as well as our extension builtin objects like "Java", "JSAdapter" as properties
* of the global scope object.
*/
public
void
initBuiltinObjects
();
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newScriptFunction(String, MethodHandle, ScriptObject, boolean)}
*
* @param name function name
* @param handle invocation handle for function
* @param scope the scope
* @param strict are we in strict mode
*
* @return new script function
*/
public
ScriptFunction
newScriptFunction
(
String
name
,
MethodHandle
handle
,
ScriptObject
scope
,
boolean
strict
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#wrapAsObject(Object)}
*
* @param obj object to wrap
* @return wrapped object
*/
public
Object
wrapAsObject
(
Object
obj
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#primitiveLookup(LinkRequest, Object)}
*
* @param request the link request for the dynamic call site.
* @param self self reference
*
* @return guarded invocation
*/
public
GuardedInvocation
primitiveLookup
(
LinkRequest
request
,
Object
self
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newObject()}
*
* @return the new ScriptObject
*/
public
ScriptObject
newObject
();
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#isError(ScriptObject)}
*
* @param sobj to check if it is an error object
* @return true if error object
*/
public
boolean
isError
(
ScriptObject
sobj
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newError(String)}
*
* @param msg the error message
*
* @return the new ScriptObject representing the error
*/
public
ScriptObject
newError
(
String
msg
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newEvalError(String)}
*
* @param msg the error message
*
* @return the new ScriptObject representing the eval error
*/
public
ScriptObject
newEvalError
(
String
msg
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newRangeError(String)}
*
* @param msg the error message
*
* @return the new ScriptObject representing the range error
*/
public
ScriptObject
newRangeError
(
String
msg
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newReferenceError(String)}
*
* @param msg the error message
*
* @return the new ScriptObject representing the reference error
*/
public
ScriptObject
newReferenceError
(
String
msg
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newSyntaxError(String)}
*
* @param msg the error message
*
* @return the new ScriptObject representing the syntax error
*/
public
ScriptObject
newSyntaxError
(
String
msg
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newTypeError(String)}
*
* @param msg the error message
*
* @return the new ScriptObject representing the type error
*/
public
ScriptObject
newTypeError
(
String
msg
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newURIError(String)}
*
* @param msg the error message
*
* @return the new ScriptObject representing the URI error
*/
public
ScriptObject
newURIError
(
String
msg
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newGenericDescriptor(boolean, boolean)}
*
* @param configurable is the described property configurable
* @param enumerable is the described property enumerable
*
* @return property descriptor
*/
public
PropertyDescriptor
newGenericDescriptor
(
boolean
configurable
,
boolean
enumerable
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newDataDescriptor(Object, boolean, boolean, boolean)}
*
* @param value data value
* @param configurable is the described property configurable
* @param enumerable is the described property enumerable
* @param writable is the described property writable
*
* @return property descriptor
*/
public
PropertyDescriptor
newDataDescriptor
(
Object
value
,
boolean
configurable
,
boolean
enumerable
,
boolean
writable
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#newAccessorDescriptor(Object, Object, boolean, boolean)}
*
* @param get property getter, or null if none
* @param set property setter, or null if none
* @param configurable is the described property configurable
* @param enumerable is the described property enumerable
*
* @return property descriptor
*/
public
PropertyDescriptor
newAccessorDescriptor
(
Object
get
,
Object
set
,
boolean
configurable
,
boolean
enumerable
);
/**
* Wrapper for {@link jdk.nashorn.internal.objects.Global#getDefaultValue(ScriptObject, Class)}
*
* @param sobj script object
* @param typeHint type hint
*
* @return default value
*/
public
Object
getDefaultValue
(
ScriptObject
sobj
,
Class
<?>
typeHint
);
/**
* Find the compiled Class for the given script source, if available
*
* @param source Source object of the script
* @return compiled Class object or null
*/
public
Class
<?>
findCachedClass
(
Source
source
);
/**
* Put the Source associated Class object in the Source-to-Class cache
*
* @param source Source of the script
* @param clazz compiled Class object for the source
*/
public
void
cacheClass
(
Source
source
,
Class
<?>
clazz
);
/**
* Get cached InvokeByName object for the given key
* @param key key to be associated with InvokeByName object
* @param creator if InvokeByName is absent 'creator' is called to make one (lazy init)
* @return InvokeByName object associated with the key.
*/
public
InvokeByName
getInvokeByName
(
final
Object
key
,
final
Callable
<
InvokeByName
>
creator
);
/**
* Get cached dynamic method handle for the given key
* @param key key to be associated with dynamic method handle
* @param creator if method handle is absent 'creator' is called to make one (lazy init)
* @return dynamic method handle associated with the key.
*/
public
MethodHandle
getDynamicInvoker
(
final
Object
key
,
final
Callable
<
MethodHandle
>
creator
);
}
nashorn/src/jdk/nashorn/internal/runtime/JSONFunctions.java
浏览文件 @
c2de1264
...
...
@@ -33,6 +33,7 @@ import jdk.nashorn.internal.ir.Node;
import
jdk.nashorn.internal.ir.ObjectNode
;
import
jdk.nashorn.internal.ir.PropertyNode
;
import
jdk.nashorn.internal.ir.UnaryNode
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.parser.JSONParser
;
import
jdk.nashorn.internal.parser.TokenType
;
import
jdk.nashorn.internal.runtime.arrays.ArrayIndex
;
...
...
@@ -47,7 +48,7 @@ public final class JSONFunctions {
private
static
final
Object
REVIVER_INVOKER
=
new
Object
();
private
static
MethodHandle
getREVIVER_INVOKER
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getDynamicInvoker
(
REVIVER_INVOKER
,
return
Context
.
getGlobal
(
).
getDynamicInvoker
(
REVIVER_INVOKER
,
new
Callable
<
MethodHandle
>()
{
@Override
public
MethodHandle
call
()
{
...
...
@@ -88,7 +89,7 @@ public final class JSONFunctions {
throw
ECMAErrors
.
syntaxError
(
e
,
"invalid.json"
,
e
.
getMessage
());
}
final
ScriptObject
global
=
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
Object
unfiltered
=
convertNode
(
global
,
node
);
return
applyReviver
(
global
,
unfiltered
,
reviver
);
}
...
...
@@ -98,10 +99,10 @@ public final class JSONFunctions {
// parse helpers
// apply 'reviver' function if available
private
static
Object
applyReviver
(
final
ScriptObject
global
,
final
Object
unfiltered
,
final
Object
reviver
)
{
private
static
Object
applyReviver
(
final
Global
global
,
final
Object
unfiltered
,
final
Object
reviver
)
{
if
(
reviver
instanceof
ScriptFunction
)
{
assert
global
instanceof
Global
Object
;
final
ScriptObject
root
=
((
GlobalObject
)
global
)
.
newObject
();
assert
global
instanceof
Global
;
final
ScriptObject
root
=
global
.
newObject
();
root
.
addOwnProperty
(
""
,
Property
.
WRITABLE_ENUMERABLE_CONFIGURABLE
,
unfiltered
);
return
walk
(
root
,
""
,
(
ScriptFunction
)
reviver
);
}
...
...
@@ -138,8 +139,8 @@ public final class JSONFunctions {
}
// Converts IR node to runtime value
private
static
Object
convertNode
(
final
ScriptObject
global
,
final
Node
node
)
{
assert
global
instanceof
Global
Object
;
private
static
Object
convertNode
(
final
Global
global
,
final
Node
node
)
{
assert
global
instanceof
Global
;
if
(
node
instanceof
LiteralNode
)
{
// check for array literal
...
...
@@ -157,7 +158,7 @@ public final class JSONFunctions {
for
(
final
Node
elem
:
elements
)
{
values
[
index
++]
=
JSType
.
toNumber
(
convertNode
(
global
,
elem
));
}
return
((
GlobalObject
)
global
)
.
wrapAsObject
(
values
);
return
global
.
wrapAsObject
(
values
);
}
final
Object
[]
values
=
new
Object
[
elements
.
length
];
...
...
@@ -167,14 +168,14 @@ public final class JSONFunctions {
values
[
index
++]
=
convertNode
(
global
,
elem
);
}
return
((
GlobalObject
)
global
)
.
wrapAsObject
(
values
);
return
global
.
wrapAsObject
(
values
);
}
return
((
LiteralNode
<?>)
node
).
getValue
();
}
else
if
(
node
instanceof
ObjectNode
)
{
final
ObjectNode
objNode
=
(
ObjectNode
)
node
;
final
ScriptObject
object
=
((
GlobalObject
)
global
)
.
newObject
();
final
ScriptObject
object
=
global
.
newObject
();
for
(
final
PropertyNode
pNode:
objNode
.
getElements
())
{
final
Node
valueNode
=
pNode
.
getValue
();
...
...
nashorn/src/jdk/nashorn/internal/runtime/JSType.java
浏览文件 @
c2de1264
...
...
@@ -36,6 +36,7 @@ import java.util.List;
import
jdk.internal.dynalink.beans.StaticClass
;
import
jdk.nashorn.api.scripting.JSObject
;
import
jdk.nashorn.internal.codegen.CompilerConstants.Call
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.parser.Lexer
;
import
jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator
;
import
jdk.nashorn.internal.runtime.linker.Bootstrap
;
...
...
@@ -852,7 +853,7 @@ public enum JSType {
* @return the wrapped object
*/
public
static
Object
toScriptObject
(
final
Object
obj
)
{
return
toScriptObject
(
Context
.
getGlobal
Trusted
(),
obj
);
return
toScriptObject
(
Context
.
getGlobal
(),
obj
);
}
/**
...
...
@@ -865,7 +866,7 @@ public enum JSType {
*
* @return the wrapped object
*/
public
static
Object
toScriptObject
(
final
ScriptObject
global
,
final
Object
obj
)
{
public
static
Object
toScriptObject
(
final
Global
global
,
final
Object
obj
)
{
if
(
nullOrUndefined
(
obj
))
{
throw
typeError
(
global
,
"not.an.object"
,
ScriptRuntime
.
safeToString
(
obj
));
}
...
...
@@ -874,7 +875,7 @@ public enum JSType {
return
obj
;
}
return
((
GlobalObject
)
global
)
.
wrapAsObject
(
obj
);
return
global
.
wrapAsObject
(
obj
);
}
/**
...
...
@@ -984,7 +985,7 @@ public enum JSType {
if
(
obj
instanceof
ScriptObject
)
{
if
(
safe
)
{
final
ScriptObject
sobj
=
(
ScriptObject
)
obj
;
final
Global
Object
gobj
=
(
GlobalObject
)
Context
.
getGlobalTrusted
();
final
Global
gobj
=
Context
.
getGlobal
();
return
gobj
.
isError
(
sobj
)
?
ECMAException
.
safeToString
(
sobj
)
:
sobj
.
safeToString
();
...
...
nashorn/src/jdk/nashorn/internal/runtime/ListAdapter.java
浏览文件 @
c2de1264
...
...
@@ -34,6 +34,7 @@ import java.util.RandomAccess;
import
java.util.concurrent.Callable
;
import
jdk.nashorn.api.scripting.JSObject
;
import
jdk.nashorn.api.scripting.ScriptObjectMirror
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.linker.Bootstrap
;
import
jdk.nashorn.internal.runtime.linker.InvokeByName
;
...
...
@@ -54,7 +55,7 @@ public abstract class ListAdapter extends AbstractList<Object> implements Random
// These add to the back and front of the list
private
static
final
Object
PUSH
=
new
Object
();
private
static
InvokeByName
getPUSH
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getInvokeByName
(
PUSH
,
return
Context
.
getGlobal
(
).
getInvokeByName
(
PUSH
,
new
Callable
<
InvokeByName
>()
{
@Override
public
InvokeByName
call
()
{
...
...
@@ -65,7 +66,7 @@ public abstract class ListAdapter extends AbstractList<Object> implements Random
private
static
final
Object
UNSHIFT
=
new
Object
();
private
static
InvokeByName
getUNSHIFT
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getInvokeByName
(
UNSHIFT
,
return
Context
.
getGlobal
(
).
getInvokeByName
(
UNSHIFT
,
new
Callable
<
InvokeByName
>()
{
@Override
public
InvokeByName
call
()
{
...
...
@@ -77,7 +78,7 @@ public abstract class ListAdapter extends AbstractList<Object> implements Random
// These remove from the back and front of the list
private
static
final
Object
POP
=
new
Object
();
private
static
InvokeByName
getPOP
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getInvokeByName
(
POP
,
return
Context
.
getGlobal
(
).
getInvokeByName
(
POP
,
new
Callable
<
InvokeByName
>()
{
@Override
public
InvokeByName
call
()
{
...
...
@@ -88,7 +89,7 @@ public abstract class ListAdapter extends AbstractList<Object> implements Random
private
static
final
Object
SHIFT
=
new
Object
();
private
static
InvokeByName
getSHIFT
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getInvokeByName
(
SHIFT
,
return
Context
.
getGlobal
(
).
getInvokeByName
(
SHIFT
,
new
Callable
<
InvokeByName
>()
{
@Override
public
InvokeByName
call
()
{
...
...
@@ -100,7 +101,7 @@ public abstract class ListAdapter extends AbstractList<Object> implements Random
// These insert and remove in the middle of the list
private
static
final
Object
SPLICE_ADD
=
new
Object
();
private
static
InvokeByName
getSPLICE_ADD
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getInvokeByName
(
SPLICE_ADD
,
return
Context
.
getGlobal
(
).
getInvokeByName
(
SPLICE_ADD
,
new
Callable
<
InvokeByName
>()
{
@Override
public
InvokeByName
call
()
{
...
...
@@ -111,7 +112,7 @@ public abstract class ListAdapter extends AbstractList<Object> implements Random
private
static
final
Object
SPLICE_REMOVE
=
new
Object
();
private
static
InvokeByName
getSPLICE_REMOVE
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getInvokeByName
(
SPLICE_REMOVE
,
return
Context
.
getGlobal
(
).
getInvokeByName
(
SPLICE_REMOVE
,
new
Callable
<
InvokeByName
>()
{
@Override
public
InvokeByName
call
()
{
...
...
nashorn/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java
浏览文件 @
c2de1264
...
...
@@ -35,7 +35,6 @@ import jdk.internal.dynalink.linker.LinkRequest;
import
jdk.internal.dynalink.support.Guards
;
import
jdk.nashorn.internal.lookup.MethodHandleFactory
;
import
jdk.nashorn.internal.lookup.MethodHandleFunctionality
;
import
jdk.nashorn.internal.objects.NativeJava
;
import
jdk.nashorn.internal.objects.annotations.Attribute
;
import
jdk.nashorn.internal.objects.annotations.Function
;
...
...
@@ -52,7 +51,7 @@ import jdk.nashorn.internal.objects.annotations.Function;
* var ArrayList = java.util.ArrayList
* var list = new ArrayList
* </pre>
* You can also use {@link NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly
* You can also use {@link
jdk.nashorn.internal.objects.
NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly
* equivalent:
* <pre>
* var listType1 = java.util.ArrayList
...
...
nashorn/src/jdk/nashorn/internal/runtime/ParserException.java
浏览文件 @
c2de1264
...
...
@@ -26,6 +26,7 @@
package
jdk.nashorn.internal.runtime
;
import
jdk.nashorn.api.scripting.NashornException
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.parser.Token
;
/**
...
...
@@ -110,7 +111,7 @@ public final class ParserException extends NashornException {
* Throw this {@code ParserException} as one of the 7 native JavaScript errors
* @param global global scope object
*/
public
void
throwAsEcmaException
(
final
ScriptObject
global
)
{
public
void
throwAsEcmaException
(
final
Global
global
)
{
throw
ECMAErrors
.
asEcmaException
(
global
,
this
);
}
}
...
...
nashorn/src/jdk/nashorn/internal/runtime/Property.java
浏览文件 @
c2de1264
...
...
@@ -84,9 +84,13 @@ public abstract class Property {
/** Can this property be undefined? */
public
static
final
int
CAN_BE_UNDEFINED
=
1
<<
8
;
/* Is this a function declaration property ? */
/*
*
Is this a function declaration property ? */
public
static
final
int
IS_FUNCTION_DECLARATION
=
1
<<
9
;
/** Is this property bound to a receiver? This means get/set operations will be delegated to
* a statically defined object instead of the object passed as callsite parameter. */
public
static
final
int
IS_BOUND
=
1
<<
10
;
/** Property key. */
private
final
String
key
;
...
...
@@ -251,6 +255,16 @@ public abstract class Property {
return
(
flags
&
IS_SPILL
)
==
IS_SPILL
;
}
/**
* Is this property bound to a receiver? If this method returns {@code true} get and set operations
* will be delegated to a statically bound object instead of the object passed as parameter.
*
* @return true if this is a bound property
*/
public
boolean
isBound
()
{
return
(
flags
&
IS_BOUND
)
==
IS_BOUND
;
}
/**
* Does this property use any slots in the spill array described in
* {@link Property#isSpill}? In that case how many. Currently a property
...
...
nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java
浏览文件 @
c2de1264
...
...
@@ -103,9 +103,7 @@ public final class RecompilableScriptFunctionData extends ScriptFunctionData {
public
RecompilableScriptFunctionData
(
final
FunctionNode
functionNode
,
final
CodeInstaller
<
ScriptEnvironment
>
installer
,
final
String
allocatorClassName
,
final
PropertyMap
allocatorMap
)
{
super
(
functionName
(
functionNode
),
functionNode
.
getParameters
().
size
(),
functionNode
.
isStrict
(),
false
,
true
);
getFlags
(
functionNode
));
this
.
functionNode
=
functionNode
;
this
.
source
=
functionNode
.
getSource
();
...
...
@@ -129,10 +127,11 @@ public final class RecompilableScriptFunctionData extends ScriptFunctionData {
final
StringBuilder
sb
=
new
StringBuilder
();
if
(
source
!=
null
)
{
sb
.
append
(
source
.
getName
())
.
append
(
':'
)
.
append
(
functionNode
.
getLineNumber
())
.
append
(
' '
);
sb
.
append
(
source
.
getName
());
if
(
functionNode
!=
null
)
{
sb
.
append
(
':'
).
append
(
functionNode
.
getLineNumber
());
}
sb
.
append
(
' '
);
}
return
sb
.
toString
()
+
super
.
toString
();
...
...
@@ -159,6 +158,20 @@ public final class RecompilableScriptFunctionData extends ScriptFunctionData {
return
Token
.
toDesc
(
TokenType
.
FUNCTION
,
position
,
length
);
}
private
static
int
getFlags
(
final
FunctionNode
functionNode
)
{
int
flags
=
IS_CONSTRUCTOR
;
if
(
functionNode
.
isStrict
())
{
flags
|=
IS_STRICT
;
}
if
(
functionNode
.
needsCallee
())
{
flags
|=
NEEDS_CALLEE
;
}
if
(
functionNode
.
usesThis
()
||
functionNode
.
hasEval
())
{
flags
|=
USES_THIS
;
}
return
flags
;
}
@Override
ScriptObject
allocate
(
final
PropertyMap
map
)
{
try
{
...
...
@@ -182,41 +195,42 @@ public final class RecompilableScriptFunctionData extends ScriptFunctionData {
return
allocatorMap
;
}
@Override
protected
void
ensureCompiled
()
{
if
(
functionNode
!=
null
&&
functionNode
.
isLazy
())
{
Compiler
.
LOG
.
info
(
"Trampoline hit: need to do lazy compilation of '"
,
functionNode
.
getName
(),
"'"
);
final
Compiler
compiler
=
new
Compiler
(
installer
);
functionNode
=
compiler
.
compile
(
functionNode
);
assert
!
functionNode
.
isLazy
();
compiler
.
install
(
functionNode
);
flags
=
getFlags
(
functionNode
);
}
}
@Override
protected
synchronized
void
ensureCodeGenerated
()
{
if
(!
code
.
isEmpty
())
{
return
;
// nothing to do, we have code, at least some.
}
if
(
functionNode
.
isLazy
())
{
Compiler
.
LOG
.
info
(
"Trampoline hit: need to do lazy compilation of '"
,
functionNode
.
getName
(),
"'"
);
final
Compiler
compiler
=
new
Compiler
(
installer
);
functionNode
=
compiler
.
compile
(
functionNode
);
assert
!
functionNode
.
isLazy
();
compiler
.
install
(
functionNode
);
/*
* We don't need to update any flags - varArgs and needsCallee are instrincic
* in the function world we need to get a destination node from the compile instead
* and replace it with our function node. TODO
*/
}
/*
* We can't get to this program point unless we have bytecode, either from
* eager compilation or from running a lazy compile on the lines above
*/
assert
functionNode
.
hasState
(
CompilationState
.
EMITTED
)
:
functionNode
.
getName
()
+
" "
+
functionNode
.
getState
()
+
" "
+
Debug
.
id
(
functionNode
);
// code exists - look it up and add it into the automatically sorted invoker list
addCode
(
functionNode
);
if
(!
functionNode
.
canSpecialize
())
{
// allow GC to claim IR stuff that is not needed anymore
functionNode
=
null
;
installer
=
null
;
}
if
(!
code
.
isEmpty
())
{
return
;
// nothing to do, we have code, at least some.
}
ensureCompiled
();
/*
* We can't get to this program point unless we have bytecode, either from
* eager compilation or from running a lazy compile on the lines above
*/
assert
functionNode
.
hasState
(
CompilationState
.
EMITTED
)
:
functionNode
.
getName
()
+
" "
+
functionNode
.
getState
()
+
" "
+
Debug
.
id
(
functionNode
);
// code exists - look it up and add it into the automatically sorted invoker list
addCode
(
functionNode
);
if
(!
functionNode
.
canSpecialize
())
{
// allow GC to claim IR stuff that is not needed anymore
functionNode
=
null
;
installer
=
null
;
}
}
private
MethodHandle
addCode
(
final
FunctionNode
fn
)
{
...
...
nashorn/src/jdk/nashorn/internal/runtime/ScriptFunction.java
浏览文件 @
c2de1264
...
...
@@ -38,6 +38,7 @@ import jdk.internal.dynalink.linker.GuardedInvocation;
import
jdk.internal.dynalink.linker.LinkRequest
;
import
jdk.nashorn.internal.codegen.CompilerConstants.Call
;
import
jdk.nashorn.internal.lookup.MethodHandleFactory
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor
;
import
jdk.nashorn.internal.runtime.linker.NashornGuards
;
...
...
@@ -66,6 +67,8 @@ public abstract class ScriptFunction extends ScriptObject {
private
static
final
MethodHandle
WRAPFILTER
=
findOwnMH
(
"wrapFilter"
,
Object
.
class
,
Object
.
class
);
private
static
final
MethodHandle
GLOBALFILTER
=
findOwnMH
(
"globalFilter"
,
Object
.
class
,
Object
.
class
);
/** method handle to scope getter for this ScriptFunction */
public
static
final
Call
GET_SCOPE
=
virtualCallNoLookup
(
ScriptFunction
.
class
,
"getScope"
,
ScriptObject
.
class
);
...
...
@@ -91,9 +94,7 @@ public abstract class ScriptFunction extends ScriptObject {
* @param map property map
* @param scope scope
* @param specs specialized version of this function - other method handles
* @param strict is this a strict mode function?
* @param builtin is this a built in function?
* @param isConstructor is this a constructor?
* @param flags {@link ScriptFunctionData} flags
*/
protected
ScriptFunction
(
final
String
name
,
...
...
@@ -101,11 +102,9 @@ public abstract class ScriptFunction extends ScriptObject {
final
PropertyMap
map
,
final
ScriptObject
scope
,
final
MethodHandle
[]
specs
,
final
boolean
strict
,
final
boolean
builtin
,
final
boolean
isConstructor
)
{
final
int
flags
)
{
this
(
new
FinalScriptFunctionData
(
name
,
methodHandle
,
specs
,
strict
,
builtin
,
isConstructor
),
map
,
scope
);
this
(
new
FinalScriptFunctionData
(
name
,
methodHandle
,
specs
,
flags
),
map
,
scope
);
}
/**
...
...
@@ -477,7 +476,14 @@ public abstract class ScriptFunction extends ScriptObject {
if
(
obj
instanceof
ScriptObject
||
!
ScriptFunctionData
.
isPrimitiveThis
(
obj
))
{
return
obj
;
}
return
((
GlobalObject
)
Context
.
getGlobalTrusted
()).
wrapAsObject
(
obj
);
return
Context
.
getGlobal
().
wrapAsObject
(
obj
);
}
@SuppressWarnings
(
"unused"
)
private
static
Object
globalFilter
(
final
Object
object
)
{
// replace whatever we get with the current global object
return
Context
.
getGlobal
();
}
/**
...
...
@@ -495,11 +501,11 @@ public abstract class ScriptFunction extends ScriptObject {
@Override
protected
GuardedInvocation
findCallMethod
(
final
CallSiteDescriptor
desc
,
final
LinkRequest
request
)
{
final
MethodType
type
=
desc
.
getMethodType
();
final
boolean
scopeCall
=
NashornCallSiteDescriptor
.
isScope
(
desc
);
if
(
request
.
isCallSiteUnstable
())
{
// (this, callee, args...) => (this, callee, args[])
final
MethodHandle
collector
=
MH
.
asCollector
(
ScriptRuntime
.
APPLY
.
methodHandle
(),
Object
[].
class
,
type
.
parameterCount
()
-
2
);
// (callee, this, args...) => (callee, this, args[])
final
MethodHandle
collector
=
MH
.
asCollector
(
ScriptRuntime
.
APPLY
.
methodHandle
(),
Object
[].
class
,
type
.
parameterCount
()
-
2
);
// If call site is statically typed to take a ScriptFunction, we don't need a guard, otherwise we need a
// generic "is this a ScriptFunction?" guard.
...
...
@@ -510,17 +516,12 @@ public abstract class ScriptFunction extends ScriptObject {
MethodHandle
boundHandle
;
MethodHandle
guard
=
null
;
final
boolean
scopeCall
=
NashornCallSiteDescriptor
.
isScope
(
desc
);
if
(
data
.
needsCallee
())
{
final
MethodHandle
callHandle
=
getBestInvoker
(
type
,
request
.
getArguments
());
if
(
scopeCall
)
{
if
(
scopeCall
&&
needsWrappedThis
()
)
{
// Make a handle that drops the passed "this" argument and substitutes either Global or Undefined
// (callee, this, args...) => (callee, args...)
boundHandle
=
MH
.
insertArguments
(
callHandle
,
1
,
needsWrappedThis
()
?
Context
.
getGlobalTrusted
()
:
ScriptRuntime
.
UNDEFINED
);
// (callee, args...) => (callee, [this], args...)
boundHandle
=
MH
.
dropArguments
(
boundHandle
,
1
,
Object
.
class
);
// (callee, this, args...) => (callee, [this], args...)
boundHandle
=
MH
.
filterArguments
(
callHandle
,
1
,
GLOBALFILTER
);
}
else
{
// It's already (callee, this, args...), just what we need
boundHandle
=
callHandle
;
...
...
@@ -531,12 +532,12 @@ public abstract class ScriptFunction extends ScriptObject {
// NOTE: the only built-in named "extend" is NativeJava.extend. As a special-case we're binding the
// current lookup as its "this" so it can do security-sensitive creation of adapter classes.
boundHandle
=
MH
.
dropArguments
(
MH
.
bindTo
(
callHandle
,
desc
.
getLookup
()),
0
,
Object
.
class
,
Object
.
class
);
}
else
if
(
scopeCall
)
{
}
else
if
(
scopeCall
&&
needsWrappedThis
()
)
{
// Make a handle that drops the passed "this" argument and substitutes either Global or Undefined
// (this, args...) => (args...)
boundHandle
=
MH
.
bindTo
(
callHandle
,
needsWrappedThis
()
?
Context
.
getGlobalTrusted
()
:
ScriptRuntime
.
UNDEFINED
);
// (args...) => ([callee], [this], args...)
boundHandle
=
MH
.
dropArguments
(
boundHandle
,
0
,
Object
.
class
,
Object
.
class
);
// (this, args...) => (
[this],
args...)
boundHandle
=
MH
.
filterArguments
(
callHandle
,
0
,
GLOBALFILTER
);
// (
[this],
args...) => ([callee], [this], args...)
boundHandle
=
MH
.
dropArguments
(
boundHandle
,
0
,
Object
.
class
);
}
else
{
// (this, args...) => ([callee], this, args...)
boundHandle
=
MH
.
dropArguments
(
callHandle
,
0
,
Object
.
class
);
...
...
nashorn/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java
浏览文件 @
c2de1264
...
...
@@ -32,6 +32,7 @@ import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
import
java.lang.invoke.MethodHandle
;
import
java.lang.invoke.MethodHandles
;
import
java.lang.invoke.MethodType
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.linker.JavaAdapterFactory
;
/**
...
...
@@ -47,33 +48,44 @@ public abstract class ScriptFunctionData {
/** All versions of this function that have been generated to code */
protected
final
CompiledFunctions
code
;
private
int
arity
;
private
final
boolean
isStrict
;
private
final
boolean
isBuiltin
;
/** Function flags */
protected
int
flags
;
private
final
boolean
isConstructor
;
private
int
arity
;
private
static
final
MethodHandle
NEWFILTER
=
findOwnMH
(
"newFilter"
,
Object
.
class
,
Object
.
class
,
Object
.
class
);
private
static
final
MethodHandle
BIND_VAR_ARGS
=
findOwnMH
(
"bindVarArgs"
,
Object
[].
class
,
Object
[].
class
,
Object
[].
class
);
/** Is this a strict mode function? */
public
static
final
int
IS_STRICT
=
1
<<
0
;
/** Is this a built-in function? */
public
static
final
int
IS_BUILTIN
=
1
<<
1
;
/** Is this a constructor function? */
public
static
final
int
IS_CONSTRUCTOR
=
1
<<
2
;
/** Does this function expect a callee argument? */
public
static
final
int
NEEDS_CALLEE
=
1
<<
3
;
/** Does this function make use of the this-object argument? */
public
static
final
int
USES_THIS
=
1
<<
4
;
/** Flag for strict or built-in functions */
public
static
final
int
IS_STRICT_OR_BUILTIN
=
IS_STRICT
|
IS_BUILTIN
;
/** Flag for built-in constructors */
public
static
final
int
IS_BUILTIN_CONSTRUCTOR
=
IS_BUILTIN
|
IS_CONSTRUCTOR
;
/** Flag for strict constructors */
public
static
final
int
IS_STRICT_CONSTRUCTOR
=
IS_STRICT
|
IS_CONSTRUCTOR
;
/**
* Constructor
*
* @param name script function name
* @param arity arity
* @param isStrict is the function strict
* @param isBuiltin is the function built in
* @param isConstructor is the function a constructor
* @param flags the function flags
*/
ScriptFunctionData
(
final
String
name
,
final
int
arity
,
final
boolean
isStrict
,
final
boolean
isBuiltin
,
final
boolean
isConstructor
)
{
this
.
name
=
name
;
this
.
arity
=
arity
;
this
.
code
=
new
CompiledFunctions
();
this
.
isStrict
=
isStrict
;
this
.
isBuiltin
=
isBuiltin
;
this
.
isConstructor
=
isConstructor
;
ScriptFunctionData
(
final
String
name
,
final
int
arity
,
final
int
flags
)
{
this
.
name
=
name
;
this
.
arity
=
arity
;
this
.
code
=
new
CompiledFunctions
();
this
.
flags
=
flags
;
}
final
int
getArity
()
{
...
...
@@ -105,21 +117,21 @@ public abstract class ScriptFunctionData {
* @return true if strict, false otherwise
*/
public
boolean
isStrict
()
{
return
isStrict
;
return
(
flags
&
IS_STRICT
)
!=
0
;
}
boolean
isBuiltin
()
{
return
isBuiltin
;
return
(
flags
&
IS_BUILTIN
)
!=
0
;
}
boolean
isConstructor
()
{
return
isConstructor
;
return
(
flags
&
IS_CONSTRUCTOR
)
!=
0
;
}
boolean
needsCallee
()
{
// we don't know if we need a callee or not unless
we are generat
ed
ensureCo
deGenerat
ed
();
return
code
.
needsCallee
()
;
// we don't know if we need a callee or not unless
code has been compil
ed
ensureCo
mpil
ed
();
return
(
flags
&
NEEDS_CALLEE
)
!=
0
;
}
/**
...
...
@@ -128,7 +140,7 @@ public abstract class ScriptFunctionData {
* @return true if this argument must be an object
*/
boolean
needsWrappedThis
()
{
return
!
isStrict
&&
!
isBuiltin
;
return
(
flags
&
USES_THIS
)
!=
0
&&
(
flags
&
IS_STRICT_OR_BUILTIN
)
==
0
;
}
String
toSource
()
{
...
...
@@ -201,6 +213,15 @@ public abstract class ScriptFunctionData {
//empty
}
/**
* If we can have lazy code generation, this is a hook to ensure that the code has been compiled.
* This does not guarantee the code been installed in this {@code ScriptFunctionData} instance;
* use {@link #ensureCodeGenerated()} to install the actual method handles.
*/
protected
void
ensureCompiled
()
{
//empty
}
/**
* Return a generic Object/Object invoker for this method. It will ensure code
* is generated, get the most generic of all versions of this function and adapt it
...
...
@@ -259,6 +280,8 @@ public abstract class ScriptFunctionData {
final
Object
[]
allArgs
=
args
==
null
?
ScriptRuntime
.
EMPTY_ARRAY
:
args
;
final
int
length
=
args
==
null
?
0
:
args
.
length
;
// Clear the callee and this flags
final
int
boundFlags
=
flags
&
~
NEEDS_CALLEE
&
~
USES_THIS
;
CompiledFunctions
boundList
=
new
CompiledFunctions
();
if
(
code
.
size
()
==
1
)
{
...
...
@@ -273,8 +296,7 @@ public abstract class ScriptFunctionData {
boundList
.
add
(
bind
(
inv
,
fn
,
self
,
allArgs
));
}
ScriptFunctionData
boundData
=
new
FinalScriptFunctionData
(
name
,
arity
==
-
1
?
-
1
:
Math
.
max
(
0
,
arity
-
length
),
boundList
,
isStrict
(),
isBuiltin
(),
isConstructor
());
return
boundData
;
return
new
FinalScriptFunctionData
(
name
,
arity
==
-
1
?
-
1
:
Math
.
max
(
0
,
arity
-
length
),
boundList
,
boundFlags
);
}
/**
...
...
@@ -351,11 +373,11 @@ public abstract class ScriptFunctionData {
private
Object
convertThisObject
(
final
Object
thiz
)
{
if
(!(
thiz
instanceof
ScriptObject
)
&&
needsWrappedThis
())
{
if
(
JSType
.
nullOrUndefined
(
thiz
))
{
return
Context
.
getGlobal
Trusted
();
return
Context
.
getGlobal
();
}
if
(
isPrimitiveThis
(
thiz
))
{
return
((
GlobalObject
)
Context
.
getGlobalTrusted
()
).
wrapAsObject
(
thiz
);
return
Context
.
getGlobal
(
).
wrapAsObject
(
thiz
);
}
}
...
...
nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java
浏览文件 @
c2de1264
...
...
@@ -66,6 +66,7 @@ import jdk.nashorn.internal.lookup.Lookup;
import
jdk.nashorn.internal.lookup.MethodHandleFactory
;
import
jdk.nashorn.internal.objects.AccessorPropertyDescriptor
;
import
jdk.nashorn.internal.objects.DataPropertyDescriptor
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.arrays.ArrayData
;
import
jdk.nashorn.internal.runtime.arrays.ArrayIndex
;
import
jdk.nashorn.internal.runtime.linker.Bootstrap
;
...
...
@@ -131,7 +132,8 @@ public abstract class ScriptObject implements PropertyAccess {
static
final
MethodHandle
GETPROTO
=
findOwnMH
(
"getProto"
,
ScriptObject
.
class
);
static
final
MethodHandle
SETPROTOCHECK
=
findOwnMH
(
"setProtoCheck"
,
void
.
class
,
Object
.
class
);
static
final
MethodHandle
MEGAMORPHIC_GET
=
findOwnMH
(
"megamorphicGet"
,
Object
.
class
,
String
.
class
,
boolean
.
class
);
static
final
MethodHandle
MEGAMORPHIC_GET
=
findOwnMH
(
"megamorphicGet"
,
Object
.
class
,
String
.
class
,
boolean
.
class
,
boolean
.
class
);
static
final
MethodHandle
GLOBALFILTER
=
findOwnMH
(
"globalFilter"
,
Object
.
class
,
Object
.
class
);
static
final
MethodHandle
SETFIELD
=
findOwnMH
(
"setField"
,
void
.
class
,
CallSiteDescriptor
.
class
,
PropertyMap
.
class
,
PropertyMap
.
class
,
MethodHandle
.
class
,
Object
.
class
,
Object
.
class
);
static
final
MethodHandle
SETSPILL
=
findOwnMH
(
"setSpill"
,
void
.
class
,
CallSiteDescriptor
.
class
,
PropertyMap
.
class
,
PropertyMap
.
class
,
int
.
class
,
Object
.
class
,
Object
.
class
);
...
...
@@ -225,6 +227,7 @@ public abstract class ScriptObject implements PropertyAccess {
final
Property
oldProp
=
newMap
.
findProperty
(
key
);
if
(
oldProp
==
null
)
{
if
(
property
instanceof
UserAccessorProperty
)
{
// Note: we copy accessor functions to this object which is semantically different from binding.
final
UserAccessorProperty
prop
=
this
.
newUserAccessors
(
key
,
property
.
getFlags
(),
property
.
getGetterFunction
(
source
),
property
.
getSetterFunction
(
source
));
newMap
=
newMap
.
addPropertyNoHistory
(
prop
);
}
else
{
...
...
@@ -322,18 +325,18 @@ public abstract class ScriptObject implements PropertyAccess {
* @return property descriptor
*/
public
final
PropertyDescriptor
toPropertyDescriptor
()
{
final
Global
Object
global
=
(
GlobalObject
)
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
final
PropertyDescriptor
desc
;
if
(
isDataDescriptor
())
{
if
(
has
(
SET
)
||
has
(
GET
))
{
throw
typeError
(
(
ScriptObject
)
global
,
"inconsistent.property.descriptor"
);
throw
typeError
(
global
,
"inconsistent.property.descriptor"
);
}
desc
=
global
.
newDataDescriptor
(
UNDEFINED
,
false
,
false
,
false
);
}
else
if
(
isAccessorDescriptor
())
{
if
(
has
(
VALUE
)
||
has
(
WRITABLE
))
{
throw
typeError
(
(
ScriptObject
)
global
,
"inconsistent.property.descriptor"
);
throw
typeError
(
global
,
"inconsistent.property.descriptor"
);
}
desc
=
global
.
newAccessorDescriptor
(
UNDEFINED
,
UNDEFINED
,
false
,
false
);
...
...
@@ -352,7 +355,7 @@ public abstract class ScriptObject implements PropertyAccess {
*
* @return property descriptor
*/
public
static
PropertyDescriptor
toPropertyDescriptor
(
final
ScriptObject
global
,
final
Object
obj
)
{
public
static
PropertyDescriptor
toPropertyDescriptor
(
final
Global
global
,
final
Object
obj
)
{
if
(
obj
instanceof
ScriptObject
)
{
return
((
ScriptObject
)
obj
).
toPropertyDescriptor
();
}
...
...
@@ -371,7 +374,7 @@ public abstract class ScriptObject implements PropertyAccess {
public
Object
getOwnPropertyDescriptor
(
final
String
key
)
{
final
Property
property
=
getMap
().
findProperty
(
key
);
final
Global
Object
global
=
(
GlobalObject
)
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
if
(
property
!=
null
)
{
final
ScriptFunction
get
=
property
.
getGetterFunction
(
this
);
...
...
@@ -436,7 +439,7 @@ public abstract class ScriptObject implements PropertyAccess {
* @return true if property was successfully defined
*/
public
boolean
defineOwnProperty
(
final
String
key
,
final
Object
propertyDesc
,
final
boolean
reject
)
{
final
ScriptObject
global
=
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
final
PropertyDescriptor
desc
=
toPropertyDescriptor
(
global
,
propertyDesc
);
final
Object
current
=
getOwnPropertyDescriptor
(
key
);
final
String
name
=
JSType
.
toString
(
key
);
...
...
@@ -634,7 +637,7 @@ public abstract class ScriptObject implements PropertyAccess {
final
int
propFlags
=
Property
.
toFlags
(
pdesc
);
if
(
pdesc
.
type
()
==
PropertyDescriptor
.
GENERIC
)
{
final
Global
Object
global
=
(
GlobalObject
)
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
final
PropertyDescriptor
dDesc
=
global
.
newDataDescriptor
(
UNDEFINED
,
false
,
false
,
false
);
dDesc
.
fillFrom
((
ScriptObject
)
pdesc
);
...
...
@@ -974,17 +977,6 @@ public abstract class ScriptObject implements PropertyAccess {
return
ObjectClassGenerator
.
UNDEFINED_DOUBLE
;
}
/**
* Get the object value of a property
*
* @param find {@link FindProperty} lookup result
*
* @return the value of the property
*/
protected
static
Object
getObjectValue
(
final
FindProperty
find
)
{
return
find
.
getObjectValue
();
}
/**
* Return methodHandle of value function for call.
*
...
...
@@ -995,7 +987,7 @@ public abstract class ScriptObject implements PropertyAccess {
* @return value of property as a MethodHandle or null.
*/
protected
MethodHandle
getCallMethodHandle
(
final
FindProperty
find
,
final
MethodType
type
,
final
String
bindName
)
{
return
getCallMethodHandle
(
getObjectValue
(
find
),
type
,
bindName
);
return
getCallMethodHandle
(
find
.
getObjectValue
(
),
type
,
bindName
);
}
/**
...
...
@@ -1019,7 +1011,7 @@ public abstract class ScriptObject implements PropertyAccess {
* @return Value of property.
*/
public
final
Object
getWithProperty
(
final
Property
property
)
{
return
getObjectValue
(
new
FindProperty
(
this
,
this
,
property
)
);
return
new
FindProperty
(
this
,
this
,
property
).
getObjectValue
(
);
}
/**
...
...
@@ -1158,7 +1150,7 @@ public abstract class ScriptObject implements PropertyAccess {
}
setProto
((
ScriptObject
)
newProto
);
}
else
{
final
ScriptObject
global
=
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
final
Object
newProtoObject
=
JSType
.
toScriptObject
(
global
,
newProto
);
if
(
newProtoObject
instanceof
ScriptObject
)
{
...
...
@@ -1248,11 +1240,11 @@ public abstract class ScriptObject implements PropertyAccess {
* @return the default value
*/
public
Object
getDefaultValue
(
final
Class
<?>
typeHint
)
{
// We delegate to Global
Object
, as the implementation uses dynamic call sites to invoke object's "toString" and
// We delegate to Global, as the implementation uses dynamic call sites to invoke object's "toString" and
// "valueOf" methods, and in order to avoid those call sites from becoming megamorphic when multiple contexts
// are being executed in a long-running program, we move the code and their associated dynamic call sites
// (Global.TO_STRING and Global.VALUE_OF) into per-context code.
return
((
GlobalObject
)
Context
.
getGlobalTrusted
()
).
getDefaultValue
(
this
,
typeHint
);
return
Context
.
getGlobal
(
).
getDefaultValue
(
this
,
typeHint
);
}
/**
...
...
@@ -1740,7 +1732,7 @@ public abstract class ScriptObject implements PropertyAccess {
protected
GuardedInvocation
findGetMethod
(
final
CallSiteDescriptor
desc
,
final
LinkRequest
request
,
final
String
operator
)
{
final
String
name
=
desc
.
getNameToken
(
CallSiteDescriptor
.
NAME_OPERAND
);
if
(
request
.
isCallSiteUnstable
()
||
hasWithScope
())
{
return
findMegaMorphicGetMethod
(
desc
,
name
,
"getMethod"
.
equals
(
operator
));
return
findMegaMorphicGetMethod
(
desc
,
name
,
"getMethod"
.
equals
(
operator
)
,
isScope
()
&&
NashornCallSiteDescriptor
.
isScope
(
desc
)
);
}
final
FindProperty
find
=
findProperty
(
name
,
true
);
...
...
@@ -1765,9 +1757,8 @@ public abstract class ScriptObject implements PropertyAccess {
final
Property
property
=
find
.
getProperty
();
methodHandle
=
find
.
getGetter
(
returnType
);
final
boolean
noGuard
=
ObjectClassGenerator
.
OBJECT_FIELDS_ONLY
&&
NashornCallSiteDescriptor
.
isFastScope
(
desc
)
&&
!
property
.
canChangeType
();
// getMap() is fine as we have the prototype switchpoint depending on where the property was found
final
MethodHandle
guard
=
noGuard
?
null
:
NashornGuards
.
getMapGuard
(
getMap
());
// Get the appropriate guard for this callsite and property.
final
MethodHandle
guard
=
NashornGuards
.
getGuard
(
this
,
property
,
desc
);
final
ScriptObject
owner
=
find
.
getOwner
();
if
(
methodHandle
!=
null
)
{
...
...
@@ -1777,31 +1768,32 @@ public abstract class ScriptObject implements PropertyAccess {
}
if
(!
property
.
hasGetterFunction
(
owner
))
{
// If not a scope bind to actual prototype as changing prototype will change the property map.
// For scopes we install a filter that replaces the self object with the prototype owning the property.
methodHandle
=
isScope
()
?
addProtoFilter
(
methodHandle
,
find
.
getProtoChainLength
())
:
bindTo
(
methodHandle
,
owner
);
// Add a filter that replaces the self object with the prototype owning the property.
methodHandle
=
addProtoFilter
(
methodHandle
,
find
.
getProtoChainLength
());
}
return
new
GuardedInvocation
(
methodHandle
,
noGuard
?
null
:
getProtoSwitchPoint
(
name
,
owner
),
guard
);
return
new
GuardedInvocation
(
methodHandle
,
guard
==
null
?
null
:
getProtoSwitchPoint
(
name
,
owner
),
guard
);
}
assert
!
NashornCallSiteDescriptor
.
isFastScope
(
desc
);
return
new
GuardedInvocation
(
Lookup
.
emptyGetter
(
returnType
),
getProtoSwitchPoint
(
name
,
owner
),
guard
);
}
private
static
GuardedInvocation
findMegaMorphicGetMethod
(
final
CallSiteDescriptor
desc
,
final
String
name
,
final
boolean
isMethod
)
{
final
MethodHandle
invoker
=
MH
.
insertArguments
(
MEGAMORPHIC_GET
,
1
,
name
,
isMethod
);
private
static
GuardedInvocation
findMegaMorphicGetMethod
(
final
CallSiteDescriptor
desc
,
final
String
name
,
final
boolean
isMethod
,
final
boolean
isScope
)
{
final
MethodHandle
invoker
=
MH
.
insertArguments
(
MEGAMORPHIC_GET
,
1
,
name
,
isMethod
,
isScope
);
final
MethodHandle
guard
=
getScriptObjectGuard
(
desc
.
getMethodType
());
return
new
GuardedInvocation
(
invoker
,
guard
);
}
@SuppressWarnings
(
"unused"
)
private
Object
megamorphicGet
(
final
String
key
,
final
boolean
isMethod
)
{
private
Object
megamorphicGet
(
final
String
key
,
final
boolean
isMethod
,
final
boolean
isScope
)
{
final
FindProperty
find
=
findProperty
(
key
,
true
);
if
(
find
!=
null
)
{
return
getObjectValue
(
find
);
return
find
.
getObjectValue
();
}
if
(
isScope
)
{
throw
referenceError
(
"not.defined"
,
key
);
}
return
isMethod
?
getNoSuchMethod
(
key
)
:
invokeNoSuchProperty
(
key
);
...
...
@@ -1996,6 +1988,15 @@ public abstract class ScriptObject implements PropertyAccess {
}
}
@SuppressWarnings
(
"unused"
)
private
static
Object
globalFilter
(
final
Object
object
)
{
ScriptObject
sobj
=
(
ScriptObject
)
object
;
while
(
sobj
!=
null
&&
!(
sobj
instanceof
Global
))
{
sobj
=
sobj
.
getProto
();
}
return
sobj
;
}
private
static
GuardedInvocation
findMegaMorphicSetMethod
(
final
CallSiteDescriptor
desc
,
final
String
name
)
{
final
MethodType
type
=
desc
.
getMethodType
().
insertParameterTypes
(
1
,
Object
.
class
);
final
GuardedInvocation
inv
=
findSetIndexMethod
(
type
,
NashornCallSiteDescriptor
.
isStrict
(
desc
));
...
...
@@ -2041,7 +2042,7 @@ public abstract class ScriptObject implements PropertyAccess {
return
noSuchProperty
(
desc
,
request
);
}
final
Object
value
=
getObjectValue
(
find
);
final
Object
value
=
find
.
getObjectValue
(
);
if
(!
(
value
instanceof
ScriptFunction
))
{
return
createEmptyGetter
(
desc
,
name
);
}
...
...
@@ -2067,7 +2068,7 @@ public abstract class ScriptObject implements PropertyAccess {
final
boolean
scopeAccess
=
isScope
()
&&
NashornCallSiteDescriptor
.
isScope
(
desc
);
if
(
find
!=
null
)
{
final
Object
value
=
getObjectValue
(
find
);
final
Object
value
=
find
.
getObjectValue
(
);
ScriptFunction
func
=
null
;
MethodHandle
methodHandle
=
null
;
...
...
@@ -2102,7 +2103,7 @@ public abstract class ScriptObject implements PropertyAccess {
final
FindProperty
find
=
findProperty
(
NO_SUCH_PROPERTY_NAME
,
true
);
if
(
find
!=
null
)
{
final
Object
func
=
getObjectValue
(
find
);
final
Object
func
=
find
.
getObjectValue
(
);
if
(
func
instanceof
ScriptFunction
)
{
return
ScriptRuntime
.
apply
((
ScriptFunction
)
func
,
this
,
name
);
...
...
@@ -2124,7 +2125,7 @@ public abstract class ScriptObject implements PropertyAccess {
return
invokeNoSuchProperty
(
name
);
}
final
Object
value
=
getObjectValue
(
find
);
final
Object
value
=
find
.
getObjectValue
(
);
if
(!
(
value
instanceof
ScriptFunction
))
{
return
UNDEFINED
;
}
...
...
@@ -2664,7 +2665,7 @@ public abstract class ScriptObject implements PropertyAccess {
final
FindProperty
find
=
object
.
findProperty
(
key
,
false
,
false
,
this
);
if
(
find
!=
null
)
{
return
getObjectValue
(
find
);
return
find
.
getObjectValue
(
);
}
}
...
...
@@ -2682,7 +2683,7 @@ public abstract class ScriptObject implements PropertyAccess {
final
FindProperty
find
=
findProperty
(
key
,
true
);
if
(
find
!=
null
)
{
return
getObjectValue
(
find
);
return
find
.
getObjectValue
(
);
}
}
...
...
@@ -2823,7 +2824,15 @@ public abstract class ScriptObject implements PropertyAccess {
throw
typeError
(
"object.non.extensible"
,
key
,
ScriptRuntime
.
safeToString
(
this
));
}
}
else
{
spill
(
key
,
value
);
ScriptObject
sobj
=
this
;
// undefined scope properties are set in the global object.
if
(
isScope
())
{
while
(
sobj
!=
null
&&
!(
sobj
instanceof
Global
))
{
sobj
=
sobj
.
getProto
();
}
assert
sobj
!=
null
:
"no parent global object in scope"
;
}
sobj
.
spill
(
key
,
value
);
}
}
...
...
nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java
浏览文件 @
c2de1264
...
...
@@ -474,7 +474,7 @@ public final class ScriptRuntime {
* @return {@link WithObject} that is the new scope
*/
public
static
ScriptObject
openWith
(
final
ScriptObject
scope
,
final
Object
expression
)
{
final
ScriptObject
global
=
Context
.
getGlobalTrusted
();
final
Global
global
=
Context
.
getGlobal
();
if
(
expression
==
UNDEFINED
)
{
throw
typeError
(
global
,
"cant.apply.with.to.undefined"
);
}
else
if
(
expression
==
null
)
{
...
...
nashorn/src/jdk/nashorn/internal/runtime/SetMethodCreator.java
浏览文件 @
c2de1264
...
...
@@ -31,7 +31,6 @@ import static jdk.nashorn.internal.lookup.Lookup.MH;
import
java.lang.invoke.MethodHandle
;
import
jdk.internal.dynalink.CallSiteDescriptor
;
import
jdk.internal.dynalink.linker.GuardedInvocation
;
import
jdk.nashorn.internal.codegen.ObjectClassGenerator
;
import
jdk.nashorn.internal.lookup.Lookup
;
import
jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor
;
import
jdk.nashorn.internal.runtime.linker.NashornGuards
;
...
...
@@ -104,21 +103,9 @@ final class SetMethodCreator {
* @return the composed guarded invocation that represents the dynamic setter method for the property.
*/
GuardedInvocation
createGuardedInvocation
()
{
return
new
GuardedInvocation
(
methodHandle
,
getGuard
(
));
return
new
GuardedInvocation
(
methodHandle
,
NashornGuards
.
getGuard
(
sobj
,
property
,
desc
));
}
private
MethodHandle
getGuard
()
{
return
needsNoGuard
()
?
null
:
NashornGuards
.
getMapGuard
(
getMap
());
}
private
boolean
needsNoGuard
()
{
return
NashornCallSiteDescriptor
.
isFastScope
(
desc
)
&&
(
ObjectClassGenerator
.
OBJECT_FIELDS_ONLY
||
isPropertyTypeStable
());
}
private
boolean
isPropertyTypeStable
()
{
return
property
==
null
||
!
property
.
canChangeType
();
}
}
private
SetMethod
createSetMethod
()
{
...
...
@@ -153,10 +140,7 @@ final class SetMethodCreator {
final
MethodHandle
boundHandle
;
if
(!
property
.
hasSetterFunction
(
find
.
getOwner
())
&&
find
.
isInherited
())
{
// Bind or add prototype filter depending on whether this is a scope object.
boundHandle
=
sobj
.
isScope
()
?
ScriptObject
.
addProtoFilter
(
methodHandle
,
find
.
getProtoChainLength
()):
ScriptObject
.
bindTo
(
methodHandle
,
find
.
getOwner
());
boundHandle
=
ScriptObject
.
addProtoFilter
(
methodHandle
,
find
.
getProtoChainLength
());
}
else
{
boundHandle
=
methodHandle
;
}
...
...
@@ -164,8 +148,8 @@ final class SetMethodCreator {
}
private
SetMethod
createGlobalPropertySetter
()
{
final
ScriptObject
global
=
Context
.
getGlobal
Trusted
();
return
new
SetMethod
(
ScriptObject
.
bindTo
(
global
.
addSpill
(
getName
()),
global
),
null
);
final
ScriptObject
global
=
Context
.
getGlobal
();
return
new
SetMethod
(
MH
.
filterArguments
(
global
.
addSpill
(
getName
()),
0
,
ScriptObject
.
GLOBALFILTER
),
null
);
}
private
SetMethod
createNewPropertySetter
()
{
...
...
nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java
浏览文件 @
c2de1264
...
...
@@ -34,6 +34,7 @@ import jdk.nashorn.internal.lookup.Lookup;
import
jdk.nashorn.internal.runtime.linker.Bootstrap
;
import
static
jdk
.
nashorn
.
internal
.
codegen
.
CompilerConstants
.
staticCall
;
import
jdk.nashorn.internal.objects.Global
;
import
static
jdk
.
nashorn
.
internal
.
runtime
.
ECMAErrors
.
typeError
;
import
static
jdk
.
nashorn
.
internal
.
runtime
.
ScriptRuntime
.
UNDEFINED
;
...
...
@@ -73,7 +74,7 @@ public final class UserAccessorProperty extends Property {
private
static
MethodHandle
getINVOKE_UA_GETTER
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getDynamicInvoker
(
INVOKE_UA_GETTER
,
return
Context
.
getGlobal
(
).
getDynamicInvoker
(
INVOKE_UA_GETTER
,
new
Callable
<
MethodHandle
>()
{
@Override
public
MethodHandle
call
()
{
...
...
@@ -86,7 +87,7 @@ public final class UserAccessorProperty extends Property {
/** Dynamic invoker for setter */
private
static
Object
INVOKE_UA_SETTER
=
new
Object
();
private
static
MethodHandle
getINVOKE_UA_SETTER
()
{
return
((
GlobalObject
)
Context
.
getGlobal
()
).
getDynamicInvoker
(
INVOKE_UA_SETTER
,
return
Context
.
getGlobal
(
).
getDynamicInvoker
(
INVOKE_UA_SETTER
,
new
Callable
<
MethodHandle
>()
{
@Override
public
MethodHandle
call
()
{
...
...
nashorn/src/jdk/nashorn/internal/runtime/WithObject.java
浏览文件 @
c2de1264
...
...
@@ -88,6 +88,11 @@ public final class WithObject extends ScriptObject implements Scope {
@Override
public
GuardedInvocation
lookup
(
final
CallSiteDescriptor
desc
,
final
LinkRequest
request
)
{
if
(
request
.
isCallSiteUnstable
())
{
// Fall back to megamorphic invocation which performs a complete lookup each time without further relinking.
return
super
.
lookup
(
desc
,
request
);
}
// With scopes can never be observed outside of Nashorn code, so all call sites that can address it will of
// necessity have a Nashorn descriptor - it is safe to cast.
final
NashornCallSiteDescriptor
ndesc
=
(
NashornCallSiteDescriptor
)
desc
;
...
...
@@ -265,7 +270,7 @@ public final class WithObject extends ScriptObject implements Scope {
}
private
static
MethodHandle
filter
(
final
MethodHandle
mh
,
final
MethodHandle
filter
)
{
return
MH
.
filterArguments
(
mh
,
0
,
filter
);
return
MH
.
filterArguments
(
mh
,
0
,
filter
.
asType
(
filter
.
type
().
changeReturnType
(
mh
.
type
().
parameterType
(
0
)))
);
}
/**
...
...
nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java
浏览文件 @
c2de1264
...
...
@@ -27,7 +27,7 @@ package jdk.nashorn.internal.runtime.arrays;
import
java.lang.invoke.MethodHandle
;
import
java.nio.ByteBuffer
;
import
jdk.nashorn.internal.
runtime.GlobalObject
;
import
jdk.nashorn.internal.
objects.Global
;
import
jdk.nashorn.internal.runtime.JSType
;
import
jdk.nashorn.internal.runtime.PropertyDescriptor
;
...
...
@@ -399,7 +399,7 @@ public abstract class ArrayData {
*
* @return property descriptor for element
*/
public
PropertyDescriptor
getDescriptor
(
final
Global
Object
global
,
final
int
index
)
{
public
PropertyDescriptor
getDescriptor
(
final
Global
global
,
final
int
index
)
{
return
global
.
newDataDescriptor
(
getObject
(
index
),
true
,
true
,
true
);
}
...
...
nashorn/src/jdk/nashorn/internal/runtime/arrays/ByteBufferArrayData.java
浏览文件 @
c2de1264
...
...
@@ -27,7 +27,7 @@ package jdk.nashorn.internal.runtime.arrays;
import
static
jdk
.
nashorn
.
internal
.
runtime
.
ECMAErrors
.
typeError
;
import
java.nio.ByteBuffer
;
import
jdk.nashorn.internal.
runtime.GlobalObject
;
import
jdk.nashorn.internal.
objects.Global
;
import
jdk.nashorn.internal.runtime.PropertyDescriptor
;
import
jdk.nashorn.internal.runtime.ScriptRuntime
;
...
...
@@ -60,7 +60,8 @@ final class ByteBufferArrayData extends ArrayData {
*
* @return property descriptor for element
*/
public
PropertyDescriptor
getDescriptor
(
final
GlobalObject
global
,
final
int
index
)
{
@Override
public
PropertyDescriptor
getDescriptor
(
final
Global
global
,
final
int
index
)
{
// make the index properties not configurable
return
global
.
newDataDescriptor
(
getObject
(
index
),
false
,
true
,
true
);
}
...
...
nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java
浏览文件 @
c2de1264
...
...
@@ -25,9 +25,9 @@
package
jdk.nashorn.internal.runtime.arrays
;
import
jdk.nashorn.internal.objects.Global
;
import
static
jdk
.
nashorn
.
internal
.
runtime
.
ECMAErrors
.
typeError
;
import
jdk.nashorn.internal.runtime.GlobalObject
;
import
jdk.nashorn.internal.runtime.PropertyDescriptor
;
/**
...
...
@@ -44,7 +44,7 @@ final class FrozenArrayFilter extends SealedArrayFilter {
}
@Override
public
PropertyDescriptor
getDescriptor
(
final
Global
Object
global
,
final
int
index
)
{
public
PropertyDescriptor
getDescriptor
(
final
Global
global
,
final
int
index
)
{
return
global
.
newDataDescriptor
(
getObject
(
index
),
false
,
true
,
false
);
}
...
...
nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java
浏览文件 @
c2de1264
...
...
@@ -25,9 +25,9 @@
package
jdk.nashorn.internal.runtime.arrays
;
import
jdk.nashorn.internal.objects.Global
;
import
static
jdk
.
nashorn
.
internal
.
runtime
.
ECMAErrors
.
typeError
;
import
jdk.nashorn.internal.runtime.GlobalObject
;
import
jdk.nashorn.internal.runtime.PropertyDescriptor
;
/**
...
...
@@ -62,7 +62,7 @@ class SealedArrayFilter extends ArrayFilter {
}
@Override
public
PropertyDescriptor
getDescriptor
(
final
Global
Object
global
,
final
int
index
)
{
public
PropertyDescriptor
getDescriptor
(
final
Global
global
,
final
int
index
)
{
return
global
.
newDataDescriptor
(
getObject
(
index
),
false
,
true
,
true
);
}
}
nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
浏览文件 @
c2de1264
...
...
@@ -64,6 +64,7 @@ import jdk.internal.org.objectweb.asm.Label;
import
jdk.internal.org.objectweb.asm.Opcodes
;
import
jdk.internal.org.objectweb.asm.Type
;
import
jdk.internal.org.objectweb.asm.commons.InstructionAdapter
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.Context
;
import
jdk.nashorn.internal.runtime.ScriptFunction
;
import
jdk.nashorn.internal.runtime.ScriptObject
;
...
...
@@ -134,6 +135,7 @@ final class JavaAdapterBytecodeGenerator {
static
final
Type
CONTEXT_TYPE
=
Type
.
getType
(
Context
.
class
);
static
final
Type
OBJECT_TYPE
=
Type
.
getType
(
Object
.
class
);
static
final
Type
SCRIPT_OBJECT_TYPE
=
Type
.
getType
(
ScriptObject
.
class
);
static
final
Type
GLOBAL_TYPE
=
Type
.
getType
(
Global
.
class
);
static
final
String
CONTEXT_TYPE_NAME
=
CONTEXT_TYPE
.
getInternalName
();
static
final
String
OBJECT_TYPE_NAME
=
OBJECT_TYPE
.
getInternalName
();
...
...
@@ -143,8 +145,10 @@ final class JavaAdapterBytecodeGenerator {
static
final
String
GLOBAL_FIELD_NAME
=
"global"
;
static
final
String
SCRIPT_OBJECT_TYPE_DESCRIPTOR
=
SCRIPT_OBJECT_TYPE
.
getDescriptor
();
static
final
String
GLOBAL_TYPE_DESCRIPTOR
=
GLOBAL_TYPE
.
getDescriptor
();
static
final
String
SET_GLOBAL_METHOD_DESCRIPTOR
=
Type
.
getMethodDescriptor
(
Type
.
VOID_TYPE
,
SCRIPT_OBJECT_TYPE
);
static
final
String
SET_GLOBAL_METHOD_DESCRIPTOR
=
Type
.
getMethodDescriptor
(
Type
.
VOID_TYPE
,
GLOBAL_TYPE
);
static
final
String
VOID_NOARG_METHOD_DESCRIPTOR
=
Type
.
getMethodDescriptor
(
Type
.
VOID_TYPE
);
private
static
final
Type
SCRIPT_FUNCTION_TYPE
=
Type
.
getType
(
ScriptFunction
.
class
);
...
...
@@ -167,7 +171,7 @@ final class JavaAdapterBytecodeGenerator {
private
static
final
String
UNSUPPORTED_OPERATION_TYPE_NAME
=
UNSUPPORTED_OPERATION_TYPE
.
getInternalName
();
private
static
final
String
METHOD_HANDLE_TYPE_DESCRIPTOR
=
METHOD_HANDLE_TYPE
.
getDescriptor
();
private
static
final
String
GET_GLOBAL_METHOD_DESCRIPTOR
=
Type
.
getMethodDescriptor
(
SCRIPT_OBJECT
_TYPE
);
private
static
final
String
GET_GLOBAL_METHOD_DESCRIPTOR
=
Type
.
getMethodDescriptor
(
GLOBAL
_TYPE
);
private
static
final
String
GET_CLASS_METHOD_DESCRIPTOR
=
Type
.
getMethodDescriptor
(
Type
.
getType
(
Class
.
class
));
// Package used when the adapter can't be defined in the adaptee's package (either because it's sealed, or because
...
...
@@ -259,7 +263,7 @@ final class JavaAdapterBytecodeGenerator {
}
private
void
generateGlobalFields
()
{
cw
.
visitField
(
ACC_PRIVATE
|
ACC_FINAL
|
(
classOverride
?
ACC_STATIC
:
0
),
GLOBAL_FIELD_NAME
,
SCRIPT_OBJECT
_TYPE_DESCRIPTOR
,
null
,
null
).
visitEnd
();
cw
.
visitField
(
ACC_PRIVATE
|
ACC_FINAL
|
(
classOverride
?
ACC_STATIC
:
0
),
GLOBAL_FIELD_NAME
,
GLOBAL
_TYPE_DESCRIPTOR
,
null
,
null
).
visitEnd
();
usedFieldNames
.
add
(
GLOBAL_FIELD_NAME
);
}
...
...
@@ -363,7 +367,7 @@ final class JavaAdapterBytecodeGenerator {
}
// Assign "global = Context.getGlobal()"
invokeGetGlobalWithNullCheck
(
mv
);
mv
.
putstatic
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
SCRIPT_OBJECT
_TYPE_DESCRIPTOR
);
mv
.
putstatic
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
GLOBAL
_TYPE_DESCRIPTOR
);
endInitMethod
(
mv
);
}
...
...
@@ -508,7 +512,7 @@ final class JavaAdapterBytecodeGenerator {
// Assign "this.global = Context.getGlobal()"
mv
.
visitVarInsn
(
ALOAD
,
0
);
invokeGetGlobalWithNullCheck
(
mv
);
mv
.
putfield
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
SCRIPT_OBJECT
_TYPE_DESCRIPTOR
);
mv
.
putfield
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
GLOBAL
_TYPE_DESCRIPTOR
);
endInitMethod
(
mv
);
}
...
...
@@ -652,10 +656,10 @@ final class JavaAdapterBytecodeGenerator {
// Load the creatingGlobal object
if
(
classOverride
)
{
// If class handle is defined, load the static defining global
mv
.
getstatic
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
SCRIPT_OBJECT
_TYPE_DESCRIPTOR
);
mv
.
getstatic
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
GLOBAL
_TYPE_DESCRIPTOR
);
}
else
{
mv
.
visitVarInsn
(
ALOAD
,
0
);
mv
.
getfield
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
SCRIPT_OBJECT
_TYPE_DESCRIPTOR
);
mv
.
getfield
(
generatedClassName
,
GLOBAL_FIELD_NAME
,
GLOBAL
_TYPE_DESCRIPTOR
);
}
// stack: [creatingGlobal, handle]
final
Label
setupGlobal
=
new
Label
();
...
...
@@ -674,7 +678,7 @@ final class JavaAdapterBytecodeGenerator {
// stack: [creatingGlobal, creatingGlobal, handle]
// Emit code for switching to the creating global
//
ScriptObject
currentGlobal = Context.getGlobal();
//
Global
currentGlobal = Context.getGlobal();
invokeGetGlobal
(
mv
);
mv
.
dup
();
...
...
@@ -744,7 +748,7 @@ final class JavaAdapterBytecodeGenerator {
final
Label
methodEnd
=
new
Label
();
mv
.
visitLabel
(
methodEnd
);
mv
.
visitLocalVariable
(
"currentGlobal"
,
SCRIPT_OBJECT
_TYPE_DESCRIPTOR
,
null
,
setupGlobal
,
methodEnd
,
currentGlobalVar
);
mv
.
visitLocalVariable
(
"currentGlobal"
,
GLOBAL
_TYPE_DESCRIPTOR
,
null
,
setupGlobal
,
methodEnd
,
currentGlobalVar
);
mv
.
visitLocalVariable
(
"globalsDiffer"
,
Type
.
INT_TYPE
.
getDescriptor
(),
null
,
setupGlobal
,
methodEnd
,
globalsDifferVar
);
if
(
throwableDeclared
)
{
...
...
nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
浏览文件 @
c2de1264
...
...
@@ -48,7 +48,6 @@ import java.util.Map;
import
java.util.concurrent.ConcurrentHashMap
;
import
jdk.internal.dynalink.beans.StaticClass
;
import
jdk.internal.dynalink.support.LinkRequestImpl
;
import
jdk.nashorn.internal.objects.NativeJava
;
import
jdk.nashorn.internal.runtime.Context
;
import
jdk.nashorn.internal.runtime.ECMAException
;
import
jdk.nashorn.internal.runtime.ScriptFunction
;
...
...
@@ -68,8 +67,8 @@ import jdk.nashorn.internal.runtime.ScriptObject;
* generate the adapter class itself; see its documentation for details about the generated class.
* </p><p>
* You normally don't use this class directly, but rather either create adapters from script using
* {@link NativeJava#extend(Object, Object...)}, using the {@code new} operator on abstract classes and interfaces (see
* {@link NativeJava#type(Object, Object)}), or implicitly when passing script functions to Java methods expecting SAM
* {@link
jdk.nashorn.internal.objects.
NativeJava#extend(Object, Object...)}, using the {@code new} operator on abstract classes and interfaces (see
* {@link
jdk.nashorn.internal.objects.
NativeJava#type(Object, Object)}), or implicitly when passing script functions to Java methods expecting SAM
* types.
* </p>
*/
...
...
@@ -337,6 +336,7 @@ public final class JavaAdapterFactory {
private
static
ProtectionDomain
createMinimalPermissionDomain
()
{
// Generated classes need to have at least the permission to access Nashorn runtime and runtime.linker packages.
final
Permissions
permissions
=
new
Permissions
();
permissions
.
add
(
new
RuntimePermission
(
"accessClassInPackage.jdk.nashorn.internal.objects"
));
permissions
.
add
(
new
RuntimePermission
(
"accessClassInPackage.jdk.nashorn.internal.runtime"
));
permissions
.
add
(
new
RuntimePermission
(
"accessClassInPackage.jdk.nashorn.internal.runtime.linker"
));
return
new
ProtectionDomain
(
new
CodeSource
(
null
,
(
CodeSigner
[])
null
),
permissions
);
...
...
nashorn/src/jdk/nashorn/internal/runtime/linker/NashornGuards.java
浏览文件 @
c2de1264
...
...
@@ -29,6 +29,11 @@ import static jdk.nashorn.internal.lookup.Lookup.MH;
import
java.lang.invoke.MethodHandle
;
import
java.lang.invoke.MethodHandles
;
import
java.lang.ref.WeakReference
;
import
jdk.internal.dynalink.CallSiteDescriptor
;
import
jdk.nashorn.internal.codegen.ObjectClassGenerator
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.Property
;
import
jdk.nashorn.internal.runtime.PropertyMap
;
import
jdk.nashorn.internal.runtime.ScriptFunction
;
import
jdk.nashorn.internal.runtime.ScriptObject
;
...
...
@@ -40,6 +45,7 @@ public final class NashornGuards {
private
static
final
MethodHandle
IS_SCRIPTOBJECT
=
findOwnMH
(
"isScriptObject"
,
boolean
.
class
,
Object
.
class
);
private
static
final
MethodHandle
IS_SCRIPTFUNCTION
=
findOwnMH
(
"isScriptFunction"
,
boolean
.
class
,
Object
.
class
);
private
static
final
MethodHandle
IS_MAP
=
findOwnMH
(
"isMap"
,
boolean
.
class
,
Object
.
class
,
PropertyMap
.
class
);
private
static
final
MethodHandle
SAME_OBJECT
=
findOwnMH
(
"sameObject"
,
boolean
.
class
,
Object
.
class
,
WeakReference
.
class
);
private
static
final
MethodHandle
IS_INSTANCEOF_2
=
findOwnMH
(
"isInstanceOf2"
,
boolean
.
class
,
Object
.
class
,
Class
.
class
,
Class
.
class
);
// don't create me!
...
...
@@ -74,6 +80,55 @@ public final class NashornGuards {
return
MH
.
insertArguments
(
IS_MAP
,
1
,
map
);
}
/**
* Determine whether the given callsite needs a guard.
* @param property the property, or null
* @param desc the callsite descriptor
* @return true if a guard should be used for this callsite
*/
static
boolean
needsGuard
(
final
Property
property
,
final
CallSiteDescriptor
desc
)
{
return
property
==
null
||
property
.
isConfigurable
()
||
property
.
isBound
()
||
!
ObjectClassGenerator
.
OBJECT_FIELDS_ONLY
||
!
NashornCallSiteDescriptor
.
isFastScope
(
desc
)
||
property
.
canChangeType
();
}
/**
* Get the guard for a property access. This returns an identity guard for non-configurable global properties
* and a map guard for everything else.
*
* @param sobj the first object in the prototype chain
* @param property the property
* @param desc the callsite descriptor
* @return method handle for guard
*/
public
static
MethodHandle
getGuard
(
final
ScriptObject
sobj
,
final
Property
property
,
final
CallSiteDescriptor
desc
)
{
if
(!
needsGuard
(
property
,
desc
))
{
return
null
;
}
if
(
NashornCallSiteDescriptor
.
isScope
(
desc
))
{
if
(
property
!=
null
&&
property
.
isBound
())
{
// This is a declared top level variables in main script or eval, use identity guard.
return
getIdentityGuard
(
sobj
);
}
if
(!(
sobj
instanceof
Global
)
&&
(
property
==
null
||
property
.
isConfigurable
()))
{
// Undeclared variables in nested evals need stronger guards
return
combineGuards
(
getIdentityGuard
(
sobj
),
getMapGuard
(
sobj
.
getMap
()));
}
}
return
getMapGuard
(
sobj
.
getMap
());
}
/**
* Get a guard that checks referential identity of the current object.
*
* @param sobj the self object
* @return true if same self object instance
*/
public
static
MethodHandle
getIdentityGuard
(
final
ScriptObject
sobj
)
{
return
MH
.
insertArguments
(
SAME_OBJECT
,
1
,
new
WeakReference
<>(
sobj
));
}
/**
* Get a guard that checks if in item is an instance of either of two classes.
*
...
...
@@ -111,6 +166,11 @@ public final class NashornGuards {
return
self
instanceof
ScriptObject
&&
((
ScriptObject
)
self
).
getMap
()
==
map
;
}
@SuppressWarnings
(
"unused"
)
private
static
boolean
sameObject
(
final
Object
self
,
final
WeakReference
<
ScriptObject
>
ref
)
{
return
self
==
ref
.
get
();
}
@SuppressWarnings
(
"unused"
)
private
static
boolean
isInstanceOf2
(
final
Object
self
,
final
Class
<?>
class1
,
final
Class
<?>
class2
)
{
return
class1
.
isInstance
(
self
)
||
class2
.
isInstance
(
self
);
...
...
nashorn/src/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java
浏览文件 @
c2de1264
...
...
@@ -37,9 +37,9 @@ import jdk.internal.dynalink.linker.LinkRequest;
import
jdk.internal.dynalink.linker.LinkerServices
;
import
jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker
;
import
jdk.internal.dynalink.support.TypeUtilities
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.runtime.ConsString
;
import
jdk.nashorn.internal.runtime.Context
;
import
jdk.nashorn.internal.runtime.GlobalObject
;
/**
* Internal linker for String, Boolean, and Number objects, only ever used by Nashorn engine and not exposed to other
...
...
@@ -62,7 +62,7 @@ final class NashornPrimitiveLinker implements TypeBasedGuardingDynamicLinker, Gu
final
LinkRequest
request
=
origRequest
.
withoutRuntimeContext
();
// Nashorn has no runtime context
final
Object
self
=
request
.
getReceiver
();
final
Global
Object
global
=
(
GlobalObject
)
Context
.
getGlobal
();
final
Global
global
=
Context
.
getGlobal
();
final
NashornCallSiteDescriptor
desc
=
(
NashornCallSiteDescriptor
)
request
.
getCallSiteDescriptor
();
return
Bootstrap
.
asType
(
global
.
primitiveLookup
(
request
,
self
),
linkerServices
,
desc
);
...
...
nashorn/src/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java
浏览文件 @
c2de1264
...
...
@@ -35,6 +35,7 @@ import jdk.internal.dynalink.linker.LinkRequest;
import
jdk.internal.dynalink.support.CallSiteDescriptorFactory
;
import
jdk.internal.dynalink.support.Guards
;
import
jdk.nashorn.internal.lookup.Lookup
;
import
jdk.nashorn.internal.runtime.FindProperty
;
import
jdk.nashorn.internal.runtime.ScriptObject
;
/**
...
...
@@ -61,8 +62,9 @@ public final class PrimitiveLookup {
* type {@code receiverClass}.
*/
public
static
GuardedInvocation
lookupPrimitive
(
final
LinkRequest
request
,
final
Class
<?>
receiverClass
,
final
ScriptObject
wrappedReceiver
,
final
MethodHandle
wrapFilter
)
{
return
lookupPrimitive
(
request
,
Guards
.
getInstanceOfGuard
(
receiverClass
),
wrappedReceiver
,
wrapFilter
);
final
ScriptObject
wrappedReceiver
,
final
MethodHandle
wrapFilter
,
final
MethodHandle
protoFilter
)
{
return
lookupPrimitive
(
request
,
Guards
.
getInstanceOfGuard
(
receiverClass
),
wrappedReceiver
,
wrapFilter
,
protoFilter
);
}
/**
...
...
@@ -79,7 +81,8 @@ public final class PrimitiveLookup {
* type (that is implied by both {@code guard} and {@code wrappedReceiver}).
*/
public
static
GuardedInvocation
lookupPrimitive
(
final
LinkRequest
request
,
final
MethodHandle
guard
,
final
ScriptObject
wrappedReceiver
,
final
MethodHandle
wrapFilter
)
{
final
ScriptObject
wrappedReceiver
,
final
MethodHandle
wrapFilter
,
final
MethodHandle
protoFilter
)
{
final
CallSiteDescriptor
desc
=
request
.
getCallSiteDescriptor
();
final
String
operator
=
CallSiteDescriptorFactory
.
tokenizeOperators
(
desc
).
get
(
0
);
if
(
"setProp"
.
equals
(
operator
)
||
"setElem"
.
equals
(
operator
))
{
...
...
@@ -93,9 +96,23 @@ public final class PrimitiveLookup {
if
(
desc
.
getNameTokenCount
()
>
2
)
{
final
String
name
=
desc
.
getNameToken
(
CallSiteDescriptor
.
NAME_OPERAND
);
if
(
wrappedReceiver
.
findProperty
(
name
,
true
)
==
null
)
{
final
FindProperty
find
=
wrappedReceiver
.
findProperty
(
name
,
true
);
if
(
find
==
null
)
{
// Give up early, give chance to BeanLinker and NashornBottomLinker to deal with it.
return
null
;
}
else
if
(
find
.
isInherited
()
&&
!
find
.
getProperty
().
hasGetterFunction
(
find
.
getOwner
()))
{
// If property is found in the prototype object bind the method handle directly to
// the proto filter instead of going through wrapper instantiation below.
final
ScriptObject
proto
=
wrappedReceiver
.
getProto
();
final
GuardedInvocation
link
=
proto
.
lookup
(
desc
,
request
);
if
(
link
!=
null
)
{
final
MethodHandle
invocation
=
link
.
getInvocation
();
final
MethodHandle
adaptedInvocation
=
MH
.
asType
(
invocation
,
invocation
.
type
().
changeParameterType
(
0
,
Object
.
class
));
final
MethodHandle
method
=
MH
.
filterArguments
(
adaptedInvocation
,
0
,
protoFilter
);
final
MethodHandle
protoGuard
=
MH
.
filterArguments
(
link
.
getGuard
(),
0
,
protoFilter
);
return
new
GuardedInvocation
(
method
,
NashornGuards
.
combineGuards
(
guard
,
protoGuard
));
}
}
}
final
GuardedInvocation
link
=
wrappedReceiver
.
lookup
(
desc
,
request
);
...
...
nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties
浏览文件 @
c2de1264
...
...
@@ -79,6 +79,7 @@ type.error.not.a.function={0} is not a function
type.error.not.a.constructor
=
{0} is not a constructor function
type.error.not.a.file
=
{0} is not a File
type.error.not.a.bytebuffer
=
{0} is not a java.nio.ByteBuffer
type.error.not.an.arraybuffer.in.dataview
=
First arg to DataView constructor must be an ArrayBuffer
# operations not permitted on undefined
type.error.cant.call.undefined
=
Cannot call undefined
...
...
@@ -137,6 +138,9 @@ type.error.no.method.matches.args=Can not invoke method {0} with the passed argu
type.error.method.not.constructor
=
Java method {0} can't be used as a constructor.
type.error.env.not.object
=
$ENV must be an Object.
type.error.unsupported.java.to.type
=
Unsupported Java.to target type {0}.
range.error.dataview.constructor.offset
=
Wrong offset or length in DataView constructor
range.error.dataview.offset
=
Offset is outside the bounds of the DataView
range.error.inappropriate.array.length
=
inappropriate array length: {0}
range.error.inappropriate.array.buffer.length
=
inappropriate array buffer length: {0}
range.error.invalid.fraction.digits
=
fractionDigits argument to {0} must be in [0, 20]
...
...
nashorn/src/jdk/nashorn/tools/Shell.java
浏览文件 @
c2de1264
...
...
@@ -42,6 +42,7 @@ import jdk.nashorn.internal.codegen.Compiler;
import
jdk.nashorn.internal.ir.FunctionNode
;
import
jdk.nashorn.internal.ir.debug.ASTWriter
;
import
jdk.nashorn.internal.ir.debug.PrintVisitor
;
import
jdk.nashorn.internal.objects.Global
;
import
jdk.nashorn.internal.parser.Parser
;
import
jdk.nashorn.internal.runtime.Context
;
import
jdk.nashorn.internal.runtime.ErrorManager
;
...
...
@@ -148,7 +149,7 @@ public class Shell {
return
COMMANDLINE_ERROR
;
}
final
ScriptObject
global
=
context
.
createGlobal
();
final
Global
global
=
context
.
createGlobal
();
final
ScriptEnvironment
env
=
context
.
getEnv
();
final
List
<
String
>
files
=
env
.
getFiles
();
if
(
files
.
isEmpty
())
{
...
...
@@ -231,8 +232,8 @@ public class Shell {
* @return error code
* @throws IOException when any script file read results in I/O error
*/
private
static
int
compileScripts
(
final
Context
context
,
final
ScriptObject
global
,
final
List
<
String
>
files
)
throws
IOException
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
private
static
int
compileScripts
(
final
Context
context
,
final
Global
global
,
final
List
<
String
>
files
)
throws
IOException
{
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
final
ScriptEnvironment
env
=
context
.
getEnv
();
try
{
...
...
@@ -281,8 +282,8 @@ public class Shell {
* @return error code
* @throws IOException when any script file read results in I/O error
*/
private
int
runScripts
(
final
Context
context
,
final
ScriptObject
global
,
final
List
<
String
>
files
)
throws
IOException
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
private
int
runScripts
(
final
Context
context
,
final
Global
global
,
final
List
<
String
>
files
)
throws
IOException
{
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
try
{
if
(
globalChanged
)
{
...
...
@@ -339,8 +340,8 @@ public class Shell {
* @return error code
* @throws IOException when any script file read results in I/O error
*/
private
static
int
runFXScripts
(
final
Context
context
,
final
ScriptObject
global
,
final
List
<
String
>
files
)
throws
IOException
{
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
private
static
int
runFXScripts
(
final
Context
context
,
final
Global
global
,
final
List
<
String
>
files
)
throws
IOException
{
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
try
{
if
(
globalChanged
)
{
...
...
@@ -389,11 +390,11 @@ public class Shell {
* @return return code
*/
@SuppressWarnings
(
"resource"
)
private
static
int
readEvalPrint
(
final
Context
context
,
final
ScriptObject
global
)
{
private
static
int
readEvalPrint
(
final
Context
context
,
final
Global
global
)
{
final
String
prompt
=
bundle
.
getString
(
"shell.prompt"
);
final
BufferedReader
in
=
new
BufferedReader
(
new
InputStreamReader
(
System
.
in
));
final
PrintWriter
err
=
context
.
getErr
();
final
ScriptObject
oldGlobal
=
Context
.
getGlobal
();
final
Global
oldGlobal
=
Context
.
getGlobal
();
final
boolean
globalChanged
=
(
oldGlobal
!=
global
);
final
ScriptEnvironment
env
=
context
.
getEnv
();
...
...
nashorn/test/script/basic/JDK-8034055.js
0 → 100644
浏览文件 @
c2de1264
/*
* Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* JDK-8034055: delete on global object not properly guarded
*
* @test
* @run
*/
var
global
=
this
;
var
x
;
function
test
(
defineGlobals
)
{
if
(
defineGlobals
)
{
global
.
x
=
1
;
global
.
y
=
2
;
}
try
{
print
(
x
);
print
(
y
);
}
catch
(
e
)
{
print
(
e
);
}
finally
{
print
(
delete
global
.
x
);
print
(
delete
global
.
y
);
}
}
// Repeatedly set and delete global variables
test
(
true
);
test
(
false
);
test
(
true
);
test
(
false
);
nashorn/test/script/basic/JDK-8034055.js.EXPECTED
0 → 100644
浏览文件 @
c2de1264
1
2
false
true
1
ReferenceError: "y" is not defined
false
true
1
2
false
true
1
ReferenceError: "y" is not defined
false
true
nashorn/test/script/basic/dataview_endian.js
0 → 100644
浏览文件 @
c2de1264
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* JDK-8015958: DataView constructor is not defined
*
* @test
* @run
*/
// set/get endianess checks
var
buffer
=
new
ArrayBuffer
(
4
);
var
dv
=
new
DataView
(
buffer
);
// write (default) big endian, read big/little endian
dv
.
setUint16
(
0
,
0xABCD
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
),
0xABCD
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
,
false
),
0xABCD
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
,
true
),
0xCDAB
);
// write little endian, read big/little endian
dv
.
setUint16
(
0
,
0xABCD
,
true
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
),
0xCDAB
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
,
false
),
0xCDAB
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
,
true
),
0xABCD
);
// write explicit big endian, read big/little endian
dv
.
setUint16
(
0
,
0xABCD
,
false
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
),
0xABCD
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
,
false
),
0xABCD
);
Assert
.
assertEquals
(
dv
.
getUint16
(
0
,
true
),
0xCDAB
);
// write (default) big endian, read big/little endian
dv
.
setUint32
(
0
,
0xABCDEF89
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
),
0xABCDEF89
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
,
false
),
0xABCDEF89
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
,
true
),
0x89EFCDAB
);
// write little endian, read big/little endian
dv
.
setUint32
(
0
,
0xABCDEF89
,
true
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
),
0x89EFCDAB
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
,
false
),
0x89EFCDAB
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
,
true
),
0xABCDEF89
);
// write explicit big endian, read big/little endian
dv
.
setUint32
(
0
,
0xABCDEF89
,
false
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
),
0xABCDEF89
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
,
false
),
0xABCDEF89
);
Assert
.
assertEquals
(
dv
.
getUint32
(
0
,
true
),
0x89EFCDAB
);
nashorn/test/script/basic/dataview_getset.js
0 → 100644
浏览文件 @
c2de1264
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* JDK-8015958: DataView constructor is not defined
*
* @test
* @run
*/
// checking get/set of values of various types
// Also basic endianess check.
var
Float
=
Java
.
type
(
"
java.lang.Float
"
);
var
Double
=
Java
.
type
(
"
java.lang.Double
"
);
var
DOUBLE_MIN
=
Double
.
MIN_VALUE
;
var
DOUBLE_MIN_NORMAL
=
Double
.
MIN_NORMAL
;
var
FLOAT_MIN
=
Float
.
MIN_VALUE
;
var
FLOAT_MIN_NORMAL
=
Float
.
MIN_NORMAL
;
var
buffer
=
new
ArrayBuffer
(
12
);
var
dv
=
new
DataView
(
buffer
);
dv
.
setInt8
(
1
,
123
);
Assert
.
assertEquals
(
dv
.
getInt8
(
1
),
123
);
dv
.
setInt8
(
1
,
123
,
true
);
Assert
.
assertEquals
(
dv
.
getInt8
(
1
,
true
),
123
);
dv
.
setUint8
(
1
,
255
);
Assert
.
assertEquals
(
dv
.
getUint8
(
1
),
255
);
dv
.
setUint8
(
1
,
255
,
true
);
Assert
.
assertEquals
(
dv
.
getUint8
(
1
,
true
),
255
);
dv
.
setInt16
(
1
,
1234
);
Assert
.
assertEquals
(
dv
.
getInt16
(
1
),
1234
);
dv
.
setInt16
(
1
,
1234
,
true
);
Assert
.
assertEquals
(
dv
.
getInt16
(
1
,
true
),
1234
);
dv
.
setUint16
(
1
,
65535
);
Assert
.
assertEquals
(
dv
.
getUint16
(
1
),
65535
);
dv
.
setUint16
(
1
,
65535
,
true
);
Assert
.
assertEquals
(
dv
.
getUint16
(
1
,
true
),
65535
);
dv
.
setInt32
(
1
,
1234
);
Assert
.
assertEquals
(
dv
.
getInt32
(
1
),
1234
);
dv
.
setInt32
(
1
,
1234
,
true
);
Assert
.
assertEquals
(
dv
.
getInt32
(
1
,
true
),
1234
);
dv
.
setUint32
(
1
,
4294967295
);
Assert
.
assertEquals
(
dv
.
getUint32
(
1
),
4294967295
);
dv
.
setUint32
(
1
,
4294967295
,
true
);
Assert
.
assertEquals
(
dv
.
getUint32
(
1
,
true
),
4294967295
);
dv
.
setFloat64
(
1
,
Math
.
PI
);
Assert
.
assertEquals
(
dv
.
getFloat64
(
1
),
Math
.
PI
,
DOUBLE_MIN
);
dv
.
setFloat64
(
1
,
Math
.
PI
,
true
);
Assert
.
assertEquals
(
dv
.
getFloat64
(
1
,
true
),
Math
.
PI
,
DOUBLE_MIN
);
dv
.
setFloat64
(
1
,
DOUBLE_MIN_NORMAL
);
Assert
.
assertEquals
(
dv
.
getFloat64
(
1
),
DOUBLE_MIN_NORMAL
,
DOUBLE_MIN
);
dv
.
setFloat64
(
1
,
DOUBLE_MIN_NORMAL
,
true
);
Assert
.
assertEquals
(
dv
.
getFloat64
(
1
,
true
),
DOUBLE_MIN_NORMAL
,
DOUBLE_MIN
);
dv
.
setFloat32
(
1
,
1.414
);
Assert
[
"
assertEquals(float, float, float)
"
](
dv
.
getFloat32
(
1
),
1.414
,
FLOAT_MIN
);
dv
.
setFloat32
(
1
,
1.414
,
true
);
Assert
[
"
assertEquals(float, float, float)
"
](
dv
.
getFloat32
(
1
,
true
),
1.414
,
FLOAT_MIN
);
dv
.
setFloat32
(
1
,
FLOAT_MIN_NORMAL
);
Assert
[
"
assertEquals(float, float, float)
"
](
dv
.
getFloat32
(
1
),
FLOAT_MIN_NORMAL
,
FLOAT_MIN
);
dv
.
setFloat32
(
1
,
FLOAT_MIN_NORMAL
,
true
);
Assert
[
"
assertEquals(float, float, float)
"
](
dv
.
getFloat32
(
1
,
true
),
FLOAT_MIN_NORMAL
,
FLOAT_MIN
);
nashorn/test/script/basic/dataview_new.js
0 → 100644
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/api/scripting/ScopeTest.java
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/api/scripting/resources/func.js
0 → 100644
浏览文件 @
c2de1264
/*
* Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
// This script is loaded from jdk.nashorn.api.scripting.ScopeTest to test script class sharing and reuse.
var
scopeVar
=
1
;
var
global
=
this
;
undefGlobal
=
this
;
function
scopeTest
()
{
if
(
this
!==
global
)
{
throw
new
Error
(
"
this !== global
"
);
}
if
(
this
!==
undefGlobal
)
{
throw
new
Error
(
"
this !== undefinedGlobal
"
)
}
return
scopeVar
;
}
scopeTest
();
nashorn/test/src/jdk/nashorn/api/scripting/resources/gettersetter.js
0 → 100644
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/api/scripting/resources/witheval.js
0 → 100644
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/internal/codegen/CompilerTest.java
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/internal/performance/PerformanceWrapper.java
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/internal/runtime/ContextTest.java
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/internal/runtime/NoPersistenceCachingTest.java
0 → 100644
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
nashorn/test/src/jdk/nashorn/internal/test/framework/SharedContextEvaluator.java
浏览文件 @
c2de1264
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录