Index: src/js/messages.js |
diff --git a/src/js/messages.js b/src/js/messages.js |
index 69d3fbb4f50c89cc03b0ee80c9c1abe7a53997ac..f026d6b6b69a8f298d42b2f201079ae88216094d 100644 |
--- a/src/js/messages.js |
+++ b/src/js/messages.js |
@@ -23,6 +23,10 @@ var callSitePositionSymbol = |
utils.ImportNow("call_site_position_symbol"); |
var callSiteStrictSymbol = |
utils.ImportNow("call_site_strict_symbol"); |
+var callSiteWasmObjectSymbol = |
+ utils.ImportNow("call_site_wasm_obj_symbol"); |
+var callSiteWasmFunctionIndexSymbol = |
+ utils.ImportNow("call_site_wasm_func_index_symbol"); |
var Float32x4ToString; |
var formattedStackTraceSymbol = |
utils.ImportNow("formatted_stack_trace_symbol"); |
@@ -555,7 +559,7 @@ function GetStackTraceLine(recv, fun, pos, isGlobal) { |
// Error implementation |
function CallSite(receiver, fun, pos, strict_mode) { |
- if (!IS_FUNCTION(fun)) { |
+ if (!IS_FUNCTION(fun) && !IS_NUMBER(fun)) { |
throw MakeTypeError(kCallSiteExpectsFunction, typeof fun); |
} |
@@ -563,14 +567,19 @@ function CallSite(receiver, fun, pos, strict_mode) { |
return new CallSite(receiver, fun, pos, strict_mode); |
} |
- SET_PRIVATE(this, callSiteReceiverSymbol, receiver); |
- SET_PRIVATE(this, callSiteFunctionSymbol, fun); |
+ if (IS_FUNCTION(fun)) { |
+ SET_PRIVATE(this, callSiteReceiverSymbol, receiver); |
+ SET_PRIVATE(this, callSiteFunctionSymbol, fun); |
+ } else { |
+ SET_PRIVATE(this, callSiteWasmObjectSymbol, receiver); |
+ SET_PRIVATE(this, callSiteWasmFunctionIndexSymbol, TO_UINT32(fun)); |
+ } |
SET_PRIVATE(this, callSitePositionSymbol, TO_INT32(pos)); |
SET_PRIVATE(this, callSiteStrictSymbol, TO_BOOLEAN(strict_mode)); |
} |
function CheckCallSite(obj, name) { |
- if (!IS_RECEIVER(obj) || !HAS_PRIVATE(obj, callSiteFunctionSymbol)) { |
+ if (!IS_RECEIVER(obj) || !HAS_PRIVATE(obj, callSitePositionSymbol)) { |
throw MakeTypeError(kCallSiteMethod, name); |
} |
} |
@@ -621,6 +630,12 @@ function CallSiteGetScriptNameOrSourceURL() { |
function CallSiteGetFunctionName() { |
// See if the function knows its own name |
CheckCallSite(this, "getFunctionName"); |
+ if (HAS_PRIVATE(this, callSiteWasmObjectSymbol)) { |
+ var wasm = GET_PRIVATE(this, callSiteWasmObjectSymbol); |
+ var func_index = GET_PRIVATE(this, callSiteWasmFunctionIndexSymbol); |
+ return IS_UNDEFINED(wasm) ? "<WASM>" : |
+ IS_STRING(wasm) ? wasm : %WasmGetFunctionName(wasm, func_index); |
+ } |
return %CallSiteGetFunctionNameRT(this); |
} |
@@ -656,7 +671,26 @@ function CallSiteIsConstructor() { |
return %CallSiteIsConstructorRT(this); |
} |
+function CallSiteIsWasm() { |
+ CheckCallSite(this, "isWasm"); |
+ return HAS_PRIVATE(this, callSiteWasmObjectSymbol); |
+} |
+ |
+function CallSiteGetWasmObject() { |
+ CheckCallSite(this, "getWasmObject"); |
+ return GET_PRIVATE(this, callSiteWasmObjectSymbol); |
+} |
+ |
+function CallSiteGetWasmFunctionIndex() { |
+ CheckCallSite(this, "getWasmFunctionIndex"); |
+ return GET_PRIVATE(this, callSiteWasmFunctionIndexSymbol); |
+} |
+ |
function CallSiteToString() { |
+ if (this.isWasm()) { |
+ return this.getFunctionName() + " (<WASM>:" + this.getPosition() + ")"; |
+ } |
+ |
var fileName; |
var fileLocation = ""; |
if (this.isNative()) { |
@@ -737,6 +771,9 @@ utils.SetUpLockedPrototype(CallSite, ["receiver", "fun", "pos"], [ |
"isNative", CallSiteIsNative, |
"getPosition", CallSiteGetPosition, |
"isConstructor", CallSiteIsConstructor, |
+ "isWasm", CallSiteIsWasm, |
+ "getWasmObject", CallSiteGetWasmObject, |
+ "getWasmFunctionIndex", CallSiteGetWasmFunctionIndex, |
"toString", CallSiteToString |
]); |
@@ -801,7 +838,7 @@ function GetStackFrames(raw_stack) { |
var fun = raw_stack[i + 1]; |
var code = raw_stack[i + 2]; |
var pc = raw_stack[i + 3]; |
- var pos = %_IsSmi(code) ? code : %FunctionGetPositionForOffset(code, pc); |
+ var pos = %FunctionGetPositionForOffset(code, pc); |
sloppy_frames--; |
frames.push(new CallSite(recv, fun, pos, (sloppy_frames < 0))); |
} |