Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions context.go
Original file line number Diff line number Diff line change
Expand Up @@ -388,14 +388,26 @@ func (ctx *Context) NewDate(epochMS float64) *Value {
return &Value{ctx: ctx, ref: C.JS_NewDate(ctx.ref, C.double(epochMS))}
}

func (ctx *Context) newSymbol(description *C.char, isGlobal bool) *Value {
if !ctx.hasValidRef() {
return nil
}
return &Value{ctx: ctx, ref: C.JS_NewSymbol(ctx.ref, description, C.bool(isGlobal))}
}

// NewSymbol returns a JavaScript local symbol.
func (ctx *Context) NewSymbol(description string) *Value {
if !ctx.hasValidRef() {
return nil
}
desc := C.CString(description)
defer C.free(unsafe.Pointer(desc))
return &Value{ctx: ctx, ref: C.JS_NewSymbol(ctx.ref, desc, C.bool(false))}
return ctx.newSymbol(desc, false)
}
Comment thread
buke marked this conversation as resolved.

// NewSymbolWithoutDescription returns a JavaScript local symbol created with Symbol().
func (ctx *Context) NewSymbolWithoutDescription() *Value {
return ctx.newSymbol(nil, false)
}

// NewGlobalSymbol returns a JavaScript global symbol.
Expand All @@ -405,7 +417,12 @@ func (ctx *Context) NewGlobalSymbol(description string) *Value {
}
desc := C.CString(description)
defer C.free(unsafe.Pointer(desc))
return &Value{ctx: ctx, ref: C.JS_NewSymbol(ctx.ref, desc, C.bool(true))}
return ctx.newSymbol(desc, true)
}

// NewGlobalSymbolWithoutDescription returns a JavaScript global symbol created with Symbol.for("undefined").
func (ctx *Context) NewGlobalSymbolWithoutDescription() *Value {
return ctx.newSymbol(nil, true)
}

// String returns a string value with given string.
Expand Down
26 changes: 26 additions & 0 deletions context_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,14 +357,24 @@ func TestContextLibcStage4Helpers(t *testing.T) {
require.NotNil(t, localSym)
require.True(t, localSym.IsSymbol())

localSymNoDesc := ctx.NewSymbolWithoutDescription()
require.NotNil(t, localSymNoDesc)
require.True(t, localSymNoDesc.IsSymbol())

globalSym := ctx.NewGlobalSymbol("global-key")
require.NotNil(t, globalSym)
require.True(t, globalSym.IsSymbol())

globalSymNoDesc := ctx.NewGlobalSymbolWithoutDescription()
require.NotNil(t, globalSymNoDesc)
require.True(t, globalSymNoDesc.IsSymbol())

globals := ctx.Globals()
require.NotNil(t, globals)
globals.Set("_localSym", localSym)
globals.Set("_localSymNoDesc", localSymNoDesc)
globals.Set("_globalSym", globalSym)
globals.Set("_globalSymNoDesc", globalSymNoDesc)

localKey := ctx.Eval(`Symbol.keyFor(globalThis._localSym)`)
require.NotNil(t, localKey)
Expand All @@ -377,6 +387,18 @@ func TestContextLibcStage4Helpers(t *testing.T) {
require.False(t, globalKey.IsException())
require.Equal(t, "global-key", globalKey.ToString())

localNoDescSemantics := ctx.Eval(`globalThis._localSymNoDesc.description === undefined && Symbol.keyFor(globalThis._localSymNoDesc) === undefined`)
require.NotNil(t, localNoDescSemantics)
defer localNoDescSemantics.Free()
require.False(t, localNoDescSemantics.IsException())
require.True(t, localNoDescSemantics.ToBool())

globalNoDescSemantics := ctx.Eval(`globalThis._globalSymNoDesc.description === "undefined" && Symbol.keyFor(globalThis._globalSymNoDesc) === "undefined"`)
require.NotNil(t, globalNoDescSemantics)
defer globalNoDescSemantics.Free()
require.False(t, globalNoDescSemantics.IsException())
require.True(t, globalNoDescSemantics.ToBool())

moduleFunc := ctx.Eval(`export const v = 1`, EvalFlagModule(true), EvalFlagCompileOnly(true))
require.NotNil(t, moduleFunc)
defer moduleFunc.Free()
Expand Down Expand Up @@ -411,7 +433,9 @@ func TestContextLibcStage4HelpersNilAndClosedGuards(t *testing.T) {
var nilCtx *Context
require.Nil(t, nilCtx.NewDate(0))
require.Nil(t, nilCtx.NewSymbol("x"))
require.Nil(t, nilCtx.NewSymbolWithoutDescription())
require.Nil(t, nilCtx.NewGlobalSymbol("x"))
require.Nil(t, nilCtx.NewGlobalSymbolWithoutDescription())
require.False(t, nilCtx.SetImportMeta(nil, false, false))
require.False(t, nilCtx.BootstrapBJSON())
require.Equal(t, -1, nilCtx.LoopOnce())
Expand All @@ -430,7 +454,9 @@ func TestContextLibcStage4HelpersNilAndClosedGuards(t *testing.T) {
ctx.Close()
require.Nil(t, ctx.NewDate(0))
require.Nil(t, ctx.NewSymbol("x"))
require.Nil(t, ctx.NewSymbolWithoutDescription())
require.Nil(t, ctx.NewGlobalSymbol("x"))
require.Nil(t, ctx.NewGlobalSymbolWithoutDescription())
require.False(t, ctx.SetImportMeta(moduleFunc, false, false))
require.False(t, ctx.BootstrapBJSON())
require.Equal(t, -1, ctx.LoopOnce())
Expand Down
Loading